diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-03-21 11:23:21 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-03-21 11:23:21 -0300 |
| commit | 0593256707ceddb1bc9cd4b25b822a7fbcfedd66 (patch) | |
| tree | 6c6859b94086b71b27409b565ed34c114f03e7f8 /lvm.c | |
| parent | ce6f5502c99ce9a367e25b678e375db6f8164d73 (diff) | |
| download | lua-0593256707ceddb1bc9cd4b25b822a7fbcfedd66.tar.gz lua-0593256707ceddb1bc9cd4b25b822a7fbcfedd66.tar.bz2 lua-0593256707ceddb1bc9cd4b25b822a7fbcfedd66.zip | |
'luaH_get' functions return tag of the result
Undoing previous commit. Returning TValue increases code size without
any visible gains. Returning the tag is a little simpler than returning
a special code (HOK/HNOTFOUND) and the tag is useful by itself in
some cases.
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 61 |
1 files changed, 30 insertions, 31 deletions
| @@ -285,13 +285,12 @@ static int floatforloop (StkId ra) { | |||
| 285 | 285 | ||
| 286 | 286 | ||
| 287 | /* | 287 | /* |
| 288 | ** Finish the table access 'val = t[key]'. | 288 | ** Finish the table access 'val = t[key]' and return the tag of the result. |
| 289 | */ | 289 | */ |
| 290 | void luaV_finishget_ (lua_State *L, const TValue *t, TValue *key, StkId val, | 290 | int luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val, |
| 291 | int tag) { | 291 | int tag) { |
| 292 | int loop; /* counter to avoid infinite loops */ | 292 | int loop; /* counter to avoid infinite loops */ |
| 293 | const TValue *tm; /* metamethod */ | 293 | const TValue *tm; /* metamethod */ |
| 294 | TValue aux; | ||
| 295 | for (loop = 0; loop < MAXTAGLOOP; loop++) { | 294 | for (loop = 0; loop < MAXTAGLOOP; loop++) { |
| 296 | if (tag == LUA_VNOTABLE) { /* 't' is not a table? */ | 295 | if (tag == LUA_VNOTABLE) { /* 't' is not a table? */ |
| 297 | lua_assert(!ttistable(t)); | 296 | lua_assert(!ttistable(t)); |
| @@ -304,22 +303,22 @@ void luaV_finishget_ (lua_State *L, const TValue *t, TValue *key, StkId val, | |||
| 304 | tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */ | 303 | tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */ |
| 305 | if (tm == NULL) { /* no metamethod? */ | 304 | if (tm == NULL) { /* no metamethod? */ |
| 306 | setnilvalue(s2v(val)); /* result is nil */ | 305 | setnilvalue(s2v(val)); /* result is nil */ |
| 307 | return; | 306 | return LUA_VNIL; |
| 308 | } | 307 | } |
| 309 | /* else will try the metamethod */ | 308 | /* else will try the metamethod */ |
| 310 | } | 309 | } |
| 311 | if (ttisfunction(tm)) { /* is metamethod a function? */ | 310 | if (ttisfunction(tm)) { /* is metamethod a function? */ |
| 312 | luaT_callTMres(L, tm, t, key, val); /* call it */ | 311 | luaT_callTMres(L, tm, t, key, val); /* call it */ |
| 313 | return; | 312 | return ttypetag(s2v(val)); |
| 314 | } | 313 | } |
| 315 | t = tm; /* else try to access 'tm[key]' */ | 314 | t = tm; /* else try to access 'tm[key]' */ |
| 316 | luaV_fastget(t, key, s2v(val), luaH_get, aux); | 315 | luaV_fastget(t, key, s2v(val), luaH_get, tag); |
| 317 | if (!isemptyV(aux)) | 316 | if (!tagisempty(tag)) |
| 318 | return; /* done */ | 317 | return tag; /* done */ |
| 319 | /* else repeat (tail call 'luaV_finishget') */ | 318 | /* else repeat (tail call 'luaV_finishget') */ |
| 320 | tag = ttypetagV(aux); | ||
| 321 | } | 319 | } |
| 322 | luaG_runerror(L, "'__index' chain too long; possible loop"); | 320 | luaG_runerror(L, "'__index' chain too long; possible loop"); |
| 321 | return 0; /* to avoid warnings */ | ||
| 323 | } | 322 | } |
| 324 | 323 | ||
| 325 | 324 | ||
| @@ -1247,36 +1246,36 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
| 1247 | TValue *upval = cl->upvals[GETARG_B(i)]->v.p; | 1246 | TValue *upval = cl->upvals[GETARG_B(i)]->v.p; |
| 1248 | TValue *rc = KC(i); | 1247 | TValue *rc = KC(i); |
| 1249 | TString *key = tsvalue(rc); /* key must be a short string */ | 1248 | TString *key = tsvalue(rc); /* key must be a short string */ |
| 1250 | TValue aux; | 1249 | int tag; |
| 1251 | luaV_fastget(upval, key, s2v(ra), luaH_getshortstr, aux); | 1250 | luaV_fastget(upval, key, s2v(ra), luaH_getshortstr, tag); |
| 1252 | if (isemptyV(aux)) | 1251 | if (tagisempty(tag)) |
| 1253 | Protect(luaV_finishget(L, upval, rc, ra, aux)); | 1252 | Protect(luaV_finishget(L, upval, rc, ra, tag)); |
| 1254 | vmbreak; | 1253 | vmbreak; |
| 1255 | } | 1254 | } |
| 1256 | vmcase(OP_GETTABLE) { | 1255 | vmcase(OP_GETTABLE) { |
| 1257 | StkId ra = RA(i); | 1256 | StkId ra = RA(i); |
| 1258 | TValue *rb = vRB(i); | 1257 | TValue *rb = vRB(i); |
| 1259 | TValue *rc = vRC(i); | 1258 | TValue *rc = vRC(i); |
| 1260 | TValue aux; | 1259 | int tag; |
| 1261 | if (ttisinteger(rc)) { /* fast track for integers? */ | 1260 | if (ttisinteger(rc)) { /* fast track for integers? */ |
| 1262 | luaV_fastgeti(rb, ivalue(rc), s2v(ra), aux); | 1261 | luaV_fastgeti(rb, ivalue(rc), s2v(ra), tag); |
| 1263 | } | 1262 | } |
| 1264 | else | 1263 | else |
| 1265 | luaV_fastget(rb, rc, s2v(ra), luaH_get, aux); | 1264 | luaV_fastget(rb, rc, s2v(ra), luaH_get, tag); |
| 1266 | if (isemptyV(aux)) /* fast track for integers? */ | 1265 | if (tagisempty(tag)) |
| 1267 | Protect(luaV_finishget(L, rb, rc, ra, aux)); | 1266 | Protect(luaV_finishget(L, rb, rc, ra, tag)); |
| 1268 | vmbreak; | 1267 | vmbreak; |
| 1269 | } | 1268 | } |
| 1270 | vmcase(OP_GETI) { | 1269 | vmcase(OP_GETI) { |
| 1271 | StkId ra = RA(i); | 1270 | StkId ra = RA(i); |
| 1272 | TValue *rb = vRB(i); | 1271 | TValue *rb = vRB(i); |
| 1273 | int c = GETARG_C(i); | 1272 | int c = GETARG_C(i); |
| 1274 | TValue aux; | 1273 | int tag; |
| 1275 | luaV_fastgeti(rb, c, s2v(ra), aux); | 1274 | luaV_fastgeti(rb, c, s2v(ra), tag); |
| 1276 | if (isemptyV(aux)) { | 1275 | if (tagisempty(tag)) { |
| 1277 | TValue key; | 1276 | TValue key; |
| 1278 | setivalue(&key, c); | 1277 | setivalue(&key, c); |
| 1279 | Protect(luaV_finishget(L, rb, &key, ra, aux)); | 1278 | Protect(luaV_finishget(L, rb, &key, ra, tag)); |
| 1280 | } | 1279 | } |
| 1281 | vmbreak; | 1280 | vmbreak; |
| 1282 | } | 1281 | } |
| @@ -1285,10 +1284,10 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
| 1285 | TValue *rb = vRB(i); | 1284 | TValue *rb = vRB(i); |
| 1286 | TValue *rc = KC(i); | 1285 | TValue *rc = KC(i); |
| 1287 | TString *key = tsvalue(rc); /* key must be a short string */ | 1286 | TString *key = tsvalue(rc); /* key must be a short string */ |
| 1288 | TValue aux; | 1287 | int tag; |
| 1289 | luaV_fastget(rb, key, s2v(ra), luaH_getshortstr, aux); | 1288 | luaV_fastget(rb, key, s2v(ra), luaH_getshortstr, tag); |
| 1290 | if (isemptyV(aux)) | 1289 | if (tagisempty(tag)) |
| 1291 | Protect(luaV_finishget(L, rb, rc, ra, aux)); | 1290 | Protect(luaV_finishget(L, rb, rc, ra, tag)); |
| 1292 | vmbreak; | 1291 | vmbreak; |
| 1293 | } | 1292 | } |
| 1294 | vmcase(OP_SETTABUP) { | 1293 | vmcase(OP_SETTABUP) { |
| @@ -1370,14 +1369,14 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
| 1370 | } | 1369 | } |
| 1371 | vmcase(OP_SELF) { | 1370 | vmcase(OP_SELF) { |
| 1372 | StkId ra = RA(i); | 1371 | StkId ra = RA(i); |
| 1373 | TValue aux; | 1372 | int tag; |
| 1374 | TValue *rb = vRB(i); | 1373 | TValue *rb = vRB(i); |
| 1375 | TValue *rc = RKC(i); | 1374 | TValue *rc = RKC(i); |
| 1376 | TString *key = tsvalue(rc); /* key must be a string */ | 1375 | TString *key = tsvalue(rc); /* key must be a string */ |
| 1377 | setobj2s(L, ra + 1, rb); | 1376 | setobj2s(L, ra + 1, rb); |
| 1378 | luaV_fastget(rb, key, s2v(ra), luaH_getstr, aux); | 1377 | luaV_fastget(rb, key, s2v(ra), luaH_getstr, tag); |
| 1379 | if (isemptyV(aux)) | 1378 | if (tagisempty(tag)) |
| 1380 | Protect(luaV_finishget(L, rb, rc, ra, aux)); | 1379 | Protect(luaV_finishget(L, rb, rc, ra, tag)); |
| 1381 | vmbreak; | 1380 | vmbreak; |
| 1382 | } | 1381 | } |
| 1383 | vmcase(OP_ADDI) { | 1382 | vmcase(OP_ADDI) { |
