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