Lua5.4源码阅读—数据类型(1)

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;

通用数据结构的组织如图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值