Use the key directly to refer to the lua callback handler.
authorRui Guo <firemeteor.guo@gmail.com>
Fri, 12 Jun 2009 03:38:36 +0000 (12 11:38 +0800)
committerRui Guo <firemeteor.guo@gmail.com>
Fri, 12 Jun 2009 03:38:36 +0000 (12 11:38 +0800)
src/lua.c

index 544cd3e..9befa82 100644 (file)
--- a/src/lua.c
+++ b/src/lua.c
@@ -80,51 +80,9 @@ static int LuaRegEvent(lua_State *L);
 static int LuaUnRegEvent(lua_State *L);
 static void LuaShowErr(lua_State *L);
 
-enum
-{
-  LUA_HANDLER_TYPE_N = 1,
-  LUA_HANDLER_TYPE_F
-};
-
-struct lua_handler
-{
-  int type;
-  union
-  {
-    const char *name;
-    int reference;
-  } u;
-};
-
-struct lua_handler *
-LuaAllocHandler(const char *name, int ref)
-{
-  struct lua_handler *lh;
-  lh = (struct lua_handler*) malloc(sizeof(struct lua_handler));
-  if (!lh)
-    return NULL;
-
-  if (name)
-    {
-      lh->type = LUA_HANDLER_TYPE_N;
-      lh->u.name = name;
-    }
-  else
-    {
-      lh->type = LUA_HANDLER_TYPE_F;
-      lh->u.reference = ref;
-    }
-
-  return lh;
-}
-
-void
-LuaFreeHandler(struct lua_handler **lh)
-{
-  if ((*lh)->type == LUA_HANDLER_TYPE_N)
-    Free((*lh)->u.name);
-  Free(*lh);
-}
+typedef int lua_handler;
+#define LuaAllocHandler(a) a
+#define LuaFreeHandler(a)
 
 /** Template {{{ */
 
@@ -918,12 +876,12 @@ LuaPushHTable(lua_State *L, int screen, const char * t)
 }
 
 void
-LuaPushHandler(lua_State *L, struct lua_handler * lh)
+LuaPushHandler(lua_State *L, lua_handler lh)
 {
   int keyfunc;
   luaL_getmetatable(L, "screen");
   keyfunc = LuaPushHTable(L, -1, "_keyfunc");
-  lua_rawgeti(L, keyfunc, lh->u.reference);
+  lua_rawgeti(L, keyfunc, lh);
   lua_replace(L, -3);
   lua_pop(L, 1);
 }
@@ -1014,7 +972,7 @@ LuaHSetName(lua_State *L, int key, int name)
 
 /* Do not hold the return value for long */
 const char *
-LuaHGetName(lua_State *L, int key)
+LuaHGetName(lua_State *L, lua_handler key)
 {
   int keyfunc, sc;
   const char * name;
@@ -1029,7 +987,7 @@ LuaHGetName(lua_State *L, int key)
   return name;
 }
 
-struct lua_handler *
+lua_handler
 LuaCheckHandler(lua_State *L, int idx, int reg)
 {
   int name = 0, key, sc;
@@ -1054,7 +1012,7 @@ LuaCheckHandler(lua_State *L, int idx, int reg)
       LuaHSetName(L, key, name);
       lua_pop(L, 1);
     }
-  return LuaAllocHandler(NULL, key);
+  return LuaAllocHandler(key);
 }
 
 /* }}} **/
@@ -1062,7 +1020,7 @@ LuaCheckHandler(lua_State *L, int idx, int reg)
 static int
 LuaDispatch(void *handler, const char *params, va_list va)
 {
-  struct lua_handler *lh = handler;
+  lua_handler lh = (lua_handler)handler;
   int argc, retvalue;
 
   StackDump(L, "before dispatch");
@@ -1107,7 +1065,7 @@ LuaRegEvent(lua_State *L)
    *   returns: A ticket for later unregister. */
   int idx = 1, argc = lua_gettop(L);
   unsigned int priv = 31; /* Default privilege */
-  struct lua_handler *lh;
+  lua_handler lh;
 
   char *obj = NULL;
   const char *objname = "global";
@@ -1155,7 +1113,7 @@ LuaRegEvent(lua_State *L)
       l->dispatcher = LuaDispatch;
       if (register_listener(sev, l))
         {
-          const char *fname = LuaHGetName(L, lh->u.reference);
+          const char *fname = LuaHGetName(L, lh);
           free(l);
          if (fname)
            return luaL_error(L, "Handler %s has already been registered", fname);
@@ -1163,7 +1121,7 @@ LuaRegEvent(lua_State *L)
            return luaL_error(L, "Handler has already been registered");
         }
       /* Return the handler for un-register */
-      l->handler = lh;
+      l->handler = (void *)lh;
       lua_pushlightuserdata(L, l);
     }
   else
@@ -1201,7 +1159,7 @@ LuaUnRegEvent(lua_State *L)
     }
   else
     {
-      LuaFreeHandler(((struct lua_handler **)&(l->handler)));
+      LuaFreeHandler(((lua_handler)&(l->handler)));
       unregister_listener(l);
       lua_pushboolean(L, 1);
     }