说这个,先要说下 lua 的环境,正常说创建一个 lua 的虚拟环境,就是创建一组全局变量, lua1.0 里创建的主要是以下几个:
extern Symbol *lua_table; /* 符号数组 */extern Word lua_ntable;extern char **lua_constant; /* 常量数组 */extern Word lua_nconstant;extern char **lua_string; /* 字符数组 */extern Word lua_nstring;extern Hash **lua_array; /* Hash 数组, 这个结构存的东西基本没有不能存的 */extern Word lua_narray;extern char *lua_file[]; /* lua 操作的文件描述数组 */extern int lua_nfile;static Object stack[MAXSTACK] ; /* 虚拟指令操作的 stack */
内存的回收 lua 的思想比较简单,就是 检查 lua_array, lua_string 中的成员是否在 stack 中, 不在的话就移除。
具体的实现就是标记 stack , 遍历数组, 因为在入数组的时候,是 strdup,直接 释放就好了,所以效率会很好。 lua_array 的思想一样。
/*** Simulate a garbage colection. When string table or array table overflows,** this function check if all allocated strings and arrays are in use. If** there are unused ones, pack (compress) the tables.*/static void lua_pack (void){ lua_markstack (); lua_marktable (); { /* pack string */ int i, j; for (i=j=0; i