1cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* 2cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** $Id: lstate.h,v 2.82 2012/07/02 13:37:04 roberto Exp $ 3cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** Global State 4cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** See Copyright Notice in lua.h 5cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar*/ 6cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 7cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#ifndef lstate_h 8cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define lstate_h 9cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 10cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "lua.h" 11cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 12cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "lobject.h" 13cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ltm.h" 14cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "lzio.h" 15cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 16cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 17cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* 18cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 19cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** Some notes about garbage-collected objects: All objects in Lua must 20cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** be kept somehow accessible until being freed. 21cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** 22cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** Lua keeps most objects linked in list g->allgc. The link uses field 23cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** 'next' of the CommonHeader. 24cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** 25cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** Strings are kept in several lists headed by the array g->strt.hash. 26cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** 27cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** Open upvalues are not subject to independent garbage collection. They 28cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** are collected together with their respective threads. Lua keeps a 29cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** double-linked list with all open upvalues (g->uvhead) so that it can 30cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** mark objects referred by them. (They are always gray, so they must 31cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** be remarked in the atomic step. Usually their contents would be marked 32cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** when traversing the respective threads, but the thread may already be 33cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** dead, while the upvalue is still accessible through closures.) 34cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** 35cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** Objects with finalizers are kept in the list g->finobj. 36cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** 37cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** The list g->tobefnz links all objects being finalized. 38cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 39cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar*/ 40cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 41cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 42cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarstruct lua_longjmp; /* defined in ldo.c */ 43cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 44cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 45cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 46cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* extra stack space to handle TM calls and some other extras */ 47cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define EXTRA_STACK 5 48cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 49cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 50cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define BASIC_STACK_SIZE (2*LUA_MINSTACK) 51cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 52cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 53cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* kinds of Garbage Collection */ 54cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define KGC_NORMAL 0 55cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define KGC_EMERGENCY 1 /* gc was forced by an allocation failure */ 56cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define KGC_GEN 2 /* generational collection */ 57cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 58cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 59cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaartypedef struct stringtable { 60cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject **hash; 61cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_int32 nuse; /* number of elements */ 62cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar int size; 6388364df7b6429fa96bb5130ea73bd40b0629e30eEric Christopher} stringtable; 6488364df7b6429fa96bb5130ea73bd40b0629e30eEric Christopher 6588364df7b6429fa96bb5130ea73bd40b0629e30eEric Christopher 66cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* 67cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** information about a call 68cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar*/ 69cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaartypedef struct CallInfo { 70cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar StkId func; /* function index in the stack */ 71cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar StkId top; /* top for this function */ 72cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar struct CallInfo *previous, *next; /* dynamic call link */ 73cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar short nresults; /* expected number of results from this function */ 74cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_byte callstatus; 75cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar ptrdiff_t extra; 76cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar union { 77cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar struct { /* only for Lua functions */ 78cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar StkId base; /* base for this function */ 79cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar const Instruction *savedpc; 80cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } l; 81cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar struct { /* only for C functions */ 82cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar int ctx; /* context info. in case of yields */ 83cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lua_CFunction k; /* continuation in case of yields */ 84cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar ptrdiff_t old_errfunc; 85cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_byte old_allowhook; 86cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_byte status; 87cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } c; 88cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } u; 89cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} CallInfo; 90cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 91cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 92cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* 93cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** Bits in CallInfo status 94cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar*/ 95cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define CIST_LUA (1<<0) /* call is running a Lua function */ 96cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define CIST_HOOKED (1<<1) /* call is running a debug hook */ 97cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define CIST_REENTRY (1<<2) /* call is running on same invocation of 98cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar luaV_execute of previous call */ 99cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define CIST_YIELDED (1<<3) /* call reentered after suspension */ 100cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define CIST_YPCALL (1<<4) /* call is a yieldable protected call */ 101cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define CIST_STAT (1<<5) /* call has an error status (pcall) */ 102cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define CIST_TAIL (1<<6) /* call was tail called */ 103cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define CIST_HOOKYIELD (1<<7) /* last hook called yielded */ 104cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 105cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 106cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define isLua(ci) ((ci)->callstatus & CIST_LUA) 107cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 108cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 109cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* 110cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** `global state', shared by all threads of this state 111cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar*/ 112cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaartypedef struct global_State { 113cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lua_Alloc frealloc; /* function to reallocate memory */ 114cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar void *ud; /* auxiliary data to `frealloc' */ 115cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_mem totalbytes; /* number of bytes currently allocated - GCdebt */ 116cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar l_mem GCdebt; /* bytes allocated not yet compensated by the collector */ 117cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_mem GCmemtrav; /* memory traversed by the GC */ 118cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_mem GCestimate; /* an estimate of the non-garbage memory in use */ 119cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar stringtable strt; /* hash table for strings */ 120cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar TValue l_registry; 121cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar unsigned int seed; /* randomized seed for hashes */ 122cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_byte currentwhite; 123cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_byte gcstate; /* state of garbage collector */ 124cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_byte gckind; /* kind of GC running */ 125cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_byte gcrunning; /* true if GC is running */ 126cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar int sweepstrgc; /* position of sweep in `strt' */ 127cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject *allgc; /* list of all collectable objects */ 128cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject *finobj; /* list of collectable objects with finalizers */ 129cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject **sweepgc; /* current position of sweep in list 'allgc' */ 130cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject **sweepfin; /* current position of sweep in list 'finobj' */ 131cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject *gray; /* list of gray objects */ 132cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject *grayagain; /* list of objects to be traversed atomically */ 133cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject *weak; /* list of tables with weak values */ 134cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject *ephemeron; /* list of ephemeron tables (weak keys) */ 135cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject *allweak; /* list of all-weak tables */ 136cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject *tobefnz; /* list of userdata to be GC */ 137cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar UpVal uvhead; /* head of double-linked list of all open upvalues */ 138cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar Mbuffer buff; /* temporary buffer for string concatenation */ 139cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar int gcpause; /* size of pause between successive GCs */ 140cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar int gcmajorinc; /* pause between major collections (only in gen. mode) */ 141cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar int gcstepmul; /* GC `granularity' */ 142cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lua_CFunction panic; /* to be called in unprotected errors */ 143cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar struct lua_State *mainthread; 144cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar const lua_Number *version; /* pointer to version number */ 145cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar TString *memerrmsg; /* memory-error message */ 146cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar TString *tmname[TM_N]; /* array with tag-method names */ 147cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar struct Table *mt[LUA_NUMTAGS]; /* metatables for basic types */ 148cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} global_State; 149cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 150cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 151cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* 152cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** `per thread' state 153cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar*/ 154cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarstruct lua_State { 155cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar CommonHeader; 156cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_byte status; 157cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar StkId top; /* first free slot in the stack */ 158cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar global_State *l_G; 159cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar CallInfo *ci; /* call info for current function */ 160cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar const Instruction *oldpc; /* last pc traced */ 161cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar StkId stack_last; /* last free slot in the stack */ 162cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar StkId stack; /* stack base */ 163cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar int stacksize; 164cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar unsigned short nny; /* number of non-yieldable calls in stack */ 165cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar unsigned short nCcalls; /* number of nested C calls */ 166cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_byte hookmask; 167cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lu_byte allowhook; 168cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar int basehookcount; 169cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar int hookcount; 170cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar lua_Hook hook; 171cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject *openupval; /* list of open upvalues in this stack */ 172cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCObject *gclist; 173cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar struct lua_longjmp *errorJmp; /* current error recover point */ 174cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar ptrdiff_t errfunc; /* current error handling function (stack index) */ 175cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar CallInfo base_ci; /* CallInfo for first level (C calling Lua) */ 176cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}; 177cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 178cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 179cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define G(L) (L->l_G) 180cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 181cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 182cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* 183cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar** Union of all collectable objects 184cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar*/ 185cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarunion GCObject { 186cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar GCheader gch; /* common header */ 187cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar union TString ts; 188cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar union Udata u; 189cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar union Closure cl; 190cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar struct Table h; 191cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar struct Proto p; 192cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar struct UpVal uv; 193cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar struct lua_State th; /* thread */ 194cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar}; 195cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 196cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 197cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define gch(o) (&(o)->gch) 198cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 199cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* macros to convert a GCObject into a specific value */ 200cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define rawgco2ts(o) \ 201cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar check_exp(novariant((o)->gch.tt) == LUA_TSTRING, &((o)->ts)) 202cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define gco2ts(o) (&rawgco2ts(o)->tsv) 203cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define rawgco2u(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u)) 204cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define gco2u(o) (&rawgco2u(o)->uv) 205cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define gco2lcl(o) check_exp((o)->gch.tt == LUA_TLCL, &((o)->cl.l)) 206cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define gco2ccl(o) check_exp((o)->gch.tt == LUA_TCCL, &((o)->cl.c)) 207cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define gco2cl(o) \ 208cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar check_exp(novariant((o)->gch.tt) == LUA_TFUNCTION, &((o)->cl)) 209cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define gco2t(o) check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h)) 210cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define gco2p(o) check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p)) 211cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define gco2uv(o) check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv)) 212cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define gco2th(o) check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th)) 213cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 214cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* macro to convert any Lua object into a GCObject */ 215cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define obj2gco(v) (cast(GCObject *, (v))) 216cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 217cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 218cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar/* actual number of total bytes allocated */ 219cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#define gettotalbytes(g) ((g)->totalbytes + (g)->GCdebt) 220cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 221cabc7af293504ad256d2203ae88ee11cbc34c2edErick TryzelaarLUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt); 222cabc7af293504ad256d2203ae88ee11cbc34c2edErick TryzelaarLUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); 223cabc7af293504ad256d2203ae88ee11cbc34c2edErick TryzelaarLUAI_FUNC CallInfo *luaE_extendCI (lua_State *L); 224cabc7af293504ad256d2203ae88ee11cbc34c2edErick TryzelaarLUAI_FUNC void luaE_freeCI (lua_State *L); 225cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 226cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 227cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#endif 228cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 229cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar