Avoid recording interference due to invocation of VM hooks.
Thanks to Sergey Kaplun. #1429 #1434
This commit is contained in:
@@ -523,16 +523,18 @@ out:
|
||||
/* Stitch a new trace. */
|
||||
void LJ_FASTCALL lj_dispatch_stitch(jit_State *J, const BCIns *pc)
|
||||
{
|
||||
ERRNO_SAVE
|
||||
lua_State *L = J->L;
|
||||
void *cf = cframe_raw(L->cframe);
|
||||
const BCIns *oldpc = cframe_pc(cf);
|
||||
setcframe_pc(cf, pc);
|
||||
/* Before dispatch, have to bias PC by 1. */
|
||||
L->top = L->base + cur_topslot(curr_proto(L), pc+1, cframe_multres_n(cf));
|
||||
lj_trace_stitch(J, pc-1); /* Point to the CALL instruction. */
|
||||
setcframe_pc(cf, oldpc);
|
||||
ERRNO_RESTORE
|
||||
if (!(J2G(J)->hookmask & HOOK_VMEVENT)) {
|
||||
ERRNO_SAVE
|
||||
lua_State *L = J->L;
|
||||
void *cf = cframe_raw(L->cframe);
|
||||
const BCIns *oldpc = cframe_pc(cf);
|
||||
setcframe_pc(cf, pc);
|
||||
/* Before dispatch, have to bias PC by 1. */
|
||||
L->top = L->base + cur_topslot(curr_proto(L), pc+1, cframe_multres_n(cf));
|
||||
lj_trace_stitch(J, pc-1); /* Point to the CALL instruction. */
|
||||
setcframe_pc(cf, oldpc);
|
||||
ERRNO_RESTORE
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -467,7 +467,11 @@ static void trace_start(jit_State *J)
|
||||
J->ktrace = 0;
|
||||
setgcref(J->cur.startpt, obj2gco(J->pt));
|
||||
|
||||
lj_vmevent_send(J2G(J), TRACE,
|
||||
lj_vmevent_send_(J2G(J), TRACE,
|
||||
TValue savetv = J2G(J)->tmptv;
|
||||
TValue savetv2 = J2G(J)->tmptv2;
|
||||
TraceNo parent = J->parent;
|
||||
ExitNo exitno = J->exitno;
|
||||
setstrV(V, V->top++, lj_str_newlit(V, "start"));
|
||||
setintV(V->top++, traceno);
|
||||
setfuncV(V, V->top++, J->fn);
|
||||
@@ -482,6 +486,11 @@ static void trace_start(jit_State *J)
|
||||
setintV(V->top++, -1);
|
||||
}
|
||||
}
|
||||
,
|
||||
J2G(J)->tmptv = savetv;
|
||||
J2G(J)->tmptv2 = savetv2;
|
||||
J->parent = parent;
|
||||
J->exitno = exitno;
|
||||
);
|
||||
lj_record_setup(J);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user