1*8e3e3a7aSWarner Losh /* 2*8e3e3a7aSWarner Losh ** $Id: lobject.h,v 2.117 2016/08/01 19:51:24 roberto Exp $ 3*8e3e3a7aSWarner Losh ** Type definitions for Lua objects 4*8e3e3a7aSWarner Losh ** See Copyright Notice in lua.h 5*8e3e3a7aSWarner Losh */ 6*8e3e3a7aSWarner Losh 7*8e3e3a7aSWarner Losh 8*8e3e3a7aSWarner Losh #ifndef lobject_h 9*8e3e3a7aSWarner Losh #define lobject_h 10*8e3e3a7aSWarner Losh 11*8e3e3a7aSWarner Losh 12*8e3e3a7aSWarner Losh #include <stdarg.h> 13*8e3e3a7aSWarner Losh 14*8e3e3a7aSWarner Losh 15*8e3e3a7aSWarner Losh #include "llimits.h" 16*8e3e3a7aSWarner Losh #include "lua.h" 17*8e3e3a7aSWarner Losh 18*8e3e3a7aSWarner Losh 19*8e3e3a7aSWarner Losh /* 20*8e3e3a7aSWarner Losh ** Extra tags for non-values 21*8e3e3a7aSWarner Losh */ 22*8e3e3a7aSWarner Losh #define LUA_TPROTO LUA_NUMTAGS /* function prototypes */ 23*8e3e3a7aSWarner Losh #define LUA_TDEADKEY (LUA_NUMTAGS+1) /* removed keys in tables */ 24*8e3e3a7aSWarner Losh 25*8e3e3a7aSWarner Losh /* 26*8e3e3a7aSWarner Losh ** number of all possible tags (including LUA_TNONE but excluding DEADKEY) 27*8e3e3a7aSWarner Losh */ 28*8e3e3a7aSWarner Losh #define LUA_TOTALTAGS (LUA_TPROTO + 2) 29*8e3e3a7aSWarner Losh 30*8e3e3a7aSWarner Losh 31*8e3e3a7aSWarner Losh /* 32*8e3e3a7aSWarner Losh ** tags for Tagged Values have the following use of bits: 33*8e3e3a7aSWarner Losh ** bits 0-3: actual tag (a LUA_T* value) 34*8e3e3a7aSWarner Losh ** bits 4-5: variant bits 35*8e3e3a7aSWarner Losh ** bit 6: whether value is collectable 36*8e3e3a7aSWarner Losh */ 37*8e3e3a7aSWarner Losh 38*8e3e3a7aSWarner Losh 39*8e3e3a7aSWarner Losh /* 40*8e3e3a7aSWarner Losh ** LUA_TFUNCTION variants: 41*8e3e3a7aSWarner Losh ** 0 - Lua function 42*8e3e3a7aSWarner Losh ** 1 - light C function 43*8e3e3a7aSWarner Losh ** 2 - regular C function (closure) 44*8e3e3a7aSWarner Losh */ 45*8e3e3a7aSWarner Losh 46*8e3e3a7aSWarner Losh /* Variant tags for functions */ 47*8e3e3a7aSWarner Losh #define LUA_TLCL (LUA_TFUNCTION | (0 << 4)) /* Lua closure */ 48*8e3e3a7aSWarner Losh #define LUA_TLCF (LUA_TFUNCTION | (1 << 4)) /* light C function */ 49*8e3e3a7aSWarner Losh #define LUA_TCCL (LUA_TFUNCTION | (2 << 4)) /* C closure */ 50*8e3e3a7aSWarner Losh 51*8e3e3a7aSWarner Losh 52*8e3e3a7aSWarner Losh /* Variant tags for strings */ 53*8e3e3a7aSWarner Losh #define LUA_TSHRSTR (LUA_TSTRING | (0 << 4)) /* short strings */ 54*8e3e3a7aSWarner Losh #define LUA_TLNGSTR (LUA_TSTRING | (1 << 4)) /* long strings */ 55*8e3e3a7aSWarner Losh 56*8e3e3a7aSWarner Losh 57*8e3e3a7aSWarner Losh /* Variant tags for numbers */ 58*8e3e3a7aSWarner Losh #define LUA_TNUMFLT (LUA_TNUMBER | (0 << 4)) /* float numbers */ 59*8e3e3a7aSWarner Losh #define LUA_TNUMINT (LUA_TNUMBER | (1 << 4)) /* integer numbers */ 60*8e3e3a7aSWarner Losh 61*8e3e3a7aSWarner Losh 62*8e3e3a7aSWarner Losh /* Bit mark for collectable types */ 63*8e3e3a7aSWarner Losh #define BIT_ISCOLLECTABLE (1 << 6) 64*8e3e3a7aSWarner Losh 65*8e3e3a7aSWarner Losh /* mark a tag as collectable */ 66*8e3e3a7aSWarner Losh #define ctb(t) ((t) | BIT_ISCOLLECTABLE) 67*8e3e3a7aSWarner Losh 68*8e3e3a7aSWarner Losh 69*8e3e3a7aSWarner Losh /* 70*8e3e3a7aSWarner Losh ** Common type for all collectable objects 71*8e3e3a7aSWarner Losh */ 72*8e3e3a7aSWarner Losh typedef struct GCObject GCObject; 73*8e3e3a7aSWarner Losh 74*8e3e3a7aSWarner Losh 75*8e3e3a7aSWarner Losh /* 76*8e3e3a7aSWarner Losh ** Common Header for all collectable objects (in macro form, to be 77*8e3e3a7aSWarner Losh ** included in other objects) 78*8e3e3a7aSWarner Losh */ 79*8e3e3a7aSWarner Losh #define CommonHeader GCObject *next; lu_byte tt; lu_byte marked 80*8e3e3a7aSWarner Losh 81*8e3e3a7aSWarner Losh 82*8e3e3a7aSWarner Losh /* 83*8e3e3a7aSWarner Losh ** Common type has only the common header 84*8e3e3a7aSWarner Losh */ 85*8e3e3a7aSWarner Losh struct GCObject { 86*8e3e3a7aSWarner Losh CommonHeader; 87*8e3e3a7aSWarner Losh }; 88*8e3e3a7aSWarner Losh 89*8e3e3a7aSWarner Losh 90*8e3e3a7aSWarner Losh 91*8e3e3a7aSWarner Losh 92*8e3e3a7aSWarner Losh /* 93*8e3e3a7aSWarner Losh ** Tagged Values. This is the basic representation of values in Lua, 94*8e3e3a7aSWarner Losh ** an actual value plus a tag with its type. 95*8e3e3a7aSWarner Losh */ 96*8e3e3a7aSWarner Losh 97*8e3e3a7aSWarner Losh /* 98*8e3e3a7aSWarner Losh ** Union of all Lua values 99*8e3e3a7aSWarner Losh */ 100*8e3e3a7aSWarner Losh typedef union Value { 101*8e3e3a7aSWarner Losh GCObject *gc; /* collectable objects */ 102*8e3e3a7aSWarner Losh void *p; /* light userdata */ 103*8e3e3a7aSWarner Losh int b; /* booleans */ 104*8e3e3a7aSWarner Losh lua_CFunction f; /* light C functions */ 105*8e3e3a7aSWarner Losh lua_Integer i; /* integer numbers */ 106*8e3e3a7aSWarner Losh lua_Number n; /* float numbers */ 107*8e3e3a7aSWarner Losh } Value; 108*8e3e3a7aSWarner Losh 109*8e3e3a7aSWarner Losh 110*8e3e3a7aSWarner Losh #define TValuefields Value value_; int tt_ 111*8e3e3a7aSWarner Losh 112*8e3e3a7aSWarner Losh 113*8e3e3a7aSWarner Losh typedef struct lua_TValue { 114*8e3e3a7aSWarner Losh TValuefields; 115*8e3e3a7aSWarner Losh } TValue; 116*8e3e3a7aSWarner Losh 117*8e3e3a7aSWarner Losh 118*8e3e3a7aSWarner Losh 119*8e3e3a7aSWarner Losh /* macro defining a nil value */ 120*8e3e3a7aSWarner Losh #define NILCONSTANT {NULL}, LUA_TNIL 121*8e3e3a7aSWarner Losh 122*8e3e3a7aSWarner Losh 123*8e3e3a7aSWarner Losh #define val_(o) ((o)->value_) 124*8e3e3a7aSWarner Losh 125*8e3e3a7aSWarner Losh 126*8e3e3a7aSWarner Losh /* raw type tag of a TValue */ 127*8e3e3a7aSWarner Losh #define rttype(o) ((o)->tt_) 128*8e3e3a7aSWarner Losh 129*8e3e3a7aSWarner Losh /* tag with no variants (bits 0-3) */ 130*8e3e3a7aSWarner Losh #define novariant(x) ((x) & 0x0F) 131*8e3e3a7aSWarner Losh 132*8e3e3a7aSWarner Losh /* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ 133*8e3e3a7aSWarner Losh #define ttype(o) (rttype(o) & 0x3F) 134*8e3e3a7aSWarner Losh 135*8e3e3a7aSWarner Losh /* type tag of a TValue with no variants (bits 0-3) */ 136*8e3e3a7aSWarner Losh #define ttnov(o) (novariant(rttype(o))) 137*8e3e3a7aSWarner Losh 138*8e3e3a7aSWarner Losh 139*8e3e3a7aSWarner Losh /* Macros to test type */ 140*8e3e3a7aSWarner Losh #define checktag(o,t) (rttype(o) == (t)) 141*8e3e3a7aSWarner Losh #define checktype(o,t) (ttnov(o) == (t)) 142*8e3e3a7aSWarner Losh #define ttisnumber(o) checktype((o), LUA_TNUMBER) 143*8e3e3a7aSWarner Losh #define ttisfloat(o) checktag((o), LUA_TNUMFLT) 144*8e3e3a7aSWarner Losh #define ttisinteger(o) checktag((o), LUA_TNUMINT) 145*8e3e3a7aSWarner Losh #define ttisnil(o) checktag((o), LUA_TNIL) 146*8e3e3a7aSWarner Losh #define ttisboolean(o) checktag((o), LUA_TBOOLEAN) 147*8e3e3a7aSWarner Losh #define ttislightuserdata(o) checktag((o), LUA_TLIGHTUSERDATA) 148*8e3e3a7aSWarner Losh #define ttisstring(o) checktype((o), LUA_TSTRING) 149*8e3e3a7aSWarner Losh #define ttisshrstring(o) checktag((o), ctb(LUA_TSHRSTR)) 150*8e3e3a7aSWarner Losh #define ttislngstring(o) checktag((o), ctb(LUA_TLNGSTR)) 151*8e3e3a7aSWarner Losh #define ttistable(o) checktag((o), ctb(LUA_TTABLE)) 152*8e3e3a7aSWarner Losh #define ttisfunction(o) checktype(o, LUA_TFUNCTION) 153*8e3e3a7aSWarner Losh #define ttisclosure(o) ((rttype(o) & 0x1F) == LUA_TFUNCTION) 154*8e3e3a7aSWarner Losh #define ttisCclosure(o) checktag((o), ctb(LUA_TCCL)) 155*8e3e3a7aSWarner Losh #define ttisLclosure(o) checktag((o), ctb(LUA_TLCL)) 156*8e3e3a7aSWarner Losh #define ttislcf(o) checktag((o), LUA_TLCF) 157*8e3e3a7aSWarner Losh #define ttisfulluserdata(o) checktag((o), ctb(LUA_TUSERDATA)) 158*8e3e3a7aSWarner Losh #define ttisthread(o) checktag((o), ctb(LUA_TTHREAD)) 159*8e3e3a7aSWarner Losh #define ttisdeadkey(o) checktag((o), LUA_TDEADKEY) 160*8e3e3a7aSWarner Losh 161*8e3e3a7aSWarner Losh 162*8e3e3a7aSWarner Losh /* Macros to access values */ 163*8e3e3a7aSWarner Losh #define ivalue(o) check_exp(ttisinteger(o), val_(o).i) 164*8e3e3a7aSWarner Losh #define fltvalue(o) check_exp(ttisfloat(o), val_(o).n) 165*8e3e3a7aSWarner Losh #define nvalue(o) check_exp(ttisnumber(o), \ 166*8e3e3a7aSWarner Losh (ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o))) 167*8e3e3a7aSWarner Losh #define gcvalue(o) check_exp(iscollectable(o), val_(o).gc) 168*8e3e3a7aSWarner Losh #define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p) 169*8e3e3a7aSWarner Losh #define tsvalue(o) check_exp(ttisstring(o), gco2ts(val_(o).gc)) 170*8e3e3a7aSWarner Losh #define uvalue(o) check_exp(ttisfulluserdata(o), gco2u(val_(o).gc)) 171*8e3e3a7aSWarner Losh #define clvalue(o) check_exp(ttisclosure(o), gco2cl(val_(o).gc)) 172*8e3e3a7aSWarner Losh #define clLvalue(o) check_exp(ttisLclosure(o), gco2lcl(val_(o).gc)) 173*8e3e3a7aSWarner Losh #define clCvalue(o) check_exp(ttisCclosure(o), gco2ccl(val_(o).gc)) 174*8e3e3a7aSWarner Losh #define fvalue(o) check_exp(ttislcf(o), val_(o).f) 175*8e3e3a7aSWarner Losh #define hvalue(o) check_exp(ttistable(o), gco2t(val_(o).gc)) 176*8e3e3a7aSWarner Losh #define bvalue(o) check_exp(ttisboolean(o), val_(o).b) 177*8e3e3a7aSWarner Losh #define thvalue(o) check_exp(ttisthread(o), gco2th(val_(o).gc)) 178*8e3e3a7aSWarner Losh /* a dead value may get the 'gc' field, but cannot access its contents */ 179*8e3e3a7aSWarner Losh #define deadvalue(o) check_exp(ttisdeadkey(o), cast(void *, val_(o).gc)) 180*8e3e3a7aSWarner Losh 181*8e3e3a7aSWarner Losh #define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) 182*8e3e3a7aSWarner Losh 183*8e3e3a7aSWarner Losh 184*8e3e3a7aSWarner Losh #define iscollectable(o) (rttype(o) & BIT_ISCOLLECTABLE) 185*8e3e3a7aSWarner Losh 186*8e3e3a7aSWarner Losh 187*8e3e3a7aSWarner Losh /* Macros for internal tests */ 188*8e3e3a7aSWarner Losh #define righttt(obj) (ttype(obj) == gcvalue(obj)->tt) 189*8e3e3a7aSWarner Losh 190*8e3e3a7aSWarner Losh #define checkliveness(L,obj) \ 191*8e3e3a7aSWarner Losh lua_longassert(!iscollectable(obj) || \ 192*8e3e3a7aSWarner Losh (righttt(obj) && (L == NULL || !isdead(G(L),gcvalue(obj))))) 193*8e3e3a7aSWarner Losh 194*8e3e3a7aSWarner Losh 195*8e3e3a7aSWarner Losh /* Macros to set values */ 196*8e3e3a7aSWarner Losh #define settt_(o,t) ((o)->tt_=(t)) 197*8e3e3a7aSWarner Losh 198*8e3e3a7aSWarner Losh #define setfltvalue(obj,x) \ 199*8e3e3a7aSWarner Losh { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMFLT); } 200*8e3e3a7aSWarner Losh 201*8e3e3a7aSWarner Losh #define chgfltvalue(obj,x) \ 202*8e3e3a7aSWarner Losh { TValue *io=(obj); lua_assert(ttisfloat(io)); val_(io).n=(x); } 203*8e3e3a7aSWarner Losh 204*8e3e3a7aSWarner Losh #define setivalue(obj,x) \ 205*8e3e3a7aSWarner Losh { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_TNUMINT); } 206*8e3e3a7aSWarner Losh 207*8e3e3a7aSWarner Losh #define chgivalue(obj,x) \ 208*8e3e3a7aSWarner Losh { TValue *io=(obj); lua_assert(ttisinteger(io)); val_(io).i=(x); } 209*8e3e3a7aSWarner Losh 210*8e3e3a7aSWarner Losh #define setnilvalue(obj) settt_(obj, LUA_TNIL) 211*8e3e3a7aSWarner Losh 212*8e3e3a7aSWarner Losh #define setfvalue(obj,x) \ 213*8e3e3a7aSWarner Losh { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); } 214*8e3e3a7aSWarner Losh 215*8e3e3a7aSWarner Losh #define setpvalue(obj,x) \ 216*8e3e3a7aSWarner Losh { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); } 217*8e3e3a7aSWarner Losh 218*8e3e3a7aSWarner Losh #define setbvalue(obj,x) \ 219*8e3e3a7aSWarner Losh { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); } 220*8e3e3a7aSWarner Losh 221*8e3e3a7aSWarner Losh #define setgcovalue(L,obj,x) \ 222*8e3e3a7aSWarner Losh { TValue *io = (obj); GCObject *i_g=(x); \ 223*8e3e3a7aSWarner Losh val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); } 224*8e3e3a7aSWarner Losh 225*8e3e3a7aSWarner Losh #define setsvalue(L,obj,x) \ 226*8e3e3a7aSWarner Losh { TValue *io = (obj); TString *x_ = (x); \ 227*8e3e3a7aSWarner Losh val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \ 228*8e3e3a7aSWarner Losh checkliveness(L,io); } 229*8e3e3a7aSWarner Losh 230*8e3e3a7aSWarner Losh #define setuvalue(L,obj,x) \ 231*8e3e3a7aSWarner Losh { TValue *io = (obj); Udata *x_ = (x); \ 232*8e3e3a7aSWarner Losh val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TUSERDATA)); \ 233*8e3e3a7aSWarner Losh checkliveness(L,io); } 234*8e3e3a7aSWarner Losh 235*8e3e3a7aSWarner Losh #define setthvalue(L,obj,x) \ 236*8e3e3a7aSWarner Losh { TValue *io = (obj); lua_State *x_ = (x); \ 237*8e3e3a7aSWarner Losh val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTHREAD)); \ 238*8e3e3a7aSWarner Losh checkliveness(L,io); } 239*8e3e3a7aSWarner Losh 240*8e3e3a7aSWarner Losh #define setclLvalue(L,obj,x) \ 241*8e3e3a7aSWarner Losh { TValue *io = (obj); LClosure *x_ = (x); \ 242*8e3e3a7aSWarner Losh val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TLCL)); \ 243*8e3e3a7aSWarner Losh checkliveness(L,io); } 244*8e3e3a7aSWarner Losh 245*8e3e3a7aSWarner Losh #define setclCvalue(L,obj,x) \ 246*8e3e3a7aSWarner Losh { TValue *io = (obj); CClosure *x_ = (x); \ 247*8e3e3a7aSWarner Losh val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TCCL)); \ 248*8e3e3a7aSWarner Losh checkliveness(L,io); } 249*8e3e3a7aSWarner Losh 250*8e3e3a7aSWarner Losh #define sethvalue(L,obj,x) \ 251*8e3e3a7aSWarner Losh { TValue *io = (obj); Table *x_ = (x); \ 252*8e3e3a7aSWarner Losh val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTABLE)); \ 253*8e3e3a7aSWarner Losh checkliveness(L,io); } 254*8e3e3a7aSWarner Losh 255*8e3e3a7aSWarner Losh #define setdeadvalue(obj) settt_(obj, LUA_TDEADKEY) 256*8e3e3a7aSWarner Losh 257*8e3e3a7aSWarner Losh 258*8e3e3a7aSWarner Losh 259*8e3e3a7aSWarner Losh #define setobj(L,obj1,obj2) \ 260*8e3e3a7aSWarner Losh { TValue *io1=(obj1); *io1 = *(obj2); \ 261*8e3e3a7aSWarner Losh (void)L; checkliveness(L,io1); } 262*8e3e3a7aSWarner Losh 263*8e3e3a7aSWarner Losh 264*8e3e3a7aSWarner Losh /* 265*8e3e3a7aSWarner Losh ** different types of assignments, according to destination 266*8e3e3a7aSWarner Losh */ 267*8e3e3a7aSWarner Losh 268*8e3e3a7aSWarner Losh /* from stack to (same) stack */ 269*8e3e3a7aSWarner Losh #define setobjs2s setobj 270*8e3e3a7aSWarner Losh /* to stack (not from same stack) */ 271*8e3e3a7aSWarner Losh #define setobj2s setobj 272*8e3e3a7aSWarner Losh #define setsvalue2s setsvalue 273*8e3e3a7aSWarner Losh #define sethvalue2s sethvalue 274*8e3e3a7aSWarner Losh #define setptvalue2s setptvalue 275*8e3e3a7aSWarner Losh /* from table to same table */ 276*8e3e3a7aSWarner Losh #define setobjt2t setobj 277*8e3e3a7aSWarner Losh /* to new object */ 278*8e3e3a7aSWarner Losh #define setobj2n setobj 279*8e3e3a7aSWarner Losh #define setsvalue2n setsvalue 280*8e3e3a7aSWarner Losh 281*8e3e3a7aSWarner Losh /* to table (define it as an expression to be used in macros) */ 282*8e3e3a7aSWarner Losh #define setobj2t(L,o1,o2) ((void)L, *(o1)=*(o2), checkliveness(L,(o1))) 283*8e3e3a7aSWarner Losh 284*8e3e3a7aSWarner Losh 285*8e3e3a7aSWarner Losh 286*8e3e3a7aSWarner Losh 287*8e3e3a7aSWarner Losh /* 288*8e3e3a7aSWarner Losh ** {====================================================== 289*8e3e3a7aSWarner Losh ** types and prototypes 290*8e3e3a7aSWarner Losh ** ======================================================= 291*8e3e3a7aSWarner Losh */ 292*8e3e3a7aSWarner Losh 293*8e3e3a7aSWarner Losh 294*8e3e3a7aSWarner Losh typedef TValue *StkId; /* index to stack elements */ 295*8e3e3a7aSWarner Losh 296*8e3e3a7aSWarner Losh 297*8e3e3a7aSWarner Losh 298*8e3e3a7aSWarner Losh 299*8e3e3a7aSWarner Losh /* 300*8e3e3a7aSWarner Losh ** Header for string value; string bytes follow the end of this structure 301*8e3e3a7aSWarner Losh ** (aligned according to 'UTString'; see next). 302*8e3e3a7aSWarner Losh */ 303*8e3e3a7aSWarner Losh typedef struct TString { 304*8e3e3a7aSWarner Losh CommonHeader; 305*8e3e3a7aSWarner Losh lu_byte extra; /* reserved words for short strings; "has hash" for longs */ 306*8e3e3a7aSWarner Losh lu_byte shrlen; /* length for short strings */ 307*8e3e3a7aSWarner Losh unsigned int hash; 308*8e3e3a7aSWarner Losh union { 309*8e3e3a7aSWarner Losh size_t lnglen; /* length for long strings */ 310*8e3e3a7aSWarner Losh struct TString *hnext; /* linked list for hash table */ 311*8e3e3a7aSWarner Losh } u; 312*8e3e3a7aSWarner Losh } TString; 313*8e3e3a7aSWarner Losh 314*8e3e3a7aSWarner Losh 315*8e3e3a7aSWarner Losh /* 316*8e3e3a7aSWarner Losh ** Ensures that address after this type is always fully aligned. 317*8e3e3a7aSWarner Losh */ 318*8e3e3a7aSWarner Losh typedef union UTString { 319*8e3e3a7aSWarner Losh L_Umaxalign dummy; /* ensures maximum alignment for strings */ 320*8e3e3a7aSWarner Losh TString tsv; 321*8e3e3a7aSWarner Losh } UTString; 322*8e3e3a7aSWarner Losh 323*8e3e3a7aSWarner Losh 324*8e3e3a7aSWarner Losh /* 325*8e3e3a7aSWarner Losh ** Get the actual string (array of bytes) from a 'TString'. 326*8e3e3a7aSWarner Losh ** (Access to 'extra' ensures that value is really a 'TString'.) 327*8e3e3a7aSWarner Losh */ 328*8e3e3a7aSWarner Losh #define getstr(ts) \ 329*8e3e3a7aSWarner Losh check_exp(sizeof((ts)->extra), cast(char *, (ts)) + sizeof(UTString)) 330*8e3e3a7aSWarner Losh 331*8e3e3a7aSWarner Losh 332*8e3e3a7aSWarner Losh /* get the actual string (array of bytes) from a Lua value */ 333*8e3e3a7aSWarner Losh #define svalue(o) getstr(tsvalue(o)) 334*8e3e3a7aSWarner Losh 335*8e3e3a7aSWarner Losh /* get string length from 'TString *s' */ 336*8e3e3a7aSWarner Losh #define tsslen(s) ((s)->tt == LUA_TSHRSTR ? (s)->shrlen : (s)->u.lnglen) 337*8e3e3a7aSWarner Losh 338*8e3e3a7aSWarner Losh /* get string length from 'TValue *o' */ 339*8e3e3a7aSWarner Losh #define vslen(o) tsslen(tsvalue(o)) 340*8e3e3a7aSWarner Losh 341*8e3e3a7aSWarner Losh 342*8e3e3a7aSWarner Losh /* 343*8e3e3a7aSWarner Losh ** Header for userdata; memory area follows the end of this structure 344*8e3e3a7aSWarner Losh ** (aligned according to 'UUdata'; see next). 345*8e3e3a7aSWarner Losh */ 346*8e3e3a7aSWarner Losh typedef struct Udata { 347*8e3e3a7aSWarner Losh CommonHeader; 348*8e3e3a7aSWarner Losh lu_byte ttuv_; /* user value's tag */ 349*8e3e3a7aSWarner Losh struct Table *metatable; 350*8e3e3a7aSWarner Losh size_t len; /* number of bytes */ 351*8e3e3a7aSWarner Losh union Value user_; /* user value */ 352*8e3e3a7aSWarner Losh } Udata; 353*8e3e3a7aSWarner Losh 354*8e3e3a7aSWarner Losh 355*8e3e3a7aSWarner Losh /* 356*8e3e3a7aSWarner Losh ** Ensures that address after this type is always fully aligned. 357*8e3e3a7aSWarner Losh */ 358*8e3e3a7aSWarner Losh typedef union UUdata { 359*8e3e3a7aSWarner Losh L_Umaxalign dummy; /* ensures maximum alignment for 'local' udata */ 360*8e3e3a7aSWarner Losh Udata uv; 361*8e3e3a7aSWarner Losh } UUdata; 362*8e3e3a7aSWarner Losh 363*8e3e3a7aSWarner Losh 364*8e3e3a7aSWarner Losh /* 365*8e3e3a7aSWarner Losh ** Get the address of memory block inside 'Udata'. 366*8e3e3a7aSWarner Losh ** (Access to 'ttuv_' ensures that value is really a 'Udata'.) 367*8e3e3a7aSWarner Losh */ 368*8e3e3a7aSWarner Losh #define getudatamem(u) \ 369*8e3e3a7aSWarner Losh check_exp(sizeof((u)->ttuv_), (cast(char*, (u)) + sizeof(UUdata))) 370*8e3e3a7aSWarner Losh 371*8e3e3a7aSWarner Losh #define setuservalue(L,u,o) \ 372*8e3e3a7aSWarner Losh { const TValue *io=(o); Udata *iu = (u); \ 373*8e3e3a7aSWarner Losh iu->user_ = io->value_; iu->ttuv_ = rttype(io); \ 374*8e3e3a7aSWarner Losh checkliveness(L,io); } 375*8e3e3a7aSWarner Losh 376*8e3e3a7aSWarner Losh 377*8e3e3a7aSWarner Losh #define getuservalue(L,u,o) \ 378*8e3e3a7aSWarner Losh { TValue *io=(o); const Udata *iu = (u); \ 379*8e3e3a7aSWarner Losh io->value_ = iu->user_; settt_(io, iu->ttuv_); \ 380*8e3e3a7aSWarner Losh checkliveness(L,io); } 381*8e3e3a7aSWarner Losh 382*8e3e3a7aSWarner Losh 383*8e3e3a7aSWarner Losh /* 384*8e3e3a7aSWarner Losh ** Description of an upvalue for function prototypes 385*8e3e3a7aSWarner Losh */ 386*8e3e3a7aSWarner Losh typedef struct Upvaldesc { 387*8e3e3a7aSWarner Losh TString *name; /* upvalue name (for debug information) */ 388*8e3e3a7aSWarner Losh lu_byte instack; /* whether it is in stack (register) */ 389*8e3e3a7aSWarner Losh lu_byte idx; /* index of upvalue (in stack or in outer function's list) */ 390*8e3e3a7aSWarner Losh } Upvaldesc; 391*8e3e3a7aSWarner Losh 392*8e3e3a7aSWarner Losh 393*8e3e3a7aSWarner Losh /* 394*8e3e3a7aSWarner Losh ** Description of a local variable for function prototypes 395*8e3e3a7aSWarner Losh ** (used for debug information) 396*8e3e3a7aSWarner Losh */ 397*8e3e3a7aSWarner Losh typedef struct LocVar { 398*8e3e3a7aSWarner Losh TString *varname; 399*8e3e3a7aSWarner Losh int startpc; /* first point where variable is active */ 400*8e3e3a7aSWarner Losh int endpc; /* first point where variable is dead */ 401*8e3e3a7aSWarner Losh } LocVar; 402*8e3e3a7aSWarner Losh 403*8e3e3a7aSWarner Losh 404*8e3e3a7aSWarner Losh /* 405*8e3e3a7aSWarner Losh ** Function Prototypes 406*8e3e3a7aSWarner Losh */ 407*8e3e3a7aSWarner Losh typedef struct Proto { 408*8e3e3a7aSWarner Losh CommonHeader; 409*8e3e3a7aSWarner Losh lu_byte numparams; /* number of fixed parameters */ 410*8e3e3a7aSWarner Losh lu_byte is_vararg; 411*8e3e3a7aSWarner Losh lu_byte maxstacksize; /* number of registers needed by this function */ 412*8e3e3a7aSWarner Losh int sizeupvalues; /* size of 'upvalues' */ 413*8e3e3a7aSWarner Losh int sizek; /* size of 'k' */ 414*8e3e3a7aSWarner Losh int sizecode; 415*8e3e3a7aSWarner Losh int sizelineinfo; 416*8e3e3a7aSWarner Losh int sizep; /* size of 'p' */ 417*8e3e3a7aSWarner Losh int sizelocvars; 418*8e3e3a7aSWarner Losh int linedefined; /* debug information */ 419*8e3e3a7aSWarner Losh int lastlinedefined; /* debug information */ 420*8e3e3a7aSWarner Losh TValue *k; /* constants used by the function */ 421*8e3e3a7aSWarner Losh Instruction *code; /* opcodes */ 422*8e3e3a7aSWarner Losh struct Proto **p; /* functions defined inside the function */ 423*8e3e3a7aSWarner Losh int *lineinfo; /* map from opcodes to source lines (debug information) */ 424*8e3e3a7aSWarner Losh LocVar *locvars; /* information about local variables (debug information) */ 425*8e3e3a7aSWarner Losh Upvaldesc *upvalues; /* upvalue information */ 426*8e3e3a7aSWarner Losh struct LClosure *cache; /* last-created closure with this prototype */ 427*8e3e3a7aSWarner Losh TString *source; /* used for debug information */ 428*8e3e3a7aSWarner Losh GCObject *gclist; 429*8e3e3a7aSWarner Losh } Proto; 430*8e3e3a7aSWarner Losh 431*8e3e3a7aSWarner Losh 432*8e3e3a7aSWarner Losh 433*8e3e3a7aSWarner Losh /* 434*8e3e3a7aSWarner Losh ** Lua Upvalues 435*8e3e3a7aSWarner Losh */ 436*8e3e3a7aSWarner Losh typedef struct UpVal UpVal; 437*8e3e3a7aSWarner Losh 438*8e3e3a7aSWarner Losh 439*8e3e3a7aSWarner Losh /* 440*8e3e3a7aSWarner Losh ** Closures 441*8e3e3a7aSWarner Losh */ 442*8e3e3a7aSWarner Losh 443*8e3e3a7aSWarner Losh #define ClosureHeader \ 444*8e3e3a7aSWarner Losh CommonHeader; lu_byte nupvalues; GCObject *gclist 445*8e3e3a7aSWarner Losh 446*8e3e3a7aSWarner Losh typedef struct CClosure { 447*8e3e3a7aSWarner Losh ClosureHeader; 448*8e3e3a7aSWarner Losh lua_CFunction f; 449*8e3e3a7aSWarner Losh TValue upvalue[1]; /* list of upvalues */ 450*8e3e3a7aSWarner Losh } CClosure; 451*8e3e3a7aSWarner Losh 452*8e3e3a7aSWarner Losh 453*8e3e3a7aSWarner Losh typedef struct LClosure { 454*8e3e3a7aSWarner Losh ClosureHeader; 455*8e3e3a7aSWarner Losh struct Proto *p; 456*8e3e3a7aSWarner Losh UpVal *upvals[1]; /* list of upvalues */ 457*8e3e3a7aSWarner Losh } LClosure; 458*8e3e3a7aSWarner Losh 459*8e3e3a7aSWarner Losh 460*8e3e3a7aSWarner Losh typedef union Closure { 461*8e3e3a7aSWarner Losh CClosure c; 462*8e3e3a7aSWarner Losh LClosure l; 463*8e3e3a7aSWarner Losh } Closure; 464*8e3e3a7aSWarner Losh 465*8e3e3a7aSWarner Losh 466*8e3e3a7aSWarner Losh #define isLfunction(o) ttisLclosure(o) 467*8e3e3a7aSWarner Losh 468*8e3e3a7aSWarner Losh #define getproto(o) (clLvalue(o)->p) 469*8e3e3a7aSWarner Losh 470*8e3e3a7aSWarner Losh 471*8e3e3a7aSWarner Losh /* 472*8e3e3a7aSWarner Losh ** Tables 473*8e3e3a7aSWarner Losh */ 474*8e3e3a7aSWarner Losh 475*8e3e3a7aSWarner Losh typedef union TKey { 476*8e3e3a7aSWarner Losh struct { 477*8e3e3a7aSWarner Losh TValuefields; 478*8e3e3a7aSWarner Losh int next; /* for chaining (offset for next node) */ 479*8e3e3a7aSWarner Losh } nk; 480*8e3e3a7aSWarner Losh TValue tvk; 481*8e3e3a7aSWarner Losh } TKey; 482*8e3e3a7aSWarner Losh 483*8e3e3a7aSWarner Losh 484*8e3e3a7aSWarner Losh /* copy a value into a key without messing up field 'next' */ 485*8e3e3a7aSWarner Losh #define setnodekey(L,key,obj) \ 486*8e3e3a7aSWarner Losh { TKey *k_=(key); const TValue *io_=(obj); \ 487*8e3e3a7aSWarner Losh k_->nk.value_ = io_->value_; k_->nk.tt_ = io_->tt_; \ 488*8e3e3a7aSWarner Losh (void)L; checkliveness(L,io_); } 489*8e3e3a7aSWarner Losh 490*8e3e3a7aSWarner Losh 491*8e3e3a7aSWarner Losh typedef struct Node { 492*8e3e3a7aSWarner Losh TValue i_val; 493*8e3e3a7aSWarner Losh TKey i_key; 494*8e3e3a7aSWarner Losh } Node; 495*8e3e3a7aSWarner Losh 496*8e3e3a7aSWarner Losh 497*8e3e3a7aSWarner Losh typedef struct Table { 498*8e3e3a7aSWarner Losh CommonHeader; 499*8e3e3a7aSWarner Losh lu_byte flags; /* 1<<p means tagmethod(p) is not present */ 500*8e3e3a7aSWarner Losh lu_byte lsizenode; /* log2 of size of 'node' array */ 501*8e3e3a7aSWarner Losh unsigned int sizearray; /* size of 'array' array */ 502*8e3e3a7aSWarner Losh TValue *array; /* array part */ 503*8e3e3a7aSWarner Losh Node *node; 504*8e3e3a7aSWarner Losh Node *lastfree; /* any free position is before this position */ 505*8e3e3a7aSWarner Losh struct Table *metatable; 506*8e3e3a7aSWarner Losh GCObject *gclist; 507*8e3e3a7aSWarner Losh } Table; 508*8e3e3a7aSWarner Losh 509*8e3e3a7aSWarner Losh 510*8e3e3a7aSWarner Losh 511*8e3e3a7aSWarner Losh /* 512*8e3e3a7aSWarner Losh ** 'module' operation for hashing (size is always a power of 2) 513*8e3e3a7aSWarner Losh */ 514*8e3e3a7aSWarner Losh #define lmod(s,size) \ 515*8e3e3a7aSWarner Losh (check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1))))) 516*8e3e3a7aSWarner Losh 517*8e3e3a7aSWarner Losh 518*8e3e3a7aSWarner Losh #define twoto(x) (1<<(x)) 519*8e3e3a7aSWarner Losh #define sizenode(t) (twoto((t)->lsizenode)) 520*8e3e3a7aSWarner Losh 521*8e3e3a7aSWarner Losh 522*8e3e3a7aSWarner Losh /* 523*8e3e3a7aSWarner Losh ** (address of) a fixed nil value 524*8e3e3a7aSWarner Losh */ 525*8e3e3a7aSWarner Losh #define luaO_nilobject (&luaO_nilobject_) 526*8e3e3a7aSWarner Losh 527*8e3e3a7aSWarner Losh 528*8e3e3a7aSWarner Losh LUAI_DDEC const TValue luaO_nilobject_; 529*8e3e3a7aSWarner Losh 530*8e3e3a7aSWarner Losh /* size of buffer for 'luaO_utf8esc' function */ 531*8e3e3a7aSWarner Losh #define UTF8BUFFSZ 8 532*8e3e3a7aSWarner Losh 533*8e3e3a7aSWarner Losh LUAI_FUNC int luaO_int2fb (unsigned int x); 534*8e3e3a7aSWarner Losh LUAI_FUNC int luaO_fb2int (int x); 535*8e3e3a7aSWarner Losh LUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x); 536*8e3e3a7aSWarner Losh LUAI_FUNC int luaO_ceillog2 (unsigned int x); 537*8e3e3a7aSWarner Losh LUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1, 538*8e3e3a7aSWarner Losh const TValue *p2, TValue *res); 539*8e3e3a7aSWarner Losh LUAI_FUNC size_t luaO_str2num (const char *s, TValue *o); 540*8e3e3a7aSWarner Losh LUAI_FUNC int luaO_hexavalue (int c); 541*8e3e3a7aSWarner Losh LUAI_FUNC void luaO_tostring (lua_State *L, StkId obj); 542*8e3e3a7aSWarner Losh LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, 543*8e3e3a7aSWarner Losh va_list argp); 544*8e3e3a7aSWarner Losh LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); 545*8e3e3a7aSWarner Losh LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); 546*8e3e3a7aSWarner Losh 547*8e3e3a7aSWarner Losh 548*8e3e3a7aSWarner Losh #endif 549*8e3e3a7aSWarner Losh 550