diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_parse.c | 28 |
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. */ |
668 | static void bcemit_method(FuncState *fs, ExpDesc *e, ExpDesc *key) | 668 | static 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); |