# HG changeset patch # User jbe # Date 1449692184 -3600 # Node ID 762ab1e877028348f9150e57fe5230f3139a6b0f # Parent ae1a66bb6b7dbdb6618f912ea1082aac74fa0ee3 Use uservalues rather than ephemeron tables in mondelefant diff -r ae1a66bb6b7d -r 762ab1e87702 libraries/mondelefant/mondelefant_native.c --- a/libraries/mondelefant/mondelefant_native.c Wed Dec 09 05:23:42 2015 +0100 +++ b/libraries/mondelefant/mondelefant_native.c Wed Dec 09 21:16:24 2015 +0100 @@ -15,8 +15,6 @@ #define MONDELEFANT_MODULE_REGKEY (MONDELEFANT_REGKEY "module") // registry key of meta-table for database connections: #define MONDELEFANT_CONN_MT_REGKEY (MONDELEFANT_REGKEY "connection") -// registry key of table storing connection specific data: -#define MONDELEFANT_CONN_DATA_REGKEY (MONDELEFANT_REGKEY "connection_data") // registry key of meta-table for database result lists and objects: #define MONDELEFANT_RESULT_MT_REGKEY (MONDELEFANT_REGKEY "result") // registry key of meta-table for database error objects: @@ -306,15 +304,12 @@ // set meta-table of userdata: luaL_getmetatable(L, MONDELEFANT_CONN_MT_REGKEY); // 2 lua_setmetatable(L, 1); - // create entry in table storing connection specific data and associate - // created userdata with it: - lua_getfield(L, LUA_REGISTRYINDEX, MONDELEFANT_CONN_DATA_REGKEY); // 2 - lua_pushvalue(L, 1); // 3 - lua_newtable(L); // 4 - lua_pushinteger(L, PQsocket(pgconn)); // determine file descriptor - lua_setfield(L, 4, "fd"); // set "fd" attribute - lua_settable(L, 2); - lua_settop(L, 1); + // create and associate userdata table: + lua_newtable(L); + lua_setuservalue(L, 1); + // store key "fd" with file descriptor of connection: + lua_pushinteger(L, PQsocket(pgconn)); + lua_setfield(L, 1, "fd"); // store key "engine" with value "postgresql" as connection specific data: lua_pushliteral(L, "postgresql"); lua_setfield(L, 1, "engine"); @@ -338,10 +333,7 @@ static int mondelefant_conn_index(lua_State *L) { // try table for connection specific data: lua_settop(L, 2); - lua_getfield(L, LUA_REGISTRYINDEX, MONDELEFANT_CONN_DATA_REGKEY); // 3 - lua_pushvalue(L, 1); // 4 - lua_gettable(L, 3); // 4 - lua_remove(L, 3); // connection specific data-table at stack position 3 + lua_getuservalue(L, 1); // 3 lua_pushvalue(L, 2); // 4 lua_gettable(L, 3); // 4 if (!lua_isnil(L, 4)) return 1; @@ -378,10 +370,7 @@ static int mondelefant_conn_newindex(lua_State *L) { // store key-value pair in table for connection specific data: lua_settop(L, 3); - lua_getfield(L, LUA_REGISTRYINDEX, MONDELEFANT_CONN_DATA_REGKEY); // 4 - lua_pushvalue(L, 1); // 5 - lua_gettable(L, 4); // 5 - lua_remove(L, 4); // connection specific data-table at stack position 4 + lua_getuservalue(L, 1); // 4 lua_pushvalue(L, 2); lua_pushvalue(L, 3); lua_settable(L, 4); @@ -405,11 +394,8 @@ conn = mondelefant_get_conn(L, 1); PQfinish(conn->pgconn); conn->pgconn = NULL; - lua_getfield(L, LUA_REGISTRYINDEX, MONDELEFANT_CONN_DATA_REGKEY); // 2 - lua_pushvalue(L, 1); // 3 - lua_gettable(L, 2); // 3 - lua_pushnil(L); // 4 - lua_setfield(L, 3, "fd"); // set "fd" attribute to nil + lua_pushnil(L); // 2 + lua_setfield(L, 1, "fd"); // set "fd" attribute to nil return 0; } @@ -1990,15 +1976,6 @@ lua_setfield(L, LUA_REGISTRYINDEX, MONDELEFANT_CLASS_PROTO_REGKEY); lua_setfield(L, 1, "class_prototype"); - lua_newtable(L); // 2 - lua_pushliteral(L, "k"); // 3 - lua_setfield(L, 2, "__mode"); - lua_newtable(L); // 3 - lua_pushvalue(L, 2); // 4 - lua_setmetatable(L, 3); - lua_setfield(L, LUA_REGISTRYINDEX, MONDELEFANT_CONN_DATA_REGKEY); - lua_settop(L, 1); - luaL_newmetatable(L, MONDELEFANT_ERROROBJECT_MT_REGKEY); // 2 #if LUA_VERSION_NUM >= 502 luaL_setfuncs(L, mondelefant_errorobject_mt_functions, 0);