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