diff options
Diffstat (limited to 'lcode.c')
-rw-r--r-- | lcode.c | 36 |
1 files changed, 21 insertions, 15 deletions
@@ -678,11 +678,12 @@ void luaK_setoneret (FuncState *fs, expdesc *e) { | |||
678 | void luaK_dischargevars (FuncState *fs, expdesc *e) { | 678 | void luaK_dischargevars (FuncState *fs, expdesc *e) { |
679 | switch (e->k) { | 679 | switch (e->k) { |
680 | case VLOCAL: { /* already in a register */ | 680 | case VLOCAL: { /* already in a register */ |
681 | e->u.info = e->u.var.idx; | ||
681 | e->k = VNONRELOC; /* becomes a non-relocatable value */ | 682 | e->k = VNONRELOC; /* becomes a non-relocatable value */ |
682 | break; | 683 | break; |
683 | } | 684 | } |
684 | case VUPVAL: { /* move value to some (pending) register */ | 685 | case VUPVAL: { /* move value to some (pending) register */ |
685 | e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); | 686 | e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.var.idx, 0); |
686 | e->k = VRELOC; | 687 | e->k = VRELOC; |
687 | break; | 688 | break; |
688 | } | 689 | } |
@@ -938,12 +939,12 @@ void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { | |||
938 | switch (var->k) { | 939 | switch (var->k) { |
939 | case VLOCAL: { | 940 | case VLOCAL: { |
940 | freeexp(fs, ex); | 941 | freeexp(fs, ex); |
941 | exp2reg(fs, ex, var->u.info); /* compute 'ex' into proper place */ | 942 | exp2reg(fs, ex, var->u.var.idx); /* compute 'ex' into proper place */ |
942 | return; | 943 | return; |
943 | } | 944 | } |
944 | case VUPVAL: { | 945 | case VUPVAL: { |
945 | int e = luaK_exp2anyreg(fs, ex); | 946 | int e = luaK_exp2anyreg(fs, ex); |
946 | luaK_codeABC(fs, OP_SETUPVAL, e, var->u.info, 0); | 947 | luaK_codeABC(fs, OP_SETUPVAL, e, var->u.var.idx, 0); |
947 | break; | 948 | break; |
948 | } | 949 | } |
949 | case VINDEXUP: { | 950 | case VINDEXUP: { |
@@ -1165,25 +1166,30 @@ static int isSCnumber (expdesc *e, lua_Integer *i, int *isfloat) { | |||
1165 | ** values in registers. | 1166 | ** values in registers. |
1166 | */ | 1167 | */ |
1167 | void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { | 1168 | void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { |
1168 | lua_assert(!hasjumps(t) && (vkisinreg(t->k) || t->k == VUPVAL)); | 1169 | lua_assert(!hasjumps(t) && |
1170 | (t->k == VLOCAL || t->k == VNONRELOC || t->k == VUPVAL)); | ||
1169 | if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non string? */ | 1171 | if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non string? */ |
1170 | luaK_exp2anyreg(fs, t); /* put it in a register */ | 1172 | luaK_exp2anyreg(fs, t); /* put it in a register */ |
1171 | t->u.ind.t = t->u.info; /* register or upvalue index */ | ||
1172 | if (t->k == VUPVAL) { | 1173 | if (t->k == VUPVAL) { |
1174 | t->u.ind.t = t->u.var.idx; /* upvalue index */ | ||
1173 | t->u.ind.idx = k->u.info; /* literal string */ | 1175 | t->u.ind.idx = k->u.info; /* literal string */ |
1174 | t->k = VINDEXUP; | 1176 | t->k = VINDEXUP; |
1175 | } | 1177 | } |
1176 | else if (isKstr(fs, k)) { | ||
1177 | t->u.ind.idx = k->u.info; /* literal string */ | ||
1178 | t->k = VINDEXSTR; | ||
1179 | } | ||
1180 | else if (isCint(k)) { | ||
1181 | t->u.ind.idx = cast_int(k->u.ival); /* integer constant in proper range */ | ||
1182 | t->k = VINDEXI; | ||
1183 | } | ||
1184 | else { | 1178 | else { |
1185 | t->u.ind.idx = luaK_exp2anyreg(fs, k); /* register */ | 1179 | /* register index of the table */ |
1186 | t->k = VINDEXED; | 1180 | t->u.ind.t = (t->k == VLOCAL) ? t->u.var.idx: t->u.info; |
1181 | if (isKstr(fs, k)) { | ||
1182 | t->u.ind.idx = k->u.info; /* literal string */ | ||
1183 | t->k = VINDEXSTR; | ||
1184 | } | ||
1185 | else if (isCint(k)) { | ||
1186 | t->u.ind.idx = cast_int(k->u.ival); /* int. constant in proper range */ | ||
1187 | t->k = VINDEXI; | ||
1188 | } | ||
1189 | else { | ||
1190 | t->u.ind.idx = luaK_exp2anyreg(fs, k); /* register */ | ||
1191 | t->k = VINDEXED; | ||
1192 | } | ||
1187 | } | 1193 | } |
1188 | } | 1194 | } |
1189 | 1195 | ||