gateway: simplify stopping the cleanup timer
[olsrd.git] / lib / tas / src / lua / lobject.h
1
2 /*
3 ** $Id: lobject.h,v 1.159 2003/03/18 12:50:04 roberto Exp $
4 ** Type definitions for Lua objects
5 ** See Copyright Notice in lua.h
6 */
7
8 #ifndef lobject_h
9 #define lobject_h
10
11
12 #include "llimits.h"
13 #include "lua.h"
14
15
16 /* tags for values visible from Lua */
17 #define NUM_TAGS        LUA_TTHREAD
18
19
20 /*
21 ** Extra tags for non-values
22 */
23 #define LUA_TPROTO      (NUM_TAGS+1)
24 #define LUA_TUPVAL      (NUM_TAGS+2)
25
26
27 /*
28 ** Union of all collectable objects
29 */
30 typedef union GCObject GCObject;
31
32
33 /*
34 ** Common Header for all collectable objects (in macro form, to be
35 ** included in other objects)
36 */
37 #define CommonHeader    GCObject *next; lu_byte tt; lu_byte marked
38
39
40 /*
41 ** Common header in struct form
42 */
43 typedef struct GCheader {
44   CommonHeader;
45 } GCheader;
46
47
48
49
50 /*
51 ** Union of all Lua values
52 */
53 typedef union {
54   GCObject *gc;
55   void *p;
56   lua_Number n;
57   int b;
58 } Value;
59
60
61 /*
62 ** Lua values (or `tagged objects')
63 */
64 typedef struct lua_TObject {
65   int tt;
66   Value value;
67 } TObject;
68
69
70 /* Macros to test type */
71 #define ttisnil(o)      (ttype(o) == LUA_TNIL)
72 #define ttisnumber(o)   (ttype(o) == LUA_TNUMBER)
73 #define ttisstring(o)   (ttype(o) == LUA_TSTRING)
74 #define ttistable(o)    (ttype(o) == LUA_TTABLE)
75 #define ttisfunction(o) (ttype(o) == LUA_TFUNCTION)
76 #define ttisboolean(o)  (ttype(o) == LUA_TBOOLEAN)
77 #define ttisuserdata(o) (ttype(o) == LUA_TUSERDATA)
78 #define ttisthread(o)   (ttype(o) == LUA_TTHREAD)
79 #define ttislightuserdata(o)    (ttype(o) == LUA_TLIGHTUSERDATA)
80
81 /* Macros to access values */
82 #define ttype(o)        ((o)->tt)
83 #define gcvalue(o)      check_exp(iscollectable(o), (o)->value.gc)
84 #define pvalue(o)       check_exp(ttislightuserdata(o), (o)->value.p)
85 #define nvalue(o)       check_exp(ttisnumber(o), (o)->value.n)
86 #define tsvalue(o)      check_exp(ttisstring(o), &(o)->value.gc->ts)
87 #define uvalue(o)       check_exp(ttisuserdata(o), &(o)->value.gc->u)
88 #define clvalue(o)      check_exp(ttisfunction(o), &(o)->value.gc->cl)
89 #define hvalue(o)       check_exp(ttistable(o), &(o)->value.gc->h)
90 #define bvalue(o)       check_exp(ttisboolean(o), (o)->value.b)
91 #define thvalue(o)      check_exp(ttisthread(o), &(o)->value.gc->th)
92
93 #define l_isfalse(o)    (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))
94
95 /* Macros to set values */
96 #define setnvalue(obj,x) \
97   { TObject *i_o=(obj); i_o->tt=LUA_TNUMBER; i_o->value.n=(x); }
98
99 #define chgnvalue(obj,x) \
100         check_exp(ttype(obj)==LUA_TNUMBER, (obj)->value.n=(x))
101
102 #define setpvalue(obj,x) \
103   { TObject *i_o=(obj); i_o->tt=LUA_TLIGHTUSERDATA; i_o->value.p=(x); }
104
105 #define setbvalue(obj,x) \
106   { TObject *i_o=(obj); i_o->tt=LUA_TBOOLEAN; i_o->value.b=(x); }
107
108 #define setsvalue(obj,x) \
109   { TObject *i_o=(obj); i_o->tt=LUA_TSTRING; \
110     i_o->value.gc=cast(GCObject *, (x)); \
111     lua_assert(i_o->value.gc->gch.tt == LUA_TSTRING); }
112
113 #define setuvalue(obj,x) \
114   { TObject *i_o=(obj); i_o->tt=LUA_TUSERDATA; \
115     i_o->value.gc=cast(GCObject *, (x)); \
116     lua_assert(i_o->value.gc->gch.tt == LUA_TUSERDATA); }
117
118 #define setthvalue(obj,x) \
119   { TObject *i_o=(obj); i_o->tt=LUA_TTHREAD; \
120     i_o->value.gc=cast(GCObject *, (x)); \
121     lua_assert(i_o->value.gc->gch.tt == LUA_TTHREAD); }
122
123 #define setclvalue(obj,x) \
124   { TObject *i_o=(obj); i_o->tt=LUA_TFUNCTION; \
125     i_o->value.gc=cast(GCObject *, (x)); \
126     lua_assert(i_o->value.gc->gch.tt == LUA_TFUNCTION); }
127
128 #define sethvalue(obj,x) \
129   { TObject *i_o=(obj); i_o->tt=LUA_TTABLE; \
130     i_o->value.gc=cast_align(GCObject *, (x)); \
131     lua_assert(i_o->value.gc->gch.tt == LUA_TTABLE); }
132
133 #define setnilvalue(obj) ((obj)->tt=LUA_TNIL)
134
135
136
137 /*
138 ** for internal debug only
139 */
140 #define checkconsistency(obj) \
141   lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt))
142
143
144 #define setobj(obj1,obj2) \
145   { const TObject *o2=(obj2); TObject *o1=(obj1); \
146     checkconsistency(o2); \
147     o1->tt=o2->tt; o1->value = o2->value; }
148
149
150 /*
151 ** different types of sets, according to destination
152 */
153
154 /* from stack to (same) stack */
155 #define setobjs2s       setobj
156
157 /* to stack (not from same stack) */
158 #define setobj2s        setobj
159 #define setsvalue2s     setsvalue
160
161 /* from table to same table */
162 #define setobjt2t       setobj
163
164 /* to table */
165 #define setobj2t        setobj
166
167 /* to new object */
168 #define setobj2n        setobj
169 #define setsvalue2n     setsvalue
170
171 #define setttype(obj, tt) (ttype(obj) = (tt))
172
173
174 #define iscollectable(o)        (ttype(o) >= LUA_TSTRING)
175
176
177
178 typedef TObject *StkId;                /* index to stack elements */
179
180
181 /*
182 ** String headers for string table
183 */
184 typedef union TString {
185   L_Umaxalign dummy;                   /* ensures maximum alignment for strings */
186   struct {
187     CommonHeader;
188     lu_byte reserved;
189     lu_hash hash;
190     size_t len;
191   } tsv;
192 } TString;
193
194
195 #define getstr(ts)      cast(const char *, (ts) + 1)
196 #define svalue(o)       getstr(tsvalue(o))
197
198
199
200 typedef union Udata {
201   L_Umaxalign dummy;                   /* ensures maximum alignment for `local' udata */
202   struct {
203     CommonHeader;
204     struct Table *metatable;
205     size_t len;
206   } uv;
207 } Udata;
208
209
210
211
212 /*
213 ** Function Prototypes
214 */
215 typedef struct Proto {
216   CommonHeader;
217   TObject *k;                          /* constants used by the function */
218   Instruction *code;
219   struct Proto **p;                    /* functions defined inside the function */
220   int *lineinfo;                       /* map from opcodes to source lines */
221   struct LocVar *locvars;              /* information about local variables */
222   TString **upvalues;                  /* upvalue names */
223   TString *source;
224   int sizeupvalues;
225   int sizek;                           /* size of `k' */
226   int sizecode;
227   int sizelineinfo;
228   int sizep;                           /* size of `p' */
229   int sizelocvars;
230   int lineDefined;
231   GCObject *gclist;
232   lu_byte nups;                        /* number of upvalues */
233   lu_byte numparams;
234   lu_byte is_vararg;
235   lu_byte maxstacksize;
236 } Proto;
237
238
239 typedef struct LocVar {
240   TString *varname;
241   int startpc;                         /* first point where variable is active */
242   int endpc;                           /* first point where variable is dead */
243 } LocVar;
244
245
246
247 /*
248 ** Upvalues
249 */
250
251 typedef struct UpVal {
252   CommonHeader;
253   TObject *v;                          /* points to stack or to its own value */
254   TObject value;                       /* the value (when closed) */
255 } UpVal;
256
257
258 /*
259 ** Closures
260 */
261
262 #define ClosureHeader \
263         CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist
264
265 typedef struct CClosure {
266   ClosureHeader;
267   lua_CFunction f;
268   TObject upvalue[1];
269 } CClosure;
270
271
272 typedef struct LClosure {
273   ClosureHeader;
274   struct Proto *p;
275   TObject g;                           /* global table for this closure */
276   UpVal *upvals[1];
277 } LClosure;
278
279
280 typedef union Closure {
281   CClosure c;
282   LClosure l;
283 } Closure;
284
285
286 #define iscfunction(o)  (ttype(o) == LUA_TFUNCTION && clvalue(o)->c.isC)
287 #define isLfunction(o)  (ttype(o) == LUA_TFUNCTION && !clvalue(o)->c.isC)
288
289
290 /*
291 ** Tables
292 */
293
294 typedef struct Node {
295   TObject i_key;
296   TObject i_val;
297   struct Node *next;                   /* for chaining */
298 } Node;
299
300
301 typedef struct Table {
302   CommonHeader;
303   lu_byte flags;                       /* 1<<p means tagmethod(p) is not present */
304   lu_byte lsizenode;                   /* log2 of size of `node' array */
305   struct Table *metatable;
306   TObject *array;                      /* array part */
307   Node *node;
308   Node *firstfree;                     /* this position is free; all positions after it are full */
309   GCObject *gclist;
310   int sizearray;                       /* size of `array' array */
311 } Table;
312
313
314
315 /*
316 ** `module' operation for hashing (size is always a power of 2)
317 */
318 #define lmod(s,size) \
319         check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1))))
320
321
322 #define twoto(x)        (1<<(x))
323 #define sizenode(t)     (twoto((t)->lsizenode))
324
325
326
327 extern const TObject luaO_nilobject;
328
329 int luaO_log2(unsigned int x);
330 int luaO_int2fb(unsigned int x);
331 #define fb2int(x)       (((x) & 7) << ((x) >> 3))
332
333 int luaO_rawequalObj(const TObject * t1, const TObject * t2);
334 int luaO_str2d(const char *s, lua_Number * result);
335
336 const char *luaO_pushvfstring(lua_State * L, const char *fmt, va_list argp);
337 const char *luaO_pushfstring(lua_State * L, const char *fmt, ...);
338 void luaO_chunkid(char *out, const char *source, int len);
339
340
341 #endif