LUA TValue
//其形式如下:
typedef struct TValue {
Value value_; //raw value
lu_byte tt_; //raw type tag
} TValue;
//其Value为LUA所支持的基本类型的union形式
typedef union Value {
struct GCObject *gc;
void *p;
lua_CFunction f;
lua_Integer i;
lua_Number n;
} Value;
// lu_byte tt_ 即 unsigned char tt_ 为变量类型
因此ttisinteger(o) 等价于 o->tt_ == 3 ? true : false
union结构体中各项的具体意义为:
变量 | 说明 |
---|---|
GCObject gch | 用于垃圾回收 主要是为了连接垃圾回收对象的互相引用关系 |
void *p | 为c中传入的指针,由c 分配和释放 |
lua_CFunction f | 表示C导出给lua的函数指针,typedef int (*lua_CFunction) (lua_State *L); |
lua_Integer i | 表示整数类型,typedef long long lua_Integer; |
lua_Number n | 表示双精度浮点类型,typedef double lua_Number; |
从网络上找到的一个TValue结构图见下:
图示与代码已经有了一些可见变化,可见lua 5.3 版本相较于图示结构已经有了一些修改,比如取消了原本使用int类型存贮bool值的b,将原本存储所有数值类型的double n拆为存储整数的lua_Integer的i和存储双精度浮点数的n
其中GCObject gch的结构,如下:
typedef struct GCObject {
struct GCObject *next;
unsigned char tt;
unsigned char marked;
} GCObject;
next指向下一个链表结构,tt表示类型,marked是垃圾回收的标记,具体LUA 5.3 垃圾回收机制见:LUA 5.3 垃圾回收机制.(重要不紧急)