From: Mike Pall Date: Wed, 11 Feb 2026 22:12:53 +0000 (+0100) Subject: Avoid recording interference due to invocation of VM hooks. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab834de8b6a963a83046a72b5a7751dcd6cdcff0;p=thirdparty%2FLuaJIT.git Avoid recording interference due to invocation of VM hooks. Thanks to Sergey Kaplun. #1429 #1434 --- diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c index 1e55c48a..636fb033 100644 --- a/src/lj_dispatch.c +++ b/src/lj_dispatch.c @@ -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 diff --git a/src/lj_trace.c b/src/lj_trace.c index 1f3686a3..e55045f4 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c @@ -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); }