Lua源碼閱讀筆記,主要參考自《Lua設計與實現》。
源碼版本爲 5.1.4,下載地址:https://github.com/lichuang/Lua-5.1.4-codedump
CommonHeader
任何需要進行GC操作的Lua數據類型,都會有一個 CommonHeader宏定義的成員,且定義在結構體的最開始部分。CommonHeader類似於一個基類,需要GC處理的數據類型均繼承自這個基類,所以他們的結構體定義的開頭就是CommonHeader。
//lobject.h
#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked
其中,next
是指向下一個GC鏈表的成員,tt
表示數據類型、marked
爲GC相關的標誌位。
例如表數據類型 Table的定義:
//lobject.h
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;
GCheader
CommonHeader外面再包了一層GCheader
//lobject.h
typedef struct GCheader {
CommonHeader;
} GCheader;
GCObject 聯合體
GCObject 聯合體表示需要GC的數據類型,包含了所有需要進行垃圾回收的數據類型,方便查找不同類型的數據。
//lstate.h
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 */
};
Value聯合體
此外,還有不需要GC的類型。
再用Value聯合體包含了GCObject和其他不需要GC的數據類型。
//lobject.h
typedef union {
GCObject *gc;
void *p;
lua_Number n;
int b;
} Value;
TValuefields
TValuefields將Value和數據類型tt結合起來
//lobject.h
#define TValuefields Value value; int tt
TValue
TValuefields外面再包一層,最終形成TValue結構體,用於表示Lua中的任何數據。
/lobject.h
typedef struct lua_TValue {
TValuefields;
} TValue;
綜上,Lua通用數據結構的組織如圖所示
參考資料:《Lua設計與實現》