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 | |