《lua设计与实现》第2章 Lua中的数据类型

//主要有以下几种数据类型
//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;

 

原文地址:https://www.cnblogs.com/yyqng/p/14289412.html