先看看頭文件裏的定義,定義了一些出錯信息,幾個內存管理接口,和宏。
幾個宏的定義也是用到了內存分配的幾個接口。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。
分配不成功,則出錯。
返回成功分配的內存。
lua
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 從新分配內存。
返回實際分配的個數。
debug
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 方法裏調的那幾個方法又分別是幹什麼的?
----------------------------------------
指針