关于Lua数据类型源代码分析

移动开发 iOS
关于Lua数据类型源代码分析是本文要介绍的内容,主要是来了解lua源代码的分析理解,具体内容的实现来看本文详解。

关于Lua数据类型源代码分析是本文要介绍的内容,主要是来了解lua源代码的分析理解,具体内容的实现来看本文详解。

Lua语言是不用声明变量的类型的,而且是类型可变的,如下面的语句:

  1. local a = 1;  
  2. a = “hello”; 

开始是a的类型是number,当复制为字符串时,类型改为string,可以通过type(a)查看。那么它是怎么做到的呢?参见如下的TValue定义:

  1. typedef struct lua_TValue { // lobject.h, line 73  
  2.   TValuefields;  
  3. } TValue;  
  4. #define TValuefields       Value value; int tt // lobject.h, line 71  
  5. typedef union { // lobject.h, line 59  
  6.   GCObject *gc;  
  7.   void *p;  
  8.   lua_Number n;  
  9.   int b;  
  10. } Value;  
  11. typedef LUA_NUMBER lua_Number; // lua.h, line 100  
  12. #define LUA_NUMBER  double // luaconf.h, line 505 

Lua中所有的类型都定义为TValue类型。tt表示类型,定义参见:

  1. #define LUA_TNONE           (-1) // lua.h, line 73  
  2. #define LUA_TNIL        0  
  3. #define LUA_TBOOLEAN            1  
  4. #define LUA_TLIGHTUSERDATA       2 // light userdata  
  5. #define LUA_TNUMBER             3  
  6. #define LUA_TSTRING        4  
  7. #define LUA_TTABLE          5  
  8. #define LUA_TFUNCTION          6  
  9. #define LUA_TUSERDATA          7  
  10. #define LUA_TTHREAD              8 

上面的定义中,除了8种基本的数据类型之外,还包括未知类型和light userdata,light userdata表示仅仅在lua中保存了userdata的指针,占用的内存不归lua管。Value代表变量的具体值,b表示整形,n表示浮点型;gc表示可以用于垃圾回收的对象的指针;当gc取gch值时,p应该是lua对象的指针,否则有可能只想TValue本身。其中相关的定义如下:

  1. union GCObject { // lstate.h, line 136  
  2.   GCheader gch;  
  3.   union TString ts;  
  4.   union Udata u;  
  5.   union Closure cl;  
  6.   struct Table h;  
  7.   struct Proto p;  
  8.   struct UpVal uv;  
  9.   struct lua_State th;  /* thread */  
  10. };  
  11. typedef struct GCheader { // lobject.h, line 49  
  12.   CommonHeader;  
  13. } GCheader;  
  14.  
  15. #define CommonHeader GCObject *next; lu_byte tt; lu_byte marked // lobject.h, line 43 

GCObject定义中,gch用于垃圾回收;ts表示用于字符串表的类型;u表示userdata;cl表示闭合函数;h表示表;p表示函数;uv表示upvalue;th表示线程,每一个lua_State相当于一个线程;具体的定义及注释如下:

  1. TString  
  2. typedef union TString { // lobject.h, line 200  
  3.   L_Umaxalign dummy;  /* ensures maximum alignment for strings */// 对齐用  
  4.   struct {  
  5.     CommonHeader;  
  6.     lu_byte reserved;  
  7.     unsigned int hash;  
  8.     size_t len;  
  9.   } tsv;  
  10. } TString; 

Udata表示userdata

  1. typedef union Udata { // lobject.h, line 216  
  2.   L_Umaxalign dummy;  /* ensures maximum alignment for `local' udata */  
  3.   struct {  
  4.     CommonHeader;  
  5.     struct Table *metatable;  
  6.     struct Table *env;  
  7.     size_t len;  
  8.   } uv;  
  9. } Udata; 

