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