Annotate

util/debug.lua @ 4522:29f75c2af90e

util.debug: Move optimal line length (default 65) into a variable
author Matthew Wild <mwild1@gmail.com>
date Thu, 22 Mar 2012 15:10:38 +0000
parent 4521:4c7495f7f543
child 4523:d733bde93074
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- Variables ending with these names will not
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- have their values printed ('password' includes
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 -- 'new_password', etc.)
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local censored_names = {
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 password = true;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 passwd = true;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 pass = true;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 pwd = true;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 };
4522
29f75c2af90e util.debug: Move optimal line length (default 65) into a variable
Matthew Wild <mwild1@gmail.com>
parents: 4521
diff changeset
10 local optimal_line_length = 65;
29f75c2af90e util.debug: Move optimal line length (default 65) into a variable
Matthew Wild <mwild1@gmail.com>
parents: 4521
diff changeset
11
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local function get_locals_table(level)
4465
41c4252526bd util.debug: Adjust level within get_locals_table() to account for the additional depth of this function itself
Matthew Wild <mwild1@gmail.com>
parents: 4418
diff changeset
14 level = level + 1; -- Skip this function itself
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local locals = {};
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 for local_num = 1, math.huge do
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 local name, value = debug.getlocal(level, local_num);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 if not name then break; end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 table.insert(locals, { name = name, value = value });
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 return locals;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 local function get_upvalues_table(func)
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 local upvalues = {};
4418
70b5e533325d util.debug: Fix potential traceback
Matthew Wild <mwild1@gmail.com>
parents: 4412
diff changeset
26 if func then
70b5e533325d util.debug: Fix potential traceback
Matthew Wild <mwild1@gmail.com>
parents: 4412
diff changeset
27 for upvalue_num = 1, math.huge do
70b5e533325d util.debug: Fix potential traceback
Matthew Wild <mwild1@gmail.com>
parents: 4412
diff changeset
28 local name, value = debug.getupvalue(func, upvalue_num);
70b5e533325d util.debug: Fix potential traceback
Matthew Wild <mwild1@gmail.com>
parents: 4412
diff changeset
29 if not name then break; end
70b5e533325d util.debug: Fix potential traceback
Matthew Wild <mwild1@gmail.com>
parents: 4412
diff changeset
30 table.insert(upvalues, { name = name, value = value });
70b5e533325d util.debug: Fix potential traceback
Matthew Wild <mwild1@gmail.com>
parents: 4412
diff changeset
31 end
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 return upvalues;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 local function string_from_var_table(var_table, max_line_len, indent_str)
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 local var_string = {};
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 local col_pos = 0;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 max_line_len = max_line_len or math.huge;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 indent_str = "\n"..(indent_str or "");
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 for _, var in ipairs(var_table) do
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local name, value = var.name, var.value;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 if name:sub(1,1) ~= "(" then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 if type(value) == "string" then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 if censored_names[name:match("%a+$")] then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 value = "<hidden>";
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 else
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 value = ("%q"):format(value);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 else
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 value = tostring(value);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 if #value > max_line_len then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 value = value:sub(1, max_line_len-3).."…";
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 local str = ("%s = %s"):format(name, tostring(value));
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 col_pos = col_pos + #str;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 if col_pos > max_line_len then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 table.insert(var_string, indent_str);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 col_pos = 0;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 table.insert(var_string, str);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 if #var_string == 0 then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 return nil;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 else
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 return "{ "..table.concat(var_string, ", "):gsub(indent_str..", ", indent_str).." }";
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 function get_traceback_table(thread, start_level)
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 local levels = {};
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 for level = start_level, math.huge do
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 local info;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 if thread then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 info = debug.getinfo(thread, level);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 else
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 info = debug.getinfo(level);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 if not info then break; end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 levels[(level-start_level)+1] = {
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 level = level;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 info = info;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 locals = get_locals_table(level);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 upvalues = get_upvalues_table(info.func);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 };
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 return levels;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92
4520
2d85ac26799c util.debug: Add catch for an "error in error handling"
Matthew Wild <mwild1@gmail.com>
parents: 4519
diff changeset
93 function debug.traceback(...)
2d85ac26799c util.debug: Add catch for an "error in error handling"
Matthew Wild <mwild1@gmail.com>
parents: 4519
diff changeset
94 local ok, ret = pcall(debug._traceback, ...);
2d85ac26799c util.debug: Add catch for an "error in error handling"
Matthew Wild <mwild1@gmail.com>
parents: 4519
diff changeset
95 if not ok then
2d85ac26799c util.debug: Add catch for an "error in error handling"
Matthew Wild <mwild1@gmail.com>
parents: 4519
diff changeset
96 return "Error in error handling: "..ret;
2d85ac26799c util.debug: Add catch for an "error in error handling"
Matthew Wild <mwild1@gmail.com>
parents: 4519
diff changeset
97 end
2d85ac26799c util.debug: Add catch for an "error in error handling"
Matthew Wild <mwild1@gmail.com>
parents: 4519
diff changeset
98 return ret;
2d85ac26799c util.debug: Add catch for an "error in error handling"
Matthew Wild <mwild1@gmail.com>
parents: 4519
diff changeset
99 end
2d85ac26799c util.debug: Add catch for an "error in error handling"
Matthew Wild <mwild1@gmail.com>
parents: 4519
diff changeset
100
2d85ac26799c util.debug: Add catch for an "error in error handling"
Matthew Wild <mwild1@gmail.com>
parents: 4519
diff changeset
101 function debug._traceback(thread, message, level)
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 if type(thread) ~= "thread" then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 thread, message, level = coroutine.running(), thread, message;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 if level and type(message) ~= "string" then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 return nil, "invalid message";
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 elseif not level then
4519
510f4ba7080f util.debug: Attempt to get debug.traceback() parameter handling correct (again)
Matthew Wild <mwild1@gmail.com>
parents: 4465
diff changeset
108 if type(message) == "number" then
510f4ba7080f util.debug: Attempt to get debug.traceback() parameter handling correct (again)
Matthew Wild <mwild1@gmail.com>
parents: 4465
diff changeset
109 level, message = message, nil;
510f4ba7080f util.debug: Attempt to get debug.traceback() parameter handling correct (again)
Matthew Wild <mwild1@gmail.com>
parents: 4465
diff changeset
110 else
510f4ba7080f util.debug: Attempt to get debug.traceback() parameter handling correct (again)
Matthew Wild <mwild1@gmail.com>
parents: 4465
diff changeset
111 level = 2;
510f4ba7080f util.debug: Attempt to get debug.traceback() parameter handling correct (again)
Matthew Wild <mwild1@gmail.com>
parents: 4465
diff changeset
112 end
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 message = message and (message.."\n") or "";
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 local levels = get_traceback_table(thread, level+2);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118
4521
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
119 local last_source_desc;
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
120
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 local lines = {};
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 for nlevel, level in ipairs(levels) do
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 local info = level.info;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 local line = "...";
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 local func_type = info.namewhat.." ";
4521
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
126 local source_desc = (info.short_src == "[C]" and "C code") or info.short_src or "Unknown";
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 if func_type == " " then func_type = ""; end;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 if info.short_src == "[C]" then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 line = "[ C ] "..func_type.."C function "..(info.name and ("%q"):format(info.name) or "(unknown name)")
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 elseif info.what == "main" then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131 line = "[Lua] "..info.short_src.." line "..info.currentline;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 else
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 local name = info.name or " ";
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 if name ~= " " then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 name = ("%q"):format(name);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 if func_type == "global " or func_type == "local " then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 func_type = func_type.."function ";
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 line = "[Lua] "..info.short_src.." line "..info.currentline.." in "..func_type..name.." defined on line "..info.linedefined;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 end
4521
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
142 if source_desc ~= last_source_desc then -- Venturing into a new source, add marker for previous
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
143 if last_source_desc then
4522
29f75c2af90e util.debug: Move optimal line length (default 65) into a variable
Matthew Wild <mwild1@gmail.com>
parents: 4521
diff changeset
144 local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc)/2));
4521
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
145 table.insert(lines, "\t ^"..padding.." "..last_source_desc.." "..padding..(#last_source_desc%2==0 and "-^" or "^ "));
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
146 end
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
147 last_source_desc = source_desc;
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
148 end
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 nlevel = nlevel-1;
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 table.insert(lines, "\t"..(nlevel==0 and ">" or " ").."("..nlevel..") "..line);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 local npadding = (" "):rep(#tostring(nlevel));
4522
29f75c2af90e util.debug: Move optimal line length (default 65) into a variable
Matthew Wild <mwild1@gmail.com>
parents: 4521
diff changeset
152 local locals_str = string_from_var_table(level.locals, optimal_line_length, "\t "..npadding);
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153 if locals_str then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 table.insert(lines, "\t "..npadding.."Locals: "..locals_str);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 end
4522
29f75c2af90e util.debug: Move optimal line length (default 65) into a variable
Matthew Wild <mwild1@gmail.com>
parents: 4521
diff changeset
156 local upvalues_str = string_from_var_table(level.upvalues, optimal_line_length, "\t "..npadding);
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157 if upvalues_str then
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 table.insert(lines, "\t "..npadding.."Upvals: "..upvalues_str);
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 end
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 end
4521
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
161
4522
29f75c2af90e util.debug: Move optimal line length (default 65) into a variable
Matthew Wild <mwild1@gmail.com>
parents: 4521
diff changeset
162 local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc) / 2));
4521
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
163 table.insert(lines, "\t ^"..padding.." "..last_source_desc.." "..padding..(#last_source_desc%2==0 and "-^" or "^ "));
4c7495f7f543 util.debug: Add markers in the output when crossing source file boundaries
Matthew Wild <mwild1@gmail.com>
parents: 4520
diff changeset
164
4412
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 return message.."stack traceback:\n"..table.concat(lines, "\n");
5d7d9a60bc7f util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 end