diff options
| -rw-r--r-- | src/lj_trace.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/lj_trace.c b/src/lj_trace.c index 7141de46..d83d36e6 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c | |||
| @@ -714,8 +714,14 @@ static TraceNo trace_exit_find(jit_State *J, MCode *pc) | |||
| 714 | TraceNo traceno; | 714 | TraceNo traceno; |
| 715 | for (traceno = 1; traceno < J->sizetrace; traceno++) { | 715 | for (traceno = 1; traceno < J->sizetrace; traceno++) { |
| 716 | GCtrace *T = traceref(J, traceno); | 716 | GCtrace *T = traceref(J, traceno); |
| 717 | if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode)) | 717 | if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode)) { |
| 718 | if (J->exitno == T->nsnap) { /* Treat stack check like a parent exit. */ | ||
| 719 | lua_assert(T->root != 0); | ||
| 720 | traceno = T->ir[REF_BASE].op1; | ||
| 721 | J->exitno = T->ir[REF_BASE].op2; | ||
| 722 | } | ||
| 718 | return traceno; | 723 | return traceno; |
| 724 | } | ||
| 719 | } | 725 | } |
| 720 | lua_assert(0); | 726 | lua_assert(0); |
| 721 | return 0; | 727 | return 0; |
| @@ -735,6 +741,8 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) | |||
| 735 | #ifdef EXITSTATE_PCREG | 741 | #ifdef EXITSTATE_PCREG |
| 736 | J->parent = trace_exit_find(J, (MCode *)(intptr_t)ex->gpr[EXITSTATE_PCREG]); | 742 | J->parent = trace_exit_find(J, (MCode *)(intptr_t)ex->gpr[EXITSTATE_PCREG]); |
| 737 | #endif | 743 | #endif |
| 744 | lua_assert(traceref(J, J->parent) != NULL && | ||
| 745 | J->exitno < traceref(J, J->parent)->nsnap); | ||
| 738 | exd.J = J; | 746 | exd.J = J; |
| 739 | exd.exptr = exptr; | 747 | exd.exptr = exptr; |
| 740 | errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); | 748 | errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); |
