aboutsummaryrefslogtreecommitdiff
path: root/src/lj_parse.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_parse.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/src/lj_parse.c b/src/lj_parse.c
index a30921af..5a44f8db 100644
--- a/src/lj_parse.c
+++ b/src/lj_parse.c
@@ -667,19 +667,20 @@ static void bcemit_store(FuncState *fs, ExpDesc *var, ExpDesc *e)
667/* Emit method lookup expression. */ 667/* Emit method lookup expression. */
668static void bcemit_method(FuncState *fs, ExpDesc *e, ExpDesc *key) 668static void bcemit_method(FuncState *fs, ExpDesc *e, ExpDesc *key)
669{ 669{
670 BCReg idx, func, obj = expr_toanyreg(fs, e); 670 BCReg idx, func, fr2, obj = expr_toanyreg(fs, e);
671 expr_free(fs, e); 671 expr_free(fs, e);
672 func = fs->freereg; 672 func = fs->freereg;
673 bcemit_AD(fs, BC_MOV, func+1+LJ_FR2, obj); /* Copy object to 1st argument. */ 673 fr2 = fs->ls->fr2;
674 bcemit_AD(fs, BC_MOV, func+1+fr2, obj); /* Copy object to 1st argument. */
674 lj_assertFS(expr_isstrk(key), "bad usage"); 675 lj_assertFS(expr_isstrk(key), "bad usage");
675 idx = const_str(fs, key); 676 idx = const_str(fs, key);
676 if (idx <= BCMAX_C) { 677 if (idx <= BCMAX_C) {
677 bcreg_reserve(fs, 2+LJ_FR2); 678 bcreg_reserve(fs, 2+fr2);
678 bcemit_ABC(fs, BC_TGETS, func, obj, idx); 679 bcemit_ABC(fs, BC_TGETS, func, obj, idx);
679 } else { 680 } else {
680 bcreg_reserve(fs, 3+LJ_FR2); 681 bcreg_reserve(fs, 3+fr2);
681 bcemit_AD(fs, BC_KSTR, func+2+LJ_FR2, idx); 682 bcemit_AD(fs, BC_KSTR, func+2+fr2, idx);
682 bcemit_ABC(fs, BC_TGETV, func, obj, func+2+LJ_FR2); 683 bcemit_ABC(fs, BC_TGETV, func, obj, func+2+fr2);
683 fs->freereg--; 684 fs->freereg--;
684 } 685 }
685 e->u.s.info = func; 686 e->u.s.info = func;
@@ -1326,9 +1327,12 @@ static void fs_fixup_bc(FuncState *fs, GCproto *pt, BCIns *bc, MSize n)
1326{ 1327{
1327 BCInsLine *base = fs->bcbase; 1328 BCInsLine *base = fs->bcbase;
1328 MSize i; 1329 MSize i;
1330 BCIns op;
1329 pt->sizebc = n; 1331 pt->sizebc = n;
1330 bc[0] = BCINS_AD((fs->flags & PROTO_VARARG) ? BC_FUNCV : BC_FUNCF, 1332 if (fs->ls->fr2 != LJ_FR2) op = BC_NOT; /* Mark non-native prototype. */
1331 fs->framesize, 0); 1333 else if ((fs->flags & PROTO_VARARG)) op = BC_FUNCV;
1334 else op = BC_FUNCF;
1335 bc[0] = BCINS_AD(op, fs->framesize, 0);
1332 for (i = 1; i < n; i++) 1336 for (i = 1; i < n; i++)
1333 bc[i] = base[i].ins; 1337 bc[i] = base[i].ins;
1334} 1338}
@@ -1936,11 +1940,11 @@ static void parse_args(LexState *ls, ExpDesc *e)
1936 lj_assertFS(e->k == VNONRELOC, "bad expr type %d", e->k); 1940 lj_assertFS(e->k == VNONRELOC, "bad expr type %d", e->k);
1937 base = e->u.s.info; /* Base register for call. */ 1941 base = e->u.s.info; /* Base register for call. */
1938 if (args.k == VCALL) { 1942 if (args.k == VCALL) {
1939 ins = BCINS_ABC(BC_CALLM, base, 2, args.u.s.aux - base - 1 - LJ_FR2); 1943 ins = BCINS_ABC(BC_CALLM, base, 2, args.u.s.aux - base - 1 - ls->fr2);
1940 } else { 1944 } else {
1941 if (args.k != VVOID) 1945 if (args.k != VVOID)
1942 expr_tonextreg(fs, &args); 1946 expr_tonextreg(fs, &args);
1943 ins = BCINS_ABC(BC_CALL, base, 2, fs->freereg - base - LJ_FR2); 1947 ins = BCINS_ABC(BC_CALL, base, 2, fs->freereg - base - ls->fr2);
1944 } 1948 }
1945 expr_init(e, VCALL, bcemit_INS(fs, ins)); 1949 expr_init(e, VCALL, bcemit_INS(fs, ins));
1946 e->u.s.aux = base; 1950 e->u.s.aux = base;
@@ -1980,7 +1984,7 @@ static void expr_primary(LexState *ls, ExpDesc *v)
1980 parse_args(ls, v); 1984 parse_args(ls, v);
1981 } else if (ls->tok == '(' || ls->tok == TK_string || ls->tok == '{') { 1985 } else if (ls->tok == '(' || ls->tok == TK_string || ls->tok == '{') {
1982 expr_tonextreg(fs, v); 1986 expr_tonextreg(fs, v);
1983 if (LJ_FR2) bcreg_reserve(fs, 1); 1987 if (ls->fr2) bcreg_reserve(fs, 1);
1984 parse_args(ls, v); 1988 parse_args(ls, v);
1985 } else { 1989 } else {
1986 break; 1990 break;
@@ -2565,7 +2569,7 @@ static void parse_for_iter(LexState *ls, GCstr *indexname)
2565 line = ls->linenumber; 2569 line = ls->linenumber;
2566 assign_adjust(ls, 3, expr_list(ls, &e), &e); 2570 assign_adjust(ls, 3, expr_list(ls, &e), &e);
2567 /* The iterator needs another 3 [4] slots (func [pc] | state ctl). */ 2571 /* The iterator needs another 3 [4] slots (func [pc] | state ctl). */
2568 bcreg_bump(fs, 3+LJ_FR2); 2572 bcreg_bump(fs, 3+ls->fr2);
2569 isnext = (nvars <= 5 && predict_next(ls, fs, exprpc)); 2573 isnext = (nvars <= 5 && predict_next(ls, fs, exprpc));
2570 var_add(ls, 3); /* Hidden control variables. */ 2574 var_add(ls, 3); /* Hidden control variables. */
2571 lex_check(ls, TK_do); 2575 lex_check(ls, TK_do);