您的位置:首页 > 编程语言 > Lua

(1) Lua源码系列----数据类型的源码

2018-01-03 10:46 375 查看

Lua的数据类型

说明:Lua版本 5.3.4

如果让自己利用C去实现Lua的数据类型,你会怎么做?

1. C语言实现的两种常见方法

1.1. 方法①

各个数据独立,比如在lighttpd1.4.47中,字符串和整数的定义抽象如下:

typedef struct
{
int type;  //数据类型

char* str;
... //其他内容
} data_string; //字符串

typedef struct
{
int type;
int integer;
... //其他内容
}data_integer;


1.2 方法②

还有一种将所有数据类型用union组织起来的方式,比如

typedef struct
{
int type;
union {
char *str;
int integer;
}v;
}value;


2. Lua中的实现

Lua将所有的数据类型都通过通用数据类型表示,所以整体结构上和方法②相似。

下面先说一下Lua的数据类型。

lua的数据类型可以分为两大类,需要GC的和非GC的。

类型对应数据结构
LUA_TNONE -1
LUA_TNIL 0空类型
LUA_TBOOLEAN 1布尔
LUA_TLIGHTUSERDATA 2指针void*
LUA_TNUMBER 3数据lua_Number
LUA_TSTRING 4字符串TString
LUA_TTABLE 5Table
LUA_TFUNCTION 6函数CClosure、LClosure
LUA_TUSERDATA 7指针void*
LUA_TTHREAD 8Lua虚拟机、协程lua_State
参考资料: lua 5.3.4, 《lua设计与实现》,codedump 著。

2.1 GC 数据类型

typedef struct GCObject GCObject;

#define CommonHeader GCOjbect *next; lu_byte tt; lu_byte marked

struct GCObject {
CommonHeader;
}


2.2 通用数据

/*lua 通用数据 */
typedef union Value {
GCObject *gc;        /* collectable objects 指向 TString, Table等 */
void *p;             /* light userdata */
int b;               /* booleans */
l
8b37
ua_CFunction f;     /* light C functons */
lua_Integer i;       /* integer numbers */
lua_Number n;        /* float numbers */
} Value;

#define TValuefields Value value_; int tt_

typedef struct lua_TValue {
TValuefields;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: