首页 > 代码库 > Lua1.1 数据结构

Lua1.1 数据结构

分析一下 lua 中常用的几个数据结构:
先看一下 opcode.h 中的:

typedef unsigned char Byte;
typedef unsigned short Word;
typedef union
{
 struct {char c1; char c2;} m;
 Word w;
} CodeWord;
typedef union
{
 struct {char c1; char c2; char c3; char c4;} m;
 float f;
} CodeFloat;

这两个 union 类型主要是用来做虚拟机指令用的。
lua1.1 中虚拟机的指令是一个字节,当要保存的数是一个 Word 或者 float 时,以 Word 为例,可以直接给 CodeWord 类型的 w 赋值,之后,用 CodeWord 的结构体 m 的两个字段来生成指令并存入指令数组中。
如下的 code_word 方法的实现可以看出这个结构是如何使用的

static void code_word (Word n)
{
 CodeWord code;
 code.w = n;
 code_byte(code.m.c1);
 code_byte(code.m.c2);
}

OpCode 枚举是 lua1.1 虚拟机所支持的所有指令。

Type 枚举是 lua 中的几种数据类型。

typedef enum
{
 T_MARK,
 T_NIL,
 T_NUMBER,
 T_STRING,
 T_ARRAY,
 T_FUNCTION,
 T_CFUNCTION,
 T_USERDATA
} Type;

Value 联合体是 lua 的数据定义。

typedef union
{
 Cfunction f;
 real n;
 char *s;
 Byte *b;
 struct Hash *a;
 void *u;
} Value;

Object 带标签的数据类型,其中 tag 字段表示 Object 的类型,Value 是 Object 的值。

typedef struct Object
{
 Type tag;
 Value value;
} Object;

Symbol 符号,name 符号的名字,object 符号的值,它是一个 Object 类型。

typedef struct
{
 char *name;
 Object object;
} Symbol;
struct List
{
 Symbol *s;
 struct List *next;
};

符号表就是一个符号数组,next 主要用于在 searchlist 中用于查找。

hash.h 中定义了关联数组,也就是 lua 里的 table 类型。

// table 中的无素

typedef struct node
{
 Object ref; // 元素的 key
 Object val; // 元素的 value
 struct node *next; // 指向下一个元素的指针。
} Node;

// table 定义

typedef struct Hash
{
 char mark;
 unsigned int nhash;
 Node **list;
} Hash;

其中:
mark 在垃圾回收时的标记
nhash table 中的元素个数
list 元素的列表

Lua1.1 数据结构