由于lua版本迭代之间,数据结构和函数都会部分变化
以下是我分析的lua.h中的信息,以便确定版本
#define LUA_VERSION_MAJOR "5"#define LUA_VERSION_MINOR "3"#define LUA_VERSION_NUM 503#define LUA_VERSION_RELEASE "3"
#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked/*** Union of all collectable objects (only for conversions)*/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 */};
主要位于lobject.h中,部分位于lstate.h
以下和机器有关,比如在32位(64位)机器
#define LUA_INT32 int#define LUAI_UMEM size_t#define LUAI_MEM ptrdiff_t
以下通用定义
#define LUA_NUMBER_DOUBLE#define LUA_NUMBER doubletypedef unsigned char lu_byte;typedef TValue *StkId; /* index to stack elements */typedef struct lua_TValue TValue;typedef int (*lua_CFunction) (lua_State *L);typedef unsigned LUA_INT32 lu_int32;typedef LUAI_UMEM lu_mem;typedef LUAI_MEM l_mem;typedef lu_int32 Instruction;
保存lua数据的结构lua_TValue
lua_TValue 位于lobject.h
//保存值和类型#define TValuefields Value value_; int tt_struct lua_TValue {TValuefields;};
/*** Union of all Lua values*/typedef union Value {GCObject *gc; /* collectable objects */void *p; /* light userdata */int b; /* booleans */lua_CFunction f; /* light C functions 函数指针*/lua_Integer i; /* integer numbers */lua_Number n; /* float numbers 默认为double*/} Value;
#define CommonHeader GCObject *next; lu_byte tt; lu_byte markedstruct GCObject {CommonHeader;};
/*** Header for userdata; memory area follows the end of this structure** (aligned according to 'UUdata'; see next).*/typedef struct Udata {CommonHeader;lu_byte ttuv_; /* user value's tag */struct Table *metatable;size_t len; /* number of bytes */union Value user_; /* user value */} Udata;/*** Ensures that address after this type is always fully aligned.*/typedef union UUdata {L_Umaxalign dummy; /* ensures maximum alignment for 'local' udata */Udata uv;} UUdata;
string
/*** Header for string value; string bytes follow the end of this structure** (aligned according to 'UTString'; see next).*/typedef struct TString {CommonHeader;lu_byte extra; /* reserved words for short strings; "has hash" for longs */lu_byte shrlen; /* length for short strings */unsigned int hash;union {size_t lnglen; /* length for long strings */struct TString *hnext; /* linked list for hash table */} u;} TString;/*** Ensures that address after this type is always fully aligned.*/typedef union UTString {L_Umaxalign dummy; /* ensures maximum alignment for strings */TString tsv;} UTString;
//闭包相关#define ClosureHeader CommonHeader; lu_byte nupvalues; GCObject *gclisttypedef struct CClosure {ClosureHeader;lua_CFunction f;TValue upvalue[1]; /* list of upvalues */} CClosure;typedef struct LClosure {ClosureHeader;struct Proto *p;UpVal *upvals[1]; /* list of upvalues */} LClosure;typedef union Closure {CClosure c;LClosure l;} Closure;
//表相关typedef union TKey {struct {TValuefields;struct Node *next; /* for chaining */} nk;TValue tvk;} TKey;typedef struct Node {TValue i_val;TKey i_key;} Node;typedef struct Table {CommonHeader;lu_byte flags; /* 1<<p means tagmethod(p) is not present */lu_byte lsizenode; /* log2 of size of `node' array */int sizearray; /* size of `array' array */TValue *array; /* array part */Node *node;Node *lastfree; /* any free position is before this position */struct Table *metatable;GCObject *gclist;} Table;
/*
** Description of an upvalue for function prototypes
*/
typedef struct Upvaldesc {
TString *name; /* upvalue name (for debug information) */
lu_byte instack; /* whether it is in stack */
lu_byte idx; /* index of upvalue (in stack or in outer function's list) */
} Upvaldesc;
/*
** Description of a local variable for function prototypes
** (used for debug information)
*/
typedef struct LocVar {
TString *varname;
int startpc; /* first point where variable is active */
int endpc; /* first point where variable is dead */
} LocVar;
/*
** Function Prototypes
*/
typedef struct Proto {
CommonHeader;
TValue *k; /* constants used by the function */
Instruction *code;
struct Proto **p; /* functions defined inside the function */
int *lineinfo; /* map from opcodes to source lines (debug information) */
LocVar *locvars; /* information about local variables (debug information) */
Upvaldesc *upvalues; /* upvalue information */
union Closure *cache; /* last created closure with this prototype */
TString *source; /* used for debug information */
int sizeupvalues; /* size of 'upvalues' */
int sizek; /* size of `k' */
int sizecode;
int sizelineinfo;
int sizep; /* size of `p' */
int sizelocvars;
int linedefined;
int lastlinedefined;
GCObject *gclist;
lu_byte numparams; /* number of fixed parameters */
lu_byte is_vararg;
lu_byte maxstacksize; /* maximum stack used by this function */
} Proto;
//上值
typedef struct UpVal {
CommonHeader;
TValue *v; /* points to stack or to its own value */
union {
TValue value; /* the value (when closed) */
struct { /* double linked list (when open) */
struct UpVal *prev;
struct UpVal *next;
} l;
} u;
} UpVal;
