xref: /aosp_15_r20/external/lua/src/lobject.h (revision 088332b5b69e7ab13924864b272aabfc2509d2d5)
1*088332b5SXin Li /*
2*088332b5SXin Li ** $Id: lobject.h $
3*088332b5SXin Li ** Type definitions for Lua objects
4*088332b5SXin Li ** See Copyright Notice in lua.h
5*088332b5SXin Li */
6*088332b5SXin Li 
7*088332b5SXin Li 
8*088332b5SXin Li #ifndef lobject_h
9*088332b5SXin Li #define lobject_h
10*088332b5SXin Li 
11*088332b5SXin Li 
12*088332b5SXin Li #include <stdarg.h>
13*088332b5SXin Li 
14*088332b5SXin Li 
15*088332b5SXin Li #include "llimits.h"
16*088332b5SXin Li #include "lua.h"
17*088332b5SXin Li 
18*088332b5SXin Li 
19*088332b5SXin Li /*
20*088332b5SXin Li ** Extra types for collectable non-values
21*088332b5SXin Li */
22*088332b5SXin Li #define LUA_TUPVAL	LUA_NUMTYPES  /* upvalues */
23*088332b5SXin Li #define LUA_TPROTO	(LUA_NUMTYPES+1)  /* function prototypes */
24*088332b5SXin Li 
25*088332b5SXin Li 
26*088332b5SXin Li /*
27*088332b5SXin Li ** number of all possible types (including LUA_TNONE)
28*088332b5SXin Li */
29*088332b5SXin Li #define LUA_TOTALTYPES		(LUA_TPROTO + 2)
30*088332b5SXin Li 
31*088332b5SXin Li 
32*088332b5SXin Li /*
33*088332b5SXin Li ** tags for Tagged Values have the following use of bits:
34*088332b5SXin Li ** bits 0-3: actual tag (a LUA_T* constant)
35*088332b5SXin Li ** bits 4-5: variant bits
36*088332b5SXin Li ** bit 6: whether value is collectable
37*088332b5SXin Li */
38*088332b5SXin Li 
39*088332b5SXin Li /* add variant bits to a type */
40*088332b5SXin Li #define makevariant(t,v)	((t) | ((v) << 4))
41*088332b5SXin Li 
42*088332b5SXin Li 
43*088332b5SXin Li 
44*088332b5SXin Li /*
45*088332b5SXin Li ** Union of all Lua values
46*088332b5SXin Li */
47*088332b5SXin Li typedef union Value {
48*088332b5SXin Li   struct GCObject *gc;    /* collectable objects */
49*088332b5SXin Li   void *p;         /* light userdata */
50*088332b5SXin Li   lua_CFunction f; /* light C functions */
51*088332b5SXin Li   lua_Integer i;   /* integer numbers */
52*088332b5SXin Li   lua_Number n;    /* float numbers */
53*088332b5SXin Li } Value;
54*088332b5SXin Li 
55*088332b5SXin Li 
56*088332b5SXin Li /*
57*088332b5SXin Li ** Tagged Values. This is the basic representation of values in Lua:
58*088332b5SXin Li ** an actual value plus a tag with its type.
59*088332b5SXin Li */
60*088332b5SXin Li 
61*088332b5SXin Li #define TValuefields	Value value_; lu_byte tt_
62*088332b5SXin Li 
63*088332b5SXin Li typedef struct TValue {
64*088332b5SXin Li   TValuefields;
65*088332b5SXin Li } TValue;
66*088332b5SXin Li 
67*088332b5SXin Li 
68*088332b5SXin Li #define val_(o)		((o)->value_)
69*088332b5SXin Li #define valraw(o)	(&val_(o))
70*088332b5SXin Li 
71*088332b5SXin Li 
72*088332b5SXin Li /* raw type tag of a TValue */
73*088332b5SXin Li #define rawtt(o)	((o)->tt_)
74*088332b5SXin Li 
75*088332b5SXin Li /* tag with no variants (bits 0-3) */
76*088332b5SXin Li #define novariant(t)	((t) & 0x0F)
77*088332b5SXin Li 
78*088332b5SXin Li /* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */
79*088332b5SXin Li #define withvariant(t)	((t) & 0x3F)
80*088332b5SXin Li #define ttypetag(o)	withvariant(rawtt(o))
81*088332b5SXin Li 
82*088332b5SXin Li /* type of a TValue */
83*088332b5SXin Li #define ttype(o)	(novariant(rawtt(o)))
84*088332b5SXin Li 
85*088332b5SXin Li 
86*088332b5SXin Li /* Macros to test type */
87*088332b5SXin Li #define checktag(o,t)		(rawtt(o) == (t))
88*088332b5SXin Li #define checktype(o,t)		(ttype(o) == (t))
89*088332b5SXin Li 
90*088332b5SXin Li 
91*088332b5SXin Li /* Macros for internal tests */
92*088332b5SXin Li 
93*088332b5SXin Li /* collectable object has the same tag as the original value */
94*088332b5SXin Li #define righttt(obj)		(ttypetag(obj) == gcvalue(obj)->tt)
95*088332b5SXin Li 
96*088332b5SXin Li /*
97*088332b5SXin Li ** Any value being manipulated by the program either is non
98*088332b5SXin Li ** collectable, or the collectable object has the right tag
99*088332b5SXin Li ** and it is not dead. The option 'L == NULL' allows other
100*088332b5SXin Li ** macros using this one to be used where L is not available.
101*088332b5SXin Li */
102*088332b5SXin Li #define checkliveness(L,obj) \
103*088332b5SXin Li 	((void)L, lua_longassert(!iscollectable(obj) || \
104*088332b5SXin Li 		(righttt(obj) && (L == NULL || !isdead(G(L),gcvalue(obj))))))
105*088332b5SXin Li 
106*088332b5SXin Li 
107*088332b5SXin Li /* Macros to set values */
108*088332b5SXin Li 
109*088332b5SXin Li /* set a value's tag */
110*088332b5SXin Li #define settt_(o,t)	((o)->tt_=(t))
111*088332b5SXin Li 
112*088332b5SXin Li 
113*088332b5SXin Li /* main macro to copy values (from 'obj1' to 'obj2') */
114*088332b5SXin Li #define setobj(L,obj1,obj2) \
115*088332b5SXin Li 	{ TValue *io1=(obj1); const TValue *io2=(obj2); \
116*088332b5SXin Li           io1->value_ = io2->value_; settt_(io1, io2->tt_); \
117*088332b5SXin Li 	  checkliveness(L,io1); lua_assert(!isnonstrictnil(io1)); }
118*088332b5SXin Li 
119*088332b5SXin Li /*
120*088332b5SXin Li ** Different types of assignments, according to source and destination.
121*088332b5SXin Li ** (They are mostly equal now, but may be different in the future.)
122*088332b5SXin Li */
123*088332b5SXin Li 
124*088332b5SXin Li /* from stack to stack */
125*088332b5SXin Li #define setobjs2s(L,o1,o2)	setobj(L,s2v(o1),s2v(o2))
126*088332b5SXin Li /* to stack (not from same stack) */
127*088332b5SXin Li #define setobj2s(L,o1,o2)	setobj(L,s2v(o1),o2)
128*088332b5SXin Li /* from table to same table */
129*088332b5SXin Li #define setobjt2t	setobj
130*088332b5SXin Li /* to new object */
131*088332b5SXin Li #define setobj2n	setobj
132*088332b5SXin Li /* to table */
133*088332b5SXin Li #define setobj2t	setobj
134*088332b5SXin Li 
135*088332b5SXin Li 
136*088332b5SXin Li /*
137*088332b5SXin Li ** Entries in the Lua stack
138*088332b5SXin Li */
139*088332b5SXin Li typedef union StackValue {
140*088332b5SXin Li   TValue val;
141*088332b5SXin Li } StackValue;
142*088332b5SXin Li 
143*088332b5SXin Li 
144*088332b5SXin Li /* index to stack elements */
145*088332b5SXin Li typedef StackValue *StkId;
146*088332b5SXin Li 
147*088332b5SXin Li /* convert a 'StackValue' to a 'TValue' */
148*088332b5SXin Li #define s2v(o)	(&(o)->val)
149*088332b5SXin Li 
150*088332b5SXin Li 
151*088332b5SXin Li 
152*088332b5SXin Li /*
153*088332b5SXin Li ** {==================================================================
154*088332b5SXin Li ** Nil
155*088332b5SXin Li ** ===================================================================
156*088332b5SXin Li */
157*088332b5SXin Li 
158*088332b5SXin Li /* Standard nil */
159*088332b5SXin Li #define LUA_VNIL	makevariant(LUA_TNIL, 0)
160*088332b5SXin Li 
161*088332b5SXin Li /* Empty slot (which might be different from a slot containing nil) */
162*088332b5SXin Li #define LUA_VEMPTY	makevariant(LUA_TNIL, 1)
163*088332b5SXin Li 
164*088332b5SXin Li /* Value returned for a key not found in a table (absent key) */
165*088332b5SXin Li #define LUA_VABSTKEY	makevariant(LUA_TNIL, 2)
166*088332b5SXin Li 
167*088332b5SXin Li 
168*088332b5SXin Li /* macro to test for (any kind of) nil */
169*088332b5SXin Li #define ttisnil(v)		checktype((v), LUA_TNIL)
170*088332b5SXin Li 
171*088332b5SXin Li 
172*088332b5SXin Li /* macro to test for a standard nil */
173*088332b5SXin Li #define ttisstrictnil(o)	checktag((o), LUA_VNIL)
174*088332b5SXin Li 
175*088332b5SXin Li 
176*088332b5SXin Li #define setnilvalue(obj) settt_(obj, LUA_VNIL)
177*088332b5SXin Li 
178*088332b5SXin Li 
179*088332b5SXin Li #define isabstkey(v)		checktag((v), LUA_VABSTKEY)
180*088332b5SXin Li 
181*088332b5SXin Li 
182*088332b5SXin Li /*
183*088332b5SXin Li ** macro to detect non-standard nils (used only in assertions)
184*088332b5SXin Li */
185*088332b5SXin Li #define isnonstrictnil(v)	(ttisnil(v) && !ttisstrictnil(v))
186*088332b5SXin Li 
187*088332b5SXin Li 
188*088332b5SXin Li /*
189*088332b5SXin Li ** By default, entries with any kind of nil are considered empty.
190*088332b5SXin Li ** (In any definition, values associated with absent keys must also
191*088332b5SXin Li ** be accepted as empty.)
192*088332b5SXin Li */
193*088332b5SXin Li #define isempty(v)		ttisnil(v)
194*088332b5SXin Li 
195*088332b5SXin Li 
196*088332b5SXin Li /* macro defining a value corresponding to an absent key */
197*088332b5SXin Li #define ABSTKEYCONSTANT		{NULL}, LUA_VABSTKEY
198*088332b5SXin Li 
199*088332b5SXin Li 
200*088332b5SXin Li /* mark an entry as empty */
201*088332b5SXin Li #define setempty(v)		settt_(v, LUA_VEMPTY)
202*088332b5SXin Li 
203*088332b5SXin Li 
204*088332b5SXin Li 
205*088332b5SXin Li /* }================================================================== */
206*088332b5SXin Li 
207*088332b5SXin Li 
208*088332b5SXin Li /*
209*088332b5SXin Li ** {==================================================================
210*088332b5SXin Li ** Booleans
211*088332b5SXin Li ** ===================================================================
212*088332b5SXin Li */
213*088332b5SXin Li 
214*088332b5SXin Li 
215*088332b5SXin Li #define LUA_VFALSE	makevariant(LUA_TBOOLEAN, 0)
216*088332b5SXin Li #define LUA_VTRUE	makevariant(LUA_TBOOLEAN, 1)
217*088332b5SXin Li 
218*088332b5SXin Li #define ttisboolean(o)		checktype((o), LUA_TBOOLEAN)
219*088332b5SXin Li #define ttisfalse(o)		checktag((o), LUA_VFALSE)
220*088332b5SXin Li #define ttistrue(o)		checktag((o), LUA_VTRUE)
221*088332b5SXin Li 
222*088332b5SXin Li 
223*088332b5SXin Li #define l_isfalse(o)	(ttisfalse(o) || ttisnil(o))
224*088332b5SXin Li 
225*088332b5SXin Li 
226*088332b5SXin Li #define setbfvalue(obj)		settt_(obj, LUA_VFALSE)
227*088332b5SXin Li #define setbtvalue(obj)		settt_(obj, LUA_VTRUE)
228*088332b5SXin Li 
229*088332b5SXin Li /* }================================================================== */
230*088332b5SXin Li 
231*088332b5SXin Li 
232*088332b5SXin Li /*
233*088332b5SXin Li ** {==================================================================
234*088332b5SXin Li ** Threads
235*088332b5SXin Li ** ===================================================================
236*088332b5SXin Li */
237*088332b5SXin Li 
238*088332b5SXin Li #define LUA_VTHREAD		makevariant(LUA_TTHREAD, 0)
239*088332b5SXin Li 
240*088332b5SXin Li #define ttisthread(o)		checktag((o), ctb(LUA_VTHREAD))
241*088332b5SXin Li 
242*088332b5SXin Li #define thvalue(o)	check_exp(ttisthread(o), gco2th(val_(o).gc))
243*088332b5SXin Li 
244*088332b5SXin Li #define setthvalue(L,obj,x) \
245*088332b5SXin Li   { TValue *io = (obj); lua_State *x_ = (x); \
246*088332b5SXin Li     val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VTHREAD)); \
247*088332b5SXin Li     checkliveness(L,io); }
248*088332b5SXin Li 
249*088332b5SXin Li #define setthvalue2s(L,o,t)	setthvalue(L,s2v(o),t)
250*088332b5SXin Li 
251*088332b5SXin Li /* }================================================================== */
252*088332b5SXin Li 
253*088332b5SXin Li 
254*088332b5SXin Li /*
255*088332b5SXin Li ** {==================================================================
256*088332b5SXin Li ** Collectable Objects
257*088332b5SXin Li ** ===================================================================
258*088332b5SXin Li */
259*088332b5SXin Li 
260*088332b5SXin Li /*
261*088332b5SXin Li ** Common Header for all collectable objects (in macro form, to be
262*088332b5SXin Li ** included in other objects)
263*088332b5SXin Li */
264*088332b5SXin Li #define CommonHeader	struct GCObject *next; lu_byte tt; lu_byte marked
265*088332b5SXin Li 
266*088332b5SXin Li 
267*088332b5SXin Li /* Common type for all collectable objects */
268*088332b5SXin Li typedef struct GCObject {
269*088332b5SXin Li   CommonHeader;
270*088332b5SXin Li } GCObject;
271*088332b5SXin Li 
272*088332b5SXin Li 
273*088332b5SXin Li /* Bit mark for collectable types */
274*088332b5SXin Li #define BIT_ISCOLLECTABLE	(1 << 6)
275*088332b5SXin Li 
276*088332b5SXin Li #define iscollectable(o)	(rawtt(o) & BIT_ISCOLLECTABLE)
277*088332b5SXin Li 
278*088332b5SXin Li /* mark a tag as collectable */
279*088332b5SXin Li #define ctb(t)			((t) | BIT_ISCOLLECTABLE)
280*088332b5SXin Li 
281*088332b5SXin Li #define gcvalue(o)	check_exp(iscollectable(o), val_(o).gc)
282*088332b5SXin Li 
283*088332b5SXin Li #define gcvalueraw(v)	((v).gc)
284*088332b5SXin Li 
285*088332b5SXin Li #define setgcovalue(L,obj,x) \
286*088332b5SXin Li   { TValue *io = (obj); GCObject *i_g=(x); \
287*088332b5SXin Li     val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); }
288*088332b5SXin Li 
289*088332b5SXin Li /* }================================================================== */
290*088332b5SXin Li 
291*088332b5SXin Li 
292*088332b5SXin Li /*
293*088332b5SXin Li ** {==================================================================
294*088332b5SXin Li ** Numbers
295*088332b5SXin Li ** ===================================================================
296*088332b5SXin Li */
297*088332b5SXin Li 
298*088332b5SXin Li /* Variant tags for numbers */
299*088332b5SXin Li #define LUA_VNUMINT	makevariant(LUA_TNUMBER, 0)  /* integer numbers */
300*088332b5SXin Li #define LUA_VNUMFLT	makevariant(LUA_TNUMBER, 1)  /* float numbers */
301*088332b5SXin Li 
302*088332b5SXin Li #define ttisnumber(o)		checktype((o), LUA_TNUMBER)
303*088332b5SXin Li #define ttisfloat(o)		checktag((o), LUA_VNUMFLT)
304*088332b5SXin Li #define ttisinteger(o)		checktag((o), LUA_VNUMINT)
305*088332b5SXin Li 
306*088332b5SXin Li #define nvalue(o)	check_exp(ttisnumber(o), \
307*088332b5SXin Li 	(ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o)))
308*088332b5SXin Li #define fltvalue(o)	check_exp(ttisfloat(o), val_(o).n)
309*088332b5SXin Li #define ivalue(o)	check_exp(ttisinteger(o), val_(o).i)
310*088332b5SXin Li 
311*088332b5SXin Li #define fltvalueraw(v)	((v).n)
312*088332b5SXin Li #define ivalueraw(v)	((v).i)
313*088332b5SXin Li 
314*088332b5SXin Li #define setfltvalue(obj,x) \
315*088332b5SXin Li   { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_VNUMFLT); }
316*088332b5SXin Li 
317*088332b5SXin Li #define chgfltvalue(obj,x) \
318*088332b5SXin Li   { TValue *io=(obj); lua_assert(ttisfloat(io)); val_(io).n=(x); }
319*088332b5SXin Li 
320*088332b5SXin Li #define setivalue(obj,x) \
321*088332b5SXin Li   { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_VNUMINT); }
322*088332b5SXin Li 
323*088332b5SXin Li #define chgivalue(obj,x) \
324*088332b5SXin Li   { TValue *io=(obj); lua_assert(ttisinteger(io)); val_(io).i=(x); }
325*088332b5SXin Li 
326*088332b5SXin Li /* }================================================================== */
327*088332b5SXin Li 
328*088332b5SXin Li 
329*088332b5SXin Li /*
330*088332b5SXin Li ** {==================================================================
331*088332b5SXin Li ** Strings
332*088332b5SXin Li ** ===================================================================
333*088332b5SXin Li */
334*088332b5SXin Li 
335*088332b5SXin Li /* Variant tags for strings */
336*088332b5SXin Li #define LUA_VSHRSTR	makevariant(LUA_TSTRING, 0)  /* short strings */
337*088332b5SXin Li #define LUA_VLNGSTR	makevariant(LUA_TSTRING, 1)  /* long strings */
338*088332b5SXin Li 
339*088332b5SXin Li #define ttisstring(o)		checktype((o), LUA_TSTRING)
340*088332b5SXin Li #define ttisshrstring(o)	checktag((o), ctb(LUA_VSHRSTR))
341*088332b5SXin Li #define ttislngstring(o)	checktag((o), ctb(LUA_VLNGSTR))
342*088332b5SXin Li 
343*088332b5SXin Li #define tsvalueraw(v)	(gco2ts((v).gc))
344*088332b5SXin Li 
345*088332b5SXin Li #define tsvalue(o)	check_exp(ttisstring(o), gco2ts(val_(o).gc))
346*088332b5SXin Li 
347*088332b5SXin Li #define setsvalue(L,obj,x) \
348*088332b5SXin Li   { TValue *io = (obj); TString *x_ = (x); \
349*088332b5SXin Li     val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \
350*088332b5SXin Li     checkliveness(L,io); }
351*088332b5SXin Li 
352*088332b5SXin Li /* set a string to the stack */
353*088332b5SXin Li #define setsvalue2s(L,o,s)	setsvalue(L,s2v(o),s)
354*088332b5SXin Li 
355*088332b5SXin Li /* set a string to a new object */
356*088332b5SXin Li #define setsvalue2n	setsvalue
357*088332b5SXin Li 
358*088332b5SXin Li 
359*088332b5SXin Li /*
360*088332b5SXin Li ** Header for a string value.
361*088332b5SXin Li */
362*088332b5SXin Li typedef struct TString {
363*088332b5SXin Li   CommonHeader;
364*088332b5SXin Li   lu_byte extra;  /* reserved words for short strings; "has hash" for longs */
365*088332b5SXin Li   lu_byte shrlen;  /* length for short strings */
366*088332b5SXin Li   unsigned int hash;
367*088332b5SXin Li   union {
368*088332b5SXin Li     size_t lnglen;  /* length for long strings */
369*088332b5SXin Li     struct TString *hnext;  /* linked list for hash table */
370*088332b5SXin Li   } u;
371*088332b5SXin Li   char contents[1];
372*088332b5SXin Li } TString;
373*088332b5SXin Li 
374*088332b5SXin Li 
375*088332b5SXin Li 
376*088332b5SXin Li /*
377*088332b5SXin Li ** Get the actual string (array of bytes) from a 'TString'.
378*088332b5SXin Li */
379*088332b5SXin Li #define getstr(ts)  ((ts)->contents)
380*088332b5SXin Li 
381*088332b5SXin Li 
382*088332b5SXin Li /* get the actual string (array of bytes) from a Lua value */
383*088332b5SXin Li #define svalue(o)       getstr(tsvalue(o))
384*088332b5SXin Li 
385*088332b5SXin Li /* get string length from 'TString *s' */
386*088332b5SXin Li #define tsslen(s)	((s)->tt == LUA_VSHRSTR ? (s)->shrlen : (s)->u.lnglen)
387*088332b5SXin Li 
388*088332b5SXin Li /* get string length from 'TValue *o' */
389*088332b5SXin Li #define vslen(o)	tsslen(tsvalue(o))
390*088332b5SXin Li 
391*088332b5SXin Li /* }================================================================== */
392*088332b5SXin Li 
393*088332b5SXin Li 
394*088332b5SXin Li /*
395*088332b5SXin Li ** {==================================================================
396*088332b5SXin Li ** Userdata
397*088332b5SXin Li ** ===================================================================
398*088332b5SXin Li */
399*088332b5SXin Li 
400*088332b5SXin Li 
401*088332b5SXin Li /*
402*088332b5SXin Li ** Light userdata should be a variant of userdata, but for compatibility
403*088332b5SXin Li ** reasons they are also different types.
404*088332b5SXin Li */
405*088332b5SXin Li #define LUA_VLIGHTUSERDATA	makevariant(LUA_TLIGHTUSERDATA, 0)
406*088332b5SXin Li 
407*088332b5SXin Li #define LUA_VUSERDATA		makevariant(LUA_TUSERDATA, 0)
408*088332b5SXin Li 
409*088332b5SXin Li #define ttislightuserdata(o)	checktag((o), LUA_VLIGHTUSERDATA)
410*088332b5SXin Li #define ttisfulluserdata(o)	checktag((o), ctb(LUA_VUSERDATA))
411*088332b5SXin Li 
412*088332b5SXin Li #define pvalue(o)	check_exp(ttislightuserdata(o), val_(o).p)
413*088332b5SXin Li #define uvalue(o)	check_exp(ttisfulluserdata(o), gco2u(val_(o).gc))
414*088332b5SXin Li 
415*088332b5SXin Li #define pvalueraw(v)	((v).p)
416*088332b5SXin Li 
417*088332b5SXin Li #define setpvalue(obj,x) \
418*088332b5SXin Li   { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_VLIGHTUSERDATA); }
419*088332b5SXin Li 
420*088332b5SXin Li #define setuvalue(L,obj,x) \
421*088332b5SXin Li   { TValue *io = (obj); Udata *x_ = (x); \
422*088332b5SXin Li     val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VUSERDATA)); \
423*088332b5SXin Li     checkliveness(L,io); }
424*088332b5SXin Li 
425*088332b5SXin Li 
426*088332b5SXin Li /* Ensures that addresses after this type are always fully aligned. */
427*088332b5SXin Li typedef union UValue {
428*088332b5SXin Li   TValue uv;
429*088332b5SXin Li   LUAI_MAXALIGN;  /* ensures maximum alignment for udata bytes */
430*088332b5SXin Li } UValue;
431*088332b5SXin Li 
432*088332b5SXin Li 
433*088332b5SXin Li /*
434*088332b5SXin Li ** Header for userdata with user values;
435*088332b5SXin Li ** memory area follows the end of this structure.
436*088332b5SXin Li */
437*088332b5SXin Li typedef struct Udata {
438*088332b5SXin Li   CommonHeader;
439*088332b5SXin Li   unsigned short nuvalue;  /* number of user values */
440*088332b5SXin Li   size_t len;  /* number of bytes */
441*088332b5SXin Li   struct Table *metatable;
442*088332b5SXin Li   GCObject *gclist;
443*088332b5SXin Li   UValue uv[1];  /* user values */
444*088332b5SXin Li } Udata;
445*088332b5SXin Li 
446*088332b5SXin Li 
447*088332b5SXin Li /*
448*088332b5SXin Li ** Header for userdata with no user values. These userdata do not need
449*088332b5SXin Li ** to be gray during GC, and therefore do not need a 'gclist' field.
450*088332b5SXin Li ** To simplify, the code always use 'Udata' for both kinds of userdata,
451*088332b5SXin Li ** making sure it never accesses 'gclist' on userdata with no user values.
452*088332b5SXin Li ** This structure here is used only to compute the correct size for
453*088332b5SXin Li ** this representation. (The 'bindata' field in its end ensures correct
454*088332b5SXin Li ** alignment for binary data following this header.)
455*088332b5SXin Li */
456*088332b5SXin Li typedef struct Udata0 {
457*088332b5SXin Li   CommonHeader;
458*088332b5SXin Li   unsigned short nuvalue;  /* number of user values */
459*088332b5SXin Li   size_t len;  /* number of bytes */
460*088332b5SXin Li   struct Table *metatable;
461*088332b5SXin Li   union {LUAI_MAXALIGN;} bindata;
462*088332b5SXin Li } Udata0;
463*088332b5SXin Li 
464*088332b5SXin Li 
465*088332b5SXin Li /* compute the offset of the memory area of a userdata */
466*088332b5SXin Li #define udatamemoffset(nuv) \
467*088332b5SXin Li 	((nuv) == 0 ? offsetof(Udata0, bindata)  \
468*088332b5SXin Li                     : offsetof(Udata, uv) + (sizeof(UValue) * (nuv)))
469*088332b5SXin Li 
470*088332b5SXin Li /* get the address of the memory block inside 'Udata' */
471*088332b5SXin Li #define getudatamem(u)	(cast_charp(u) + udatamemoffset((u)->nuvalue))
472*088332b5SXin Li 
473*088332b5SXin Li /* compute the size of a userdata */
474*088332b5SXin Li #define sizeudata(nuv,nb)	(udatamemoffset(nuv) + (nb))
475*088332b5SXin Li 
476*088332b5SXin Li /* }================================================================== */
477*088332b5SXin Li 
478*088332b5SXin Li 
479*088332b5SXin Li /*
480*088332b5SXin Li ** {==================================================================
481*088332b5SXin Li ** Prototypes
482*088332b5SXin Li ** ===================================================================
483*088332b5SXin Li */
484*088332b5SXin Li 
485*088332b5SXin Li #define LUA_VPROTO	makevariant(LUA_TPROTO, 0)
486*088332b5SXin Li 
487*088332b5SXin Li 
488*088332b5SXin Li /*
489*088332b5SXin Li ** Description of an upvalue for function prototypes
490*088332b5SXin Li */
491*088332b5SXin Li typedef struct Upvaldesc {
492*088332b5SXin Li   TString *name;  /* upvalue name (for debug information) */
493*088332b5SXin Li   lu_byte instack;  /* whether it is in stack (register) */
494*088332b5SXin Li   lu_byte idx;  /* index of upvalue (in stack or in outer function's list) */
495*088332b5SXin Li   lu_byte kind;  /* kind of corresponding variable */
496*088332b5SXin Li } Upvaldesc;
497*088332b5SXin Li 
498*088332b5SXin Li 
499*088332b5SXin Li /*
500*088332b5SXin Li ** Description of a local variable for function prototypes
501*088332b5SXin Li ** (used for debug information)
502*088332b5SXin Li */
503*088332b5SXin Li typedef struct LocVar {
504*088332b5SXin Li   TString *varname;
505*088332b5SXin Li   int startpc;  /* first point where variable is active */
506*088332b5SXin Li   int endpc;    /* first point where variable is dead */
507*088332b5SXin Li } LocVar;
508*088332b5SXin Li 
509*088332b5SXin Li 
510*088332b5SXin Li /*
511*088332b5SXin Li ** Associates the absolute line source for a given instruction ('pc').
512*088332b5SXin Li ** The array 'lineinfo' gives, for each instruction, the difference in
513*088332b5SXin Li ** lines from the previous instruction. When that difference does not
514*088332b5SXin Li ** fit into a byte, Lua saves the absolute line for that instruction.
515*088332b5SXin Li ** (Lua also saves the absolute line periodically, to speed up the
516*088332b5SXin Li ** computation of a line number: we can use binary search in the
517*088332b5SXin Li ** absolute-line array, but we must traverse the 'lineinfo' array
518*088332b5SXin Li ** linearly to compute a line.)
519*088332b5SXin Li */
520*088332b5SXin Li typedef struct AbsLineInfo {
521*088332b5SXin Li   int pc;
522*088332b5SXin Li   int line;
523*088332b5SXin Li } AbsLineInfo;
524*088332b5SXin Li 
525*088332b5SXin Li /*
526*088332b5SXin Li ** Function Prototypes
527*088332b5SXin Li */
528*088332b5SXin Li typedef struct Proto {
529*088332b5SXin Li   CommonHeader;
530*088332b5SXin Li   lu_byte numparams;  /* number of fixed (named) parameters */
531*088332b5SXin Li   lu_byte is_vararg;
532*088332b5SXin Li   lu_byte maxstacksize;  /* number of registers needed by this function */
533*088332b5SXin Li   int sizeupvalues;  /* size of 'upvalues' */
534*088332b5SXin Li   int sizek;  /* size of 'k' */
535*088332b5SXin Li   int sizecode;
536*088332b5SXin Li   int sizelineinfo;
537*088332b5SXin Li   int sizep;  /* size of 'p' */
538*088332b5SXin Li   int sizelocvars;
539*088332b5SXin Li   int sizeabslineinfo;  /* size of 'abslineinfo' */
540*088332b5SXin Li   int linedefined;  /* debug information  */
541*088332b5SXin Li   int lastlinedefined;  /* debug information  */
542*088332b5SXin Li   TValue *k;  /* constants used by the function */
543*088332b5SXin Li   Instruction *code;  /* opcodes */
544*088332b5SXin Li   struct Proto **p;  /* functions defined inside the function */
545*088332b5SXin Li   Upvaldesc *upvalues;  /* upvalue information */
546*088332b5SXin Li   ls_byte *lineinfo;  /* information about source lines (debug information) */
547*088332b5SXin Li   AbsLineInfo *abslineinfo;  /* idem */
548*088332b5SXin Li   LocVar *locvars;  /* information about local variables (debug information) */
549*088332b5SXin Li   TString  *source;  /* used for debug information */
550*088332b5SXin Li   GCObject *gclist;
551*088332b5SXin Li } Proto;
552*088332b5SXin Li 
553*088332b5SXin Li /* }================================================================== */
554*088332b5SXin Li 
555*088332b5SXin Li 
556*088332b5SXin Li /*
557*088332b5SXin Li ** {==================================================================
558*088332b5SXin Li ** Closures
559*088332b5SXin Li ** ===================================================================
560*088332b5SXin Li */
561*088332b5SXin Li 
562*088332b5SXin Li #define LUA_VUPVAL	makevariant(LUA_TUPVAL, 0)
563*088332b5SXin Li 
564*088332b5SXin Li 
565*088332b5SXin Li /* Variant tags for functions */
566*088332b5SXin Li #define LUA_VLCL	makevariant(LUA_TFUNCTION, 0)  /* Lua closure */
567*088332b5SXin Li #define LUA_VLCF	makevariant(LUA_TFUNCTION, 1)  /* light C function */
568*088332b5SXin Li #define LUA_VCCL	makevariant(LUA_TFUNCTION, 2)  /* C closure */
569*088332b5SXin Li 
570*088332b5SXin Li #define ttisfunction(o)		checktype(o, LUA_TFUNCTION)
571*088332b5SXin Li #define ttisclosure(o)		((rawtt(o) & 0x1F) == LUA_VLCL)
572*088332b5SXin Li #define ttisLclosure(o)		checktag((o), ctb(LUA_VLCL))
573*088332b5SXin Li #define ttislcf(o)		checktag((o), LUA_VLCF)
574*088332b5SXin Li #define ttisCclosure(o)		checktag((o), ctb(LUA_VCCL))
575*088332b5SXin Li 
576*088332b5SXin Li #define isLfunction(o)	ttisLclosure(o)
577*088332b5SXin Li 
578*088332b5SXin Li #define clvalue(o)	check_exp(ttisclosure(o), gco2cl(val_(o).gc))
579*088332b5SXin Li #define clLvalue(o)	check_exp(ttisLclosure(o), gco2lcl(val_(o).gc))
580*088332b5SXin Li #define fvalue(o)	check_exp(ttislcf(o), val_(o).f)
581*088332b5SXin Li #define clCvalue(o)	check_exp(ttisCclosure(o), gco2ccl(val_(o).gc))
582*088332b5SXin Li 
583*088332b5SXin Li #define fvalueraw(v)	((v).f)
584*088332b5SXin Li 
585*088332b5SXin Li #define setclLvalue(L,obj,x) \
586*088332b5SXin Li   { TValue *io = (obj); LClosure *x_ = (x); \
587*088332b5SXin Li     val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VLCL)); \
588*088332b5SXin Li     checkliveness(L,io); }
589*088332b5SXin Li 
590*088332b5SXin Li #define setclLvalue2s(L,o,cl)	setclLvalue(L,s2v(o),cl)
591*088332b5SXin Li 
592*088332b5SXin Li #define setfvalue(obj,x) \
593*088332b5SXin Li   { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_VLCF); }
594*088332b5SXin Li 
595*088332b5SXin Li #define setclCvalue(L,obj,x) \
596*088332b5SXin Li   { TValue *io = (obj); CClosure *x_ = (x); \
597*088332b5SXin Li     val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VCCL)); \
598*088332b5SXin Li     checkliveness(L,io); }
599*088332b5SXin Li 
600*088332b5SXin Li 
601*088332b5SXin Li /*
602*088332b5SXin Li ** Upvalues for Lua closures
603*088332b5SXin Li */
604*088332b5SXin Li typedef struct UpVal {
605*088332b5SXin Li   CommonHeader;
606*088332b5SXin Li   lu_byte tbc;  /* true if it represents a to-be-closed variable */
607*088332b5SXin Li   TValue *v;  /* points to stack or to its own value */
608*088332b5SXin Li   union {
609*088332b5SXin Li     struct {  /* (when open) */
610*088332b5SXin Li       struct UpVal *next;  /* linked list */
611*088332b5SXin Li       struct UpVal **previous;
612*088332b5SXin Li     } open;
613*088332b5SXin Li     TValue value;  /* the value (when closed) */
614*088332b5SXin Li   } u;
615*088332b5SXin Li } UpVal;
616*088332b5SXin Li 
617*088332b5SXin Li 
618*088332b5SXin Li 
619*088332b5SXin Li #define ClosureHeader \
620*088332b5SXin Li 	CommonHeader; lu_byte nupvalues; GCObject *gclist
621*088332b5SXin Li 
622*088332b5SXin Li typedef struct CClosure {
623*088332b5SXin Li   ClosureHeader;
624*088332b5SXin Li   lua_CFunction f;
625*088332b5SXin Li   TValue upvalue[1];  /* list of upvalues */
626*088332b5SXin Li } CClosure;
627*088332b5SXin Li 
628*088332b5SXin Li 
629*088332b5SXin Li typedef struct LClosure {
630*088332b5SXin Li   ClosureHeader;
631*088332b5SXin Li   struct Proto *p;
632*088332b5SXin Li   UpVal *upvals[1];  /* list of upvalues */
633*088332b5SXin Li } LClosure;
634*088332b5SXin Li 
635*088332b5SXin Li 
636*088332b5SXin Li typedef union Closure {
637*088332b5SXin Li   CClosure c;
638*088332b5SXin Li   LClosure l;
639*088332b5SXin Li } Closure;
640*088332b5SXin Li 
641*088332b5SXin Li 
642*088332b5SXin Li #define getproto(o)	(clLvalue(o)->p)
643*088332b5SXin Li 
644*088332b5SXin Li /* }================================================================== */
645*088332b5SXin Li 
646*088332b5SXin Li 
647*088332b5SXin Li /*
648*088332b5SXin Li ** {==================================================================
649*088332b5SXin Li ** Tables
650*088332b5SXin Li ** ===================================================================
651*088332b5SXin Li */
652*088332b5SXin Li 
653*088332b5SXin Li #define LUA_VTABLE	makevariant(LUA_TTABLE, 0)
654*088332b5SXin Li 
655*088332b5SXin Li #define ttistable(o)		checktag((o), ctb(LUA_VTABLE))
656*088332b5SXin Li 
657*088332b5SXin Li #define hvalue(o)	check_exp(ttistable(o), gco2t(val_(o).gc))
658*088332b5SXin Li 
659*088332b5SXin Li #define sethvalue(L,obj,x) \
660*088332b5SXin Li   { TValue *io = (obj); Table *x_ = (x); \
661*088332b5SXin Li     val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VTABLE)); \
662*088332b5SXin Li     checkliveness(L,io); }
663*088332b5SXin Li 
664*088332b5SXin Li #define sethvalue2s(L,o,h)	sethvalue(L,s2v(o),h)
665*088332b5SXin Li 
666*088332b5SXin Li 
667*088332b5SXin Li /*
668*088332b5SXin Li ** Nodes for Hash tables: A pack of two TValue's (key-value pairs)
669*088332b5SXin Li ** plus a 'next' field to link colliding entries. The distribution
670*088332b5SXin Li ** of the key's fields ('key_tt' and 'key_val') not forming a proper
671*088332b5SXin Li ** 'TValue' allows for a smaller size for 'Node' both in 4-byte
672*088332b5SXin Li ** and 8-byte alignments.
673*088332b5SXin Li */
674*088332b5SXin Li typedef union Node {
675*088332b5SXin Li   struct NodeKey {
676*088332b5SXin Li     TValuefields;  /* fields for value */
677*088332b5SXin Li     lu_byte key_tt;  /* key type */
678*088332b5SXin Li     int next;  /* for chaining */
679*088332b5SXin Li     Value key_val;  /* key value */
680*088332b5SXin Li   } u;
681*088332b5SXin Li   TValue i_val;  /* direct access to node's value as a proper 'TValue' */
682*088332b5SXin Li } Node;
683*088332b5SXin Li 
684*088332b5SXin Li 
685*088332b5SXin Li /* copy a value into a key */
686*088332b5SXin Li #define setnodekey(L,node,obj) \
687*088332b5SXin Li 	{ Node *n_=(node); const TValue *io_=(obj); \
688*088332b5SXin Li 	  n_->u.key_val = io_->value_; n_->u.key_tt = io_->tt_; \
689*088332b5SXin Li 	  checkliveness(L,io_); }
690*088332b5SXin Li 
691*088332b5SXin Li 
692*088332b5SXin Li /* copy a value from a key */
693*088332b5SXin Li #define getnodekey(L,obj,node) \
694*088332b5SXin Li 	{ TValue *io_=(obj); const Node *n_=(node); \
695*088332b5SXin Li 	  io_->value_ = n_->u.key_val; io_->tt_ = n_->u.key_tt; \
696*088332b5SXin Li 	  checkliveness(L,io_); }
697*088332b5SXin Li 
698*088332b5SXin Li 
699*088332b5SXin Li /*
700*088332b5SXin Li ** About 'alimit': if 'isrealasize(t)' is true, then 'alimit' is the
701*088332b5SXin Li ** real size of 'array'. Otherwise, the real size of 'array' is the
702*088332b5SXin Li ** smallest power of two not smaller than 'alimit' (or zero iff 'alimit'
703*088332b5SXin Li ** is zero); 'alimit' is then used as a hint for #t.
704*088332b5SXin Li */
705*088332b5SXin Li 
706*088332b5SXin Li #define BITRAS		(1 << 7)
707*088332b5SXin Li #define isrealasize(t)		(!((t)->flags & BITRAS))
708*088332b5SXin Li #define setrealasize(t)		((t)->flags &= cast_byte(~BITRAS))
709*088332b5SXin Li #define setnorealasize(t)	((t)->flags |= BITRAS)
710*088332b5SXin Li 
711*088332b5SXin Li 
712*088332b5SXin Li typedef struct Table {
713*088332b5SXin Li   CommonHeader;
714*088332b5SXin Li   lu_byte flags;  /* 1<<p means tagmethod(p) is not present */
715*088332b5SXin Li   lu_byte lsizenode;  /* log2 of size of 'node' array */
716*088332b5SXin Li   unsigned int alimit;  /* "limit" of 'array' array */
717*088332b5SXin Li   TValue *array;  /* array part */
718*088332b5SXin Li   Node *node;
719*088332b5SXin Li   Node *lastfree;  /* any free position is before this position */
720*088332b5SXin Li   struct Table *metatable;
721*088332b5SXin Li   GCObject *gclist;
722*088332b5SXin Li } Table;
723*088332b5SXin Li 
724*088332b5SXin Li 
725*088332b5SXin Li /*
726*088332b5SXin Li ** Macros to manipulate keys inserted in nodes
727*088332b5SXin Li */
728*088332b5SXin Li #define keytt(node)		((node)->u.key_tt)
729*088332b5SXin Li #define keyval(node)		((node)->u.key_val)
730*088332b5SXin Li 
731*088332b5SXin Li #define keyisnil(node)		(keytt(node) == LUA_TNIL)
732*088332b5SXin Li #define keyisinteger(node)	(keytt(node) == LUA_VNUMINT)
733*088332b5SXin Li #define keyival(node)		(keyval(node).i)
734*088332b5SXin Li #define keyisshrstr(node)	(keytt(node) == ctb(LUA_VSHRSTR))
735*088332b5SXin Li #define keystrval(node)		(gco2ts(keyval(node).gc))
736*088332b5SXin Li 
737*088332b5SXin Li #define setnilkey(node)		(keytt(node) = LUA_TNIL)
738*088332b5SXin Li 
739*088332b5SXin Li #define keyiscollectable(n)	(keytt(n) & BIT_ISCOLLECTABLE)
740*088332b5SXin Li 
741*088332b5SXin Li #define gckey(n)	(keyval(n).gc)
742*088332b5SXin Li #define gckeyN(n)	(keyiscollectable(n) ? gckey(n) : NULL)
743*088332b5SXin Li 
744*088332b5SXin Li 
745*088332b5SXin Li /*
746*088332b5SXin Li ** Use a "nil table" to mark dead keys in a table. Those keys serve
747*088332b5SXin Li ** to keep space for removed entries, which may still be part of
748*088332b5SXin Li ** chains. Note that the 'keytt' does not have the BIT_ISCOLLECTABLE
749*088332b5SXin Li ** set, so these values are considered not collectable and are different
750*088332b5SXin Li ** from any valid value.
751*088332b5SXin Li */
752*088332b5SXin Li #define setdeadkey(n)	(keytt(n) = LUA_TTABLE, gckey(n) = NULL)
753*088332b5SXin Li 
754*088332b5SXin Li /* }================================================================== */
755*088332b5SXin Li 
756*088332b5SXin Li 
757*088332b5SXin Li 
758*088332b5SXin Li /*
759*088332b5SXin Li ** 'module' operation for hashing (size is always a power of 2)
760*088332b5SXin Li */
761*088332b5SXin Li #define lmod(s,size) \
762*088332b5SXin Li 	(check_exp((size&(size-1))==0, (cast_int((s) & ((size)-1)))))
763*088332b5SXin Li 
764*088332b5SXin Li 
765*088332b5SXin Li #define twoto(x)	(1<<(x))
766*088332b5SXin Li #define sizenode(t)	(twoto((t)->lsizenode))
767*088332b5SXin Li 
768*088332b5SXin Li 
769*088332b5SXin Li /* size of buffer for 'luaO_utf8esc' function */
770*088332b5SXin Li #define UTF8BUFFSZ	8
771*088332b5SXin Li 
772*088332b5SXin Li LUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x);
773*088332b5SXin Li LUAI_FUNC int luaO_ceillog2 (unsigned int x);
774*088332b5SXin Li LUAI_FUNC int luaO_rawarith (lua_State *L, int op, const TValue *p1,
775*088332b5SXin Li                              const TValue *p2, TValue *res);
776*088332b5SXin Li LUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1,
777*088332b5SXin Li                            const TValue *p2, StkId res);
778*088332b5SXin Li LUAI_FUNC size_t luaO_str2num (const char *s, TValue *o);
779*088332b5SXin Li LUAI_FUNC int luaO_hexavalue (int c);
780*088332b5SXin Li LUAI_FUNC void luaO_tostring (lua_State *L, TValue *obj);
781*088332b5SXin Li LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt,
782*088332b5SXin Li                                                        va_list argp);
783*088332b5SXin Li LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...);
784*088332b5SXin Li LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t srclen);
785*088332b5SXin Li 
786*088332b5SXin Li 
787*088332b5SXin Li #endif
788*088332b5SXin Li 
789