//主要有以下几种数据类型 //lua.h:72 #define LUA_TNONE (-1) // 无 #define LUA_TNIL 0 // 空 #define LUA_TBOOLEAN 1 // 布尔 #define LUA_TLIGHTUSERDATA 2 // 指针 void* 使用者管理 #define LUA_TNUMBER 3 // 数字 lua_Number #define LUA_TSTRING 4 // 字符串 TString #define LUA_TTABLE 5 // 表 Table #define LUA_TFUNCTION 6 // 函数 CClosure、LClosure #define LUA_TUSERDATA 7 // 指针 void* Lua内部管理 #define LUA_TTHREAD 8 // Lua虚拟机、协程 lua_state //lobject.h:189 //判断是否需要GC(Garbage Collection)操作 #define iscollectable(o) (ttype(o) >= LUA_TSTRING) //lobject.h:43 #define CommonHeader GCObject *next; lu_byte tt; lu_byte marked //lobject.h:338 //任何需要GC操作的数据类型都有 CommonHeader 这个部分,例如Table的定义 typedef struct Table { CommonHeader; lu_byte flags; /* 1<<p means tagmethod(p) is not present */ lu_byte lsizenode; /* log2 of size of `node' array */ struct Table *metatable; TValue *array; /* array part */ Node *node; Node *lastfree; /* any free position is before this position */ GCObject *gclist; int sizearray; /* size of `array' array */ } Table; //lobject.h:49 typedef struct GCheader { CommonHeader; } GCheader; //lstate.h:136 //GCObject 将所有需要进行垃圾回收的数据类型全部囊括其中 union GCObject { GCheader gch; union TString ts; union Udata u; union Closure cl; struct Table h; struct Proto p; struct UpVal uv; struct lua_State th; /* thread */ }; //lobject.h:59 //此外,还有几种数据类型是不需要进行垃圾回收的, //Lua 中将GCObject 和它们一起放在了联合体Value 中: typedef union { GCObject *gc; void *p; lua_Number n; int b; } Value; //至此,还还欠缺一点东西, 那就是数据的类型(int tt): //lobject.h:71 #define TValuefields Value value; int tt typedef struct lua_TValue { TValuefields; } TValue;