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