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.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/lj_trace.c b/src/lj_trace.c
index 246dc03c..f7b12068 100644
--- a/src/lj_trace.c
+++ b/src/lj_trace.c
@@ -666,6 +666,7 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
666 ExitDataCP exd; 666 ExitDataCP exd;
667 int errcode; 667 int errcode;
668 const BCIns *pc; 668 const BCIns *pc;
669 void *cf;
669 exd.J = J; 670 exd.J = J;
670 exd.exptr = exptr; 671 exd.exptr = exptr;
671 errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); 672 errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp);
@@ -692,7 +693,9 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
692 693
693 pc = exd.pc; 694 pc = exd.pc;
694 trace_hotside(J, pc); 695 trace_hotside(J, pc);
695 if (bc_op(*pc) == BC_JLOOP) { 696 cf = cframe_raw(L->cframe);
697 switch (bc_op(*pc)) {
698 case BC_JLOOP: {
696 BCIns *retpc = &J->trace[bc_d(*pc)]->startins; 699 BCIns *retpc = &J->trace[bc_d(*pc)]->startins;
697 if (bc_isret(bc_op(*retpc))) { 700 if (bc_isret(bc_op(*retpc))) {
698 if (J->state == LJ_TRACE_RECORD) { 701 if (J->state == LJ_TRACE_RECORD) {
@@ -703,8 +706,21 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
703 pc = retpc; 706 pc = retpc;
704 } 707 }
705 } 708 }
709 break;
710 }
711 case BC_CALLM: case BC_CALLMT:
712 cframe_multres(cf) = (BCReg)(L->top - L->base) - bc_a(*pc) - bc_c(*pc);
713 break;
714 case BC_RETM:
715 cframe_multres(cf) = (BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc);
716 break;
717 case BC_TSETM:
718 cframe_multres(cf) = (BCReg)(L->top - L->base) + 1 - bc_a(*pc);
719 break;
720 default:
721 break;
706 } 722 }
707 setcframe_pc(cframe_raw(L->cframe), pc); 723 setcframe_pc(cf, pc);
708 return 0; 724 return 0;
709} 725}
710 726