【lua学习】2.数据类型

Lua中的数据类型

宏名 (见lua.h)宏值类型对应数据结构
LUA_TNONE-1无类型
LUA_TNIL0空类型
LUA_TBOOLEAN1布尔类型
LUA_TLIGHTUSERDATA2指针void*
LUA_TNUMBER3数字lua_Number
LUA_TSTRING4字符串TString
LUA_TTABLE5Table
LUA_TFUNCTION6函数CClosure,LClosure
LUA_TUSERDATA7指针void*
LUA_TTHREAD8lua虚拟机,协程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 4
	union Udata u;//LUA_TUSERDATA 7
	union Closure cl;//LUA_TFUNCTION 6
	struct Table h;//LUA_TTABLE 5
	struct 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值