Lua源碼閱讀(一):Lua數據類型

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設計與實現》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章