存档

‘lua’ 分类的存档

Lua源码剖析(五)

2013年12月3日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: Lua源码剖析(五)

这次主要来分析lua的gc。

首先lua中的数据类型包括下面9种,ni, Boolean, number, string, table,user data, thread , functions 以及 lightusedata.其中 string, table,thread , function 是会被垃圾回收管理的,其他的都是值存在。

因此我们来看对应的GC数据结构.

#define CommonHeader     GCObject *next; lu_byte tt; lu_byte marked
 
typedef struct GCheader {
  CommonHeader;
} GCheader;

union GCObject {
  GCheader gch;
  union TString ts;
  union Udata u;
  union Closure cl;
  struct Table h;
  struct Proto p;
  struct UpVal uv;
  struct lua_State th;  /* thread */
};

我们可以看到在lua中字符串,userdata, thread, table ,string, thread(以及Upval, proto) 都会被垃圾回收管理。这里比较关键的就是GCheader这个结构体,我们可以看到这个结构体其实就是一个链表,也就是说所有的gc对象都会被链到一个链表中,其中tt表示当前对象的类型,在lua中包括下面这些类型:

#define LUA_TNIL          0
#define LUA_TBOOLEAN          1
#define LUA_TLIGHTUSERDATA     2
#define LUA_TNUMBER          3
#define LUA_TSTRING          4
#define LUA_TTABLE          5
#define LUA_TFUNCTION          6
#define LUA_TUSERDATA          7
#define LUA_TTHREAD          8

而marked表示当前对象的状态(涉及到gc算法,后续会详细分析),状态位包括下面这些:

#define WHITE0BIT     0
#define WHITE1BIT     1
#define BLACKBIT     2
#define FINALIZEDBIT     3
#define KEYWEAKBIT     3
#define VALUEWEAKBIT     4
#define FIXEDBIT     5
#define SFIXEDBIT     6
#define WHITEBITS     bit2mask(WHITE0BIT, WHITE1BIT)

阅读全文…

Share
分类: lua, 源码阅读 标签: ,

Lua源码剖析(四)

2013年9月8日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: Lua源码剖析(四)

前面三篇请看我前面的 blog

这篇主要来分析lua的虚拟机的实现,我看的代码依旧是5.1

因此首先从luaL_loadfile开始,这个函数我们知道是在当前的lua state加载一个lua文件,其中第二个参数就是filename。

其中LoadF结构很简单,它用来表示一个load file:

typedef struct LoadF {
  int extraline;
  FILE *f;
  char buff[LUAL_BUFFERSIZE];
} LoadF;

其中会使用fopen来打开对应的文件名,然后根据第一个字符来判断是否是注释(#),如果是则跳过

    lua_pushfstring(L, "@%s", filename);
    lf.f = fopen(filename, "r");
    if (lf.f == NULL) return errfile(L, "open", fnameindex);
  }
  c = getc(lf.f);
  if (c == '#') {  /* Unix exec. file? */
    lf.extraline = 1;
    while ((c = getc(lf.f)) != EOF && c != '\n') ;  /* skip first line */
    if (c == '\n') c = getc(lf.f);
  }

阅读全文…

Share
分类: lua, 源码阅读 标签:

lua源码分析

2010年8月14日 5 条评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: lua源码分析

这个是以前blog上写的一些,不过只是分析了一部分,以后会把代码分析完的,这里我把前面分析的做成了pdf供大家 下载

Share
分类: lua, 源码阅读 标签: ,