lj_vmevent.h 1.6 KB

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