Lua処理系コード読み(13) luaL_newstate

luaL_newstateは先のlua_newstateにLuaが提供するシンプルなアロケータ(とエラー発生時呼び出す関数)を指定して呼び出す関数。

LUALIB_API lua_State *luaL_newstate (void) {
  lua_State *L = lua_newstate(l_alloc, NULL);
  if (L) lua_atpanic(L, &panic);
  return L;
}

l_allocの中身はだいぶ謎。nsizeが0のときreallocはfreeと等価なはずだし意味がないのではと思うけど、なんかそうなってない環境があるのかなー。

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
  (void)ud;
  (void)osize;
  if (nsize == 0) {
    free(ptr);
    return NULL;
  }
  else
    return realloc(ptr, nsize);
}

ud, osizeという引数はこの関数ではもちろん必要ないけど、自作アロケータを使うときに使う。udにそのアロケータが関連付けてないといけない領域が与えられるのでそんな感じに扱いましょう的なそんな。(void)ud;(void)osize;はたぶん警告とかエラーを潰す何かかなー。たいていの環境だと意味はそんなない気がする。

LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {
  lua_Alloc f;
  lua_lock(L);
  if (ud) *ud = G(L)->ud;
  f = G(L)->frealloc;
  lua_unlock(L);
  return f;
}


LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {
  lua_lock(L);
  G(L)->ud = ud;
  G(L)->frealloc = f;
  lua_unlock(L);
}

lua_getallocf, lua_setallocf経由でアロケータをセットしたり。

test