summaryrefslogtreecommitdiff
path: root/src/lj_trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_trace.c')
-rw-r--r--src/lj_trace.c24
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