Software /
code /
prosody
Comparison
util/debug.lua @ 6777:5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 21 Feb 2015 10:36:37 +0100 |
parent | 5787:9a22586f67eb |
child | 7182:858ccafbd823 |
comparison
equal
deleted
inserted
replaced
6774:3965662ae091 | 6777:5de6b93d0190 |
---|---|
11 | 11 |
12 local termcolours = require "util.termcolours"; | 12 local termcolours = require "util.termcolours"; |
13 local getstring = termcolours.getstring; | 13 local getstring = termcolours.getstring; |
14 local styles; | 14 local styles; |
15 do | 15 do |
16 _ = termcolours.getstyle; | 16 local _ = termcolours.getstyle; |
17 styles = { | 17 styles = { |
18 boundary_padding = _("bright"); | 18 boundary_padding = _("bright"); |
19 filename = _("bright", "blue"); | 19 filename = _("bright", "blue"); |
20 level_num = _("green"); | 20 level_num = _("green"); |
21 funcname = _("yellow"); | 21 funcname = _("yellow"); |
22 location = _("yellow"); | 22 location = _("yellow"); |
23 }; | 23 }; |
24 end | 24 end |
25 module("debugx", package.seeall); | 25 |
26 | 26 local function get_locals_table(thread, level) |
27 function get_locals_table(thread, level) | |
28 local locals = {}; | 27 local locals = {}; |
29 for local_num = 1, math.huge do | 28 for local_num = 1, math.huge do |
30 local name, value; | 29 local name, value; |
31 if thread then | 30 if thread then |
32 name, value = debug.getlocal(thread, level, local_num); | 31 name, value = debug.getlocal(thread, level, local_num); |
37 table.insert(locals, { name = name, value = value }); | 36 table.insert(locals, { name = name, value = value }); |
38 end | 37 end |
39 return locals; | 38 return locals; |
40 end | 39 end |
41 | 40 |
42 function get_upvalues_table(func) | 41 local function get_upvalues_table(func) |
43 local upvalues = {}; | 42 local upvalues = {}; |
44 if func then | 43 if func then |
45 for upvalue_num = 1, math.huge do | 44 for upvalue_num = 1, math.huge do |
46 local name, value = debug.getupvalue(func, upvalue_num); | 45 local name, value = debug.getupvalue(func, upvalue_num); |
47 if not name then break; end | 46 if not name then break; end |
49 end | 48 end |
50 end | 49 end |
51 return upvalues; | 50 return upvalues; |
52 end | 51 end |
53 | 52 |
54 function string_from_var_table(var_table, max_line_len, indent_str) | 53 local function string_from_var_table(var_table, max_line_len, indent_str) |
55 local var_string = {}; | 54 local var_string = {}; |
56 local col_pos = 0; | 55 local col_pos = 0; |
57 max_line_len = max_line_len or math.huge; | 56 max_line_len = max_line_len or math.huge; |
58 indent_str = "\n"..(indent_str or ""); | 57 indent_str = "\n"..(indent_str or ""); |
59 for _, var in ipairs(var_table) do | 58 for _, var in ipairs(var_table) do |
85 else | 84 else |
86 return "{ "..table.concat(var_string, ", "):gsub(indent_str..", ", indent_str).." }"; | 85 return "{ "..table.concat(var_string, ", "):gsub(indent_str..", ", indent_str).." }"; |
87 end | 86 end |
88 end | 87 end |
89 | 88 |
90 function get_traceback_table(thread, start_level) | 89 local function get_traceback_table(thread, start_level) |
91 local levels = {}; | 90 local levels = {}; |
92 for level = start_level, math.huge do | 91 for level = start_level, math.huge do |
93 local info; | 92 local info; |
94 if thread then | 93 if thread then |
95 info = debug.getinfo(thread, level); | 94 info = debug.getinfo(thread, level); |
106 }; | 105 }; |
107 end | 106 end |
108 return levels; | 107 return levels; |
109 end | 108 end |
110 | 109 |
111 function traceback(...) | |
112 local ok, ret = pcall(_traceback, ...); | |
113 if not ok then | |
114 return "Error in error handling: "..ret; | |
115 end | |
116 return ret; | |
117 end | |
118 | |
119 local function build_source_boundary_marker(last_source_desc) | 110 local function build_source_boundary_marker(last_source_desc) |
120 local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc)/2)); | 111 local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc)/2)); |
121 return getstring(styles.boundary_padding, "v"..padding).." "..getstring(styles.filename, last_source_desc).." "..getstring(styles.boundary_padding, padding..(#last_source_desc%2==0 and "-v" or "v ")); | 112 return getstring(styles.boundary_padding, "v"..padding).." "..getstring(styles.filename, last_source_desc).." "..getstring(styles.boundary_padding, padding..(#last_source_desc%2==0 and "-v" or "v ")); |
122 end | 113 end |
123 | 114 |
124 function _traceback(thread, message, level) | 115 local function _traceback(thread, message, level) |
125 | 116 |
126 -- Lua manual says: debug.traceback ([thread,] [message [, level]]) | 117 -- Lua manual says: debug.traceback ([thread,] [message [, level]]) |
127 -- I fathom this to mean one of: | 118 -- I fathom this to mean one of: |
128 -- () | 119 -- () |
129 -- (thread) | 120 -- (thread) |
190 -- table.insert(lines, "\t "..build_source_boundary_marker(last_source_desc)); | 181 -- table.insert(lines, "\t "..build_source_boundary_marker(last_source_desc)); |
191 | 182 |
192 return message.."stack traceback:\n"..table.concat(lines, "\n"); | 183 return message.."stack traceback:\n"..table.concat(lines, "\n"); |
193 end | 184 end |
194 | 185 |
195 function use() | 186 local function traceback(...) |
187 local ok, ret = pcall(_traceback, ...); | |
188 if not ok then | |
189 return "Error in error handling: "..ret; | |
190 end | |
191 return ret; | |
192 end | |
193 | |
194 local function use() | |
196 debug.traceback = traceback; | 195 debug.traceback = traceback; |
197 end | 196 end |
198 | 197 |
199 return _M; | 198 return { |
199 get_locals_table = get_locals_table; | |
200 get_upvalues_table = get_upvalues_table; | |
201 string_from_var_table = string_from_var_table; | |
202 get_traceback_table = get_traceback_table; | |
203 traceback = traceback; | |
204 use = use; | |
205 }; |