src/lj_vmevent.h - luajit-2.0-src

Data types defined

Macros defined

Source code

  1. /*
  2. ** VM event handling.
  3. ** Copyright (C) 2005-2015 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,        0xb2d91467),
  22.   VMEVENT_DEF(RECORD,        0x9284bf4f),
  23.   VMEVENT_DEF(TEXIT,        0xb29df2b0),
  24.   LJ_VMEVENT__MAX
  25. } VMEvent;

  26. #ifdef LUAJIT_DISABLE_VMEVENT
  27. #define lj_vmevent_send(L, ev, args)                UNUSED(L)
  28. #define lj_vmevent_send_(L, ev, args, post)        UNUSED(L)
  29. #else
  30. #define lj_vmevent_send(L, ev, args) \
  31.   if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \
  32.     ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \
  33.     if (argbase) { \
  34.       args \
  35.       lj_vmevent_call(L, argbase); \
  36.     } \
  37.   }
  38. #define lj_vmevent_send_(L, ev, args, post) \
  39.   if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \
  40.     ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \
  41.     if (argbase) { \
  42.       args \
  43.       lj_vmevent_call(L, argbase); \
  44.       post \
  45.     } \
  46.   }

  47. LJ_FUNC ptrdiff_t lj_vmevent_prepare(lua_State *L, VMEvent ev);
  48. LJ_FUNC void lj_vmevent_call(lua_State *L, ptrdiff_t argbase);
  49. #endif

  50. #endif