lj_lib.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. ** Library function support.
  3. ** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
  4. */
  5. #ifndef _LJ_LIB_H
  6. #define _LJ_LIB_H
  7. #include "lj_obj.h"
  8. /*
  9. ** A fallback handler is called by the assembler VM if the fast path fails:
  10. **
  11. ** - too few arguments: unrecoverable.
  12. ** - wrong argument type: recoverable, if coercion succeeds.
  13. ** - bad argument value: unrecoverable.
  14. ** - stack overflow: recoverable, if stack reallocation succeeds.
  15. ** - extra handling: recoverable.
  16. **
  17. ** The unrecoverable cases throw an error with lj_err_arg(), lj_err_argtype(),
  18. ** lj_err_caller() or lj_err_callermsg().
  19. ** The recoverable cases return 0 or the number of results + 1.
  20. ** The assembler VM retries the fast path only if 0 is returned.
  21. ** This time the fallback must not be called again or it gets stuck in a loop.
  22. */
  23. /* Return values from fallback handler. */
  24. #define FFH_RETRY 0
  25. #define FFH_UNREACHABLE FFH_RETRY
  26. #define FFH_RES(n) ((n)+1)
  27. #define FFH_TAILCALL (-1)
  28. LJ_FUNC TValue *lj_lib_checkany(lua_State *L, int narg);
  29. LJ_FUNC GCstr *lj_lib_checkstr(lua_State *L, int narg);
  30. LJ_FUNC GCstr *lj_lib_optstr(lua_State *L, int narg);
  31. #if LJ_DUALNUM
  32. LJ_FUNC void lj_lib_checknumber(lua_State *L, int narg);
  33. #else
  34. #define lj_lib_checknumber(L, narg) lj_lib_checknum((L), (narg))
  35. #endif
  36. LJ_FUNC lua_Number lj_lib_checknum(lua_State *L, int narg);
  37. LJ_FUNC int32_t lj_lib_checkint(lua_State *L, int narg);
  38. LJ_FUNC int32_t lj_lib_optint(lua_State *L, int narg, int32_t def);
  39. LJ_FUNC GCfunc *lj_lib_checkfunc(lua_State *L, int narg);
  40. LJ_FUNC GCproto *lj_lib_checkLproto(lua_State *L, int narg, int nolua);
  41. LJ_FUNC GCtab *lj_lib_checktab(lua_State *L, int narg);
  42. LJ_FUNC GCtab *lj_lib_checktabornil(lua_State *L, int narg);
  43. LJ_FUNC int lj_lib_checkopt(lua_State *L, int narg, int def, const char *lst);
  44. #if LJ_HASBUFFER
  45. LJ_FUNC GCstr *lj_lib_checkstrx(lua_State *L, int narg);
  46. LJ_FUNC int32_t lj_lib_checkintrange(lua_State *L, int narg,
  47. int32_t a, int32_t b);
  48. #endif
  49. /* Avoid including lj_frame.h. */
  50. #if LJ_GC64
  51. #define lj_lib_upvalue(L, n) \
  52. (&gcval(L->base-2)->fn.c.upvalue[(n)-1])
  53. #elif LJ_FR2
  54. #define lj_lib_upvalue(L, n) \
  55. (&gcref((L->base-2)->gcr)->fn.c.upvalue[(n)-1])
  56. #else
  57. #define lj_lib_upvalue(L, n) \
  58. (&gcref((L->base-1)->fr.func)->fn.c.upvalue[(n)-1])
  59. #endif
  60. #if LJ_TARGET_WINDOWS
  61. #define lj_lib_checkfpu(L) \
  62. do { setnumV(L->top++, (lua_Number)1437217655); \
  63. if (lua_tointeger(L, -1) != 1437217655) lj_err_caller(L, LJ_ERR_BADFPU); \
  64. L->top--; } while (0)
  65. #else
  66. #define lj_lib_checkfpu(L) UNUSED(L)
  67. #endif
  68. LJ_FUNC GCfunc *lj_lib_pushcc(lua_State *L, lua_CFunction f, int id, int n);
  69. #define lj_lib_pushcf(L, fn, id) (lj_lib_pushcc(L, (fn), (id), 0))
  70. /* Library function declarations. Scanned by buildvm. */
  71. #define LJLIB_CF(name) static int lj_cf_##name(lua_State *L)
  72. #define LJLIB_ASM(name) static int lj_ffh_##name(lua_State *L)
  73. #define LJLIB_ASM_(name)
  74. #define LJLIB_LUA(name)
  75. #define LJLIB_SET(name)
  76. #define LJLIB_PUSH(arg)
  77. #define LJLIB_REC(handler)
  78. #define LJLIB_NOREGUV
  79. #define LJLIB_NOREG
  80. #define LJ_LIB_REG(L, regname, name) \
  81. lj_lib_register(L, regname, lj_lib_init_##name, lj_lib_cf_##name)
  82. LJ_FUNC void lj_lib_register(lua_State *L, const char *libname,
  83. const uint8_t *init, const lua_CFunction *cf);
  84. LJ_FUNC void lj_lib_prereg(lua_State *L, const char *name, lua_CFunction f,
  85. GCtab *env);
  86. LJ_FUNC int lj_lib_postreg(lua_State *L, lua_CFunction cf, int id,
  87. const char *name);
  88. /* Library init data tags. */
  89. #define LIBINIT_LENMASK 0x3f
  90. #define LIBINIT_TAGMASK 0xc0
  91. #define LIBINIT_CF 0x00
  92. #define LIBINIT_ASM 0x40
  93. #define LIBINIT_ASM_ 0x80
  94. #define LIBINIT_STRING 0xc0
  95. #define LIBINIT_MAXSTR 0x38
  96. #define LIBINIT_LUA 0xf9
  97. #define LIBINIT_SET 0xfa
  98. #define LIBINIT_NUMBER 0xfb
  99. #define LIBINIT_COPY 0xfc
  100. #define LIBINIT_LASTCL 0xfd
  101. #define LIBINIT_FFID 0xfe
  102. #define LIBINIT_END 0xff
  103. #endif