Lua 源碼分析之TValue

Lua數據結構設計確定了這個整體的設計理念,Lua所有的數據,一共有9種,都是通過TValue這個結構來存儲。Lua的9種基礎的數據類型有(lua.h:73):

/*
** basic types
*/
#define LUA_TNONE        (-1)

#define LUA_TNIL        0
#define LUA_TBOOLEAN        1
#define LUA_TLIGHTUSERDATA    2
#define LUA_TNUMBER        3
#define LUA_TSTRING        4
#define LUA_TTABLE        5
#define LUA_TFUNCTION        6
#define LUA_TUSERDATA        7
#define LUA_TTHREAD        8

其中, LUA_TNONE表示不是任何的一種類型

TValue這個結構體,對應表達這9個類型是根據TValuefields來區分:

(lobject.h:107)

typedef struct lua_TValue TValue;

(lobject.h:400)

struct lua_TValue {
  TValuefields;
};

具體TValuefields的宏定義如下:
(lobject.h:105)

#define TValuefields    Value value_; int tt_

TValuefields有兩個字段:
Value:存儲具體數據的值
tt_:表示這個值的類型,即所有的基礎數據類型

在Value的結構裏面,一個結構裏分別用多個字段存儲具體的數據
(lobject.h:391)

union Value {
  GCObject *gc;    /* collectable objects */
  void *p;         /* light userdata */
  int b;           /* booleans */
  lua_CFunction f; /* light C functions */
  numfield         /* numbers */
};
GCObject *gc LUA_TSTRING、LUA_TUSERDATA、LUA_TTABLE、LUA_TTHREAD、LUA_TFUNCTION
void *p LUA_TLIGHTUSERDATA
int b LUA_TBOOLEAN
numfield LUA_TNUMBER

其中:void *p,int b,numfield都不會由GC機制回收,GCObject *gc代表需要由GC機制回收的字段;
由於有GC回收機制,名字比較相似的userdata和lightuserdata就有細微的區別,具體參考 Lua userdata和lightuserdata的區別

至此,Lua 的TValue大體設計就差不多這樣了,就是一個TValue用遍整個Lua.

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