From 89b102bd1d967656daeb337bf59ad6abeddeb613 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 25 Jun 2002 16:15:21 -0300 Subject: [PATCH] new `luaL_weakregistry' function --- lauxlib.c | 23 +++++++++++++++++++++-- lauxlib.h | 4 +++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lauxlib.c b/lauxlib.c index 81150cd4..b090e9c5 100644 --- a/lauxlib.c +++ b/lauxlib.c @@ -1,5 +1,5 @@ /* -** $Id: lauxlib.c,v 1.74 2002/06/13 13:44:50 roberto Exp roberto $ +** $Id: lauxlib.c,v 1.75 2002/06/18 15:19:27 roberto Exp roberto $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */ @@ -143,7 +143,7 @@ LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { return 0; } lua_pushvalue(L, obj); - lua_upcall(L, 1, 1); + lua_call(L, 1, 1); return 1; } @@ -299,6 +299,25 @@ LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { } +LUALIB_API void luaL_weakregistry (lua_State *L) { + static const char dummy = '\0'; /* index for a weak table in registry */ + lua_pushudataval(L, (void *)&dummy); /* push index */ + lua_rawget(L, LUA_REGISTRYINDEX); /* get value */ + if (!lua_isnil(L, -1)) return; /* weak table already created? */ + /* else must create a weak table */ + lua_pop(L, 1); /* remove previous nil */ + lua_newtable(L); /* new table `w' */ + lua_pushvalue(L, -1); + lua_setmetatable(L, -2); /* setmetatable(w, w) */ + lua_pushliteral(L, "__mode"); + lua_pushliteral(L, "kv"); + lua_rawset(L, -3); /* metatable(w).__mode = "kv" */ + lua_pushudataval(L, (void *)&dummy); /* push index */ + lua_pushvalue(L, -2); /* push value */ + lua_rawset(L, LUA_REGISTRYINDEX); /* store new weak table into registry */ +} + + /* ** {====================================================== ** Load functions diff --git a/lauxlib.h b/lauxlib.h index 63db2f94..438e6c20 100644 --- a/lauxlib.h +++ b/lauxlib.h @@ -1,5 +1,5 @@ /* -** $Id: lauxlib.h,v 1.48 2002/06/03 20:11:41 roberto Exp roberto $ +** $Id: lauxlib.h,v 1.49 2002/06/18 15:19:27 roberto Exp roberto $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */ @@ -49,6 +49,8 @@ LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...); LUALIB_API int luaL_findstring (const char *name, const char *const list[]); +LUALIB_API void luaL_weakregistry (lua_State *L); + LUALIB_API int luaL_ref (lua_State *L, int t); LUALIB_API void luaL_unref (lua_State *L, int t, int ref);