Closure又分为两种,一种用于lua中,另一种用于C代码中。

  1. #define ClosureHeader / // lobject.h, line 292  
  2.        CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; /  
  3.       struct Table *env  
  4.  
  5. typedef struct CClosure {  
  6.   ClosureHeader;  
  7.   lua_CFunction f;  
  8.   TValue upvalue[1];  
  9. } CClosure;  
  10.  
  11. typedef struct LClosure {  
  12.   ClosureHeader;  
  13.   struct Proto *p;  
  14.   UpVal *upvals[1];  
  15. } LClosure;  
  16.  
  17. typedef union Closure {  
  18.   CClosure c;  
  19.   LClosure l;  
  20. } Closure; 

C代码中使用的函数类型是lua_CFunction,而lua中使用的函数是Proto;

  1. table  
  2. typedef struct Table {  
  3.   CommonHeader; // for GC  
  4.   lu_byte flags;  /* 1<<p means tagmethod(p) is not present */  
  5.   lu_byte lsizenode;  /* log2 of size of `node' array */ // size of node array  
  6.   struct Table *metatable; // 元表  
  7.   TValue *array;  /* array part */// 数组,没有索引值时使用  
  8.   Node *node; // node array  
  9.   Node *lastfree;  /* any free position is before this position */  
  10.   GCObject *gclist;  
  11.   int sizearray;  /* size of `array' array */// 数组的大小  
  12. } Table;  
  13.  
  14. Proto  
  15. typedef struct Proto {  
  16.   CommonHeader; // for GC  
  17.   TValue *k;  /* constants used by the function */ // 常量  
  18.   Instruction *code; // function code is here, code array?  
  19.   struct Proto **p;  /* functions defined inside the function */  
  20.   int *lineinfo;  /* map from opcodes to source lines */  
  21.   struct LocVar *locvars;  /* information about local variables */  
  22.   TString **upvalues;  /* upvalue names */  
  23.   TString  *source; // 源代码?  
  24.   int sizeupvalues; // size of upvalue names  
  25.   int sizek;  /* size of `k' */  
  26.   int sizecode; // size of code  
  27.   int sizelineinfo; // size of line  
  28.   int sizep;  /* size of `p' */ // size of Protos  
  29.   int sizelocvars; // size of local values  
  30.   int linedefined;  
  31.   int lastlinedefined;  
  32.   GCObject *gclist;  
  33.   lu_byte nups;  /* number of upvalues */  
  34.   lu_byte numparams; // 参数个数  
  35.   lu_byte is_vararg; // 是否是变参  
  36.   lu_byte maxstacksize; // 函数用到的栈?  
  37. } Proto;  
  38.  
  39. UpVal  
  40. typedef struct UpVal {  
  41.   CommonHeader;  
  42.   TValue *v;  /* points to stack or to its own value */  
  43.   union {  
  44.     TValue value;  /* the value (when closed) */  
  45.     struct {  /* double linked list (when open) */  
  46.       struct UpVal *prev;  
  47.       struct UpVal *next;  
  48.     } l;  
  49.   } u;  
  50. } UpVal; 

后续会不断补充,分析数据类型每个的确切用途。

小结:关于Lua数据类型源代码分析的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: CSDN博客
相关推荐

2011-08-24 15:42:38

LUA源代码

2021-03-24 09:37:41

数据类型数据分析数据的分类

2011-08-24 16:59:59

LuaModule

2011-08-24 17:15:33

Lua源代码文件

2011-08-04 15:14:39

Objective-C 数据类型

2018-11-15 09:45:47

JavaScript数据类型变量

2011-02-23 14:46:21

FileZilla

2011-02-23 14:54:58

FileZilla

2011-02-23 14:39:27

FileZilla

2011-02-23 14:16:43

FileZilla

2009-08-14 13:52:18

C#判断数据类型

2016-08-18 14:13:55

JavaScript基本数据引用数据

2019-08-12 11:40:48

数据库SQLite3数据类型

2014-01-05 17:08:09

PostgreSQL数据类型

2011-08-29 15:53:04

Lua位运算

2011-08-25 15:41:42

Lua源码

2011-02-23 15:11:27

FileZilla

2011-02-23 15:33:42

FileZilla

2011-02-23 15:21:06

FileZilla

2011-02-23 15:26:01

FileZilla
点赞
收藏

51CTO技术栈公众号