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.

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