diff options
author | Mike Pall <mike> | 2015-01-03 15:04:38 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2015-01-03 15:04:38 +0100 |
commit | 054e6abe37450344e20b373ec326055071029e9b (patch) | |
tree | d3abbe61e643f4f59797d2aea24cc3a0643df53b /src/lj_parse.c | |
parent | a13dfd66c3427f9cc94044f261a526042b0d02f5 (diff) | |
download | luajit-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.c | 14 |
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); |