diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_trace.c | 22 |
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 | } |