首页 > 代码库 > Lua2.4 内存分配 mem.c

Lua2.4 内存分配 mem.c

先看看头文件里的定义,定义了一些出错信息,几个内存管理接口,和宏。
几个宏的定义也是用到了内存分配的几个接口。newvector 在之前的词法分析里已经出现了。
几个接口,看函数名字比较容易看出来它的作用。下面看一下它们各自的实现:

void luaI_free (void *block)
{
  if (block)
  {
    *((int *)block) = -1;  /* to catch errors */
    free(block);
  }
}

释放内存。设置 -1 的那个地方是为了捕获错误,改变被释放内存的第一个地方的内容,以防在释放内存之后误用野指针可能带来其它的莫名其妙的错误。

void *luaI_malloc (unsigned long size)
{
  void *block = malloc((size_t)size);
  if (block == NULL)
    mem_error();
  return block;
}

调用 malloc 分配内存,如果分配不成功,出错。
返回成功分配的内存。

void *luaI_realloc (void *oldblock, unsigned long size)
{
  void *block = oldblock ? realloc(oldblock, (size_t)size) :
                           malloc((size_t)size);
  if (block == NULL)
    mem_error();
  return block;
}

调用 relloc 分配内存,如果 oldblock 为空,同 malloc。
分配不成功,则出错。
返回成功分配的内存。

int luaI_growvector (void **block, unsigned long nelems, int size,
                       char *errormsg, unsigned long limit)
{
  if (nelems >= limit)
    lua_error(errormsg);
  nelems = (nelems == 0) ? 20 : nelems*2;
  if (nelems > limit)
    nelems = limit;
  *block = luaI_realloc(*block, nelems*size);
  return (int) nelems;
}

重新分配数组。内部调用 luaI_realloc 来重新分配内存。
如果需要分配的元素个数大于所限制的内存数,出错。
如果需要分配的元素个数为 0,设置其为 20 个,如果非 0,扩大一倍。
如果需要分配的元素个数大于限制,设置其为限制数。
调用 luaI_realloc 重新分配内存。
返回实际分配的个数。

void* luaI_buffer (unsigned long size)
{
  static unsigned long buffsize = 0;
  static char* buffer = NULL;
  if (size > buffsize)
    buffer = luaI_realloc(buffer, buffsize=size);
  return buffer;
}

分配一个缓冲区 buffer,内部调用 luaI_realloc 分配内存。
如果新的 buffer 的 size 小于原来的 buffer size ,什么也不做,直接返回原来的 buffer.
如果新的 buffer 的 size 大于原来 buffer 的 size,重新分配一个 buffer,返回它。分配内存时调用的依旧是 luaI_realloc。

----------------------------------------
到目前为止的问题:
lex.c
> lua_createstring 是什么? TaggedString 是个什么数据结构?
> luaI_codedebugline 是什么? 调试相关信息有哪些?

inout.c
> luaI_createfixedstring 是什么? 那个 TaggedString 是个什么数据结构?

luac.c
> do_compile 里的 TFunc 是什么?那个初始化 luaI_initTFunc 是什么?
> lua_parser 是什么? do_dump 方法里调的那几个方法又分别是干什么的?
----------------------------------------

Lua2.4 内存分配 mem.c