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源码阅读—数据类型的主要内容,如果未能解决你的问题,请参考以下文章

Lua5.4源码阅读—表

JAVA——底层源码阅读——包装数据类型Integer.valueOf()自动装箱方法底层源码分析

JDK1.8源码阅读-java.lang.Object.java

JDK源码阅读-StringStringBuilderStringBuffer

Mono源码阅读-GC造成内存泄露问题

MNN源码阅读--Tensor数据结构解析和运行示例