Lua是一个弱类型语言,类型可以在使用的时候变化。对应在源码中,TVable就充当了这个角色,lua中的所有数据类型都可以放在这个结构中。TValue是实现Lua数据类型的主要结构,不仅在脚本中使用了TValue,其他的一些数据结构也依赖于它。首先看看Lua的整个数据类型(lua.h)
#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 //(自定义的用户数据结构,有Light和Heavy两种,后者由Lua来分配管理,用GC)
#define LUA_TTHREAD 8 //(线程,CoRoutine)
#define LUA_NUMTAGS 9
从这里可以看出lua中有9中数据类型,其中有8种是和脚本中对应的,现在来看看TValue这个结构。
#define TValuefields Value value_; int tt_ ①
...
#undef TValuefields
...
/* little endian */
#define TValuefields \
union { struct { Value v__; int tt__; } i; double d__; } u ②
...