diff options
Diffstat (limited to 'lcode.c')
-rw-r--r-- | lcode.c | 35 |
1 files changed, 25 insertions, 10 deletions
@@ -81,9 +81,8 @@ int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v) { | |||
81 | case VNIL: | 81 | case VNIL: |
82 | setnilvalue(v); | 82 | setnilvalue(v); |
83 | return 1; | 83 | return 1; |
84 | case VK: { | 84 | case VKSTR: { |
85 | TValue *k = &fs->f->k[e->u.info]; | 85 | setsvalue(fs->ls->L, v, e->u.strval); |
86 | setobj(fs->ls->L, v, k); | ||
87 | return 1; | 86 | return 1; |
88 | } | 87 | } |
89 | default: return tonumeral(e, v); | 88 | default: return tonumeral(e, v); |
@@ -561,7 +560,7 @@ static int addk (FuncState *fs, TValue *key, TValue *v) { | |||
561 | /* | 560 | /* |
562 | ** Add a string to list of constants and return its index. | 561 | ** Add a string to list of constants and return its index. |
563 | */ | 562 | */ |
564 | int luaK_stringK (FuncState *fs, TString *s) { | 563 | static int stringK (FuncState *fs, TString *s) { |
565 | TValue o; | 564 | TValue o; |
566 | setsvalue(fs->ls->L, &o, s); | 565 | setsvalue(fs->ls->L, &o, s); |
567 | return addk(fs, &o, &o); /* use string itself as key */ | 566 | return addk(fs, &o, &o); /* use string itself as key */ |
@@ -656,7 +655,7 @@ static void luaK_float (FuncState *fs, int reg, lua_Number f) { | |||
656 | /* | 655 | /* |
657 | ** Convert a constant in 'v' into an expression description 'e' | 656 | ** Convert a constant in 'v' into an expression description 'e' |
658 | */ | 657 | */ |
659 | static void const2exp (FuncState *fs, TValue *v, expdesc *e) { | 658 | static void const2exp (TValue *v, expdesc *e) { |
660 | switch (ttypetag(v)) { | 659 | switch (ttypetag(v)) { |
661 | case LUA_TNUMINT: | 660 | case LUA_TNUMINT: |
662 | e->k = VKINT; e->u.ival = ivalue(v); | 661 | e->k = VKINT; e->u.ival = ivalue(v); |
@@ -671,7 +670,7 @@ static void const2exp (FuncState *fs, TValue *v, expdesc *e) { | |||
671 | e->k = VNIL; | 670 | e->k = VNIL; |
672 | break; | 671 | break; |
673 | case LUA_TSHRSTR: case LUA_TLNGSTR: | 672 | case LUA_TSHRSTR: case LUA_TLNGSTR: |
674 | e->k = VK; e->u.info = luaK_stringK(fs, tsvalue(v)); | 673 | e->k = VKSTR; e->u.strval = tsvalue(v); |
675 | break; | 674 | break; |
676 | default: lua_assert(0); | 675 | default: lua_assert(0); |
677 | } | 676 | } |
@@ -697,6 +696,16 @@ void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { | |||
697 | 696 | ||
698 | 697 | ||
699 | /* | 698 | /* |
699 | ** Convert a VKSTR to a VK | ||
700 | */ | ||
701 | static void str2K (FuncState *fs, expdesc *e) { | ||
702 | lua_assert(e->k == VKSTR); | ||
703 | e->u.info = stringK(fs, e->u.strval); | ||
704 | e->k = VK; | ||
705 | } | ||
706 | |||
707 | |||
708 | /* | ||
700 | ** Fix an expression to return one result. | 709 | ** Fix an expression to return one result. |
701 | ** If expression is not a multi-ret expression (function call or | 710 | ** If expression is not a multi-ret expression (function call or |
702 | ** vararg), it already returns one result, so nothing needs to be done. | 711 | ** vararg), it already returns one result, so nothing needs to be done. |
@@ -728,7 +737,7 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) { | |||
728 | switch (e->k) { | 737 | switch (e->k) { |
729 | case VCONST: { | 738 | case VCONST: { |
730 | TValue *val = &fs->ls->dyd->actvar.arr[e->u.info].k; | 739 | TValue *val = &fs->ls->dyd->actvar.arr[e->u.info].k; |
731 | const2exp(fs, val, e); | 740 | const2exp(val, e); |
732 | break; | 741 | break; |
733 | } | 742 | } |
734 | case VLOCAL: { /* already in a register */ | 743 | case VLOCAL: { /* already in a register */ |
@@ -789,6 +798,9 @@ static void discharge2reg (FuncState *fs, expdesc *e, int reg) { | |||
789 | luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0); | 798 | luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0); |
790 | break; | 799 | break; |
791 | } | 800 | } |
801 | case VKSTR: { | ||
802 | str2K(fs, e); | ||
803 | } /* FALLTHROUGH */ | ||
792 | case VK: { | 804 | case VK: { |
793 | luaK_codek(fs, reg, e->u.info); | 805 | luaK_codek(fs, reg, e->u.info); |
794 | break; | 806 | break; |
@@ -949,6 +961,7 @@ static int luaK_exp2K (FuncState *fs, expdesc *e) { | |||
949 | case VNIL: info = nilK(fs); break; | 961 | case VNIL: info = nilK(fs); break; |
950 | case VKINT: info = luaK_intK(fs, e->u.ival); break; | 962 | case VKINT: info = luaK_intK(fs, e->u.ival); break; |
951 | case VKFLT: info = luaK_numberK(fs, e->u.nval); break; | 963 | case VKFLT: info = luaK_numberK(fs, e->u.nval); break; |
964 | case VKSTR: info = stringK(fs, e->u.strval); break; | ||
952 | case VK: info = e->u.info; break; | 965 | case VK: info = e->u.info; break; |
953 | default: return 0; /* not a constant */ | 966 | default: return 0; /* not a constant */ |
954 | } | 967 | } |
@@ -1083,7 +1096,7 @@ void luaK_goiftrue (FuncState *fs, expdesc *e) { | |||
1083 | pc = e->u.info; /* save jump position */ | 1096 | pc = e->u.info; /* save jump position */ |
1084 | break; | 1097 | break; |
1085 | } | 1098 | } |
1086 | case VK: case VKFLT: case VKINT: case VTRUE: { | 1099 | case VK: case VKFLT: case VKINT: case VKSTR: case VTRUE: { |
1087 | pc = NO_JUMP; /* always true; do nothing */ | 1100 | pc = NO_JUMP; /* always true; do nothing */ |
1088 | break; | 1101 | break; |
1089 | } | 1102 | } |
@@ -1133,7 +1146,7 @@ static void codenot (FuncState *fs, expdesc *e) { | |||
1133 | e->k = VTRUE; /* true == not nil == not false */ | 1146 | e->k = VTRUE; /* true == not nil == not false */ |
1134 | break; | 1147 | break; |
1135 | } | 1148 | } |
1136 | case VK: case VKFLT: case VKINT: case VTRUE: { | 1149 | case VK: case VKFLT: case VKINT: case VKSTR: case VTRUE: { |
1137 | e->k = VFALSE; /* false == not "x" == not 0.5 == not 1 == not true */ | 1150 | e->k = VFALSE; /* false == not "x" == not 0.5 == not 1 == not true */ |
1138 | break; | 1151 | break; |
1139 | } | 1152 | } |
@@ -1219,9 +1232,11 @@ static int isSCnumber (expdesc *e, lua_Integer *i, int *isfloat) { | |||
1219 | ** values in registers. | 1232 | ** values in registers. |
1220 | */ | 1233 | */ |
1221 | void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { | 1234 | void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { |
1235 | if (k->k == VKSTR) | ||
1236 | str2K(fs, k); | ||
1222 | lua_assert(!hasjumps(t) && | 1237 | lua_assert(!hasjumps(t) && |
1223 | (t->k == VLOCAL || t->k == VNONRELOC || t->k == VUPVAL)); | 1238 | (t->k == VLOCAL || t->k == VNONRELOC || t->k == VUPVAL)); |
1224 | if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non string? */ | 1239 | if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non 'Kstr'? */ |
1225 | luaK_exp2anyreg(fs, t); /* put it in a register */ | 1240 | luaK_exp2anyreg(fs, t); /* put it in a register */ |
1226 | if (t->k == VUPVAL) { | 1241 | if (t->k == VUPVAL) { |
1227 | t->u.ind.t = t->u.info; /* upvalue index */ | 1242 | t->u.ind.t = t->u.info; /* upvalue index */ |