lua5.3数据结构

来源:互联网 发布:学校校园铃声软件 编辑:程序博客网 时间:2024/06/05 17:15

由于lua版本迭代之间,数据结构和函数都会部分变化
以下是我分析的lua.h中的信息,以便确定版本

#define LUA_VERSION_MAJOR   "5"#define LUA_VERSION_MINOR   "3"#define LUA_VERSION_NUM     503#define LUA_VERSION_RELEASE "3"
//看注释提示仅仅是为了类型转换,不知搞为啥要这样~,他们都有一个共同,首地址都是//深入的话还是多看看lua官网,论坛,了解下设计思想#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 marked

struct 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;

“`

0 0