18e3e3a7aSWarner Losh /* 2*0495ed39SKyle Evans ** $Id: lfunc.h $ 38e3e3a7aSWarner Losh ** Auxiliary functions to manipulate prototypes and closures 48e3e3a7aSWarner Losh ** See Copyright Notice in lua.h 58e3e3a7aSWarner Losh */ 68e3e3a7aSWarner Losh 78e3e3a7aSWarner Losh #ifndef lfunc_h 88e3e3a7aSWarner Losh #define lfunc_h 98e3e3a7aSWarner Losh 108e3e3a7aSWarner Losh 118e3e3a7aSWarner Losh #include "lobject.h" 128e3e3a7aSWarner Losh 138e3e3a7aSWarner Losh 14*0495ed39SKyle Evans #define sizeCclosure(n) (cast_int(offsetof(CClosure, upvalue)) + \ 15*0495ed39SKyle Evans cast_int(sizeof(TValue)) * (n)) 168e3e3a7aSWarner Losh 17*0495ed39SKyle Evans #define sizeLclosure(n) (cast_int(offsetof(LClosure, upvals)) + \ 18*0495ed39SKyle Evans cast_int(sizeof(TValue *)) * (n)) 198e3e3a7aSWarner Losh 208e3e3a7aSWarner Losh 218e3e3a7aSWarner Losh /* test whether thread is in 'twups' list */ 228e3e3a7aSWarner Losh #define isintwups(L) (L->twups != L) 238e3e3a7aSWarner Losh 248e3e3a7aSWarner Losh 258e3e3a7aSWarner Losh /* 268e3e3a7aSWarner Losh ** maximum number of upvalues in a closure (both C and Lua). (Value 278e3e3a7aSWarner Losh ** must fit in a VM register.) 288e3e3a7aSWarner Losh */ 298e3e3a7aSWarner Losh #define MAXUPVAL 255 308e3e3a7aSWarner Losh 318e3e3a7aSWarner Losh 328e3e3a7aSWarner Losh #define upisopen(up) ((up)->v != &(up)->u.value) 338e3e3a7aSWarner Losh 348e3e3a7aSWarner Losh 35*0495ed39SKyle Evans #define uplevel(up) check_exp(upisopen(up), cast(StkId, (up)->v)) 36*0495ed39SKyle Evans 37*0495ed39SKyle Evans 38*0495ed39SKyle Evans /* 39*0495ed39SKyle Evans ** maximum number of misses before giving up the cache of closures 40*0495ed39SKyle Evans ** in prototypes 41*0495ed39SKyle Evans */ 42*0495ed39SKyle Evans #define MAXMISS 10 43*0495ed39SKyle Evans 44*0495ed39SKyle Evans 45*0495ed39SKyle Evans /* 46*0495ed39SKyle Evans ** Special "status" for 'luaF_close' 47*0495ed39SKyle Evans */ 48*0495ed39SKyle Evans 49*0495ed39SKyle Evans /* close upvalues without running their closing methods */ 50*0495ed39SKyle Evans #define NOCLOSINGMETH (-1) 51*0495ed39SKyle Evans 52*0495ed39SKyle Evans /* close upvalues running all closing methods in protected mode */ 53*0495ed39SKyle Evans #define CLOSEPROTECT (-2) 54*0495ed39SKyle Evans 55*0495ed39SKyle Evans 568e3e3a7aSWarner Losh LUAI_FUNC Proto *luaF_newproto (lua_State *L); 57*0495ed39SKyle Evans LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nupvals); 58*0495ed39SKyle Evans LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nupvals); 598e3e3a7aSWarner Losh LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); 608e3e3a7aSWarner Losh LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); 61*0495ed39SKyle Evans LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level); 62*0495ed39SKyle Evans LUAI_FUNC int luaF_close (lua_State *L, StkId level, int status); 63*0495ed39SKyle Evans LUAI_FUNC void luaF_unlinkupval (UpVal *uv); 648e3e3a7aSWarner Losh LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); 658e3e3a7aSWarner Losh LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, 668e3e3a7aSWarner Losh int pc); 678e3e3a7aSWarner Losh 688e3e3a7aSWarner Losh 698e3e3a7aSWarner Losh #endif 70