lua 1.0 源码分析 -- 2 内存回收

  说这个,先要说下 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<lua_nstring; i++)
   if (lua_markstring(lua_string[i]) == 1)
   {
    lua_string[j++] = lua_string[i];
    lua_markstring(lua_string[i]) = 0;
   }
   else
   {
    free (lua_string[i]-1);
   }
  lua_nstring = j;
 }

 { /* pack array */
  int i, j;
  for (i=j=0; i<lua_narray; i++)
   if (markarray(lua_array[i]) == 1)
   {
    lua_array[j++] = lua_array[i];
    markarray(lua_array[i]) = 0;
   }
   else
   {
    lua_hashdelete (lua_array[i]);
   }
  lua_narray = j;
 }
}
原文地址:https://www.cnblogs.com/ashen/p/11555697.html