diff options
Diffstat (limited to 'src/lj_trace.c')
-rw-r--r-- | src/lj_trace.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/src/lj_trace.c b/src/lj_trace.c index f7b12068..d2e5a09c 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c | |||
@@ -671,7 +671,7 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) | |||
671 | exd.exptr = exptr; | 671 | exd.exptr = exptr; |
672 | errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); | 672 | errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); |
673 | if (errcode) | 673 | if (errcode) |
674 | return errcode; | 674 | return -errcode; /* Return negated error code. */ |
675 | 675 | ||
676 | lj_vmevent_send(L, TEXIT, | 676 | lj_vmevent_send(L, TEXIT, |
677 | ExitState *ex = (ExitState *)exptr; | 677 | ExitState *ex = (ExitState *)exptr; |
@@ -694,8 +694,7 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) | |||
694 | pc = exd.pc; | 694 | pc = exd.pc; |
695 | trace_hotside(J, pc); | 695 | trace_hotside(J, pc); |
696 | cf = cframe_raw(L->cframe); | 696 | cf = cframe_raw(L->cframe); |
697 | switch (bc_op(*pc)) { | 697 | if (bc_op(*pc) == BC_JLOOP) { |
698 | case BC_JLOOP: { | ||
699 | BCIns *retpc = &J->trace[bc_d(*pc)]->startins; | 698 | BCIns *retpc = &J->trace[bc_d(*pc)]->startins; |
700 | if (bc_isret(bc_op(*retpc))) { | 699 | if (bc_isret(bc_op(*retpc))) { |
701 | if (J->state == LJ_TRACE_RECORD) { | 700 | if (J->state == LJ_TRACE_RECORD) { |
@@ -706,22 +705,19 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) | |||
706 | pc = retpc; | 705 | pc = retpc; |
707 | } | 706 | } |
708 | } | 707 | } |
709 | break; | 708 | } |
710 | } | 709 | setcframe_pc(cf, pc); |
710 | /* Return MULTRES or 0. */ | ||
711 | switch (bc_op(*pc)) { | ||
711 | case BC_CALLM: case BC_CALLMT: | 712 | case BC_CALLM: case BC_CALLMT: |
712 | cframe_multres(cf) = (BCReg)(L->top - L->base) - bc_a(*pc) - bc_c(*pc); | 713 | return (int)((BCReg)(L->top - L->base) - bc_a(*pc) - bc_c(*pc)); |
713 | break; | ||
714 | case BC_RETM: | 714 | case BC_RETM: |
715 | cframe_multres(cf) = (BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc); | 715 | return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc)); |
716 | break; | ||
717 | case BC_TSETM: | 716 | case BC_TSETM: |
718 | cframe_multres(cf) = (BCReg)(L->top - L->base) + 1 - bc_a(*pc); | 717 | return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc)); |
719 | break; | ||
720 | default: | 718 | default: |
721 | break; | 719 | return 0; |
722 | } | 720 | } |
723 | setcframe_pc(cf, pc); | ||
724 | return 0; | ||
725 | } | 721 | } |
726 | 722 | ||
727 | #endif | 723 | #endif |