掌握Lua的基本数据类型:入门必备基础
三、Lua 通用数据结构的实现Lua 内部用一个宏表示哪些数据类型需要进行GC ( Garbage Collection ,垃圾回收)操作:(lobject.h)展开代码语言:C自动换行
AI代码解释
/* Bit mark for collectable types */#define BIT_ISCOLLECTABLE (1 << 6)/* raw type tag of a TValue */#define rttype(o) ((o)->tt_)#define iscollectable(o) (rttype(o) & BIT_ISCOLLECTABLE)
LUA_TSTRING (包括LUA_TSTRING )之后的数据类型都需要进行GC操作。这些需要进行GC操作的数据类型都会有一个Common Header宏定义的成员,并且这个成员在结构体定义的最开始部分。(lobject.h)展开代码语言:C
自动换行
AI代码解释
/*** Header for string value; string bytes follow the end of this structure** (aligned according to 'UTString'; see next).*/typedef struct TString {CommonHeader;lu_byte extra;/* reserved words for short strings; "has hash" for longs */lu_byte shrlen;/* length for short strings */unsigned int hash;union { size_t lnglen;/* length for long strings */ struct TString *hnext;/* linked list for hash table */} u;} TString;
(lobject.h)代码语言:C
自动换行
AI代码解释
/*** Common Header for all collectable objects (in macro form, to be** included in other objects)*/#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked
CommonHeader里面的几个成员定义如下:
[*]next :指向下 GC链表的成员。
[*]tt:表示数据的类型,即前面的那些表示数据类型的宏。
[*]marked GC相关的标记位。
同时,还有 个名为GCheader 的结构体,其中的成员只有Common eader:(lobject.h)代码语言:C
自动换行
AI代码解释
/*** Common type has only the common header*/struct GCObject {CommonHeader;};
在Lua 中就使用了GCUnion 联合体将所有需要进行垃圾回收的数据类型囊括了进来:(lstate.h)展开代码语言:C
自动换行
AI代码解释
/*** Union of all collectable objects (only for conversions)*/union GCUnion {GCObject gc;/* common header */struct TString ts;struct Udata u;union Closure cl;struct Table h;struct Proto p;struct lua_State th;/* thread */};
仅表示需要进行垃圾回收的数据类型还不够,还有几种数据类型是不需要进行垃圾回收的,中将GCObject 和它们 起放在了联合体Value 中:(lobject.h)展开代码语言:C
自动换行
AI代码解释
/*** Union of all Lua values*/typedef union Value {GCObject *gc; /* collectable objects */void *p; /* light userdata */int b; /* booleans */lua_CFunction f; /* light C functions */lua_Integer i; /* integer numbers */lua_Number n; /* float numbers */} Value;
为了清楚数据到底是什么类型的,lua代码中又有了TValuefields ,它用于将Value 类型结合在一起:
(lobject.h)代码语言:C
自动换行
AI代码解释
#define TValuefields Value value_; int tt_
最后形成了Lua中的TValue结构体, Lua 中的任何数据都可以通过该结构体表示:
(lobject.h)代码语言:C
自动换行
AI代码解释
typedef struct lua_TValue {TValuefields;} TValue;
Lua通用数据结构的组织:
[*]具体类型中有Common Header 用来存放所有数据类型都通用的字段。
[*]TValue 作为统一表示所有数据的数据结构,内部使用了联合体Value 将所有数据都包起来。
在具体的代码中, TValue用于统一地表示数据,而一旦知道了具体的类型,就需要使用具体的类型了 因此,代码中有不少涉及TValue与具体类型之间转换的代码,其主要逻辑都是将TValue中的tt value 具体类型的数据进行转换。
(lobject.h)展开代码语言:C
自动换行
AI代码解释
/* Macros to set values */#define settt_(o,t) ((o)->tt_=(t))#define setfltvalue(obj,x) \{ TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMFLT); }#define chgfltvalue(obj,x) \{ TValue *io=(obj); lua_assert(ttisfloat(io)); val_(io).n=(x); }
页:
[1]