Comparison

util/debug.lua @ 4680:8834f220ab91

util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback()
author Matthew Wild <mwild1@gmail.com>
date Tue, 24 Apr 2012 18:53:50 +0100
parent 4465:41c4252526bd
child 4684:dc70c4ffb66d
comparison
equal deleted inserted replaced
4679:5b52b5eaa03d 4680:8834f220ab91
6 passwd = true; 6 passwd = true;
7 pass = true; 7 pass = true;
8 pwd = true; 8 pwd = true;
9 }; 9 };
10 10
11 local function get_locals_table(level) 11 module("debugx", package.seeall);
12
13 function get_locals_table(level)
12 level = level + 1; -- Skip this function itself 14 level = level + 1; -- Skip this function itself
13 local locals = {}; 15 local locals = {};
14 for local_num = 1, math.huge do 16 for local_num = 1, math.huge do
15 local name, value = debug.getlocal(level, local_num); 17 local name, value = debug.getlocal(level, local_num);
16 if not name then break; end 18 if not name then break; end
17 table.insert(locals, { name = name, value = value }); 19 table.insert(locals, { name = name, value = value });
18 end 20 end
19 return locals; 21 return locals;
20 end 22 end
21 23
22 local function get_upvalues_table(func) 24 function get_upvalues_table(func)
23 local upvalues = {}; 25 local upvalues = {};
24 if func then 26 if func then
25 for upvalue_num = 1, math.huge do 27 for upvalue_num = 1, math.huge do
26 local name, value = debug.getupvalue(func, upvalue_num); 28 local name, value = debug.getupvalue(func, upvalue_num);
27 if not name then break; end 29 if not name then break; end
29 end 31 end
30 end 32 end
31 return upvalues; 33 return upvalues;
32 end 34 end
33 35
34 local function string_from_var_table(var_table, max_line_len, indent_str) 36 function string_from_var_table(var_table, max_line_len, indent_str)
35 local var_string = {}; 37 local var_string = {};
36 local col_pos = 0; 38 local col_pos = 0;
37 max_line_len = max_line_len or math.huge; 39 max_line_len = max_line_len or math.huge;
38 indent_str = "\n"..(indent_str or ""); 40 indent_str = "\n"..(indent_str or "");
39 for _, var in ipairs(var_table) do 41 for _, var in ipairs(var_table) do
86 }; 88 };
87 end 89 end
88 return levels; 90 return levels;
89 end 91 end
90 92
91 function debug.traceback(thread, message, level) 93 function traceback(thread, message, level)
92 if type(thread) ~= "thread" then 94 if type(thread) ~= "thread" then
93 thread, message, level = coroutine.running(), thread, message; 95 thread, message, level = coroutine.running(), thread, message;
94 end 96 end
95 if level and type(message) ~= "string" then 97 if level and type(message) ~= "string" then
96 return nil, "invalid message"; 98 return nil, "invalid message";
134 table.insert(lines, "\t "..npadding.."Upvals: "..upvalues_str); 136 table.insert(lines, "\t "..npadding.."Upvals: "..upvalues_str);
135 end 137 end
136 end 138 end
137 return message.."stack traceback:\n"..table.concat(lines, "\n"); 139 return message.."stack traceback:\n"..table.concat(lines, "\n");
138 end 140 end
141
142 function use()
143 debug.traceback = traceback;
144 end
145
146 return _M;