Software /
code /
prosody
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 |
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 |