1*088332b5SXin Li /* 2*088332b5SXin Li ** $Id: lfunc.h $ 3*088332b5SXin Li ** Auxiliary functions to manipulate prototypes and closures 4*088332b5SXin Li ** See Copyright Notice in lua.h 5*088332b5SXin Li */ 6*088332b5SXin Li 7*088332b5SXin Li #ifndef lfunc_h 8*088332b5SXin Li #define lfunc_h 9*088332b5SXin Li 10*088332b5SXin Li 11*088332b5SXin Li #include "lobject.h" 12*088332b5SXin Li 13*088332b5SXin Li 14*088332b5SXin Li #define sizeCclosure(n) (cast_int(offsetof(CClosure, upvalue)) + \ 15*088332b5SXin Li cast_int(sizeof(TValue)) * (n)) 16*088332b5SXin Li 17*088332b5SXin Li #define sizeLclosure(n) (cast_int(offsetof(LClosure, upvals)) + \ 18*088332b5SXin Li cast_int(sizeof(TValue *)) * (n)) 19*088332b5SXin Li 20*088332b5SXin Li 21*088332b5SXin Li /* test whether thread is in 'twups' list */ 22*088332b5SXin Li #define isintwups(L) (L->twups != L) 23*088332b5SXin Li 24*088332b5SXin Li 25*088332b5SXin Li /* 26*088332b5SXin Li ** maximum number of upvalues in a closure (both C and Lua). (Value 27*088332b5SXin Li ** must fit in a VM register.) 28*088332b5SXin Li */ 29*088332b5SXin Li #define MAXUPVAL 255 30*088332b5SXin Li 31*088332b5SXin Li 32*088332b5SXin Li #define upisopen(up) ((up)->v != &(up)->u.value) 33*088332b5SXin Li 34*088332b5SXin Li 35*088332b5SXin Li #define uplevel(up) check_exp(upisopen(up), cast(StkId, (up)->v)) 36*088332b5SXin Li 37*088332b5SXin Li 38*088332b5SXin Li /* 39*088332b5SXin Li ** maximum number of misses before giving up the cache of closures 40*088332b5SXin Li ** in prototypes 41*088332b5SXin Li */ 42*088332b5SXin Li #define MAXMISS 10 43*088332b5SXin Li 44*088332b5SXin Li 45*088332b5SXin Li /* 46*088332b5SXin Li ** Special "status" for 'luaF_close' 47*088332b5SXin Li */ 48*088332b5SXin Li 49*088332b5SXin Li /* close upvalues without running their closing methods */ 50*088332b5SXin Li #define NOCLOSINGMETH (-1) 51*088332b5SXin Li 52*088332b5SXin Li /* close upvalues running all closing methods in protected mode */ 53*088332b5SXin Li #define CLOSEPROTECT (-2) 54*088332b5SXin Li 55*088332b5SXin Li 56*088332b5SXin Li LUAI_FUNC Proto *luaF_newproto (lua_State *L); 57*088332b5SXin Li LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nupvals); 58*088332b5SXin Li LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nupvals); 59*088332b5SXin Li LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); 60*088332b5SXin Li LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); 61*088332b5SXin Li LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level); 62*088332b5SXin Li LUAI_FUNC int luaF_close (lua_State *L, StkId level, int status); 63*088332b5SXin Li LUAI_FUNC void luaF_unlinkupval (UpVal *uv); 64*088332b5SXin Li LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); 65*088332b5SXin Li LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, 66*088332b5SXin Li int pc); 67*088332b5SXin Li 68*088332b5SXin Li 69*088332b5SXin Li #endif 70