aboutsummaryrefslogtreecommitdiff
path: root/src/lj_trace.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_trace.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/lj_trace.c b/src/lj_trace.c
index a0ff8864..be886f35 100644
--- a/src/lj_trace.c
+++ b/src/lj_trace.c
@@ -215,8 +215,8 @@ static void trace_unpatch(jit_State *J, GCtrace *T)
215 break; 215 break;
216 case BC_JITERL: 216 case BC_JITERL:
217 case BC_JLOOP: 217 case BC_JLOOP:
218 lj_assertJ(op == BC_ITERL || op == BC_LOOP || bc_isret(op), 218 lj_assertJ(op == BC_ITERL || op == BC_ITERN || op == BC_LOOP ||
219 "bad original bytecode %d", op); 219 bc_isret(op), "bad original bytecode %d", op);
220 *pc = T->startins; 220 *pc = T->startins;
221 break; 221 break;
222 case BC_JMP: 222 case BC_JMP:
@@ -411,7 +411,7 @@ static void trace_start(jit_State *J)
411 TraceNo traceno; 411 TraceNo traceno;
412 412
413 if ((J->pt->flags & PROTO_NOJIT)) { /* JIT disabled for this proto? */ 413 if ((J->pt->flags & PROTO_NOJIT)) { /* JIT disabled for this proto? */
414 if (J->parent == 0 && J->exitno == 0) { 414 if (J->parent == 0 && J->exitno == 0 && bc_op(*J->pc) != BC_ITERN) {
415 /* Lazy bytecode patching to disable hotcount events. */ 415 /* Lazy bytecode patching to disable hotcount events. */
416 lj_assertJ(bc_op(*J->pc) == BC_FORL || bc_op(*J->pc) == BC_ITERL || 416 lj_assertJ(bc_op(*J->pc) == BC_FORL || bc_op(*J->pc) == BC_ITERL ||
417 bc_op(*J->pc) == BC_LOOP || bc_op(*J->pc) == BC_FUNCF, 417 bc_op(*J->pc) == BC_LOOP || bc_op(*J->pc) == BC_FUNCF,
@@ -496,6 +496,7 @@ static void trace_stop(jit_State *J)
496 J->cur.nextroot = pt->trace; 496 J->cur.nextroot = pt->trace;
497 pt->trace = (TraceNo1)traceno; 497 pt->trace = (TraceNo1)traceno;
498 break; 498 break;
499 case BC_ITERN:
499 case BC_RET: 500 case BC_RET:
500 case BC_RET0: 501 case BC_RET0:
501 case BC_RET1: 502 case BC_RET1:
@@ -575,7 +576,8 @@ static int trace_abort(jit_State *J)
575 return 1; /* Retry ASM with new MCode area. */ 576 return 1; /* Retry ASM with new MCode area. */
576 } 577 }
577 /* Penalize or blacklist starting bytecode instruction. */ 578 /* Penalize or blacklist starting bytecode instruction. */
578 if (J->parent == 0 && !bc_isret(bc_op(J->cur.startins))) { 579 if (J->parent == 0 && !bc_isret(bc_op(J->cur.startins)) &&
580 bc_op(J->cur.startins) != BC_ITERN) {
579 if (J->exitno == 0) { 581 if (J->exitno == 0) {
580 BCIns *startpc = mref(J->cur.startpc, BCIns); 582 BCIns *startpc = mref(J->cur.startpc, BCIns);
581 if (e == LJ_TRERR_RETRY) 583 if (e == LJ_TRERR_RETRY)
@@ -651,8 +653,13 @@ static TValue *trace_state(lua_State *L, lua_CFunction dummy, void *ud)
651 J->state = LJ_TRACE_RECORD; /* trace_start() may change state. */ 653 J->state = LJ_TRACE_RECORD; /* trace_start() may change state. */
652 trace_start(J); 654 trace_start(J);
653 lj_dispatch_update(J2G(J)); 655 lj_dispatch_update(J2G(J));
654 break; 656 if (J->state != LJ_TRACE_RECORD_1ST)
657 break;
658 /* fallthrough */
655 659
660 case LJ_TRACE_RECORD_1ST:
661 J->state = LJ_TRACE_RECORD;
662 /* fallthrough */
656 case LJ_TRACE_RECORD: 663 case LJ_TRACE_RECORD:
657 trace_pendpatch(J, 0); 664 trace_pendpatch(J, 0);
658 setvmstate(J2G(J), RECORD); 665 setvmstate(J2G(J), RECORD);
@@ -899,13 +906,14 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
899 } 906 }
900 if (bc_op(*pc) == BC_JLOOP) { 907 if (bc_op(*pc) == BC_JLOOP) {
901 BCIns *retpc = &traceref(J, bc_d(*pc))->startins; 908 BCIns *retpc = &traceref(J, bc_d(*pc))->startins;
902 if (bc_isret(bc_op(*retpc))) { 909 int isret = bc_isret(bc_op(*retpc));
910 if (isret || bc_op(*retpc) == BC_ITERN) {
903 if (J->state == LJ_TRACE_RECORD) { 911 if (J->state == LJ_TRACE_RECORD) {
904 J->patchins = *pc; 912 J->patchins = *pc;
905 J->patchpc = (BCIns *)pc; 913 J->patchpc = (BCIns *)pc;
906 *J->patchpc = *retpc; 914 *J->patchpc = *retpc;
907 J->bcskip = 1; 915 J->bcskip = 1;
908 } else { 916 } else if (isret) {
909 pc = retpc; 917 pc = retpc;
910 setcframe_pc(cf, pc); 918 setcframe_pc(cf, pc);
911 } 919 }