Comparison

spec/util_debug_spec.lua @ 11177:37dc2a6144d1 0.11

util.debug: Fix locals being reported under wrong stack frame in some cases (+tests!!)
author Matthew Wild <mwild1@gmail.com>
date Fri, 16 Oct 2020 13:38:04 +0100
comparison
equal deleted inserted replaced
11175:235537247aa3 11177:37dc2a6144d1
1 local dbg = require "util.debug";
2
3 describe("util.debug", function ()
4 describe("traceback()", function ()
5 it("works", function ()
6 local tb = dbg.traceback();
7 assert.is_string(tb);
8 end);
9 end);
10 describe("get_traceback_table()", function ()
11 it("works", function ()
12 local count = 0;
13 -- MUST stay in sync with the line numbers of these functions:
14 local f1_defined, f3_defined = 43, 15;
15 local function f3(f3_param) --luacheck: ignore 212/f3_param
16 count = count + 1;
17
18 for i = 1, 2 do
19 local tb = dbg.get_traceback_table(i == 1 and coroutine.running() or nil, 0);
20 assert.is_table(tb);
21 --print(dbg.traceback(), "\n\n\n", require "util.serialization".serialize(tb, { fatal = false, unquoted = true}));
22 local found_f1, found_f3;
23 for _, frame in ipairs(tb) do
24 if frame.info.linedefined == f1_defined then
25 assert.equal(0, #frame.locals);
26 assert.equal("f2", frame.upvalues[1].name);
27 assert.equal("f1_upvalue", frame.upvalues[2].name);
28 found_f1 = true;
29 elseif frame.info.linedefined == f3_defined then
30 assert.equal("f3_param", frame.locals[1].name);
31 found_f3 = true;
32 end
33 end
34 assert.is_true(found_f1);
35 assert.is_true(found_f3);
36 end
37 end
38 local function f2()
39 local f2_local = "hello";
40 return f3(f2_local);
41 end
42 local f1_upvalue = "upvalue1";
43 local function f1()
44 f2(f1_upvalue);
45 end
46
47 -- ok/err are caught and re-thrown so that
48 -- busted gets to handle them in its own way
49 local ok, err;
50 local function hook()
51 debug.sethook();
52 ok, err = pcall(f1);
53 end
54
55 -- Test the traceback is correct in various
56 -- types of caller environments
57
58 -- From a Lua hook
59 debug.sethook(hook, "crl", 1);
60 local a = string.sub("abcdef", 3, 4);
61 assert.equal("cd", a);
62 debug.sethook();
63 assert.equal(1, count);
64
65 if not ok then
66 error(err);
67 end
68 ok, err = nil, nil;
69
70 -- From a signal handler (C hook)
71 require "util.signal".signal("SIGUSR1", hook);
72 require "util.signal".raise("SIGUSR1");
73 assert.equal(2, count);
74
75 if not ok then
76 error(err);
77 end
78 ok, err = nil, nil;
79
80 -- Inside a coroutine
81 local co = coroutine.create(function ()
82 hook();
83 end);
84 coroutine.resume(co);
85
86 if not ok then
87 error(err);
88 end
89
90 assert.equal(3, count);
91 end);
92 end);
93 end);