先看看头文件里的定义,定义了一些出错信息,几个内存管理接口,和宏。
几个宏的定义也是用到了内存分配的几个接口。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 方法里调的那几个方法又分别是干什么的?
----------------------------------------
原文地址:http://my.oschina.net/xhan/blog/324763