Lua5.4源码阅读—数据类型
Posted xhjh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua5.4源码阅读—数据类型相关的知识,希望对你有一定的参考价值。
Lua数据类型
基础的数据类型宏定义:
#define LUA_TNONE (-1) //无效类型
#define LUA_TNIL 0 //空类型
#define LUA_TBOOLEAN 1 //布尔
#define LUA_TLIGHTUSERDATA 2 //指针(lua外部管理内存)
#define LUA_TNUMBER 3 //数据
#define LUA_TSTRING 4 //字符串,这和后面的类型都需要GC,这些类型最开始都会有一个CommonHeader宏定义的成员
#define LUA_TTABLE 5 //表
#define LUA_TFUNCTION 6 //函数
#define LUA_TUSERDATA 7 //指针
#define LUA_TTHREAD 8 //lua虚拟机、协程
#define LUA_NUMTYPES 9 //类型数量
Lua内部通过一个宏表示哪些数据需要GC,老版本是通过数据类型是否大于等于LUA_TSTRING来判断,当前版本为Lua5.4.3则通过在类型中加入标志位的形式判断,例如:
//类型字段中的标志位
#define BIT_ISCOLLECTABLE (1 << 6)
#define iscollectable(o) (rawtt(o) & BIT_ISCOLLECTABLE)
需要进行GC的数据类型的结构体中最开始都会有一个CommonHeader宏定义的成员:
//next:指向下一个GC对象,tt:数据类型,marked:GC标志位
#define CommonHeader struct GCObject *next; lu_byte tt; lu_byte marked
GCObject结构体的定义为只包含一个CommonHeader宏定义的成员:
typedef struct GCObject
CommonHeader;
GCObject;
通过定义一个GCUnion联合体将所有需要GC的数据类型包括起来:
union GCUnion
GCObject gc; /* common header */
struct TString ts;
struct Udata u;
union Closure cl;
struct Table h;
struct Proto p;
struct lua_State th; /* thread */
struct UpVal upv;
;
需要进行GC的数据类型,则需以CommonHeader作为结构体定义的最开始部分,例如C++类的实现原理,CommonHeader可以理解为一个基类的所有成员,而其他需要GC的数据类型均从这个基类继承。
表示所有数据的联合体Value:
typedef union Value
struct GCObject *gc; /* 回收对象 */
void *p; /* 指针 */
lua_CFunction f; /* C函数 */
lua_Integer i; /* 整数 */
lua_Number n; /* 浮点数 */
Value;
联合体Value和类型相结合则可以表示所有数据类型:
#define TValuefields Value value_; lu_byte tt_
typedef struct TValue
TValuefields;
TValue;
通用数据结构的组织如图:
以上是关于Lua5.4源码阅读—数据类型的主要内容,如果未能解决你的问题,请参考以下文章
JAVA——底层源码阅读——包装数据类型Integer.valueOf()自动装箱方法底层源码分析
JDK1.8源码阅读-java.lang.Object.java