Run VM events and finalizers in separate state.

Reported by Sergey Kaplun. #1403
This commit is contained in:
Mike Pall
2025-11-10 18:11:26 +01:00
parent fdf2379ccb
commit 5c647754a6
7 changed files with 76 additions and 67 deletions

View File

@@ -32,23 +32,25 @@ typedef enum {
} VMEvent;
#ifdef LUAJIT_DISABLE_VMEVENT
#define lj_vmevent_send(L, ev, args) UNUSED(L)
#define lj_vmevent_send_(L, ev, args, post) UNUSED(L)
#define lj_vmevent_send(g, ev, args) UNUSED(g)
#define lj_vmevent_send_(g, ev, args, post) UNUSED(g)
#else
#define lj_vmevent_send(L, ev, args) \
if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \
ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \
#define lj_vmevent_send(g, ev, args) \
if ((g)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \
lua_State *V = vmthread(g); \
ptrdiff_t argbase = lj_vmevent_prepare(V, LJ_VMEVENT_##ev); \
if (argbase) { \
args \
lj_vmevent_call(L, argbase); \
lj_vmevent_call(V, argbase); \
} \
}
#define lj_vmevent_send_(L, ev, args, post) \
if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \
ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \
#define lj_vmevent_send_(g, ev, args, post) \
if ((g)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \
lua_State *V = vmthread(g); \
ptrdiff_t argbase = lj_vmevent_prepare(V, LJ_VMEVENT_##ev); \
if (argbase) { \
args \
lj_vmevent_call(L, argbase); \
lj_vmevent_call(V, argbase); \
post \
} \
}