| 1 | /* | 
|---|
| 2 | ** $Id: lstate.h,v 2.24.1.2 2008/01/03 15:20:39 roberto Exp $ | 
|---|
| 3 | ** Global State | 
|---|
| 4 | ** See Copyright Notice in lua.h | 
|---|
| 5 | */ | 
|---|
| 6 |  | 
|---|
| 7 | #ifndef lstate_h | 
|---|
| 8 | #define lstate_h | 
|---|
| 9 |  | 
|---|
| 10 | #include "lua.h" | 
|---|
| 11 |  | 
|---|
| 12 | #include "lobject.h" | 
|---|
| 13 | #include "ltm.h" | 
|---|
| 14 | #include "lzio.h" | 
|---|
| 15 |  | 
|---|
| 16 |  | 
|---|
| 17 |  | 
|---|
| 18 | struct lua_longjmp;  /* defined in ldo.c */ | 
|---|
| 19 |  | 
|---|
| 20 |  | 
|---|
| 21 | /* table of globals */ | 
|---|
| 22 | #define gt(L)   (&L->l_gt) | 
|---|
| 23 |  | 
|---|
| 24 | /* registry */ | 
|---|
| 25 | #define registry(L)     (&G(L)->l_registry) | 
|---|
| 26 |  | 
|---|
| 27 |  | 
|---|
| 28 | /* extra stack space to handle TM calls and some other extras */ | 
|---|
| 29 | #define EXTRA_STACK   5 | 
|---|
| 30 |  | 
|---|
| 31 |  | 
|---|
| 32 | #define BASIC_CI_SIZE           8 | 
|---|
| 33 |  | 
|---|
| 34 | #define BASIC_STACK_SIZE        (2*LUA_MINSTACK) | 
|---|
| 35 |  | 
|---|
| 36 |  | 
|---|
| 37 |  | 
|---|
| 38 | typedef struct stringtable { | 
|---|
| 39 | GCObject **hash; | 
|---|
| 40 | lu_int32 nuse;  /* number of elements */ | 
|---|
| 41 | int size; | 
|---|
| 42 | } stringtable; | 
|---|
| 43 |  | 
|---|
| 44 |  | 
|---|
| 45 | /* | 
|---|
| 46 | ** informations about a call | 
|---|
| 47 | */ | 
|---|
| 48 | typedef struct CallInfo { | 
|---|
| 49 | StkId base;  /* base for this function */ | 
|---|
| 50 | StkId func;  /* function index in the stack */ | 
|---|
| 51 | StkId top;  /* top for this function */ | 
|---|
| 52 | const Instruction *savedpc; | 
|---|
| 53 | int nresults;  /* expected number of results from this function */ | 
|---|
| 54 | int tailcalls;  /* number of tail calls lost under this entry */ | 
|---|
| 55 | } CallInfo; | 
|---|
| 56 |  | 
|---|
| 57 |  | 
|---|
| 58 |  | 
|---|
| 59 | #define curr_func(L)    (clvalue(L->ci->func)) | 
|---|
| 60 | #define ci_func(ci)     (clvalue((ci)->func)) | 
|---|
| 61 | #define f_isLua(ci)     (!ci_func(ci)->c.isC) | 
|---|
| 62 | #define isLua(ci)       (ttisfunction((ci)->func) && f_isLua(ci)) | 
|---|
| 63 |  | 
|---|
| 64 |  | 
|---|
| 65 | /* | 
|---|
| 66 | ** `global state', shared by all threads of this state | 
|---|
| 67 | */ | 
|---|
| 68 | typedef struct global_State { | 
|---|
| 69 | stringtable strt;  /* hash table for strings */ | 
|---|
| 70 | lua_Alloc frealloc;  /* function to reallocate memory */ | 
|---|
| 71 | void *ud;         /* auxiliary data to `frealloc' */ | 
|---|
| 72 | lu_byte currentwhite; | 
|---|
| 73 | lu_byte gcstate;  /* state of garbage collector */ | 
|---|
| 74 | int sweepstrgc;  /* position of sweep in `strt' */ | 
|---|
| 75 | GCObject *rootgc;  /* list of all collectable objects */ | 
|---|
| 76 | GCObject **sweepgc;  /* position of sweep in `rootgc' */ | 
|---|
| 77 | GCObject *gray;  /* list of gray objects */ | 
|---|
| 78 | GCObject *grayagain;  /* list of objects to be traversed atomically */ | 
|---|
| 79 | GCObject *weak;  /* list of weak tables (to be cleared) */ | 
|---|
| 80 | GCObject *tmudata;  /* last element of list of userdata to be GC */ | 
|---|
| 81 | Mbuffer buff;  /* temporary buffer for string concatentation */ | 
|---|
| 82 | lu_mem GCthreshold; | 
|---|
| 83 | lu_mem totalbytes;  /* number of bytes currently allocated */ | 
|---|
| 84 | lu_mem estimate;  /* an estimate of number of bytes actually in use */ | 
|---|
| 85 | lu_mem gcdept;  /* how much GC is `behind schedule' */ | 
|---|
| 86 | int gcpause;  /* size of pause between successive GCs */ | 
|---|
| 87 | int gcstepmul;  /* GC `granularity' */ | 
|---|
| 88 | lua_CFunction panic;  /* to be called in unprotected errors */ | 
|---|
| 89 | TValue l_registry; | 
|---|
| 90 | struct lua_State *mainthread; | 
|---|
| 91 | UpVal uvhead;  /* head of double-linked list of all open upvalues */ | 
|---|
| 92 | struct Table *mt[NUM_TAGS];  /* metatables for basic types */ | 
|---|
| 93 | TString *tmname[TM_N];  /* array with tag-method names */ | 
|---|
| 94 | } global_State; | 
|---|
| 95 |  | 
|---|
| 96 |  | 
|---|
| 97 | /* | 
|---|
| 98 | ** `per thread' state | 
|---|
| 99 | */ | 
|---|
| 100 | struct lua_State { | 
|---|
| 101 | CommonHeader; | 
|---|
| 102 | lu_byte status; | 
|---|
| 103 | StkId top;  /* first free slot in the stack */ | 
|---|
| 104 | StkId base;  /* base of current function */ | 
|---|
| 105 | global_State *l_G; | 
|---|
| 106 | CallInfo *ci;  /* call info for current function */ | 
|---|
| 107 | const Instruction *savedpc;  /* `savedpc' of current function */ | 
|---|
| 108 | StkId stack_last;  /* last free slot in the stack */ | 
|---|
| 109 | StkId stack;  /* stack base */ | 
|---|
| 110 | CallInfo *end_ci;  /* points after end of ci array*/ | 
|---|
| 111 | CallInfo *base_ci;  /* array of CallInfo's */ | 
|---|
| 112 | int stacksize; | 
|---|
| 113 | int size_ci;  /* size of array `base_ci' */ | 
|---|
| 114 | unsigned short nCcalls;  /* number of nested C calls */ | 
|---|
| 115 | unsigned short baseCcalls;  /* nested C calls when resuming coroutine */ | 
|---|
| 116 | lu_byte hookmask; | 
|---|
| 117 | lu_byte allowhook; | 
|---|
| 118 | int basehookcount; | 
|---|
| 119 | int hookcount; | 
|---|
| 120 | lua_Hook hook; | 
|---|
| 121 | TValue l_gt;  /* table of globals */ | 
|---|
| 122 | TValue env;  /* temporary place for environments */ | 
|---|
| 123 | GCObject *openupval;  /* list of open upvalues in this stack */ | 
|---|
| 124 | GCObject *gclist; | 
|---|
| 125 | struct lua_longjmp *errorJmp;  /* current error recover point */ | 
|---|
| 126 | ptrdiff_t errfunc;  /* current error handling function (stack index) */ | 
|---|
| 127 | }; | 
|---|
| 128 |  | 
|---|
| 129 |  | 
|---|
| 130 | #define G(L)    (L->l_G) | 
|---|
| 131 |  | 
|---|
| 132 |  | 
|---|
| 133 | /* | 
|---|
| 134 | ** Union of all collectable objects | 
|---|
| 135 | */ | 
|---|
| 136 | union GCObject { | 
|---|
| 137 | GCheader gch; | 
|---|
| 138 | union TString ts; | 
|---|
| 139 | union Udata u; | 
|---|
| 140 | union Closure cl; | 
|---|
| 141 | struct Table h; | 
|---|
| 142 | struct Proto p; | 
|---|
| 143 | struct UpVal uv; | 
|---|
| 144 | struct lua_State th;  /* thread */ | 
|---|
| 145 | }; | 
|---|
| 146 |  | 
|---|
| 147 |  | 
|---|
| 148 | /* macros to convert a GCObject into a specific value */ | 
|---|
| 149 | #define rawgco2ts(o)    check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts)) | 
|---|
| 150 | #define gco2ts(o)       (&rawgco2ts(o)->tsv) | 
|---|
| 151 | #define rawgco2u(o)     check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u)) | 
|---|
| 152 | #define gco2u(o)        (&rawgco2u(o)->uv) | 
|---|
| 153 | #define gco2cl(o)       check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl)) | 
|---|
| 154 | #define gco2h(o)        check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h)) | 
|---|
| 155 | #define gco2p(o)        check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p)) | 
|---|
| 156 | #define gco2uv(o)       check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv)) | 
|---|
| 157 | #define ngcotouv(o) \ | 
|---|
| 158 | check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv)) | 
|---|
| 159 | #define gco2th(o)       check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th)) | 
|---|
| 160 |  | 
|---|
| 161 | /* macro to convert any Lua object into a GCObject */ | 
|---|
| 162 | #define obj2gco(v)      (cast(GCObject *, (v))) | 
|---|
| 163 |  | 
|---|
| 164 |  | 
|---|
| 165 | LUAI_FUNC lua_State *luaE_newthread (lua_State *L); | 
|---|
| 166 | LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); | 
|---|
| 167 |  | 
|---|
| 168 | #endif | 
|---|
| 169 |  | 
|---|