其实,我是觉得更重要的是 lobject.h
这个文件包含了不少结构的定义,这个才是最重要的。而lobject.c
这个文件的话,我感觉是主要是把一些字面量或者语法分析出来的东西转成统一的结构。
这部分是一些 extra tag 和 variant tag 的定义,而基本的 Tag 的定义是在 lua.h#62
里面。
这一部分就是对 TValue 的定义,总得来说,就是这样(这里的语法肯定是不对的,我只是搬到一起做一下嵌套):
typedef struct lua_TValue {
typedef union Value { ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯⎤
struct GCObject { |
GCObject *next; ¯¯⎤ |
lu_byte tt; CommonHeader macro |
lu_byte marked; __⎦ |
} *gc; /* collectable objects */ |
void *p; /* light userdata */ TValuefields macro
int b; /* booleans */ |
lua_CFunction f; /* light C functions */ |
lua_Integer i; /* integer numbers */ |
lua_Number n; /* float numbers */ |
} Value value_; |
int tt_ _______________________________________⎦
} TValue;
从 NILCONSTANT
那部分可以看出 tt_
存的就是之前定义的 tag。
这些定义了一些宏,用于 check type,access values,internal tests,set values,different types of assignments, according to destination。我把这些当作针对不同类型的处理的宏。留意一个地方,有些宏类似 gco2ts
这些是将 GCObject 转成不同类型是在lstate.h
里面定义的:
在 GCUnion
里面的 TString
,Udata
,Closure
, Table
, Proto
, lua_State
结构体都在最前面是用了 CommonHeader
,所以可以 union GCObject
。
这里就是定义了一些在 GCUnion
存的结构和一些使用的宏。
这些是会在 lobject.c
定义的函数。
这两个是一对的函数,用处我还没看出来,现在是在 lparser.c
跟 lvm.c
里面分别引用。
这个函数的作用就是 Computes ceil(log2(x))。
这个三个是做数学运算的。
luaO_hexavalue
将字符的 ‘0’~’9’ 和 ‘a’~’f’ 的值转成十六进制的值
luaO_str2num
方法将类似 2
, 2.1
的字符串转成 lua_Integer,lua_Number。
utf8esc
暂时没弄明白怎么调用到,这里的函数基本就是跟 string.format
相关了。va_list
这个新东西,C 用来解决变参的。
luaO_chunkid
方法在 ldebug.c
中被调用,到时再看了。