116a5fed65808adf648004b34f98718301d718fa2darylm/* 216a5fed65808adf648004b34f98718301d718fa2darylm** $Id: lobject.h,v 2.71.1.1 2013/04/12 18:48:47 roberto Exp $ 316a5fed65808adf648004b34f98718301d718fa2darylm** Type definitions for Lua objects 416a5fed65808adf648004b34f98718301d718fa2darylm** See Copyright Notice in lua.h 516a5fed65808adf648004b34f98718301d718fa2darylm*/ 616a5fed65808adf648004b34f98718301d718fa2darylm 716a5fed65808adf648004b34f98718301d718fa2darylm 816a5fed65808adf648004b34f98718301d718fa2darylm#ifndef lobject_h 916a5fed65808adf648004b34f98718301d718fa2darylm#define lobject_h 1016a5fed65808adf648004b34f98718301d718fa2darylm 1116a5fed65808adf648004b34f98718301d718fa2darylm 1216a5fed65808adf648004b34f98718301d718fa2darylm#include <stdarg.h> 1316a5fed65808adf648004b34f98718301d718fa2darylm 1416a5fed65808adf648004b34f98718301d718fa2darylm 1516a5fed65808adf648004b34f98718301d718fa2darylm#include "llimits.h" 1616a5fed65808adf648004b34f98718301d718fa2darylm#include "lua.h" 1716a5fed65808adf648004b34f98718301d718fa2darylm 1816a5fed65808adf648004b34f98718301d718fa2darylm 1916a5fed65808adf648004b34f98718301d718fa2darylm/* 2016a5fed65808adf648004b34f98718301d718fa2darylm** Extra tags for non-values 2116a5fed65808adf648004b34f98718301d718fa2darylm*/ 2216a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_TPROTO LUA_NUMTAGS 2316a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_TUPVAL (LUA_NUMTAGS+1) 2416a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_TDEADKEY (LUA_NUMTAGS+2) 2516a5fed65808adf648004b34f98718301d718fa2darylm 2616a5fed65808adf648004b34f98718301d718fa2darylm/* 2716a5fed65808adf648004b34f98718301d718fa2darylm** number of all possible tags (including LUA_TNONE but excluding DEADKEY) 2816a5fed65808adf648004b34f98718301d718fa2darylm*/ 2916a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_TOTALTAGS (LUA_TUPVAL+2) 3016a5fed65808adf648004b34f98718301d718fa2darylm 3116a5fed65808adf648004b34f98718301d718fa2darylm 3216a5fed65808adf648004b34f98718301d718fa2darylm/* 3316a5fed65808adf648004b34f98718301d718fa2darylm** tags for Tagged Values have the following use of bits: 3416a5fed65808adf648004b34f98718301d718fa2darylm** bits 0-3: actual tag (a LUA_T* value) 3516a5fed65808adf648004b34f98718301d718fa2darylm** bits 4-5: variant bits 3616a5fed65808adf648004b34f98718301d718fa2darylm** bit 6: whether value is collectable 3716a5fed65808adf648004b34f98718301d718fa2darylm*/ 3816a5fed65808adf648004b34f98718301d718fa2darylm 3916a5fed65808adf648004b34f98718301d718fa2darylm#define VARBITS (3 << 4) 4016a5fed65808adf648004b34f98718301d718fa2darylm 4116a5fed65808adf648004b34f98718301d718fa2darylm 4216a5fed65808adf648004b34f98718301d718fa2darylm/* 4316a5fed65808adf648004b34f98718301d718fa2darylm** LUA_TFUNCTION variants: 4416a5fed65808adf648004b34f98718301d718fa2darylm** 0 - Lua function 4516a5fed65808adf648004b34f98718301d718fa2darylm** 1 - light C function 4616a5fed65808adf648004b34f98718301d718fa2darylm** 2 - regular C function (closure) 4716a5fed65808adf648004b34f98718301d718fa2darylm*/ 4816a5fed65808adf648004b34f98718301d718fa2darylm 4916a5fed65808adf648004b34f98718301d718fa2darylm/* Variant tags for functions */ 5016a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_TLCL (LUA_TFUNCTION | (0 << 4)) /* Lua closure */ 5116a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_TLCF (LUA_TFUNCTION | (1 << 4)) /* light C function */ 5216a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_TCCL (LUA_TFUNCTION | (2 << 4)) /* C closure */ 5316a5fed65808adf648004b34f98718301d718fa2darylm 5416a5fed65808adf648004b34f98718301d718fa2darylm 5516a5fed65808adf648004b34f98718301d718fa2darylm/* Variant tags for strings */ 5616a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_TSHRSTR (LUA_TSTRING | (0 << 4)) /* short strings */ 5716a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_TLNGSTR (LUA_TSTRING | (1 << 4)) /* long strings */ 5816a5fed65808adf648004b34f98718301d718fa2darylm 5916a5fed65808adf648004b34f98718301d718fa2darylm 6016a5fed65808adf648004b34f98718301d718fa2darylm/* Bit mark for collectable types */ 6116a5fed65808adf648004b34f98718301d718fa2darylm#define BIT_ISCOLLECTABLE (1 << 6) 6216a5fed65808adf648004b34f98718301d718fa2darylm 6316a5fed65808adf648004b34f98718301d718fa2darylm/* mark a tag as collectable */ 6416a5fed65808adf648004b34f98718301d718fa2darylm#define ctb(t) ((t) | BIT_ISCOLLECTABLE) 6516a5fed65808adf648004b34f98718301d718fa2darylm 6616a5fed65808adf648004b34f98718301d718fa2darylm 6716a5fed65808adf648004b34f98718301d718fa2darylm/* 6816a5fed65808adf648004b34f98718301d718fa2darylm** Union of all collectable objects 6916a5fed65808adf648004b34f98718301d718fa2darylm*/ 7016a5fed65808adf648004b34f98718301d718fa2darylmtypedef union GCObject GCObject; 7116a5fed65808adf648004b34f98718301d718fa2darylm 7216a5fed65808adf648004b34f98718301d718fa2darylm 7316a5fed65808adf648004b34f98718301d718fa2darylm/* 7416a5fed65808adf648004b34f98718301d718fa2darylm** Common Header for all collectable objects (in macro form, to be 7516a5fed65808adf648004b34f98718301d718fa2darylm** included in other objects) 7616a5fed65808adf648004b34f98718301d718fa2darylm*/ 7716a5fed65808adf648004b34f98718301d718fa2darylm#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked 7816a5fed65808adf648004b34f98718301d718fa2darylm 7916a5fed65808adf648004b34f98718301d718fa2darylm 8016a5fed65808adf648004b34f98718301d718fa2darylm/* 8116a5fed65808adf648004b34f98718301d718fa2darylm** Common header in struct form 8216a5fed65808adf648004b34f98718301d718fa2darylm*/ 8316a5fed65808adf648004b34f98718301d718fa2darylmtypedef struct GCheader { 8416a5fed65808adf648004b34f98718301d718fa2darylm CommonHeader; 8516a5fed65808adf648004b34f98718301d718fa2darylm} GCheader; 8616a5fed65808adf648004b34f98718301d718fa2darylm 8716a5fed65808adf648004b34f98718301d718fa2darylm 8816a5fed65808adf648004b34f98718301d718fa2darylm 8916a5fed65808adf648004b34f98718301d718fa2darylm/* 9016a5fed65808adf648004b34f98718301d718fa2darylm** Union of all Lua values 9116a5fed65808adf648004b34f98718301d718fa2darylm*/ 9216a5fed65808adf648004b34f98718301d718fa2darylmtypedef union Value Value; 9316a5fed65808adf648004b34f98718301d718fa2darylm 9416a5fed65808adf648004b34f98718301d718fa2darylm 9516a5fed65808adf648004b34f98718301d718fa2darylm#define numfield lua_Number n; /* numbers */ 9616a5fed65808adf648004b34f98718301d718fa2darylm 9716a5fed65808adf648004b34f98718301d718fa2darylm 9816a5fed65808adf648004b34f98718301d718fa2darylm 9916a5fed65808adf648004b34f98718301d718fa2darylm/* 10016a5fed65808adf648004b34f98718301d718fa2darylm** Tagged Values. This is the basic representation of values in Lua, 10116a5fed65808adf648004b34f98718301d718fa2darylm** an actual value plus a tag with its type. 10216a5fed65808adf648004b34f98718301d718fa2darylm*/ 10316a5fed65808adf648004b34f98718301d718fa2darylm 10416a5fed65808adf648004b34f98718301d718fa2darylm#define TValuefields Value value_; int tt_ 10516a5fed65808adf648004b34f98718301d718fa2darylm 10616a5fed65808adf648004b34f98718301d718fa2darylmtypedef struct lua_TValue TValue; 10716a5fed65808adf648004b34f98718301d718fa2darylm 10816a5fed65808adf648004b34f98718301d718fa2darylm 10916a5fed65808adf648004b34f98718301d718fa2darylm/* macro defining a nil value */ 11016a5fed65808adf648004b34f98718301d718fa2darylm#define NILCONSTANT {NULL}, LUA_TNIL 11116a5fed65808adf648004b34f98718301d718fa2darylm 11216a5fed65808adf648004b34f98718301d718fa2darylm 11316a5fed65808adf648004b34f98718301d718fa2darylm#define val_(o) ((o)->value_) 11416a5fed65808adf648004b34f98718301d718fa2darylm#define num_(o) (val_(o).n) 11516a5fed65808adf648004b34f98718301d718fa2darylm 11616a5fed65808adf648004b34f98718301d718fa2darylm 11716a5fed65808adf648004b34f98718301d718fa2darylm/* raw type tag of a TValue */ 11816a5fed65808adf648004b34f98718301d718fa2darylm#define rttype(o) ((o)->tt_) 11916a5fed65808adf648004b34f98718301d718fa2darylm 12016a5fed65808adf648004b34f98718301d718fa2darylm/* tag with no variants (bits 0-3) */ 12116a5fed65808adf648004b34f98718301d718fa2darylm#define novariant(x) ((x) & 0x0F) 12216a5fed65808adf648004b34f98718301d718fa2darylm 12316a5fed65808adf648004b34f98718301d718fa2darylm/* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ 12416a5fed65808adf648004b34f98718301d718fa2darylm#define ttype(o) (rttype(o) & 0x3F) 12516a5fed65808adf648004b34f98718301d718fa2darylm 12616a5fed65808adf648004b34f98718301d718fa2darylm/* type tag of a TValue with no variants (bits 0-3) */ 12716a5fed65808adf648004b34f98718301d718fa2darylm#define ttypenv(o) (novariant(rttype(o))) 12816a5fed65808adf648004b34f98718301d718fa2darylm 12916a5fed65808adf648004b34f98718301d718fa2darylm 13016a5fed65808adf648004b34f98718301d718fa2darylm/* Macros to test type */ 13116a5fed65808adf648004b34f98718301d718fa2darylm#define checktag(o,t) (rttype(o) == (t)) 13216a5fed65808adf648004b34f98718301d718fa2darylm#define checktype(o,t) (ttypenv(o) == (t)) 13316a5fed65808adf648004b34f98718301d718fa2darylm#define ttisnumber(o) checktag((o), LUA_TNUMBER) 13416a5fed65808adf648004b34f98718301d718fa2darylm#define ttisnil(o) checktag((o), LUA_TNIL) 13516a5fed65808adf648004b34f98718301d718fa2darylm#define ttisboolean(o) checktag((o), LUA_TBOOLEAN) 13616a5fed65808adf648004b34f98718301d718fa2darylm#define ttislightuserdata(o) checktag((o), LUA_TLIGHTUSERDATA) 13716a5fed65808adf648004b34f98718301d718fa2darylm#define ttisstring(o) checktype((o), LUA_TSTRING) 13816a5fed65808adf648004b34f98718301d718fa2darylm#define ttisshrstring(o) checktag((o), ctb(LUA_TSHRSTR)) 13916a5fed65808adf648004b34f98718301d718fa2darylm#define ttislngstring(o) checktag((o), ctb(LUA_TLNGSTR)) 14016a5fed65808adf648004b34f98718301d718fa2darylm#define ttistable(o) checktag((o), ctb(LUA_TTABLE)) 14116a5fed65808adf648004b34f98718301d718fa2darylm#define ttisfunction(o) checktype(o, LUA_TFUNCTION) 14216a5fed65808adf648004b34f98718301d718fa2darylm#define ttisclosure(o) ((rttype(o) & 0x1F) == LUA_TFUNCTION) 14316a5fed65808adf648004b34f98718301d718fa2darylm#define ttisCclosure(o) checktag((o), ctb(LUA_TCCL)) 14416a5fed65808adf648004b34f98718301d718fa2darylm#define ttisLclosure(o) checktag((o), ctb(LUA_TLCL)) 14516a5fed65808adf648004b34f98718301d718fa2darylm#define ttislcf(o) checktag((o), LUA_TLCF) 14616a5fed65808adf648004b34f98718301d718fa2darylm#define ttisuserdata(o) checktag((o), ctb(LUA_TUSERDATA)) 14716a5fed65808adf648004b34f98718301d718fa2darylm#define ttisthread(o) checktag((o), ctb(LUA_TTHREAD)) 14816a5fed65808adf648004b34f98718301d718fa2darylm#define ttisdeadkey(o) checktag((o), LUA_TDEADKEY) 14916a5fed65808adf648004b34f98718301d718fa2darylm 15016a5fed65808adf648004b34f98718301d718fa2darylm#define ttisequal(o1,o2) (rttype(o1) == rttype(o2)) 15116a5fed65808adf648004b34f98718301d718fa2darylm 15216a5fed65808adf648004b34f98718301d718fa2darylm/* Macros to access values */ 15316a5fed65808adf648004b34f98718301d718fa2darylm#define nvalue(o) check_exp(ttisnumber(o), num_(o)) 15416a5fed65808adf648004b34f98718301d718fa2darylm#define gcvalue(o) check_exp(iscollectable(o), val_(o).gc) 15516a5fed65808adf648004b34f98718301d718fa2darylm#define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p) 15616a5fed65808adf648004b34f98718301d718fa2darylm#define rawtsvalue(o) check_exp(ttisstring(o), &val_(o).gc->ts) 15716a5fed65808adf648004b34f98718301d718fa2darylm#define tsvalue(o) (&rawtsvalue(o)->tsv) 15816a5fed65808adf648004b34f98718301d718fa2darylm#define rawuvalue(o) check_exp(ttisuserdata(o), &val_(o).gc->u) 15916a5fed65808adf648004b34f98718301d718fa2darylm#define uvalue(o) (&rawuvalue(o)->uv) 16016a5fed65808adf648004b34f98718301d718fa2darylm#define clvalue(o) check_exp(ttisclosure(o), &val_(o).gc->cl) 16116a5fed65808adf648004b34f98718301d718fa2darylm#define clLvalue(o) check_exp(ttisLclosure(o), &val_(o).gc->cl.l) 16216a5fed65808adf648004b34f98718301d718fa2darylm#define clCvalue(o) check_exp(ttisCclosure(o), &val_(o).gc->cl.c) 16316a5fed65808adf648004b34f98718301d718fa2darylm#define fvalue(o) check_exp(ttislcf(o), val_(o).f) 16416a5fed65808adf648004b34f98718301d718fa2darylm#define hvalue(o) check_exp(ttistable(o), &val_(o).gc->h) 16516a5fed65808adf648004b34f98718301d718fa2darylm#define bvalue(o) check_exp(ttisboolean(o), val_(o).b) 16616a5fed65808adf648004b34f98718301d718fa2darylm#define thvalue(o) check_exp(ttisthread(o), &val_(o).gc->th) 16716a5fed65808adf648004b34f98718301d718fa2darylm/* a dead value may get the 'gc' field, but cannot access its contents */ 16816a5fed65808adf648004b34f98718301d718fa2darylm#define deadvalue(o) check_exp(ttisdeadkey(o), cast(void *, val_(o).gc)) 16916a5fed65808adf648004b34f98718301d718fa2darylm 17016a5fed65808adf648004b34f98718301d718fa2darylm#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) 17116a5fed65808adf648004b34f98718301d718fa2darylm 17216a5fed65808adf648004b34f98718301d718fa2darylm 17316a5fed65808adf648004b34f98718301d718fa2darylm#define iscollectable(o) (rttype(o) & BIT_ISCOLLECTABLE) 17416a5fed65808adf648004b34f98718301d718fa2darylm 17516a5fed65808adf648004b34f98718301d718fa2darylm 17616a5fed65808adf648004b34f98718301d718fa2darylm/* Macros for internal tests */ 17716a5fed65808adf648004b34f98718301d718fa2darylm#define righttt(obj) (ttype(obj) == gcvalue(obj)->gch.tt) 17816a5fed65808adf648004b34f98718301d718fa2darylm 17916a5fed65808adf648004b34f98718301d718fa2darylm#define checkliveness(g,obj) \ 18016a5fed65808adf648004b34f98718301d718fa2darylm lua_longassert(!iscollectable(obj) || \ 18116a5fed65808adf648004b34f98718301d718fa2darylm (righttt(obj) && !isdead(g,gcvalue(obj)))) 18216a5fed65808adf648004b34f98718301d718fa2darylm 18316a5fed65808adf648004b34f98718301d718fa2darylm 18416a5fed65808adf648004b34f98718301d718fa2darylm/* Macros to set values */ 18516a5fed65808adf648004b34f98718301d718fa2darylm#define settt_(o,t) ((o)->tt_=(t)) 18616a5fed65808adf648004b34f98718301d718fa2darylm 18716a5fed65808adf648004b34f98718301d718fa2darylm#define setnvalue(obj,x) \ 18816a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io=(obj); num_(io)=(x); settt_(io, LUA_TNUMBER); } 18916a5fed65808adf648004b34f98718301d718fa2darylm 19016a5fed65808adf648004b34f98718301d718fa2darylm#define setnilvalue(obj) settt_(obj, LUA_TNIL) 19116a5fed65808adf648004b34f98718301d718fa2darylm 19216a5fed65808adf648004b34f98718301d718fa2darylm#define setfvalue(obj,x) \ 19316a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); } 19416a5fed65808adf648004b34f98718301d718fa2darylm 19516a5fed65808adf648004b34f98718301d718fa2darylm#define setpvalue(obj,x) \ 19616a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); } 19716a5fed65808adf648004b34f98718301d718fa2darylm 19816a5fed65808adf648004b34f98718301d718fa2darylm#define setbvalue(obj,x) \ 19916a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); } 20016a5fed65808adf648004b34f98718301d718fa2darylm 20116a5fed65808adf648004b34f98718301d718fa2darylm#define setgcovalue(L,obj,x) \ 20216a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io=(obj); GCObject *i_g=(x); \ 20316a5fed65808adf648004b34f98718301d718fa2darylm val_(io).gc=i_g; settt_(io, ctb(gch(i_g)->tt)); } 20416a5fed65808adf648004b34f98718301d718fa2darylm 20516a5fed65808adf648004b34f98718301d718fa2darylm#define setsvalue(L,obj,x) \ 20616a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io=(obj); \ 20716a5fed65808adf648004b34f98718301d718fa2darylm TString *x_ = (x); \ 20816a5fed65808adf648004b34f98718301d718fa2darylm val_(io).gc=cast(GCObject *, x_); settt_(io, ctb(x_->tsv.tt)); \ 20916a5fed65808adf648004b34f98718301d718fa2darylm checkliveness(G(L),io); } 21016a5fed65808adf648004b34f98718301d718fa2darylm 21116a5fed65808adf648004b34f98718301d718fa2darylm#define setuvalue(L,obj,x) \ 21216a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io=(obj); \ 21316a5fed65808adf648004b34f98718301d718fa2darylm val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TUSERDATA)); \ 21416a5fed65808adf648004b34f98718301d718fa2darylm checkliveness(G(L),io); } 21516a5fed65808adf648004b34f98718301d718fa2darylm 21616a5fed65808adf648004b34f98718301d718fa2darylm#define setthvalue(L,obj,x) \ 21716a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io=(obj); \ 21816a5fed65808adf648004b34f98718301d718fa2darylm val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TTHREAD)); \ 21916a5fed65808adf648004b34f98718301d718fa2darylm checkliveness(G(L),io); } 22016a5fed65808adf648004b34f98718301d718fa2darylm 22116a5fed65808adf648004b34f98718301d718fa2darylm#define setclLvalue(L,obj,x) \ 22216a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io=(obj); \ 22316a5fed65808adf648004b34f98718301d718fa2darylm val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TLCL)); \ 22416a5fed65808adf648004b34f98718301d718fa2darylm checkliveness(G(L),io); } 22516a5fed65808adf648004b34f98718301d718fa2darylm 22616a5fed65808adf648004b34f98718301d718fa2darylm#define setclCvalue(L,obj,x) \ 22716a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io=(obj); \ 22816a5fed65808adf648004b34f98718301d718fa2darylm val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TCCL)); \ 22916a5fed65808adf648004b34f98718301d718fa2darylm checkliveness(G(L),io); } 23016a5fed65808adf648004b34f98718301d718fa2darylm 23116a5fed65808adf648004b34f98718301d718fa2darylm#define sethvalue(L,obj,x) \ 23216a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io=(obj); \ 23316a5fed65808adf648004b34f98718301d718fa2darylm val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TTABLE)); \ 23416a5fed65808adf648004b34f98718301d718fa2darylm checkliveness(G(L),io); } 23516a5fed65808adf648004b34f98718301d718fa2darylm 23616a5fed65808adf648004b34f98718301d718fa2darylm#define setdeadvalue(obj) settt_(obj, LUA_TDEADKEY) 23716a5fed65808adf648004b34f98718301d718fa2darylm 23816a5fed65808adf648004b34f98718301d718fa2darylm 23916a5fed65808adf648004b34f98718301d718fa2darylm 24016a5fed65808adf648004b34f98718301d718fa2darylm#define setobj(L,obj1,obj2) \ 24116a5fed65808adf648004b34f98718301d718fa2darylm { const TValue *io2=(obj2); TValue *io1=(obj1); \ 24216a5fed65808adf648004b34f98718301d718fa2darylm io1->value_ = io2->value_; io1->tt_ = io2->tt_; \ 24316a5fed65808adf648004b34f98718301d718fa2darylm checkliveness(G(L),io1); } 24416a5fed65808adf648004b34f98718301d718fa2darylm 24516a5fed65808adf648004b34f98718301d718fa2darylm 24616a5fed65808adf648004b34f98718301d718fa2darylm/* 24716a5fed65808adf648004b34f98718301d718fa2darylm** different types of assignments, according to destination 24816a5fed65808adf648004b34f98718301d718fa2darylm*/ 24916a5fed65808adf648004b34f98718301d718fa2darylm 25016a5fed65808adf648004b34f98718301d718fa2darylm/* from stack to (same) stack */ 25116a5fed65808adf648004b34f98718301d718fa2darylm#define setobjs2s setobj 25216a5fed65808adf648004b34f98718301d718fa2darylm/* to stack (not from same stack) */ 25316a5fed65808adf648004b34f98718301d718fa2darylm#define setobj2s setobj 25416a5fed65808adf648004b34f98718301d718fa2darylm#define setsvalue2s setsvalue 25516a5fed65808adf648004b34f98718301d718fa2darylm#define sethvalue2s sethvalue 25616a5fed65808adf648004b34f98718301d718fa2darylm#define setptvalue2s setptvalue 25716a5fed65808adf648004b34f98718301d718fa2darylm/* from table to same table */ 25816a5fed65808adf648004b34f98718301d718fa2darylm#define setobjt2t setobj 25916a5fed65808adf648004b34f98718301d718fa2darylm/* to table */ 26016a5fed65808adf648004b34f98718301d718fa2darylm#define setobj2t setobj 26116a5fed65808adf648004b34f98718301d718fa2darylm/* to new object */ 26216a5fed65808adf648004b34f98718301d718fa2darylm#define setobj2n setobj 26316a5fed65808adf648004b34f98718301d718fa2darylm#define setsvalue2n setsvalue 26416a5fed65808adf648004b34f98718301d718fa2darylm 26516a5fed65808adf648004b34f98718301d718fa2darylm 26616a5fed65808adf648004b34f98718301d718fa2darylm/* check whether a number is valid (useful only for NaN trick) */ 26716a5fed65808adf648004b34f98718301d718fa2darylm#define luai_checknum(L,o,c) { /* empty */ } 26816a5fed65808adf648004b34f98718301d718fa2darylm 26916a5fed65808adf648004b34f98718301d718fa2darylm 27016a5fed65808adf648004b34f98718301d718fa2darylm/* 27116a5fed65808adf648004b34f98718301d718fa2darylm** {====================================================== 27216a5fed65808adf648004b34f98718301d718fa2darylm** NaN Trick 27316a5fed65808adf648004b34f98718301d718fa2darylm** ======================================================= 27416a5fed65808adf648004b34f98718301d718fa2darylm*/ 27516a5fed65808adf648004b34f98718301d718fa2darylm#if defined(LUA_NANTRICK) 27616a5fed65808adf648004b34f98718301d718fa2darylm 27716a5fed65808adf648004b34f98718301d718fa2darylm/* 27816a5fed65808adf648004b34f98718301d718fa2darylm** numbers are represented in the 'd_' field. All other values have the 27916a5fed65808adf648004b34f98718301d718fa2darylm** value (NNMARK | tag) in 'tt__'. A number with such pattern would be 28016a5fed65808adf648004b34f98718301d718fa2darylm** a "signaled NaN", which is never generated by regular operations by 28116a5fed65808adf648004b34f98718301d718fa2darylm** the CPU (nor by 'strtod') 28216a5fed65808adf648004b34f98718301d718fa2darylm*/ 28316a5fed65808adf648004b34f98718301d718fa2darylm 28416a5fed65808adf648004b34f98718301d718fa2darylm/* allows for external implementation for part of the trick */ 28516a5fed65808adf648004b34f98718301d718fa2darylm#if !defined(NNMARK) /* { */ 28616a5fed65808adf648004b34f98718301d718fa2darylm 28716a5fed65808adf648004b34f98718301d718fa2darylm 28816a5fed65808adf648004b34f98718301d718fa2darylm#if !defined(LUA_IEEEENDIAN) 28916a5fed65808adf648004b34f98718301d718fa2darylm#error option 'LUA_NANTRICK' needs 'LUA_IEEEENDIAN' 29016a5fed65808adf648004b34f98718301d718fa2darylm#endif 29116a5fed65808adf648004b34f98718301d718fa2darylm 29216a5fed65808adf648004b34f98718301d718fa2darylm 29316a5fed65808adf648004b34f98718301d718fa2darylm#define NNMARK 0x7FF7A500 29416a5fed65808adf648004b34f98718301d718fa2darylm#define NNMASK 0x7FFFFF00 29516a5fed65808adf648004b34f98718301d718fa2darylm 29616a5fed65808adf648004b34f98718301d718fa2darylm#undef TValuefields 29716a5fed65808adf648004b34f98718301d718fa2darylm#undef NILCONSTANT 29816a5fed65808adf648004b34f98718301d718fa2darylm 29916a5fed65808adf648004b34f98718301d718fa2darylm#if (LUA_IEEEENDIAN == 0) /* { */ 30016a5fed65808adf648004b34f98718301d718fa2darylm 30116a5fed65808adf648004b34f98718301d718fa2darylm/* little endian */ 30216a5fed65808adf648004b34f98718301d718fa2darylm#define TValuefields \ 30316a5fed65808adf648004b34f98718301d718fa2darylm union { struct { Value v__; int tt__; } i; double d__; } u 30416a5fed65808adf648004b34f98718301d718fa2darylm#define NILCONSTANT {{{NULL}, tag2tt(LUA_TNIL)}} 30516a5fed65808adf648004b34f98718301d718fa2darylm/* field-access macros */ 30616a5fed65808adf648004b34f98718301d718fa2darylm#define v_(o) ((o)->u.i.v__) 30716a5fed65808adf648004b34f98718301d718fa2darylm#define d_(o) ((o)->u.d__) 30816a5fed65808adf648004b34f98718301d718fa2darylm#define tt_(o) ((o)->u.i.tt__) 30916a5fed65808adf648004b34f98718301d718fa2darylm 31016a5fed65808adf648004b34f98718301d718fa2darylm#else /* }{ */ 31116a5fed65808adf648004b34f98718301d718fa2darylm 31216a5fed65808adf648004b34f98718301d718fa2darylm/* big endian */ 31316a5fed65808adf648004b34f98718301d718fa2darylm#define TValuefields \ 31416a5fed65808adf648004b34f98718301d718fa2darylm union { struct { int tt__; Value v__; } i; double d__; } u 31516a5fed65808adf648004b34f98718301d718fa2darylm#define NILCONSTANT {{tag2tt(LUA_TNIL), {NULL}}} 31616a5fed65808adf648004b34f98718301d718fa2darylm/* field-access macros */ 31716a5fed65808adf648004b34f98718301d718fa2darylm#define v_(o) ((o)->u.i.v__) 31816a5fed65808adf648004b34f98718301d718fa2darylm#define d_(o) ((o)->u.d__) 31916a5fed65808adf648004b34f98718301d718fa2darylm#define tt_(o) ((o)->u.i.tt__) 32016a5fed65808adf648004b34f98718301d718fa2darylm 32116a5fed65808adf648004b34f98718301d718fa2darylm#endif /* } */ 32216a5fed65808adf648004b34f98718301d718fa2darylm 32316a5fed65808adf648004b34f98718301d718fa2darylm#endif /* } */ 32416a5fed65808adf648004b34f98718301d718fa2darylm 32516a5fed65808adf648004b34f98718301d718fa2darylm 32616a5fed65808adf648004b34f98718301d718fa2darylm/* correspondence with standard representation */ 32716a5fed65808adf648004b34f98718301d718fa2darylm#undef val_ 32816a5fed65808adf648004b34f98718301d718fa2darylm#define val_(o) v_(o) 32916a5fed65808adf648004b34f98718301d718fa2darylm#undef num_ 33016a5fed65808adf648004b34f98718301d718fa2darylm#define num_(o) d_(o) 33116a5fed65808adf648004b34f98718301d718fa2darylm 33216a5fed65808adf648004b34f98718301d718fa2darylm 33316a5fed65808adf648004b34f98718301d718fa2darylm#undef numfield 33416a5fed65808adf648004b34f98718301d718fa2darylm#define numfield /* no such field; numbers are the entire struct */ 33516a5fed65808adf648004b34f98718301d718fa2darylm 33616a5fed65808adf648004b34f98718301d718fa2darylm/* basic check to distinguish numbers from non-numbers */ 33716a5fed65808adf648004b34f98718301d718fa2darylm#undef ttisnumber 33816a5fed65808adf648004b34f98718301d718fa2darylm#define ttisnumber(o) ((tt_(o) & NNMASK) != NNMARK) 33916a5fed65808adf648004b34f98718301d718fa2darylm 34016a5fed65808adf648004b34f98718301d718fa2darylm#define tag2tt(t) (NNMARK | (t)) 34116a5fed65808adf648004b34f98718301d718fa2darylm 34216a5fed65808adf648004b34f98718301d718fa2darylm#undef rttype 34316a5fed65808adf648004b34f98718301d718fa2darylm#define rttype(o) (ttisnumber(o) ? LUA_TNUMBER : tt_(o) & 0xff) 34416a5fed65808adf648004b34f98718301d718fa2darylm 34516a5fed65808adf648004b34f98718301d718fa2darylm#undef settt_ 34616a5fed65808adf648004b34f98718301d718fa2darylm#define settt_(o,t) (tt_(o) = tag2tt(t)) 34716a5fed65808adf648004b34f98718301d718fa2darylm 34816a5fed65808adf648004b34f98718301d718fa2darylm#undef setnvalue 34916a5fed65808adf648004b34f98718301d718fa2darylm#define setnvalue(obj,x) \ 35016a5fed65808adf648004b34f98718301d718fa2darylm { TValue *io_=(obj); num_(io_)=(x); lua_assert(ttisnumber(io_)); } 35116a5fed65808adf648004b34f98718301d718fa2darylm 35216a5fed65808adf648004b34f98718301d718fa2darylm#undef setobj 35316a5fed65808adf648004b34f98718301d718fa2darylm#define setobj(L,obj1,obj2) \ 35416a5fed65808adf648004b34f98718301d718fa2darylm { const TValue *o2_=(obj2); TValue *o1_=(obj1); \ 35516a5fed65808adf648004b34f98718301d718fa2darylm o1_->u = o2_->u; \ 35616a5fed65808adf648004b34f98718301d718fa2darylm checkliveness(G(L),o1_); } 35716a5fed65808adf648004b34f98718301d718fa2darylm 35816a5fed65808adf648004b34f98718301d718fa2darylm 35916a5fed65808adf648004b34f98718301d718fa2darylm/* 36016a5fed65808adf648004b34f98718301d718fa2darylm** these redefinitions are not mandatory, but these forms are more efficient 36116a5fed65808adf648004b34f98718301d718fa2darylm*/ 36216a5fed65808adf648004b34f98718301d718fa2darylm 36316a5fed65808adf648004b34f98718301d718fa2darylm#undef checktag 36416a5fed65808adf648004b34f98718301d718fa2darylm#undef checktype 36516a5fed65808adf648004b34f98718301d718fa2darylm#define checktag(o,t) (tt_(o) == tag2tt(t)) 36616a5fed65808adf648004b34f98718301d718fa2darylm#define checktype(o,t) (ctb(tt_(o) | VARBITS) == ctb(tag2tt(t) | VARBITS)) 36716a5fed65808adf648004b34f98718301d718fa2darylm 36816a5fed65808adf648004b34f98718301d718fa2darylm#undef ttisequal 36916a5fed65808adf648004b34f98718301d718fa2darylm#define ttisequal(o1,o2) \ 37016a5fed65808adf648004b34f98718301d718fa2darylm (ttisnumber(o1) ? ttisnumber(o2) : (tt_(o1) == tt_(o2))) 37116a5fed65808adf648004b34f98718301d718fa2darylm 37216a5fed65808adf648004b34f98718301d718fa2darylm 37316a5fed65808adf648004b34f98718301d718fa2darylm#undef luai_checknum 37416a5fed65808adf648004b34f98718301d718fa2darylm#define luai_checknum(L,o,c) { if (!ttisnumber(o)) c; } 37516a5fed65808adf648004b34f98718301d718fa2darylm 37616a5fed65808adf648004b34f98718301d718fa2darylm#endif 37716a5fed65808adf648004b34f98718301d718fa2darylm/* }====================================================== */ 37816a5fed65808adf648004b34f98718301d718fa2darylm 37916a5fed65808adf648004b34f98718301d718fa2darylm 38016a5fed65808adf648004b34f98718301d718fa2darylm 38116a5fed65808adf648004b34f98718301d718fa2darylm/* 38216a5fed65808adf648004b34f98718301d718fa2darylm** {====================================================== 38316a5fed65808adf648004b34f98718301d718fa2darylm** types and prototypes 38416a5fed65808adf648004b34f98718301d718fa2darylm** ======================================================= 38516a5fed65808adf648004b34f98718301d718fa2darylm*/ 38616a5fed65808adf648004b34f98718301d718fa2darylm 38716a5fed65808adf648004b34f98718301d718fa2darylm 38816a5fed65808adf648004b34f98718301d718fa2darylmunion Value { 38916a5fed65808adf648004b34f98718301d718fa2darylm GCObject *gc; /* collectable objects */ 39016a5fed65808adf648004b34f98718301d718fa2darylm void *p; /* light userdata */ 39116a5fed65808adf648004b34f98718301d718fa2darylm int b; /* booleans */ 39216a5fed65808adf648004b34f98718301d718fa2darylm lua_CFunction f; /* light C functions */ 39316a5fed65808adf648004b34f98718301d718fa2darylm numfield /* numbers */ 39416a5fed65808adf648004b34f98718301d718fa2darylm}; 39516a5fed65808adf648004b34f98718301d718fa2darylm 39616a5fed65808adf648004b34f98718301d718fa2darylm 39716a5fed65808adf648004b34f98718301d718fa2darylmstruct lua_TValue { 39816a5fed65808adf648004b34f98718301d718fa2darylm TValuefields; 39916a5fed65808adf648004b34f98718301d718fa2darylm}; 40016a5fed65808adf648004b34f98718301d718fa2darylm 40116a5fed65808adf648004b34f98718301d718fa2darylm 40216a5fed65808adf648004b34f98718301d718fa2darylmtypedef TValue *StkId; /* index to stack elements */ 40316a5fed65808adf648004b34f98718301d718fa2darylm 40416a5fed65808adf648004b34f98718301d718fa2darylm 40516a5fed65808adf648004b34f98718301d718fa2darylm 40616a5fed65808adf648004b34f98718301d718fa2darylm 40716a5fed65808adf648004b34f98718301d718fa2darylm/* 40816a5fed65808adf648004b34f98718301d718fa2darylm** Header for string value; string bytes follow the end of this structure 40916a5fed65808adf648004b34f98718301d718fa2darylm*/ 41016a5fed65808adf648004b34f98718301d718fa2darylmtypedef union TString { 41116a5fed65808adf648004b34f98718301d718fa2darylm L_Umaxalign dummy; /* ensures maximum alignment for strings */ 41216a5fed65808adf648004b34f98718301d718fa2darylm struct { 41316a5fed65808adf648004b34f98718301d718fa2darylm CommonHeader; 41416a5fed65808adf648004b34f98718301d718fa2darylm lu_byte extra; /* reserved words for short strings; "has hash" for longs */ 41516a5fed65808adf648004b34f98718301d718fa2darylm unsigned int hash; 41616a5fed65808adf648004b34f98718301d718fa2darylm size_t len; /* number of characters in string */ 41716a5fed65808adf648004b34f98718301d718fa2darylm } tsv; 41816a5fed65808adf648004b34f98718301d718fa2darylm} TString; 41916a5fed65808adf648004b34f98718301d718fa2darylm 42016a5fed65808adf648004b34f98718301d718fa2darylm 42116a5fed65808adf648004b34f98718301d718fa2darylm/* get the actual string (array of bytes) from a TString */ 42216a5fed65808adf648004b34f98718301d718fa2darylm#define getstr(ts) cast(const char *, (ts) + 1) 42316a5fed65808adf648004b34f98718301d718fa2darylm 42416a5fed65808adf648004b34f98718301d718fa2darylm/* get the actual string (array of bytes) from a Lua value */ 42516a5fed65808adf648004b34f98718301d718fa2darylm#define svalue(o) getstr(rawtsvalue(o)) 42616a5fed65808adf648004b34f98718301d718fa2darylm 42716a5fed65808adf648004b34f98718301d718fa2darylm 42816a5fed65808adf648004b34f98718301d718fa2darylm/* 42916a5fed65808adf648004b34f98718301d718fa2darylm** Header for userdata; memory area follows the end of this structure 43016a5fed65808adf648004b34f98718301d718fa2darylm*/ 43116a5fed65808adf648004b34f98718301d718fa2darylmtypedef union Udata { 43216a5fed65808adf648004b34f98718301d718fa2darylm L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ 43316a5fed65808adf648004b34f98718301d718fa2darylm struct { 43416a5fed65808adf648004b34f98718301d718fa2darylm CommonHeader; 43516a5fed65808adf648004b34f98718301d718fa2darylm struct Table *metatable; 43616a5fed65808adf648004b34f98718301d718fa2darylm struct Table *env; 43716a5fed65808adf648004b34f98718301d718fa2darylm size_t len; /* number of bytes */ 43816a5fed65808adf648004b34f98718301d718fa2darylm } uv; 43916a5fed65808adf648004b34f98718301d718fa2darylm} Udata; 44016a5fed65808adf648004b34f98718301d718fa2darylm 44116a5fed65808adf648004b34f98718301d718fa2darylm 44216a5fed65808adf648004b34f98718301d718fa2darylm 44316a5fed65808adf648004b34f98718301d718fa2darylm/* 44416a5fed65808adf648004b34f98718301d718fa2darylm** Description of an upvalue for function prototypes 44516a5fed65808adf648004b34f98718301d718fa2darylm*/ 44616a5fed65808adf648004b34f98718301d718fa2darylmtypedef struct Upvaldesc { 44716a5fed65808adf648004b34f98718301d718fa2darylm TString *name; /* upvalue name (for debug information) */ 44816a5fed65808adf648004b34f98718301d718fa2darylm lu_byte instack; /* whether it is in stack */ 44916a5fed65808adf648004b34f98718301d718fa2darylm lu_byte idx; /* index of upvalue (in stack or in outer function's list) */ 45016a5fed65808adf648004b34f98718301d718fa2darylm} Upvaldesc; 45116a5fed65808adf648004b34f98718301d718fa2darylm 45216a5fed65808adf648004b34f98718301d718fa2darylm 45316a5fed65808adf648004b34f98718301d718fa2darylm/* 45416a5fed65808adf648004b34f98718301d718fa2darylm** Description of a local variable for function prototypes 45516a5fed65808adf648004b34f98718301d718fa2darylm** (used for debug information) 45616a5fed65808adf648004b34f98718301d718fa2darylm*/ 45716a5fed65808adf648004b34f98718301d718fa2darylmtypedef struct LocVar { 45816a5fed65808adf648004b34f98718301d718fa2darylm TString *varname; 45916a5fed65808adf648004b34f98718301d718fa2darylm int startpc; /* first point where variable is active */ 46016a5fed65808adf648004b34f98718301d718fa2darylm int endpc; /* first point where variable is dead */ 46116a5fed65808adf648004b34f98718301d718fa2darylm} LocVar; 46216a5fed65808adf648004b34f98718301d718fa2darylm 46316a5fed65808adf648004b34f98718301d718fa2darylm 46416a5fed65808adf648004b34f98718301d718fa2darylm/* 46516a5fed65808adf648004b34f98718301d718fa2darylm** Function Prototypes 46616a5fed65808adf648004b34f98718301d718fa2darylm*/ 46716a5fed65808adf648004b34f98718301d718fa2darylmtypedef struct Proto { 46816a5fed65808adf648004b34f98718301d718fa2darylm CommonHeader; 46916a5fed65808adf648004b34f98718301d718fa2darylm TValue *k; /* constants used by the function */ 47016a5fed65808adf648004b34f98718301d718fa2darylm Instruction *code; 47116a5fed65808adf648004b34f98718301d718fa2darylm struct Proto **p; /* functions defined inside the function */ 47216a5fed65808adf648004b34f98718301d718fa2darylm int *lineinfo; /* map from opcodes to source lines (debug information) */ 47316a5fed65808adf648004b34f98718301d718fa2darylm LocVar *locvars; /* information about local variables (debug information) */ 47416a5fed65808adf648004b34f98718301d718fa2darylm Upvaldesc *upvalues; /* upvalue information */ 47516a5fed65808adf648004b34f98718301d718fa2darylm union Closure *cache; /* last created closure with this prototype */ 47616a5fed65808adf648004b34f98718301d718fa2darylm TString *source; /* used for debug information */ 47716a5fed65808adf648004b34f98718301d718fa2darylm int sizeupvalues; /* size of 'upvalues' */ 47816a5fed65808adf648004b34f98718301d718fa2darylm int sizek; /* size of `k' */ 47916a5fed65808adf648004b34f98718301d718fa2darylm int sizecode; 48016a5fed65808adf648004b34f98718301d718fa2darylm int sizelineinfo; 48116a5fed65808adf648004b34f98718301d718fa2darylm int sizep; /* size of `p' */ 48216a5fed65808adf648004b34f98718301d718fa2darylm int sizelocvars; 48316a5fed65808adf648004b34f98718301d718fa2darylm int linedefined; 48416a5fed65808adf648004b34f98718301d718fa2darylm int lastlinedefined; 48516a5fed65808adf648004b34f98718301d718fa2darylm GCObject *gclist; 48616a5fed65808adf648004b34f98718301d718fa2darylm lu_byte numparams; /* number of fixed parameters */ 48716a5fed65808adf648004b34f98718301d718fa2darylm lu_byte is_vararg; 48816a5fed65808adf648004b34f98718301d718fa2darylm lu_byte maxstacksize; /* maximum stack used by this function */ 48916a5fed65808adf648004b34f98718301d718fa2darylm} Proto; 49016a5fed65808adf648004b34f98718301d718fa2darylm 49116a5fed65808adf648004b34f98718301d718fa2darylm 49216a5fed65808adf648004b34f98718301d718fa2darylm 49316a5fed65808adf648004b34f98718301d718fa2darylm/* 49416a5fed65808adf648004b34f98718301d718fa2darylm** Lua Upvalues 49516a5fed65808adf648004b34f98718301d718fa2darylm*/ 49616a5fed65808adf648004b34f98718301d718fa2darylmtypedef struct UpVal { 49716a5fed65808adf648004b34f98718301d718fa2darylm CommonHeader; 49816a5fed65808adf648004b34f98718301d718fa2darylm TValue *v; /* points to stack or to its own value */ 49916a5fed65808adf648004b34f98718301d718fa2darylm union { 50016a5fed65808adf648004b34f98718301d718fa2darylm TValue value; /* the value (when closed) */ 50116a5fed65808adf648004b34f98718301d718fa2darylm struct { /* double linked list (when open) */ 50216a5fed65808adf648004b34f98718301d718fa2darylm struct UpVal *prev; 50316a5fed65808adf648004b34f98718301d718fa2darylm struct UpVal *next; 50416a5fed65808adf648004b34f98718301d718fa2darylm } l; 50516a5fed65808adf648004b34f98718301d718fa2darylm } u; 50616a5fed65808adf648004b34f98718301d718fa2darylm} UpVal; 50716a5fed65808adf648004b34f98718301d718fa2darylm 50816a5fed65808adf648004b34f98718301d718fa2darylm 50916a5fed65808adf648004b34f98718301d718fa2darylm/* 51016a5fed65808adf648004b34f98718301d718fa2darylm** Closures 51116a5fed65808adf648004b34f98718301d718fa2darylm*/ 51216a5fed65808adf648004b34f98718301d718fa2darylm 51316a5fed65808adf648004b34f98718301d718fa2darylm#define ClosureHeader \ 51416a5fed65808adf648004b34f98718301d718fa2darylm CommonHeader; lu_byte nupvalues; GCObject *gclist 51516a5fed65808adf648004b34f98718301d718fa2darylm 51616a5fed65808adf648004b34f98718301d718fa2darylmtypedef struct CClosure { 51716a5fed65808adf648004b34f98718301d718fa2darylm ClosureHeader; 51816a5fed65808adf648004b34f98718301d718fa2darylm lua_CFunction f; 51916a5fed65808adf648004b34f98718301d718fa2darylm TValue upvalue[1]; /* list of upvalues */ 52016a5fed65808adf648004b34f98718301d718fa2darylm} CClosure; 52116a5fed65808adf648004b34f98718301d718fa2darylm 52216a5fed65808adf648004b34f98718301d718fa2darylm 52316a5fed65808adf648004b34f98718301d718fa2darylmtypedef struct LClosure { 52416a5fed65808adf648004b34f98718301d718fa2darylm ClosureHeader; 52516a5fed65808adf648004b34f98718301d718fa2darylm struct Proto *p; 52616a5fed65808adf648004b34f98718301d718fa2darylm UpVal *upvals[1]; /* list of upvalues */ 52716a5fed65808adf648004b34f98718301d718fa2darylm} LClosure; 52816a5fed65808adf648004b34f98718301d718fa2darylm 52916a5fed65808adf648004b34f98718301d718fa2darylm 53016a5fed65808adf648004b34f98718301d718fa2darylmtypedef union Closure { 53116a5fed65808adf648004b34f98718301d718fa2darylm CClosure c; 53216a5fed65808adf648004b34f98718301d718fa2darylm LClosure l; 53316a5fed65808adf648004b34f98718301d718fa2darylm} Closure; 53416a5fed65808adf648004b34f98718301d718fa2darylm 53516a5fed65808adf648004b34f98718301d718fa2darylm 53616a5fed65808adf648004b34f98718301d718fa2darylm#define isLfunction(o) ttisLclosure(o) 53716a5fed65808adf648004b34f98718301d718fa2darylm 53816a5fed65808adf648004b34f98718301d718fa2darylm#define getproto(o) (clLvalue(o)->p) 53916a5fed65808adf648004b34f98718301d718fa2darylm 54016a5fed65808adf648004b34f98718301d718fa2darylm 54116a5fed65808adf648004b34f98718301d718fa2darylm/* 54216a5fed65808adf648004b34f98718301d718fa2darylm** Tables 54316a5fed65808adf648004b34f98718301d718fa2darylm*/ 54416a5fed65808adf648004b34f98718301d718fa2darylm 54516a5fed65808adf648004b34f98718301d718fa2darylmtypedef union TKey { 54616a5fed65808adf648004b34f98718301d718fa2darylm struct { 54716a5fed65808adf648004b34f98718301d718fa2darylm TValuefields; 54816a5fed65808adf648004b34f98718301d718fa2darylm struct Node *next; /* for chaining */ 54916a5fed65808adf648004b34f98718301d718fa2darylm } nk; 55016a5fed65808adf648004b34f98718301d718fa2darylm TValue tvk; 55116a5fed65808adf648004b34f98718301d718fa2darylm} TKey; 55216a5fed65808adf648004b34f98718301d718fa2darylm 55316a5fed65808adf648004b34f98718301d718fa2darylm 55416a5fed65808adf648004b34f98718301d718fa2darylmtypedef struct Node { 55516a5fed65808adf648004b34f98718301d718fa2darylm TValue i_val; 55616a5fed65808adf648004b34f98718301d718fa2darylm TKey i_key; 55716a5fed65808adf648004b34f98718301d718fa2darylm} Node; 55816a5fed65808adf648004b34f98718301d718fa2darylm 55916a5fed65808adf648004b34f98718301d718fa2darylm 56016a5fed65808adf648004b34f98718301d718fa2darylmtypedef struct Table { 56116a5fed65808adf648004b34f98718301d718fa2darylm CommonHeader; 56216a5fed65808adf648004b34f98718301d718fa2darylm lu_byte flags; /* 1<<p means tagmethod(p) is not present */ 56316a5fed65808adf648004b34f98718301d718fa2darylm lu_byte lsizenode; /* log2 of size of `node' array */ 56416a5fed65808adf648004b34f98718301d718fa2darylm struct Table *metatable; 56516a5fed65808adf648004b34f98718301d718fa2darylm TValue *array; /* array part */ 56616a5fed65808adf648004b34f98718301d718fa2darylm Node *node; 56716a5fed65808adf648004b34f98718301d718fa2darylm Node *lastfree; /* any free position is before this position */ 56816a5fed65808adf648004b34f98718301d718fa2darylm GCObject *gclist; 56916a5fed65808adf648004b34f98718301d718fa2darylm int sizearray; /* size of `array' array */ 57016a5fed65808adf648004b34f98718301d718fa2darylm} Table; 57116a5fed65808adf648004b34f98718301d718fa2darylm 57216a5fed65808adf648004b34f98718301d718fa2darylm 57316a5fed65808adf648004b34f98718301d718fa2darylm 57416a5fed65808adf648004b34f98718301d718fa2darylm/* 57516a5fed65808adf648004b34f98718301d718fa2darylm** `module' operation for hashing (size is always a power of 2) 57616a5fed65808adf648004b34f98718301d718fa2darylm*/ 57716a5fed65808adf648004b34f98718301d718fa2darylm#define lmod(s,size) \ 57816a5fed65808adf648004b34f98718301d718fa2darylm (check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1))))) 57916a5fed65808adf648004b34f98718301d718fa2darylm 58016a5fed65808adf648004b34f98718301d718fa2darylm 58116a5fed65808adf648004b34f98718301d718fa2darylm#define twoto(x) (1<<(x)) 58216a5fed65808adf648004b34f98718301d718fa2darylm#define sizenode(t) (twoto((t)->lsizenode)) 58316a5fed65808adf648004b34f98718301d718fa2darylm 58416a5fed65808adf648004b34f98718301d718fa2darylm 58516a5fed65808adf648004b34f98718301d718fa2darylm/* 58616a5fed65808adf648004b34f98718301d718fa2darylm** (address of) a fixed nil value 58716a5fed65808adf648004b34f98718301d718fa2darylm*/ 58816a5fed65808adf648004b34f98718301d718fa2darylm#define luaO_nilobject (&luaO_nilobject_) 58916a5fed65808adf648004b34f98718301d718fa2darylm 59016a5fed65808adf648004b34f98718301d718fa2darylm 59116a5fed65808adf648004b34f98718301d718fa2darylmLUAI_DDEC const TValue luaO_nilobject_; 59216a5fed65808adf648004b34f98718301d718fa2darylm 59316a5fed65808adf648004b34f98718301d718fa2darylm 59416a5fed65808adf648004b34f98718301d718fa2darylmLUAI_FUNC int luaO_int2fb (unsigned int x); 59516a5fed65808adf648004b34f98718301d718fa2darylmLUAI_FUNC int luaO_fb2int (int x); 59616a5fed65808adf648004b34f98718301d718fa2darylmLUAI_FUNC int luaO_ceillog2 (unsigned int x); 59716a5fed65808adf648004b34f98718301d718fa2darylmLUAI_FUNC lua_Number luaO_arith (int op, lua_Number v1, lua_Number v2); 59816a5fed65808adf648004b34f98718301d718fa2darylmLUAI_FUNC int luaO_str2d (const char *s, size_t len, lua_Number *result); 59916a5fed65808adf648004b34f98718301d718fa2darylmLUAI_FUNC int luaO_hexavalue (int c); 60016a5fed65808adf648004b34f98718301d718fa2darylmLUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, 60116a5fed65808adf648004b34f98718301d718fa2darylm va_list argp); 60216a5fed65808adf648004b34f98718301d718fa2darylmLUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); 60316a5fed65808adf648004b34f98718301d718fa2darylmLUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); 60416a5fed65808adf648004b34f98718301d718fa2darylm 60516a5fed65808adf648004b34f98718301d718fa2darylm 60616a5fed65808adf648004b34f98718301d718fa2darylm#endif 60716a5fed65808adf648004b34f98718301d718fa2darylm 608