Lua TeamLua 5.3.0dcf748911 years agoHistory
540 lines · 13.6 KB · C
RawDownload
/*** $Id: lobject.h,v 2.106 2015/01/05 13:52:37 roberto Exp $** Type definitions for Lua objects** See Copyright Notice in lua.h*/  #ifndef lobject_h#define lobject_h  #include <stdarg.h>  #include "llimits.h"#include "lua.h"  /*** Extra tags for non-values*/#define LUA_TPROTO	LUA_NUMTAGS#define LUA_TDEADKEY	(LUA_NUMTAGS+1) /*** number of all possible tags (including LUA_TNONE but excluding DEADKEY)*/#define LUA_TOTALTAGS	(LUA_TPROTO + 2)  /*** tags for Tagged Values have the following use of bits:** bits 0-3: actual tag (a LUA_T* value)** bits 4-5: variant bits** bit 6: whether value is collectable*/ #define VARBITS		(3 << 4)  /*** LUA_TFUNCTION variants:** 0 - Lua function** 1 - light C function** 2 - regular C function (closure)*/ /* Variant tags for functions */#define LUA_TLCL	(LUA_TFUNCTION | (0 << 4))  /* Lua closure */#define LUA_TLCF	(LUA_TFUNCTION | (1 << 4))  /* light C function */#define LUA_TCCL	(LUA_TFUNCTION | (2 << 4))  /* C closure */  /* Variant tags for strings */#define LUA_TSHRSTR	(LUA_TSTRING | (0 << 4))  /* short strings */#define LUA_TLNGSTR	(LUA_TSTRING | (1 << 4))  /* long strings */  /* Variant tags for numbers */#define LUA_TNUMFLT	(LUA_TNUMBER | (0 << 4))  /* float numbers */#define LUA_TNUMINT	(LUA_TNUMBER | (1 << 4))  /* integer numbers */  /* Bit mark for collectable types */#define BIT_ISCOLLECTABLE	(1 << 6) /* mark a tag as collectable */#define ctb(t)			((t) | BIT_ISCOLLECTABLE)  /*** Common type for all collectable objects*/typedef struct GCObject GCObject;  /*** Common Header for all collectable objects (in macro form, to be** included in other objects)*/#define CommonHeader	GCObject *next; lu_byte tt; lu_byte marked  /*** Common type has only the common header*/struct GCObject {  CommonHeader;};   /*** Union of all Lua values*/typedef union Value Value;    /*** Tagged Values. This is the basic representation of values in Lua,** an actual value plus a tag with its type.*/ #define TValuefields	Value value_; int tt_ typedef struct lua_TValue TValue;  /* macro defining a nil value */#define NILCONSTANT	{NULL}, LUA_TNIL  #define val_(o)		((o)->value_)  /* raw type tag of a TValue */#define rttype(o)	((o)->tt_) /* tag with no variants (bits 0-3) */#define novariant(x)	((x) & 0x0F) /* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */#define ttype(o)	(rttype(o) & 0x3F) /* type tag of a TValue with no variants (bits 0-3) */#define ttnov(o)	(novariant(rttype(o)))  /* Macros to test type */#define checktag(o,t)		(rttype(o) == (t))#define checktype(o,t)		(ttnov(o) == (t))#define ttisnumber(o)		checktype((o), LUA_TNUMBER)#define ttisfloat(o)		checktag((o), LUA_TNUMFLT)#define ttisinteger(o)		checktag((o), LUA_TNUMINT)#define ttisnil(o)		checktag((o), LUA_TNIL)#define ttisboolean(o)		checktag((o), LUA_TBOOLEAN)#define ttislightuserdata(o)	checktag((o), LUA_TLIGHTUSERDATA)#define ttisstring(o)		checktype((o), LUA_TSTRING)#define ttisshrstring(o)	checktag((o), ctb(LUA_TSHRSTR))#define ttislngstring(o)	checktag((o), ctb(LUA_TLNGSTR))#define ttistable(o)		checktag((o), ctb(LUA_TTABLE))#define ttisfunction(o)		checktype(o, LUA_TFUNCTION)#define ttisclosure(o)		((rttype(o) & 0x1F) == LUA_TFUNCTION)#define ttisCclosure(o)		checktag((o), ctb(LUA_TCCL))#define ttisLclosure(o)		checktag((o), ctb(LUA_TLCL))#define ttislcf(o)		checktag((o), LUA_TLCF)#define ttisfulluserdata(o)	checktag((o), ctb(LUA_TUSERDATA))#define ttisthread(o)		checktag((o), ctb(LUA_TTHREAD))#define ttisdeadkey(o)		checktag((o), LUA_TDEADKEY)  /* Macros to access values */#define ivalue(o)	check_exp(ttisinteger(o), val_(o).i)#define fltvalue(o)	check_exp(ttisfloat(o), val_(o).n)#define nvalue(o)	check_exp(ttisnumber(o), \	(ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o)))#define gcvalue(o)	check_exp(iscollectable(o), val_(o).gc)#define pvalue(o)	check_exp(ttislightuserdata(o), val_(o).p)#define tsvalue(o)	check_exp(ttisstring(o), gco2ts(val_(o).gc))#define uvalue(o)	check_exp(ttisfulluserdata(o), gco2u(val_(o).gc))#define clvalue(o)	check_exp(ttisclosure(o), gco2cl(val_(o).gc))#define clLvalue(o)	check_exp(ttisLclosure(o), gco2lcl(val_(o).gc))#define clCvalue(o)	check_exp(ttisCclosure(o), gco2ccl(val_(o).gc))#define fvalue(o)	check_exp(ttislcf(o), val_(o).f)#define hvalue(o)	check_exp(ttistable(o), gco2t(val_(o).gc))#define bvalue(o)	check_exp(ttisboolean(o), val_(o).b)#define thvalue(o)	check_exp(ttisthread(o), gco2th(val_(o).gc))/* a dead value may get the 'gc' field, but cannot access its contents */#define deadvalue(o)	check_exp(ttisdeadkey(o), cast(void *, val_(o).gc)) #define l_isfalse(o)	(ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))  #define iscollectable(o)	(rttype(o) & BIT_ISCOLLECTABLE)  /* Macros for internal tests */#define righttt(obj)		(ttype(obj) == gcvalue(obj)->tt) #define checkliveness(g,obj) \	lua_longassert(!iscollectable(obj) || \			(righttt(obj) && !isdead(g,gcvalue(obj))))  /* Macros to set values */#define settt_(o,t)	((o)->tt_=(t)) #define setfltvalue(obj,x) \  { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMFLT); } #define setivalue(obj,x) \  { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_TNUMINT); } #define setnilvalue(obj) settt_(obj, LUA_TNIL) #define setfvalue(obj,x) \  { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); } #define setpvalue(obj,x) \  { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); } #define setbvalue(obj,x) \  { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); } #define setgcovalue(L,obj,x) \  { TValue *io = (obj); GCObject *i_g=(x); \    val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); } #define setsvalue(L,obj,x) \  { TValue *io = (obj); TString *x_ = (x); \    val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \    checkliveness(G(L),io); } #define setuvalue(L,obj,x) \  { TValue *io = (obj); Udata *x_ = (x); \    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TUSERDATA)); \    checkliveness(G(L),io); } #define setthvalue(L,obj,x) \  { TValue *io = (obj); lua_State *x_ = (x); \    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTHREAD)); \    checkliveness(G(L),io); } #define setclLvalue(L,obj,x) \  { TValue *io = (obj); LClosure *x_ = (x); \    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TLCL)); \    checkliveness(G(L),io); } #define setclCvalue(L,obj,x) \  { TValue *io = (obj); CClosure *x_ = (x); \    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TCCL)); \    checkliveness(G(L),io); } #define sethvalue(L,obj,x) \  { TValue *io = (obj); Table *x_ = (x); \    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTABLE)); \    checkliveness(G(L),io); } #define setdeadvalue(obj)	settt_(obj, LUA_TDEADKEY)   #define setobj(L,obj1,obj2) \	{ TValue *io1=(obj1); *io1 = *(obj2); \	  (void)L; checkliveness(G(L),io1); }  /*** different types of assignments, according to destination*/ /* from stack to (same) stack */#define setobjs2s	setobj/* to stack (not from same stack) */#define setobj2s	setobj#define setsvalue2s	setsvalue#define sethvalue2s	sethvalue#define setptvalue2s	setptvalue/* from table to same table */#define setobjt2t	setobj/* to table */#define setobj2t	setobj/* to new object */#define setobj2n	setobj#define setsvalue2n	setsvalue    /*** {======================================================** types and prototypes** =======================================================*/  union Value {  GCObject *gc;    /* collectable objects */  void *p;         /* light userdata */  int b;           /* booleans */  lua_CFunction f; /* light C functions */  lua_Integer i;   /* integer numbers */  lua_Number n;    /* float numbers */};  struct lua_TValue {  TValuefields;};  typedef TValue *StkId;  /* index to stack elements */    /*** Header for string value; string bytes follow the end of this structure** (aligned according to 'UTString'; see next).*/typedef struct TString {  CommonHeader;  lu_byte extra;  /* reserved words for short strings; "has hash" for longs */  unsigned int hash;  size_t len;  /* number of characters in string */  struct TString *hnext;  /* linked list for hash table */} TString;  /*** Ensures that address after this type is always fully aligned.*/typedef union UTString {  L_Umaxalign dummy;  /* ensures maximum alignment for strings */  TString tsv;} UTString;  /*** Get the actual string (array of bytes) from a 'TString'.** (Access to 'extra' ensures that value is really a 'TString'.)*/#define getaddrstr(ts)	(cast(char *, (ts)) + sizeof(UTString))#define getstr(ts)  \  check_exp(sizeof((ts)->extra), cast(const char*, getaddrstr(ts))) /* get the actual string (array of bytes) from a Lua value */#define svalue(o)       getstr(tsvalue(o))  /*** Header for userdata; memory area follows the end of this structure** (aligned according to 'UUdata'; see next).*/typedef struct Udata {  CommonHeader;  lu_byte ttuv_;  /* user value's tag */  struct Table *metatable;  size_t len;  /* number of bytes */  union Value user_;  /* user value */} Udata;  /*** Ensures that address after this type is always fully aligned.*/typedef union UUdata {  L_Umaxalign dummy;  /* ensures maximum alignment for 'local' udata */  Udata uv;} UUdata;  /***  Get the address of memory block inside 'Udata'.** (Access to 'ttuv_' ensures that value is really a 'Udata'.)*/#define getudatamem(u)  \  check_exp(sizeof((u)->ttuv_), (cast(char*, (u)) + sizeof(UUdata))) #define setuservalue(L,u,o) \	{ const TValue *io=(o); Udata *iu = (u); \	  iu->user_ = io->value_; iu->ttuv_ = io->tt_; \	  checkliveness(G(L),io); }  #define getuservalue(L,u,o) \	{ TValue *io=(o); const Udata *iu = (u); \	  io->value_ = iu->user_; io->tt_ = iu->ttuv_; \	  checkliveness(G(L),io); }  /*** Description of an upvalue for function prototypes*/typedef struct Upvaldesc {  TString *name;  /* upvalue name (for debug information) */  lu_byte instack;  /* whether it is in stack */  lu_byte idx;  /* index of upvalue (in stack or in outer function's list) */} Upvaldesc;  /*** Description of a local variable for function prototypes** (used for debug information)*/typedef struct LocVar {  TString *varname;  int startpc;  /* first point where variable is active */  int endpc;    /* first point where variable is dead */} LocVar;  /*** Function Prototypes*/typedef struct Proto {  CommonHeader;  lu_byte numparams;  /* number of fixed parameters */  lu_byte is_vararg;  lu_byte maxstacksize;  /* maximum stack used by this function */  int sizeupvalues;  /* size of 'upvalues' */  int sizek;  /* size of 'k' */  int sizecode;  int sizelineinfo;  int sizep;  /* size of 'p' */  int sizelocvars;  int linedefined;  int lastlinedefined;  TValue *k;  /* constants used by the function */  Instruction *code;  struct Proto **p;  /* functions defined inside the function */  int *lineinfo;  /* map from opcodes to source lines (debug information) */  LocVar *locvars;  /* information about local variables (debug information) */  Upvaldesc *upvalues;  /* upvalue information */  struct LClosure *cache;  /* last created closure with this prototype */  TString  *source;  /* used for debug information */  GCObject *gclist;} Proto;   /*** Lua Upvalues*/typedef struct UpVal UpVal;  /*** Closures*/ #define ClosureHeader \	CommonHeader; lu_byte nupvalues; GCObject *gclist typedef struct CClosure {  ClosureHeader;  lua_CFunction f;  TValue upvalue[1];  /* list of upvalues */} CClosure;  typedef struct LClosure {  ClosureHeader;  struct Proto *p;  UpVal *upvals[1];  /* list of upvalues */} LClosure;  typedef union Closure {  CClosure c;  LClosure l;} Closure;  #define isLfunction(o)	ttisLclosure(o) #define getproto(o)	(clLvalue(o)->p)  /*** Tables*/ typedef union TKey {  struct {    TValuefields;    int next;  /* for chaining (offset for next node) */  } nk;  TValue tvk;} TKey;  /* copy a value into a key without messing up field 'next' */#define setnodekey(L,key,obj) \	{ TKey *k_=(key); const TValue *io_=(obj); \	  k_->nk.value_ = io_->value_; k_->nk.tt_ = io_->tt_; \	  (void)L; checkliveness(G(L),io_); }  typedef struct Node {  TValue i_val;  TKey i_key;} Node;  typedef struct Table {  CommonHeader;  lu_byte flags;  /* 1<<p means tagmethod(p) is not present */  lu_byte lsizenode;  /* log2 of size of 'node' array */  unsigned int sizearray;  /* size of 'array' array */  TValue *array;  /* array part */  Node *node;  Node *lastfree;  /* any free position is before this position */  struct Table *metatable;  GCObject *gclist;} Table;  

Lines 1–500 of 540.