summaryrefslogtreecommitdiff
path: root/src/lj_parse.c
diff options
context:
space:
mode:
authorMike Pall <mike>2015-01-03 15:04:38 +0100
committerMike Pall <mike>2015-01-03 15:04:38 +0100
commit054e6abe37450344e20b373ec326055071029e9b (patch)
treed3abbe61e643f4f59797d2aea24cc3a0643df53b /src/lj_parse.c
parenta13dfd66c3427f9cc94044f261a526042b0d02f5 (diff)
downloadluajit-054e6abe37450344e20b373ec326055071029e9b.tar.gz
luajit-054e6abe37450344e20b373ec326055071029e9b.tar.bz2
luajit-054e6abe37450344e20b373ec326055071029e9b.zip
Add LJ_FR2 mode: Two-slot frame info.
Diffstat (limited to 'src/lj_parse.c')
-rw-r--r--src/lj_parse.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/lj_parse.c b/src/lj_parse.c
index 198ddfc9..91282768 100644
--- a/src/lj_parse.c
+++ b/src/lj_parse.c
@@ -662,14 +662,14 @@ static void bcemit_method(FuncState *fs, ExpDesc *e, ExpDesc *key)
662 BCReg idx, func, obj = expr_toanyreg(fs, e); 662 BCReg idx, func, obj = expr_toanyreg(fs, e);
663 expr_free(fs, e); 663 expr_free(fs, e);
664 func = fs->freereg; 664 func = fs->freereg;
665 bcemit_AD(fs, BC_MOV, func+1, obj); /* Copy object to first argument. */ 665 bcemit_AD(fs, BC_MOV, func+1+LJ_FR2, obj); /* Copy object to 1st argument. */
666 lua_assert(expr_isstrk(key)); 666 lua_assert(expr_isstrk(key));
667 idx = const_str(fs, key); 667 idx = const_str(fs, key);
668 if (idx <= BCMAX_C) { 668 if (idx <= BCMAX_C) {
669 bcreg_reserve(fs, 2); 669 bcreg_reserve(fs, 2+LJ_FR2);
670 bcemit_ABC(fs, BC_TGETS, func, obj, idx); 670 bcemit_ABC(fs, BC_TGETS, func, obj, idx);
671 } else { 671 } else {
672 bcreg_reserve(fs, 3); 672 bcreg_reserve(fs, 3+LJ_FR2);
673 bcemit_AD(fs, BC_KSTR, func+2, idx); 673 bcemit_AD(fs, BC_KSTR, func+2, idx);
674 bcemit_ABC(fs, BC_TGETV, func, obj, func+2); 674 bcemit_ABC(fs, BC_TGETV, func, obj, func+2);
675 fs->freereg--; 675 fs->freereg--;
@@ -1913,11 +1913,11 @@ static void parse_args(LexState *ls, ExpDesc *e)
1913 lua_assert(e->k == VNONRELOC); 1913 lua_assert(e->k == VNONRELOC);
1914 base = e->u.s.info; /* Base register for call. */ 1914 base = e->u.s.info; /* Base register for call. */
1915 if (args.k == VCALL) { 1915 if (args.k == VCALL) {
1916 ins = BCINS_ABC(BC_CALLM, base, 2, args.u.s.aux - base - 1); 1916 ins = BCINS_ABC(BC_CALLM, base, 2, args.u.s.aux - base - 1 - LJ_FR2);
1917 } else { 1917 } else {
1918 if (args.k != VVOID) 1918 if (args.k != VVOID)
1919 expr_tonextreg(fs, &args); 1919 expr_tonextreg(fs, &args);
1920 ins = BCINS_ABC(BC_CALL, base, 2, fs->freereg - base); 1920 ins = BCINS_ABC(BC_CALL, base, 2, fs->freereg - base - LJ_FR2);
1921 } 1921 }
1922 expr_init(e, VCALL, bcemit_INS(fs, ins)); 1922 expr_init(e, VCALL, bcemit_INS(fs, ins));
1923 e->u.s.aux = base; 1923 e->u.s.aux = base;
@@ -1957,6 +1957,7 @@ static void expr_primary(LexState *ls, ExpDesc *v)
1957 parse_args(ls, v); 1957 parse_args(ls, v);
1958 } else if (ls->tok == '(' || ls->tok == TK_string || ls->tok == '{') { 1958 } else if (ls->tok == '(' || ls->tok == TK_string || ls->tok == '{') {
1959 expr_tonextreg(fs, v); 1959 expr_tonextreg(fs, v);
1960 if (LJ_FR2) bcreg_reserve(fs, 1);
1960 parse_args(ls, v); 1961 parse_args(ls, v);
1961 } else { 1962 } else {
1962 break; 1963 break;
@@ -2537,7 +2538,8 @@ static void parse_for_iter(LexState *ls, GCstr *indexname)
2537 lex_check(ls, TK_in); 2538 lex_check(ls, TK_in);
2538 line = ls->linenumber; 2539 line = ls->linenumber;
2539 assign_adjust(ls, 3, expr_list(ls, &e), &e); 2540 assign_adjust(ls, 3, expr_list(ls, &e), &e);
2540 bcreg_bump(fs, 3); /* The iterator needs another 3 slots (func + 2 args). */ 2541 /* The iterator needs another 3 [4] slots (func [pc] | state ctl). */
2542 bcreg_bump(fs, 3+LJ_FR2);
2541 isnext = (nvars <= 5 && predict_next(ls, fs, exprpc)); 2543 isnext = (nvars <= 5 && predict_next(ls, fs, exprpc));
2542 var_add(ls, 3); /* Hidden control variables. */ 2544 var_add(ls, 3); /* Hidden control variables. */
2543 lex_check(ls, TK_do); 2545 lex_check(ls, TK_do);