Browse Source

setlinehook/setcallhook return old hook

Roberto Ierusalimschy 25 years ago
parent
commit
40a4c76773
1 changed files with 9 additions and 6 deletions
  1. 9 6
      ldblib.c

+ 9 - 6
ldblib.c

@@ -1,5 +1,5 @@
 /*
-** $Id: ldblib.c,v 1.27 2000/10/27 16:15:53 roberto Exp roberto $
+** $Id: ldblib.c,v 1.28 2000/11/06 13:19:08 roberto Exp roberto $
 ** Interface from Lua to its debug API
 ** See Copyright Notice in lua.h
 */
@@ -145,28 +145,31 @@ static void linef (lua_State *L, lua_Debug *ar) {
 static void sethook (lua_State *L, void *key, lua_Hook hook,
                      lua_Hook (*sethookf)(lua_State * L, lua_Hook h)) {
   lua_settop(L, 1);
-  lua_getregistry(L);
-  lua_pushuserdata(L, key);
   if (lua_isnil(L, 1))
     (*sethookf)(L, NULL);
   else if (lua_isfunction(L, 1))
     (*sethookf)(L, hook);
   else
     luaL_argerror(L, 1, "function expected");
+  lua_getregistry(L);
+  lua_pushuserdata(L, key);
+  lua_pushvalue(L, -1);  /* dup key */
+  lua_gettable(L, -3);   /* get old value */
+  lua_pushvalue(L, -2);  /* key (again) */
   lua_pushvalue(L, 1);
-  lua_settable(L, -3);
+  lua_settable(L, -5);  /* set new value */
 }
 
 
 static int setcallhook (lua_State *L) {
   sethook(L, KEY_CALLHOOK, callf, lua_setcallhook);
-  return 0;
+  return 1;
 }
 
 
 static int setlinehook (lua_State *L) {
   sethook(L, KEY_LINEHOOK, linef, lua_setlinehook);
-  return 0;
+  return 1;
 }