Fixed bug: line hooks in stripped functions
Line-hook handling was accessing debug info. without checking whether
it was present.
diff --git a/ldebug.c b/ldebug.c
index 9ff7ede..8cb00e5 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -783,11 +783,13 @@
** previous instruction 'oldpc'.
*/
static int changedline (const Proto *p, int oldpc, int newpc) {
+ if (p->lineinfo == NULL) /* no debug information? */
+ return 0;
while (oldpc++ < newpc) {
if (p->lineinfo[oldpc] != 0)
return (luaG_getfuncline(p, oldpc - 1) != luaG_getfuncline(p, newpc));
}
- return 0; /* no line changes in the way */
+ return 0; /* no line changes between positions */
}
diff --git a/testes/db.lua b/testes/db.lua
index 941283f..5377f6e 100644
--- a/testes/db.lua
+++ b/testes/db.lua
@@ -884,7 +884,7 @@
print("testing debug functions on chunk without debug info")
-prog = [[-- program to be loaded without debug information
+prog = [[-- program to be loaded without debug information (strip)
local debug = require'debug'
local a = 12 -- a local variable
@@ -927,6 +927,23 @@
assert(f() == 13)
+do -- bug in 5.4.0: line hooks in stripped code
+ local function foo ()
+ local a = 1
+ local b = 2
+ return b
+ end
+
+ local s = load(string.dump(foo, true))
+ local line = true
+ debug.sethook(function (e, l)
+ assert(e == "line")
+ line = l
+ end, "l")
+ assert(s() == 2); debug.sethook(nil)
+ assert(line == nil) -- hook called withoug debug info for 1st instruction
+end
+
do -- tests for 'source' in binary dumps
local prog = [[
return function (x)