Remove end-of-line spaces and <CR>
[olsrd.git] / lib / tas / src / lua / lstate.h
1 /*
2 ** Global State
3 ** See Copyright Notice in lua.h
4 */
5
6 #ifndef lstate_h
7 #define lstate_h
8
9 #include "lua.h"
10
11 #include "lobject.h"
12 #include "ltm.h"
13 #include "lzio.h"
14
15
16 /*
17 ** macros for thread synchronization inside Lua core machine:
18 ** all accesses to the global state and to global objects are synchronized.
19 ** Because threads can read the stack of other threads
20 ** (when running garbage collection),
21 ** a thread must also synchronize any write-access to its own stack.
22 ** Unsynchronized accesses are allowed only when reading its own stack,
23 ** or when reading immutable fields from global objects
24 ** (such as string values and udata values).
25 */
26 #ifndef lua_lock
27 #define lua_lock(L)     ((void) 0)
28 #endif
29
30 #ifndef lua_unlock
31 #define lua_unlock(L)   ((void) 0)
32 #endif
33
34
35 #ifndef lua_userstateopen
36 #define lua_userstateopen(l)
37 #endif
38
39
40
41 struct lua_longjmp;  /* defined in ldo.c */
42
43
44 /* default meta table (both for tables and udata) */
45 #define defaultmeta(L)  (&G(L)->_defaultmeta)
46
47 /* table of globals */
48 #define gt(L)   (&L->_gt)
49
50 /* registry */
51 #define registry(L)     (&G(L)->_registry)
52
53
54 /* extra stack space to handle TM calls and some other extras */
55 #define EXTRA_STACK   5
56
57
58 #define BASIC_CI_SIZE           8
59
60 #define BASIC_STACK_SIZE        (2*LUA_MINSTACK)
61
62
63
64 typedef struct stringtable {
65   GCObject **hash;
66   ls_nstr nuse;  /* number of elements */
67   int size;
68 } stringtable;
69
70
71 /*
72 ** informations about a call
73 */
74 typedef struct CallInfo {
75   StkId base;  /* base for called function */
76   StkId top;  /* top for this function */
77   int state;  /* bit fields; see below */
78   union {
79     struct {  /* for Lua functions */
80       const Instruction *savedpc;
81       const Instruction **pc;  /* points to `pc' variable in `luaV_execute' */
82       int tailcalls;  /* number of tail calls lost under this entry */
83     } l;
84     struct {  /* for C functions */
85       int dummy;  /* just to avoid an empty struct */
86     } c;
87   } u;
88 } CallInfo;
89
90
91 /*
92 ** bit fields for `CallInfo.state'
93 */
94 #define CI_C            (1<<0)  /* 1 if function is a C function */
95 /* 1 if (Lua) function has an active `luaV_execute' running it */
96 #define CI_HASFRAME     (1<<1)
97 /* 1 if Lua function is calling another Lua function (and therefore its
98    `pc' is being used by the other, and therefore CI_SAVEDPC is 1 too) */
99 #define CI_CALLING      (1<<2)
100 #define CI_SAVEDPC      (1<<3)  /* 1 if `savedpc' is updated */
101 #define CI_YIELD        (1<<4)  /* 1 if thread is suspended */
102
103
104 #define ci_func(ci)     (clvalue((ci)->base - 1))
105
106
107 /*
108 ** `global state', shared by all threads of this state
109 */
110 typedef struct global_State {
111   stringtable strt;  /* hash table for strings */
112   GCObject *rootgc;  /* list of (almost) all collectable objects */
113   GCObject *rootudata;   /* (separated) list of all userdata */
114   GCObject *tmudata;  /* list of userdata to be GC */
115   Mbuffer buff;  /* temporary buffer for string concatentation */
116   lu_mem GCthreshold;
117   lu_mem nblocks;  /* number of `bytes' currently allocated */
118   lua_CFunction panic;  /* to be called in unprotected errors */
119   TObject _registry;
120   TObject _defaultmeta;
121   struct lua_State *mainthread;
122   Node dummynode[1];  /* common node array for all empty tables */
123   TString *tmname[TM_N];  /* array with tag-method names */
124 } global_State;
125
126
127 /*
128 ** `per thread' state
129 */
130 struct lua_State {
131   CommonHeader;
132   StkId top;  /* first free slot in the stack */
133   StkId base;  /* base of current function */
134   global_State *l_G;
135   CallInfo *ci;  /* call info for current function */
136   StkId stack_last;  /* last free slot in the stack */
137   StkId stack;  /* stack base */
138   int stacksize;
139   CallInfo *end_ci;  /* points after end of ci array*/
140   CallInfo *base_ci;  /* array of CallInfo's */
141   unsigned short size_ci;  /* size of array `base_ci' */
142   unsigned short nCcalls;  /* number of nested C calls */
143   lu_byte hookmask;
144   lu_byte allowhook;
145   lu_byte hookinit;
146   int basehookcount;
147   int hookcount;
148   lua_Hook hook;
149   TObject _gt;  /* table of globals */
150   GCObject *openupval;  /* list of open upvalues in this stack */
151   GCObject *gclist;
152   struct lua_longjmp *errorJmp;  /* current error recover point */
153   ptrdiff_t errfunc;  /* current error handling function (stack index) */
154 };
155
156
157 #define G(L)    (L->l_G)
158
159
160 /*
161 ** Union of all collectable objects
162 */
163 union GCObject {
164   GCheader gch;
165   union TString ts;
166   union Udata u;
167   union Closure cl;
168   struct Table h;
169   struct Proto p;
170   struct UpVal uv;
171   struct lua_State th;  /* thread */
172 };
173
174
175 /* macros to convert a GCObject into a specific value */
176 #define gcotots(o)      check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts))
177 #define gcotou(o)       check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u))
178 #define gcotocl(o)      check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl))
179 #define gcotoh(o)       check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h))
180 #define gcotop(o)       check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p))
181 #define gcotouv(o)      check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv))
182 #define ngcotouv(o) \
183         check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv))
184 #define gcototh(o)      check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th))
185
186 /* macro to convert any value into a GCObject */
187 #define valtogco(v)     (cast(GCObject *, (v)))
188
189
190 lua_State *luaE_newthread (lua_State *L);
191 void luaE_freethread (lua_State *L, lua_State *L1);
192
193 #endif
194