1280405Srpaulo/* 2344220Skevans** $Id: lobject.h,v 2.117.1.1 2017/04/19 17:39:34 roberto Exp $ 3280405Srpaulo** Type definitions for Lua objects 4280405Srpaulo** See Copyright Notice in lua.h 5280405Srpaulo*/ 6280405Srpaulo 7280405Srpaulo 8280405Srpaulo#ifndef lobject_h 9280405Srpaulo#define lobject_h 10280405Srpaulo 11280405Srpaulo 12280405Srpaulo#include <stdarg.h> 13280405Srpaulo 14280405Srpaulo 15280405Srpaulo#include "llimits.h" 16280405Srpaulo#include "lua.h" 17280405Srpaulo 18280405Srpaulo 19280405Srpaulo/* 20280405Srpaulo** Extra tags for non-values 21280405Srpaulo*/ 22326344Simp#define LUA_TPROTO LUA_NUMTAGS /* function prototypes */ 23326344Simp#define LUA_TDEADKEY (LUA_NUMTAGS+1) /* removed keys in tables */ 24280405Srpaulo 25280405Srpaulo/* 26280405Srpaulo** number of all possible tags (including LUA_TNONE but excluding DEADKEY) 27280405Srpaulo*/ 28280405Srpaulo#define LUA_TOTALTAGS (LUA_TPROTO + 2) 29280405Srpaulo 30280405Srpaulo 31280405Srpaulo/* 32280405Srpaulo** tags for Tagged Values have the following use of bits: 33280405Srpaulo** bits 0-3: actual tag (a LUA_T* value) 34280405Srpaulo** bits 4-5: variant bits 35280405Srpaulo** bit 6: whether value is collectable 36280405Srpaulo*/ 37280405Srpaulo 38280405Srpaulo 39280405Srpaulo/* 40280405Srpaulo** LUA_TFUNCTION variants: 41280405Srpaulo** 0 - Lua function 42280405Srpaulo** 1 - light C function 43280405Srpaulo** 2 - regular C function (closure) 44280405Srpaulo*/ 45280405Srpaulo 46280405Srpaulo/* Variant tags for functions */ 47280405Srpaulo#define LUA_TLCL (LUA_TFUNCTION | (0 << 4)) /* Lua closure */ 48280405Srpaulo#define LUA_TLCF (LUA_TFUNCTION | (1 << 4)) /* light C function */ 49280405Srpaulo#define LUA_TCCL (LUA_TFUNCTION | (2 << 4)) /* C closure */ 50280405Srpaulo 51280405Srpaulo 52280405Srpaulo/* Variant tags for strings */ 53280405Srpaulo#define LUA_TSHRSTR (LUA_TSTRING | (0 << 4)) /* short strings */ 54280405Srpaulo#define LUA_TLNGSTR (LUA_TSTRING | (1 << 4)) /* long strings */ 55280405Srpaulo 56280405Srpaulo 57280405Srpaulo/* Variant tags for numbers */ 58280405Srpaulo#define LUA_TNUMFLT (LUA_TNUMBER | (0 << 4)) /* float numbers */ 59280405Srpaulo#define LUA_TNUMINT (LUA_TNUMBER | (1 << 4)) /* integer numbers */ 60280405Srpaulo 61280405Srpaulo 62280405Srpaulo/* Bit mark for collectable types */ 63280405Srpaulo#define BIT_ISCOLLECTABLE (1 << 6) 64280405Srpaulo 65280405Srpaulo/* mark a tag as collectable */ 66280405Srpaulo#define ctb(t) ((t) | BIT_ISCOLLECTABLE) 67280405Srpaulo 68280405Srpaulo 69280405Srpaulo/* 70280405Srpaulo** Common type for all collectable objects 71280405Srpaulo*/ 72280405Srpaulotypedef struct GCObject GCObject; 73280405Srpaulo 74280405Srpaulo 75280405Srpaulo/* 76280405Srpaulo** Common Header for all collectable objects (in macro form, to be 77280405Srpaulo** included in other objects) 78280405Srpaulo*/ 79280405Srpaulo#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked 80280405Srpaulo 81280405Srpaulo 82280405Srpaulo/* 83280405Srpaulo** Common type has only the common header 84280405Srpaulo*/ 85280405Srpaulostruct GCObject { 86280405Srpaulo CommonHeader; 87280405Srpaulo}; 88280405Srpaulo 89280405Srpaulo 90280405Srpaulo 91326344Simp 92280405Srpaulo/* 93326344Simp** Tagged Values. This is the basic representation of values in Lua, 94326344Simp** an actual value plus a tag with its type. 95326344Simp*/ 96326344Simp 97326344Simp/* 98280405Srpaulo** Union of all Lua values 99280405Srpaulo*/ 100326344Simptypedef union Value { 101326344Simp GCObject *gc; /* collectable objects */ 102326344Simp void *p; /* light userdata */ 103326344Simp int b; /* booleans */ 104326344Simp lua_CFunction f; /* light C functions */ 105326344Simp lua_Integer i; /* integer numbers */ 106326344Simp lua_Number n; /* float numbers */ 107326344Simp} Value; 108280405Srpaulo 109280405Srpaulo 110326344Simp#define TValuefields Value value_; int tt_ 111280405Srpaulo 112280405Srpaulo 113326344Simptypedef struct lua_TValue { 114326344Simp TValuefields; 115326344Simp} TValue; 116280405Srpaulo 117280405Srpaulo 118280405Srpaulo 119280405Srpaulo/* macro defining a nil value */ 120280405Srpaulo#define NILCONSTANT {NULL}, LUA_TNIL 121280405Srpaulo 122280405Srpaulo 123280405Srpaulo#define val_(o) ((o)->value_) 124280405Srpaulo 125280405Srpaulo 126280405Srpaulo/* raw type tag of a TValue */ 127280405Srpaulo#define rttype(o) ((o)->tt_) 128280405Srpaulo 129280405Srpaulo/* tag with no variants (bits 0-3) */ 130280405Srpaulo#define novariant(x) ((x) & 0x0F) 131280405Srpaulo 132280405Srpaulo/* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ 133280405Srpaulo#define ttype(o) (rttype(o) & 0x3F) 134280405Srpaulo 135280405Srpaulo/* type tag of a TValue with no variants (bits 0-3) */ 136280405Srpaulo#define ttnov(o) (novariant(rttype(o))) 137280405Srpaulo 138280405Srpaulo 139280405Srpaulo/* Macros to test type */ 140280405Srpaulo#define checktag(o,t) (rttype(o) == (t)) 141280405Srpaulo#define checktype(o,t) (ttnov(o) == (t)) 142280405Srpaulo#define ttisnumber(o) checktype((o), LUA_TNUMBER) 143280405Srpaulo#define ttisfloat(o) checktag((o), LUA_TNUMFLT) 144280405Srpaulo#define ttisinteger(o) checktag((o), LUA_TNUMINT) 145280405Srpaulo#define ttisnil(o) checktag((o), LUA_TNIL) 146280405Srpaulo#define ttisboolean(o) checktag((o), LUA_TBOOLEAN) 147280405Srpaulo#define ttislightuserdata(o) checktag((o), LUA_TLIGHTUSERDATA) 148280405Srpaulo#define ttisstring(o) checktype((o), LUA_TSTRING) 149280405Srpaulo#define ttisshrstring(o) checktag((o), ctb(LUA_TSHRSTR)) 150280405Srpaulo#define ttislngstring(o) checktag((o), ctb(LUA_TLNGSTR)) 151280405Srpaulo#define ttistable(o) checktag((o), ctb(LUA_TTABLE)) 152280405Srpaulo#define ttisfunction(o) checktype(o, LUA_TFUNCTION) 153280405Srpaulo#define ttisclosure(o) ((rttype(o) & 0x1F) == LUA_TFUNCTION) 154280405Srpaulo#define ttisCclosure(o) checktag((o), ctb(LUA_TCCL)) 155280405Srpaulo#define ttisLclosure(o) checktag((o), ctb(LUA_TLCL)) 156280405Srpaulo#define ttislcf(o) checktag((o), LUA_TLCF) 157280405Srpaulo#define ttisfulluserdata(o) checktag((o), ctb(LUA_TUSERDATA)) 158280405Srpaulo#define ttisthread(o) checktag((o), ctb(LUA_TTHREAD)) 159280405Srpaulo#define ttisdeadkey(o) checktag((o), LUA_TDEADKEY) 160280405Srpaulo 161280405Srpaulo 162280405Srpaulo/* Macros to access values */ 163280405Srpaulo#define ivalue(o) check_exp(ttisinteger(o), val_(o).i) 164280405Srpaulo#define fltvalue(o) check_exp(ttisfloat(o), val_(o).n) 165280405Srpaulo#define nvalue(o) check_exp(ttisnumber(o), \ 166280405Srpaulo (ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o))) 167280405Srpaulo#define gcvalue(o) check_exp(iscollectable(o), val_(o).gc) 168280405Srpaulo#define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p) 169280405Srpaulo#define tsvalue(o) check_exp(ttisstring(o), gco2ts(val_(o).gc)) 170280405Srpaulo#define uvalue(o) check_exp(ttisfulluserdata(o), gco2u(val_(o).gc)) 171280405Srpaulo#define clvalue(o) check_exp(ttisclosure(o), gco2cl(val_(o).gc)) 172280405Srpaulo#define clLvalue(o) check_exp(ttisLclosure(o), gco2lcl(val_(o).gc)) 173280405Srpaulo#define clCvalue(o) check_exp(ttisCclosure(o), gco2ccl(val_(o).gc)) 174280405Srpaulo#define fvalue(o) check_exp(ttislcf(o), val_(o).f) 175280405Srpaulo#define hvalue(o) check_exp(ttistable(o), gco2t(val_(o).gc)) 176280405Srpaulo#define bvalue(o) check_exp(ttisboolean(o), val_(o).b) 177280405Srpaulo#define thvalue(o) check_exp(ttisthread(o), gco2th(val_(o).gc)) 178280405Srpaulo/* a dead value may get the 'gc' field, but cannot access its contents */ 179280405Srpaulo#define deadvalue(o) check_exp(ttisdeadkey(o), cast(void *, val_(o).gc)) 180280405Srpaulo 181280405Srpaulo#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) 182280405Srpaulo 183280405Srpaulo 184280405Srpaulo#define iscollectable(o) (rttype(o) & BIT_ISCOLLECTABLE) 185280405Srpaulo 186280405Srpaulo 187280405Srpaulo/* Macros for internal tests */ 188280405Srpaulo#define righttt(obj) (ttype(obj) == gcvalue(obj)->tt) 189280405Srpaulo 190326344Simp#define checkliveness(L,obj) \ 191280405Srpaulo lua_longassert(!iscollectable(obj) || \ 192326344Simp (righttt(obj) && (L == NULL || !isdead(G(L),gcvalue(obj))))) 193280405Srpaulo 194280405Srpaulo 195280405Srpaulo/* Macros to set values */ 196280405Srpaulo#define settt_(o,t) ((o)->tt_=(t)) 197280405Srpaulo 198280405Srpaulo#define setfltvalue(obj,x) \ 199280405Srpaulo { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMFLT); } 200280405Srpaulo 201326344Simp#define chgfltvalue(obj,x) \ 202326344Simp { TValue *io=(obj); lua_assert(ttisfloat(io)); val_(io).n=(x); } 203326344Simp 204280405Srpaulo#define setivalue(obj,x) \ 205280405Srpaulo { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_TNUMINT); } 206280405Srpaulo 207326344Simp#define chgivalue(obj,x) \ 208326344Simp { TValue *io=(obj); lua_assert(ttisinteger(io)); val_(io).i=(x); } 209326344Simp 210280405Srpaulo#define setnilvalue(obj) settt_(obj, LUA_TNIL) 211280405Srpaulo 212280405Srpaulo#define setfvalue(obj,x) \ 213280405Srpaulo { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); } 214280405Srpaulo 215280405Srpaulo#define setpvalue(obj,x) \ 216280405Srpaulo { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); } 217280405Srpaulo 218280405Srpaulo#define setbvalue(obj,x) \ 219280405Srpaulo { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); } 220280405Srpaulo 221280405Srpaulo#define setgcovalue(L,obj,x) \ 222280405Srpaulo { TValue *io = (obj); GCObject *i_g=(x); \ 223280405Srpaulo val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); } 224280405Srpaulo 225280405Srpaulo#define setsvalue(L,obj,x) \ 226280405Srpaulo { TValue *io = (obj); TString *x_ = (x); \ 227280405Srpaulo val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \ 228326344Simp checkliveness(L,io); } 229280405Srpaulo 230280405Srpaulo#define setuvalue(L,obj,x) \ 231280405Srpaulo { TValue *io = (obj); Udata *x_ = (x); \ 232280405Srpaulo val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TUSERDATA)); \ 233326344Simp checkliveness(L,io); } 234280405Srpaulo 235280405Srpaulo#define setthvalue(L,obj,x) \ 236280405Srpaulo { TValue *io = (obj); lua_State *x_ = (x); \ 237280405Srpaulo val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTHREAD)); \ 238326344Simp checkliveness(L,io); } 239280405Srpaulo 240280405Srpaulo#define setclLvalue(L,obj,x) \ 241280405Srpaulo { TValue *io = (obj); LClosure *x_ = (x); \ 242280405Srpaulo val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TLCL)); \ 243326344Simp checkliveness(L,io); } 244280405Srpaulo 245280405Srpaulo#define setclCvalue(L,obj,x) \ 246280405Srpaulo { TValue *io = (obj); CClosure *x_ = (x); \ 247280405Srpaulo val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TCCL)); \ 248326344Simp checkliveness(L,io); } 249280405Srpaulo 250280405Srpaulo#define sethvalue(L,obj,x) \ 251280405Srpaulo { TValue *io = (obj); Table *x_ = (x); \ 252280405Srpaulo val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTABLE)); \ 253326344Simp checkliveness(L,io); } 254280405Srpaulo 255280405Srpaulo#define setdeadvalue(obj) settt_(obj, LUA_TDEADKEY) 256280405Srpaulo 257280405Srpaulo 258280405Srpaulo 259280405Srpaulo#define setobj(L,obj1,obj2) \ 260280405Srpaulo { TValue *io1=(obj1); *io1 = *(obj2); \ 261326344Simp (void)L; checkliveness(L,io1); } 262280405Srpaulo 263280405Srpaulo 264280405Srpaulo/* 265280405Srpaulo** different types of assignments, according to destination 266280405Srpaulo*/ 267280405Srpaulo 268280405Srpaulo/* from stack to (same) stack */ 269280405Srpaulo#define setobjs2s setobj 270280405Srpaulo/* to stack (not from same stack) */ 271280405Srpaulo#define setobj2s setobj 272280405Srpaulo#define setsvalue2s setsvalue 273280405Srpaulo#define sethvalue2s sethvalue 274280405Srpaulo#define setptvalue2s setptvalue 275280405Srpaulo/* from table to same table */ 276280405Srpaulo#define setobjt2t setobj 277280405Srpaulo/* to new object */ 278280405Srpaulo#define setobj2n setobj 279280405Srpaulo#define setsvalue2n setsvalue 280280405Srpaulo 281326344Simp/* to table (define it as an expression to be used in macros) */ 282326344Simp#define setobj2t(L,o1,o2) ((void)L, *(o1)=*(o2), checkliveness(L,(o1))) 283280405Srpaulo 284280405Srpaulo 285280405Srpaulo 286326344Simp 287280405Srpaulo/* 288280405Srpaulo** {====================================================== 289280405Srpaulo** types and prototypes 290280405Srpaulo** ======================================================= 291280405Srpaulo*/ 292280405Srpaulo 293280405Srpaulo 294280405Srpaulotypedef TValue *StkId; /* index to stack elements */ 295280405Srpaulo 296280405Srpaulo 297280405Srpaulo 298280405Srpaulo 299280405Srpaulo/* 300280405Srpaulo** Header for string value; string bytes follow the end of this structure 301280405Srpaulo** (aligned according to 'UTString'; see next). 302280405Srpaulo*/ 303280405Srpaulotypedef struct TString { 304280405Srpaulo CommonHeader; 305280405Srpaulo lu_byte extra; /* reserved words for short strings; "has hash" for longs */ 306326344Simp lu_byte shrlen; /* length for short strings */ 307280405Srpaulo unsigned int hash; 308326344Simp union { 309326344Simp size_t lnglen; /* length for long strings */ 310326344Simp struct TString *hnext; /* linked list for hash table */ 311326344Simp } u; 312280405Srpaulo} TString; 313280405Srpaulo 314280405Srpaulo 315280405Srpaulo/* 316280405Srpaulo** Ensures that address after this type is always fully aligned. 317280405Srpaulo*/ 318280405Srpaulotypedef union UTString { 319280405Srpaulo L_Umaxalign dummy; /* ensures maximum alignment for strings */ 320280405Srpaulo TString tsv; 321280405Srpaulo} UTString; 322280405Srpaulo 323280405Srpaulo 324280405Srpaulo/* 325280405Srpaulo** Get the actual string (array of bytes) from a 'TString'. 326280405Srpaulo** (Access to 'extra' ensures that value is really a 'TString'.) 327280405Srpaulo*/ 328280405Srpaulo#define getstr(ts) \ 329326344Simp check_exp(sizeof((ts)->extra), cast(char *, (ts)) + sizeof(UTString)) 330280405Srpaulo 331326344Simp 332280405Srpaulo/* get the actual string (array of bytes) from a Lua value */ 333280405Srpaulo#define svalue(o) getstr(tsvalue(o)) 334280405Srpaulo 335326344Simp/* get string length from 'TString *s' */ 336326344Simp#define tsslen(s) ((s)->tt == LUA_TSHRSTR ? (s)->shrlen : (s)->u.lnglen) 337280405Srpaulo 338326344Simp/* get string length from 'TValue *o' */ 339326344Simp#define vslen(o) tsslen(tsvalue(o)) 340326344Simp 341326344Simp 342280405Srpaulo/* 343280405Srpaulo** Header for userdata; memory area follows the end of this structure 344280405Srpaulo** (aligned according to 'UUdata'; see next). 345280405Srpaulo*/ 346280405Srpaulotypedef struct Udata { 347280405Srpaulo CommonHeader; 348280405Srpaulo lu_byte ttuv_; /* user value's tag */ 349280405Srpaulo struct Table *metatable; 350280405Srpaulo size_t len; /* number of bytes */ 351280405Srpaulo union Value user_; /* user value */ 352280405Srpaulo} Udata; 353280405Srpaulo 354280405Srpaulo 355280405Srpaulo/* 356280405Srpaulo** Ensures that address after this type is always fully aligned. 357280405Srpaulo*/ 358280405Srpaulotypedef union UUdata { 359280405Srpaulo L_Umaxalign dummy; /* ensures maximum alignment for 'local' udata */ 360280405Srpaulo Udata uv; 361280405Srpaulo} UUdata; 362280405Srpaulo 363280405Srpaulo 364280405Srpaulo/* 365280405Srpaulo** Get the address of memory block inside 'Udata'. 366280405Srpaulo** (Access to 'ttuv_' ensures that value is really a 'Udata'.) 367280405Srpaulo*/ 368280405Srpaulo#define getudatamem(u) \ 369280405Srpaulo check_exp(sizeof((u)->ttuv_), (cast(char*, (u)) + sizeof(UUdata))) 370280405Srpaulo 371280405Srpaulo#define setuservalue(L,u,o) \ 372280405Srpaulo { const TValue *io=(o); Udata *iu = (u); \ 373326344Simp iu->user_ = io->value_; iu->ttuv_ = rttype(io); \ 374326344Simp checkliveness(L,io); } 375280405Srpaulo 376280405Srpaulo 377280405Srpaulo#define getuservalue(L,u,o) \ 378280405Srpaulo { TValue *io=(o); const Udata *iu = (u); \ 379326344Simp io->value_ = iu->user_; settt_(io, iu->ttuv_); \ 380326344Simp checkliveness(L,io); } 381280405Srpaulo 382280405Srpaulo 383280405Srpaulo/* 384280405Srpaulo** Description of an upvalue for function prototypes 385280405Srpaulo*/ 386280405Srpaulotypedef struct Upvaldesc { 387280405Srpaulo TString *name; /* upvalue name (for debug information) */ 388326344Simp lu_byte instack; /* whether it is in stack (register) */ 389280405Srpaulo lu_byte idx; /* index of upvalue (in stack or in outer function's list) */ 390280405Srpaulo} Upvaldesc; 391280405Srpaulo 392280405Srpaulo 393280405Srpaulo/* 394280405Srpaulo** Description of a local variable for function prototypes 395280405Srpaulo** (used for debug information) 396280405Srpaulo*/ 397280405Srpaulotypedef struct LocVar { 398280405Srpaulo TString *varname; 399280405Srpaulo int startpc; /* first point where variable is active */ 400280405Srpaulo int endpc; /* first point where variable is dead */ 401280405Srpaulo} LocVar; 402280405Srpaulo 403280405Srpaulo 404280405Srpaulo/* 405280405Srpaulo** Function Prototypes 406280405Srpaulo*/ 407280405Srpaulotypedef struct Proto { 408280405Srpaulo CommonHeader; 409280405Srpaulo lu_byte numparams; /* number of fixed parameters */ 410280405Srpaulo lu_byte is_vararg; 411326344Simp lu_byte maxstacksize; /* number of registers needed by this function */ 412280405Srpaulo int sizeupvalues; /* size of 'upvalues' */ 413280405Srpaulo int sizek; /* size of 'k' */ 414280405Srpaulo int sizecode; 415280405Srpaulo int sizelineinfo; 416280405Srpaulo int sizep; /* size of 'p' */ 417280405Srpaulo int sizelocvars; 418326344Simp int linedefined; /* debug information */ 419326344Simp int lastlinedefined; /* debug information */ 420280405Srpaulo TValue *k; /* constants used by the function */ 421326344Simp Instruction *code; /* opcodes */ 422280405Srpaulo struct Proto **p; /* functions defined inside the function */ 423280405Srpaulo int *lineinfo; /* map from opcodes to source lines (debug information) */ 424280405Srpaulo LocVar *locvars; /* information about local variables (debug information) */ 425280405Srpaulo Upvaldesc *upvalues; /* upvalue information */ 426326344Simp struct LClosure *cache; /* last-created closure with this prototype */ 427280405Srpaulo TString *source; /* used for debug information */ 428280405Srpaulo GCObject *gclist; 429280405Srpaulo} Proto; 430280405Srpaulo 431280405Srpaulo 432280405Srpaulo 433280405Srpaulo/* 434280405Srpaulo** Lua Upvalues 435280405Srpaulo*/ 436280405Srpaulotypedef struct UpVal UpVal; 437280405Srpaulo 438280405Srpaulo 439280405Srpaulo/* 440280405Srpaulo** Closures 441280405Srpaulo*/ 442280405Srpaulo 443280405Srpaulo#define ClosureHeader \ 444280405Srpaulo CommonHeader; lu_byte nupvalues; GCObject *gclist 445280405Srpaulo 446280405Srpaulotypedef struct CClosure { 447280405Srpaulo ClosureHeader; 448280405Srpaulo lua_CFunction f; 449280405Srpaulo TValue upvalue[1]; /* list of upvalues */ 450280405Srpaulo} CClosure; 451280405Srpaulo 452280405Srpaulo 453280405Srpaulotypedef struct LClosure { 454280405Srpaulo ClosureHeader; 455280405Srpaulo struct Proto *p; 456280405Srpaulo UpVal *upvals[1]; /* list of upvalues */ 457280405Srpaulo} LClosure; 458280405Srpaulo 459280405Srpaulo 460280405Srpaulotypedef union Closure { 461280405Srpaulo CClosure c; 462280405Srpaulo LClosure l; 463280405Srpaulo} Closure; 464280405Srpaulo 465280405Srpaulo 466280405Srpaulo#define isLfunction(o) ttisLclosure(o) 467280405Srpaulo 468280405Srpaulo#define getproto(o) (clLvalue(o)->p) 469280405Srpaulo 470280405Srpaulo 471280405Srpaulo/* 472280405Srpaulo** Tables 473280405Srpaulo*/ 474280405Srpaulo 475280405Srpaulotypedef union TKey { 476280405Srpaulo struct { 477280405Srpaulo TValuefields; 478280405Srpaulo int next; /* for chaining (offset for next node) */ 479280405Srpaulo } nk; 480280405Srpaulo TValue tvk; 481280405Srpaulo} TKey; 482280405Srpaulo 483280405Srpaulo 484280405Srpaulo/* copy a value into a key without messing up field 'next' */ 485280405Srpaulo#define setnodekey(L,key,obj) \ 486280405Srpaulo { TKey *k_=(key); const TValue *io_=(obj); \ 487280405Srpaulo k_->nk.value_ = io_->value_; k_->nk.tt_ = io_->tt_; \ 488326344Simp (void)L; checkliveness(L,io_); } 489280405Srpaulo 490280405Srpaulo 491280405Srpaulotypedef struct Node { 492280405Srpaulo TValue i_val; 493280405Srpaulo TKey i_key; 494280405Srpaulo} Node; 495280405Srpaulo 496280405Srpaulo 497280405Srpaulotypedef struct Table { 498280405Srpaulo CommonHeader; 499280405Srpaulo lu_byte flags; /* 1<<p means tagmethod(p) is not present */ 500280405Srpaulo lu_byte lsizenode; /* log2 of size of 'node' array */ 501280405Srpaulo unsigned int sizearray; /* size of 'array' array */ 502280405Srpaulo TValue *array; /* array part */ 503280405Srpaulo Node *node; 504280405Srpaulo Node *lastfree; /* any free position is before this position */ 505280405Srpaulo struct Table *metatable; 506280405Srpaulo GCObject *gclist; 507280405Srpaulo} Table; 508280405Srpaulo 509280405Srpaulo 510280405Srpaulo 511280405Srpaulo/* 512280405Srpaulo** 'module' operation for hashing (size is always a power of 2) 513280405Srpaulo*/ 514280405Srpaulo#define lmod(s,size) \ 515280405Srpaulo (check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1))))) 516280405Srpaulo 517280405Srpaulo 518280405Srpaulo#define twoto(x) (1<<(x)) 519280405Srpaulo#define sizenode(t) (twoto((t)->lsizenode)) 520280405Srpaulo 521280405Srpaulo 522280405Srpaulo/* 523280405Srpaulo** (address of) a fixed nil value 524280405Srpaulo*/ 525280405Srpaulo#define luaO_nilobject (&luaO_nilobject_) 526280405Srpaulo 527280405Srpaulo 528280405SrpauloLUAI_DDEC const TValue luaO_nilobject_; 529280405Srpaulo 530280405Srpaulo/* size of buffer for 'luaO_utf8esc' function */ 531280405Srpaulo#define UTF8BUFFSZ 8 532280405Srpaulo 533280405SrpauloLUAI_FUNC int luaO_int2fb (unsigned int x); 534280405SrpauloLUAI_FUNC int luaO_fb2int (int x); 535280405SrpauloLUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x); 536280405SrpauloLUAI_FUNC int luaO_ceillog2 (unsigned int x); 537280405SrpauloLUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1, 538280405Srpaulo const TValue *p2, TValue *res); 539280405SrpauloLUAI_FUNC size_t luaO_str2num (const char *s, TValue *o); 540280405SrpauloLUAI_FUNC int luaO_hexavalue (int c); 541280405SrpauloLUAI_FUNC void luaO_tostring (lua_State *L, StkId obj); 542280405SrpauloLUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, 543280405Srpaulo va_list argp); 544280405SrpauloLUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); 545280405SrpauloLUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); 546280405Srpaulo 547280405Srpaulo 548280405Srpaulo#endif 549280405Srpaulo 550