1 /*
2 ** VM event handling.
3 ** Copyright (C) 2005-2021 Mike Pall. See Copyright Notice in luajit.h
4 */
5 
6 #ifndef _LJ_VMEVENT_H
7 #define _LJ_VMEVENT_H
8 
9 #include "lj_obj.h"
10 
11 /* Registry key for VM event handler table. */
12 #define LJ_VMEVENTS_REGKEY	"_VMEVENTS"
13 #define LJ_VMEVENTS_HSIZE	4
14 
15 #define VMEVENT_MASK(ev)	((uint8_t)1 << ((int)(ev) & 7))
16 #define VMEVENT_HASH(ev)	((int)(ev) & ~7)
17 #define VMEVENT_HASHIDX(h)	((int)(h) << 3)
18 #define VMEVENT_NOCACHE		255
19 
20 #define VMEVENT_DEF(name, hash) \
21   LJ_VMEVENT_##name##_, \
22   LJ_VMEVENT_##name = ((LJ_VMEVENT_##name##_) & 7)|((hash) << 3)
23 
24 /* VM event IDs. */
25 typedef enum {
26   VMEVENT_DEF(BC,	0x00003883),
27   VMEVENT_DEF(TRACE,	0xb2d91467),
28   VMEVENT_DEF(RECORD,	0x9284bf4f),
29   VMEVENT_DEF(TEXIT,	0xb29df2b0),
30   LJ_VMEVENT__MAX
31 } VMEvent;
32 
33 #ifdef LUAJIT_DISABLE_VMEVENT
34 #define lj_vmevent_send(L, ev, args)		UNUSED(L)
35 #define lj_vmevent_send_(L, ev, args, post)	UNUSED(L)
36 #else
37 #define lj_vmevent_send(L, ev, args) \
38   if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \
39     ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \
40     if (argbase) { \
41       args \
42       lj_vmevent_call(L, argbase); \
43     } \
44   }
45 #define lj_vmevent_send_(L, ev, args, post) \
46   if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \
47     ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \
48     if (argbase) { \
49       args \
50       lj_vmevent_call(L, argbase); \
51       post \
52     } \
53   }
54 
55 LJ_FUNC ptrdiff_t lj_vmevent_prepare(lua_State *L, VMEvent ev);
56 LJ_FUNC void lj_vmevent_call(lua_State *L, ptrdiff_t argbase);
57 #endif
58 
59 #endif
60