diff --git a/README.html b/README.html
index 21bb3431..a43e555b 100644
--- a/README.html
+++ b/README.html
@@ -340,6 +340,7 @@ and LuaForge:
Main changes by version:
-| 1.0 | Initial publicly supported release. |
-| 1.0.1 | Fix arg check and behavior of xpcall() to leave stack intact. |
+| 1.0 | Initial publicly supported release. |
+| 1.0.1 | Fix arg check and behavior of xpcall() to leave stack intact.
+Fix debug.sethook() to when called from hook function. Fix debug.gethook() return values. |
|
diff --git a/src/core/org/luaj/lib/DebugLib.java b/src/core/org/luaj/lib/DebugLib.java
index bc319320..75d749a3 100644
--- a/src/core/org/luaj/lib/DebugLib.java
+++ b/src/core/org/luaj/lib/DebugLib.java
@@ -155,12 +155,16 @@ public class DebugLib extends LFunction {
}
protected int gethook(LuaState vm) {
- LuaState threadVm = vm;
- if ( vm.gettop() >= 2 )
- threadVm = vm.checkthread(1).vm;
- vm.pushlvalue(threadVm.gethook());
- vm.pushinteger(threadVm.gethookmask());
- vm.pushinteger(threadVm.gethookcount());
+ LuaState threadVm = optthreadvm(vm, 1);
+ LValue hook = threadVm.gethook();
+ int mask = threadVm.gethookmask();
+ int count = threadVm.gethookcount();
+ vm.pushlvalue(hook!=null? hook: LNil.NIL);
+ vm.pushstring(""
+ +((mask&LuaState.LUA_MASKCALL)!=0? "c": "")
+ +((mask&LuaState.LUA_MASKRET) !=0? "r": "")
+ +((mask&LuaState.LUA_MASKLINE)!=0? "l": ""));
+ vm.pushinteger(count);
return 3;
}
diff --git a/src/core/org/luaj/vm/LuaState.java b/src/core/org/luaj/vm/LuaState.java
index 2817702c..ed00a21e 100644
--- a/src/core/org/luaj/vm/LuaState.java
+++ b/src/core/org/luaj/vm/LuaState.java
@@ -105,7 +105,7 @@ public class LuaState extends Lua {
// debug hooks - these MUST NOT be initialized,
// so that a later obfuscation step can decide to remove them.
- private boolean hooksenabled;
+ private boolean hooksenabled,inhook;
private int hookmask;
private int hookcount;
private LFunction hookfunc;
@@ -2501,16 +2501,17 @@ public class LuaState extends Lua {
debugCallHook(LUA_HOOKTAILRET, calls[cc].currentline());
}
}
-
+
private void debugCallHook(int mask, int line) {
- int oldmask = hookmask;
+ if ( inhook )
+ return;
int oldtop = top;
int oldbase = base;
int oldcc = cc;
int oldnresults = nresults;
int beyond = (cc>=0? base+calls[cc].closure.p.maxstacksize: top);
try {
- hookmask = 0;
+ inhook = true;
// adjust base and top to beyond call frame
top = base = beyond;
@@ -2541,7 +2542,7 @@ public class LuaState extends Lua {
base = oldbase;
top = oldtop;
nresults = oldnresults;
- hookmask = oldmask ;
+ inhook = false;
}
}
}