aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-06-25 16:15:21 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-06-25 16:15:21 -0300
commit89b102bd1d967656daeb337bf59ad6abeddeb613 (patch)
treec172e696ddb80d4a1c2852a3d6f70f8f85794a71
parentfdfd5b44ee48a5497181d0bcaa89586b12a48eb4 (diff)
downloadlua-89b102bd1d967656daeb337bf59ad6abeddeb613.tar.gz
lua-89b102bd1d967656daeb337bf59ad6abeddeb613.tar.bz2
lua-89b102bd1d967656daeb337bf59ad6abeddeb613.zip
new `luaL_weakregistry' function
-rw-r--r--lauxlib.c23
-rw-r--r--lauxlib.h4
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 @@
1/* 1/*
2** $Id: lauxlib.c,v 1.74 2002/06/13 13:44:50 roberto Exp roberto $ 2** $Id: lauxlib.c,v 1.75 2002/06/18 15:19:27 roberto Exp roberto $
3** Auxiliary functions for building Lua libraries 3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -143,7 +143,7 @@ LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {
143 return 0; 143 return 0;
144 } 144 }
145 lua_pushvalue(L, obj); 145 lua_pushvalue(L, obj);
146 lua_upcall(L, 1, 1); 146 lua_call(L, 1, 1);
147 return 1; 147 return 1;
148} 148}
149 149
@@ -299,6 +299,25 @@ LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
299} 299}
300 300
301 301
302LUALIB_API void luaL_weakregistry (lua_State *L) {
303 static const char dummy = '\0'; /* index for a weak table in registry */
304 lua_pushudataval(L, (void *)&dummy); /* push index */
305 lua_rawget(L, LUA_REGISTRYINDEX); /* get value */
306 if (!lua_isnil(L, -1)) return; /* weak table already created? */
307 /* else must create a weak table */
308 lua_pop(L, 1); /* remove previous nil */
309 lua_newtable(L); /* new table `w' */
310 lua_pushvalue(L, -1);
311 lua_setmetatable(L, -2); /* setmetatable(w, w) */
312 lua_pushliteral(L, "__mode");
313 lua_pushliteral(L, "kv");
314 lua_rawset(L, -3); /* metatable(w).__mode = "kv" */
315 lua_pushudataval(L, (void *)&dummy); /* push index */
316 lua_pushvalue(L, -2); /* push value */
317 lua_rawset(L, LUA_REGISTRYINDEX); /* store new weak table into registry */
318}
319
320
302/* 321/*
303** {====================================================== 322** {======================================================
304** Load functions 323** Load functions
diff --git a/lauxlib.h b/lauxlib.h
index 63db2f94..438e6c20 100644
--- a/lauxlib.h
+++ b/lauxlib.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lauxlib.h,v 1.48 2002/06/03 20:11:41 roberto Exp roberto $ 2** $Id: lauxlib.h,v 1.49 2002/06/18 15:19:27 roberto Exp roberto $
3** Auxiliary functions for building Lua libraries 3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -49,6 +49,8 @@ LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...);
49LUALIB_API int luaL_findstring (const char *name, 49LUALIB_API int luaL_findstring (const char *name,
50 const char *const list[]); 50 const char *const list[]);
51 51
52LUALIB_API void luaL_weakregistry (lua_State *L);
53
52LUALIB_API int luaL_ref (lua_State *L, int t); 54LUALIB_API int luaL_ref (lua_State *L, int t);
53LUALIB_API void luaL_unref (lua_State *L, int t, int ref); 55LUALIB_API void luaL_unref (lua_State *L, int t, int ref);
54 56