From: Rui Guo Date: Mon, 15 Jun 2009 14:24:34 +0000 (+0800) Subject: Change function table name to ease removing refcnt. X-Git-Url: https://repo.or.cz/w/screen-lua.git/commitdiff_plain/288a04e7e31ebb3a982628211e1e09a3236938c5 Change function table name to ease removing refcnt. --- diff --git a/src/lua.c b/src/lua.c index e64ee98..5b5cf8d 100644 --- a/src/lua.c +++ b/src/lua.c @@ -828,13 +828,12 @@ int LuaInit(void) luaL_getmetatable(L, "screen"); /* two kinds of info in this table: * _funckey[func]->key - * _funckey[key]->refcnt */ - lua_pushstring(L, "_funckey"); + * _keyfunc[key]->func */ + lua_pushstring(L, "_funcreg"); lua_newtable(L); lua_rawset(L, -3); - /* two kinds of info in this table: - * _keyfunc[key]->func */ - lua_pushstring(L, "_keyfunc"); + /* _refcnt[key]->cnt */ + lua_pushstring(L, "_refcnt"); lua_newtable(L); lua_rawset(L, -3); lua_pop(L, 1); @@ -1015,12 +1014,12 @@ LuaPushHTable(lua_State *L, int screen, const char * t) void LuaPushHandler(lua_State *L, lua_handler lh) { - int keyfunc; + int funcreg; if (lh->type == LUA_HANDLER_TYPE_F) { luaL_getmetatable(L, "screen"); - keyfunc = LuaPushHTable(L, lua_gettop(L), "_keyfunc"); - lua_rawgeti(L, keyfunc, lh->u.reference); + funcreg = LuaPushHTable(L, lua_gettop(L), "_funcreg"); + lua_rawgeti(L, funcreg, lh->u.reference); lua_replace(L, -3); lua_pop(L, 1); } @@ -1033,65 +1032,68 @@ LuaPushHandler(lua_State *L, lua_handler lh) void LuaHRef(lua_State *L, int key, int reg) { - int funckey, keyfunc, cnt, sc, idx; + int refcnt, cnt, sc; luaL_getmetatable(L, "screen"); sc = lua_gettop(L); - funckey = LuaPushHTable(L, sc, "_funckey"); - keyfunc = LuaPushHTable(L, sc, "_keyfunc"); + refcnt = LuaPushHTable(L, sc, "_refcnt"); - lua_rawgeti(L, keyfunc, key); - idx = lua_gettop(L); - - lua_rawgeti(L, funckey, key); - cnt = lua_tointeger(L, -1);/*cnt = htable[key]*/ + lua_rawgeti(L, refcnt, key); + cnt = lua_tointeger(L, -1);/*cnt = refcnt[key]*/ if (!reg && cnt <= 1) { /*release the last reference*/ - luaL_unref(L, funckey, key); + int idx, funcreg = LuaPushHTable(L, sc, "_funcreg"); + lua_rawgeti(L, funcreg, key); + idx = lua_gettop(L); + + luaL_unref(L, funcreg, key); lua_pushvalue(L, idx); lua_pushnil(L); - lua_settable(L, funckey); /*htable[func]=key*/ + lua_settable(L, funcreg); /*funcreg[func]=nil*/ + lua_pop(L, 5); + return; } else { lua_pushinteger(L, key); lua_pushinteger(L, reg? cnt + 1 : cnt - 1); - lua_settable(L, funckey); /*htable[key] = cnt + 1*/ + lua_settable(L, refcnt); /*refcnt[key] = cnt + 1 or cnt - 1*/ } - lua_pop(L, 5); + lua_pop(L, 3); } /* Ref when asked to. Never unref*/ int LuaFuncKey(lua_State *L, int idx, int ref) { - int key, funckey, sc; + int key, funcreg, sc; luaL_getmetatable(L, "screen"); sc = lua_gettop(L); - funckey = LuaPushHTable(L, sc, "_funckey"); + funcreg = LuaPushHTable(L, sc, "_funcreg"); lua_pushvalue(L, idx); - lua_gettable(L, funckey);/*funckey[func] ==?*/ + lua_gettable(L, funcreg);/*funcreg[func] ==?*/ if (lua_isnil(L, -1)) { + int refcnt; /* Not found, alloc a new key */ if (!ref) return LUA_NOREF; - /*funckey[key] = 1*/ - lua_pushinteger(L, 1); - key = luaL_ref(L, funckey); + /*funcreg[key] = func*/ + lua_pushvalue(L, idx); + key = luaL_ref(L, funcreg); - /*funckey[func]=key*/ + /*funcreg[func]=key*/ lua_pushvalue(L, idx); lua_pushinteger(L, key); - lua_settable(L, funckey); + lua_settable(L, funcreg); - int keyfunc = LuaPushHTable(L, sc, "_keyfunc"); - /*keyfunc[key] = func*/ + /*refcnt[key] = func*/ + refcnt = LuaPushHTable(L, sc, "_refcnt"); lua_pushinteger(L, key); - lua_pushvalue(L, idx); - lua_settable(L, keyfunc); + lua_pushinteger(L, 1); + lua_settable(L, refcnt); lua_pop(L, 1); } @@ -1110,6 +1112,9 @@ lua_handler LuaCheckHandler(lua_State *L, int idx, int ref) { int key; + if (idx < 0) + idx = lua_gettop(L) + 1 - idx; + if (lua_isstring(L, idx)) { const char * handler;