Change function table name to ease removing refcnt.
authorRui Guo <firemeteor.guo@gmail.com>
Mon, 15 Jun 2009 14:24:34 +0000 (15 22:24 +0800)
committerRui Guo <firemeteor.guo@gmail.com>
Mon, 15 Jun 2009 14:24:34 +0000 (15 22:24 +0800)
src/lua.c

index e64ee98..5b5cf8d 100644 (file)
--- 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;