Software / code / prosody
Comparison
util/debug.lua @ 4523:d733bde93074
util.debug: Add a bit of colour
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Thu, 22 Mar 2012 16:07:57 +0000 |
| parent | 4522:29f75c2af90e |
| child | 4524:816c319a09d8 |
comparison
equal
deleted
inserted
replaced
| 4522:29f75c2af90e | 4523:d733bde93074 |
|---|---|
| 7 pass = true; | 7 pass = true; |
| 8 pwd = true; | 8 pwd = true; |
| 9 }; | 9 }; |
| 10 local optimal_line_length = 65; | 10 local optimal_line_length = 65; |
| 11 | 11 |
| 12 local termcolours = require "util.termcolours"; | |
| 13 local getstring = termcolours.getstring; | |
| 14 local styles; | |
| 15 do | |
| 16 _ = termcolours.getstyle; | |
| 17 styles = { | |
| 18 boundary_padding = _("bright", "white"); | |
| 19 filename = _("bright", "blue"); | |
| 20 level_num = _("green"); | |
| 21 funcname = _("yellow"); | |
| 22 }; | |
| 23 end | |
| 12 | 24 |
| 13 local function get_locals_table(level) | 25 local function get_locals_table(level) |
| 14 level = level + 1; -- Skip this function itself | 26 level = level + 1; -- Skip this function itself |
| 15 local locals = {}; | 27 local locals = {}; |
| 16 for local_num = 1, math.huge do | 28 for local_num = 1, math.huge do |
| 96 return "Error in error handling: "..ret; | 108 return "Error in error handling: "..ret; |
| 97 end | 109 end |
| 98 return ret; | 110 return ret; |
| 99 end | 111 end |
| 100 | 112 |
| 113 local function build_source_boundary_marker(last_source_desc) | |
| 114 local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc)/2)); | |
| 115 return getstring(styles.boundary_padding, "^"..padding).." "..getstring(styles.filename, last_source_desc).." "..getstring(styles.boundary_padding, padding..(#last_source_desc%2==0 and "-^" or "^ ")); | |
| 116 end | |
| 117 | |
| 101 function debug._traceback(thread, message, level) | 118 function debug._traceback(thread, message, level) |
| 102 if type(thread) ~= "thread" then | 119 if type(thread) ~= "thread" then |
| 103 thread, message, level = coroutine.running(), thread, message; | 120 thread, message, level = coroutine.running(), thread, message; |
| 104 end | 121 end |
| 105 if level and type(message) ~= "string" then | 122 if level and type(message) ~= "string" then |
| 135 name = ("%q"):format(name); | 152 name = ("%q"):format(name); |
| 136 end | 153 end |
| 137 if func_type == "global " or func_type == "local " then | 154 if func_type == "global " or func_type == "local " then |
| 138 func_type = func_type.."function "; | 155 func_type = func_type.."function "; |
| 139 end | 156 end |
| 140 line = "[Lua] "..info.short_src.." line "..info.currentline.." in "..func_type..name.." defined on line "..info.linedefined; | 157 line = "[Lua] "..info.short_src.." line "..info.currentline.." in "..func_type..getstring(styles.funcname, name).." defined on line "..info.linedefined; |
| 141 end | 158 end |
| 142 if source_desc ~= last_source_desc then -- Venturing into a new source, add marker for previous | 159 if source_desc ~= last_source_desc then -- Venturing into a new source, add marker for previous |
| 143 if last_source_desc then | 160 if last_source_desc then |
| 144 local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc)/2)); | 161 table.insert(lines, "\t "..build_source_boundary_marker(last_source_desc)); |
| 145 table.insert(lines, "\t ^"..padding.." "..last_source_desc.." "..padding..(#last_source_desc%2==0 and "-^" or "^ ")); | |
| 146 end | 162 end |
| 147 last_source_desc = source_desc; | 163 last_source_desc = source_desc; |
| 148 end | 164 end |
| 149 nlevel = nlevel-1; | 165 nlevel = nlevel-1; |
| 150 table.insert(lines, "\t"..(nlevel==0 and ">" or " ").."("..nlevel..") "..line); | 166 table.insert(lines, "\t"..(nlevel==0 and ">" or " ")..getstring(styles.level_num, "("..nlevel..") ")..line); |
| 151 local npadding = (" "):rep(#tostring(nlevel)); | 167 local npadding = (" "):rep(#tostring(nlevel)); |
| 152 local locals_str = string_from_var_table(level.locals, optimal_line_length, "\t "..npadding); | 168 local locals_str = string_from_var_table(level.locals, optimal_line_length, "\t "..npadding); |
| 153 if locals_str then | 169 if locals_str then |
| 154 table.insert(lines, "\t "..npadding.."Locals: "..locals_str); | 170 table.insert(lines, "\t "..npadding.."Locals: "..locals_str); |
| 155 end | 171 end |
| 157 if upvalues_str then | 173 if upvalues_str then |
| 158 table.insert(lines, "\t "..npadding.."Upvals: "..upvalues_str); | 174 table.insert(lines, "\t "..npadding.."Upvals: "..upvalues_str); |
| 159 end | 175 end |
| 160 end | 176 end |
| 161 | 177 |
| 162 local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc) / 2)); | 178 table.insert(lines, "\t "..build_source_boundary_marker(last_source_desc)); |
| 163 table.insert(lines, "\t ^"..padding.." "..last_source_desc.." "..padding..(#last_source_desc%2==0 and "-^" or "^ ")); | |
| 164 | 179 |
| 165 return message.."stack traceback:\n"..table.concat(lines, "\n"); | 180 return message.."stack traceback:\n"..table.concat(lines, "\n"); |
| 166 end | 181 end |