|
@@ -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
|
|
** Auxiliary functions for building Lua libraries
|
|
** See Copyright Notice in lua.h
|
|
** 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;
|
|
return 0;
|
|
}
|
|
}
|
|
lua_pushvalue(L, obj);
|
|
lua_pushvalue(L, obj);
|
|
- lua_upcall(L, 1, 1);
|
|
|
|
|
|
+ lua_call(L, 1, 1);
|
|
return 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
|
|
** Load functions
|