diff options
Diffstat (limited to 'src/lua/lcode.c')
| -rw-r--r-- | src/lua/lcode.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/src/lua/lcode.c b/src/lua/lcode.c index 6f241c9..d8d353f 100644 --- a/src/lua/lcode.c +++ b/src/lua/lcode.c | |||
| @@ -545,11 +545,14 @@ static void freeexps (FuncState *fs, expdesc *e1, expdesc *e2) { | |||
| 545 | ** and try to reuse constants. Because some values should not be used | 545 | ** and try to reuse constants. Because some values should not be used |
| 546 | ** as keys (nil cannot be a key, integer keys can collapse with float | 546 | ** as keys (nil cannot be a key, integer keys can collapse with float |
| 547 | ** keys), the caller must provide a useful 'key' for indexing the cache. | 547 | ** keys), the caller must provide a useful 'key' for indexing the cache. |
| 548 | ** Note that all functions share the same table, so entering or exiting | ||
| 549 | ** a function can make some indices wrong. | ||
| 548 | */ | 550 | */ |
| 549 | static int addk (FuncState *fs, TValue *key, TValue *v) { | 551 | static int addk (FuncState *fs, TValue *key, TValue *v) { |
| 552 | TValue val; | ||
| 550 | lua_State *L = fs->ls->L; | 553 | lua_State *L = fs->ls->L; |
| 551 | Proto *f = fs->f; | 554 | Proto *f = fs->f; |
| 552 | TValue *idx = luaH_set(L, fs->ls->h, key); /* index scanner table */ | 555 | const TValue *idx = luaH_get(fs->ls->h, key); /* query scanner table */ |
| 553 | int k, oldsize; | 556 | int k, oldsize; |
| 554 | if (ttisinteger(idx)) { /* is there an index there? */ | 557 | if (ttisinteger(idx)) { /* is there an index there? */ |
| 555 | k = cast_int(ivalue(idx)); | 558 | k = cast_int(ivalue(idx)); |
| @@ -563,7 +566,8 @@ static int addk (FuncState *fs, TValue *key, TValue *v) { | |||
| 563 | k = fs->nk; | 566 | k = fs->nk; |
| 564 | /* numerical value does not need GC barrier; | 567 | /* numerical value does not need GC barrier; |
| 565 | table has no metatable, so it does not need to invalidate cache */ | 568 | table has no metatable, so it does not need to invalidate cache */ |
| 566 | setivalue(idx, k); | 569 | setivalue(&val, k); |
| 570 | luaH_finishset(L, fs->ls->h, key, idx, &val); | ||
| 567 | luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants"); | 571 | luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants"); |
| 568 | while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); | 572 | while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); |
| 569 | setobj(L, &f->k[k], v); | 573 | setobj(L, &f->k[k], v); |
| @@ -753,7 +757,7 @@ void luaK_setoneret (FuncState *fs, expdesc *e) { | |||
| 753 | 757 | ||
| 754 | 758 | ||
| 755 | /* | 759 | /* |
| 756 | ** Ensure that expression 'e' is not a variable (nor a constant). | 760 | ** Ensure that expression 'e' is not a variable (nor a <const>). |
| 757 | ** (Expression still may have jump lists.) | 761 | ** (Expression still may have jump lists.) |
| 758 | */ | 762 | */ |
| 759 | void luaK_dischargevars (FuncState *fs, expdesc *e) { | 763 | void luaK_dischargevars (FuncState *fs, expdesc *e) { |
| @@ -763,7 +767,7 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) { | |||
| 763 | break; | 767 | break; |
| 764 | } | 768 | } |
| 765 | case VLOCAL: { /* already in a register */ | 769 | case VLOCAL: { /* already in a register */ |
| 766 | e->u.info = e->u.var.sidx; | 770 | e->u.info = e->u.var.ridx; |
| 767 | e->k = VNONRELOC; /* becomes a non-relocatable value */ | 771 | e->k = VNONRELOC; /* becomes a non-relocatable value */ |
| 768 | break; | 772 | break; |
| 769 | } | 773 | } |
| @@ -805,8 +809,8 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) { | |||
| 805 | 809 | ||
| 806 | 810 | ||
| 807 | /* | 811 | /* |
| 808 | ** Ensures expression value is in register 'reg' (and therefore | 812 | ** Ensure expression value is in register 'reg', making 'e' a |
| 809 | ** 'e' will become a non-relocatable expression). | 813 | ** non-relocatable expression. |
| 810 | ** (Expression still may have jump lists.) | 814 | ** (Expression still may have jump lists.) |
| 811 | */ | 815 | */ |
| 812 | static void discharge2reg (FuncState *fs, expdesc *e, int reg) { | 816 | static void discharge2reg (FuncState *fs, expdesc *e, int reg) { |
| @@ -860,7 +864,8 @@ static void discharge2reg (FuncState *fs, expdesc *e, int reg) { | |||
| 860 | 864 | ||
| 861 | 865 | ||
| 862 | /* | 866 | /* |
| 863 | ** Ensures expression value is in any register. | 867 | ** Ensure expression value is in a register, making 'e' a |
| 868 | ** non-relocatable expression. | ||
| 864 | ** (Expression still may have jump lists.) | 869 | ** (Expression still may have jump lists.) |
| 865 | */ | 870 | */ |
| 866 | static void discharge2anyreg (FuncState *fs, expdesc *e) { | 871 | static void discharge2anyreg (FuncState *fs, expdesc *e) { |
| @@ -946,8 +951,11 @@ int luaK_exp2anyreg (FuncState *fs, expdesc *e) { | |||
| 946 | exp2reg(fs, e, e->u.info); /* put final result in it */ | 951 | exp2reg(fs, e, e->u.info); /* put final result in it */ |
| 947 | return e->u.info; | 952 | return e->u.info; |
| 948 | } | 953 | } |
| 954 | /* else expression has jumps and cannot change its register | ||
| 955 | to hold the jump values, because it is a local variable. | ||
| 956 | Go through to the default case. */ | ||
| 949 | } | 957 | } |
| 950 | luaK_exp2nextreg(fs, e); /* otherwise, use next available register */ | 958 | luaK_exp2nextreg(fs, e); /* default: use next available register */ |
| 951 | return e->u.info; | 959 | return e->u.info; |
| 952 | } | 960 | } |
| 953 | 961 | ||
| @@ -1032,7 +1040,7 @@ void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { | |||
| 1032 | switch (var->k) { | 1040 | switch (var->k) { |
| 1033 | case VLOCAL: { | 1041 | case VLOCAL: { |
| 1034 | freeexp(fs, ex); | 1042 | freeexp(fs, ex); |
| 1035 | exp2reg(fs, ex, var->u.var.sidx); /* compute 'ex' into proper place */ | 1043 | exp2reg(fs, ex, var->u.var.ridx); /* compute 'ex' into proper place */ |
| 1036 | return; | 1044 | return; |
| 1037 | } | 1045 | } |
| 1038 | case VUPVAL: { | 1046 | case VUPVAL: { |
| @@ -1272,7 +1280,7 @@ void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { | |||
| 1272 | } | 1280 | } |
| 1273 | else { | 1281 | else { |
| 1274 | /* register index of the table */ | 1282 | /* register index of the table */ |
| 1275 | t->u.ind.t = (t->k == VLOCAL) ? t->u.var.sidx: t->u.info; | 1283 | t->u.ind.t = (t->k == VLOCAL) ? t->u.var.ridx: t->u.info; |
| 1276 | if (isKstr(fs, k)) { | 1284 | if (isKstr(fs, k)) { |
| 1277 | t->u.ind.idx = k->u.info; /* literal string */ | 1285 | t->u.ind.idx = k->u.info; /* literal string */ |
| 1278 | t->k = VINDEXSTR; | 1286 | t->k = VINDEXSTR; |
