【lua学习】2.数据类型
- Lua中的数据类型
- 关于TValue自顶向下分析
- TValue表示所有的Lua数据结构并带一个类型字段
- Value表示所有的Lua数据结构
- GCObject表示所有需要进行垃圾回收的数据结构
- GCheader表示需要GC的数据结构最开始的部分
Lua中的数据类型
宏名 (见lua.h) | 宏值 | 类型 | 对应数据结构 |
---|---|---|---|
LUA_TNONE | -1 | 无类型 | 无 |
LUA_TNIL | 0 | 空类型 | 无 |
LUA_TBOOLEAN | 1 | 布尔类型 | 无 |
LUA_TLIGHTUSERDATA | 2 | 指针 | void* |
LUA_TNUMBER | 3 | 数字 | lua_Number |
LUA_TSTRING | 4 | 字符串 | TString |
LUA_TTABLE | 5 | 表 | Table |
LUA_TFUNCTION | 6 | 函数 | CClosure,LClosure |
LUA_TUSERDATA | 7 | 指针 | void* |
LUA_TTHREAD | 8 | lua虚拟机,协程 | lua_State |
关于TValue自顶向下分析
TValue表示所有的Lua数据结构并带一个类型字段
(lobject.h) TValue
typedef struct lua_TValue {TValuefields;
} TValue;
(lobject.h) TValuefields
//Value就是一个可以代表任何值类型的union
//上述宏定义中,tt表示类型,也就是上面表格列举的宏
#define TValuefields Value value;int tt
Value表示所有的Lua数据结构
(lobject.h) Value
typedef union {GCObject* gc;//存需要gc类型的值void* p;//存lightuserdata类型的值lua_Number n;//存数字类型的值int b;//存boolean类型的值
} Value;
GCObject表示所有需要进行垃圾回收的数据结构
(lstate.h) GCObject
union GCObject {GCHeader gch;//看下面定义union TString ts;//LUA_TSTRING 4union Udata u;//LUA_TUSERDATA 7union Closure cl;//LUA_TFUNCTION 6struct Table h;//LUA_TTABLE 5struct Proto p;struct UpVal uv;struct lua_State th;//LUA_TTHREAD 8
};
GCheader表示需要GC的数据结构最开始的部分
(lobject.h) GCheader
typedef struct GCheader {CommonHeader;//看下文
} GCheader;
(lobject.h) CommonHeader
//任何和需要进行垃圾回收的Lua对象,必然以CommonHeader为最开始的部分
//next 指向下一个GC链表的成员,todo 后面再说
//tt 表示的数据类型,也就是开始表格定义的宏
//marked GC相关的标记为,todo 后面再说
#define CommonHeader GCObject* next; lu_byte tt; lu_byte marked
(lobject.h) gcvalue宏 获取对象的gc部分
//check_exp看下文
//iscollectable看下文
#define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc))
(llimits.h) check_exp 条件成了才展开宏
//不判断c的条件,直接展开宏e
#define check_exp(c,e) (e)
(lobject.h) iscollectable
//判断一个对象是否需要GC,只需要获得其类型宏值>=字符串即可
#define iscollectable(o) (ttype(o)>=LUA_TSTRING)
//ttype看下文
(lobject.h) ttype
//看ttype
//获取一个对象的类型
#define ttype(o) ((o)->tt)