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