author | Matthew Wild <mwild1@gmail.com> |
Tue, 24 Apr 2012 18:53:50 +0100 | |
changeset 4680 | 8834f220ab91 |
parent 4465 | 41c4252526bd |
child 4684 | dc70c4ffb66d |
permissions | -rw-r--r-- |
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 |
}; |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 |
|
4680
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
11 |
module("debugx", package.seeall); |
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
12 |
|
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
13 |
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 |
|
4680
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
24 |
function get_upvalues_table(func) |
4412
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 |
|
4680
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
36 |
function string_from_var_table(var_table, max_line_len, indent_str) |
4412
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 |
|
4680
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
93 |
function 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
|
94 |
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
|
95 |
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
|
96 |
end |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 |
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
|
98 |
return nil, "invalid message"; |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 |
elseif not level then |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 |
level = message or 2; |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 |
end |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 |
|
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 |
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
|
104 |
|
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 |
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
|
106 |
|
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 |
local lines = {}; |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 |
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
|
109 |
local info = level.info; |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 |
local line = "..."; |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 |
local func_type = info.namewhat.." "; |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 |
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
|
113 |
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
|
114 |
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
|
115 |
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
|
116 |
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
|
117 |
else |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 |
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
|
119 |
if name ~= " " then |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 |
name = ("%q"):format(name); |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 |
end |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 |
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
|
123 |
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
|
124 |
end |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 |
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
|
126 |
end |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 |
nlevel = nlevel-1; |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 |
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
|
129 |
local npadding = (" "):rep(#tostring(nlevel)); |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 |
local locals_str = string_from_var_table(level.locals, 65, "\t "..npadding); |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 |
if locals_str then |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 |
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
|
133 |
end |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 |
local upvalues_str = string_from_var_table(level.upvalues, 65, "\t "..npadding); |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 |
if upvalues_str then |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 |
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
|
137 |
end |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 |
end |
5d7d9a60bc7f
util.debug: Experimental new library for producing more extensive debug tracebacks
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 |
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
|
140 |
end |
4680
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
141 |
|
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
142 |
function use() |
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
143 |
debug.traceback = traceback; |
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
144 |
end |
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
145 |
|
8834f220ab91
util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
Matthew Wild <mwild1@gmail.com>
parents:
4465
diff
changeset
|
146 |
return _M; |