From e898c683046c6ed14c3f3565418578661b986821 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Fri, 13 Jan 2012 15:46:36 +0000 Subject: util.debug: Adjust level within get_locals_table() to account for the additional depth of this function itself --- util/debug.lua | 1 + 1 file changed, 1 insertion(+) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index 22d02bf2..2170a6d1 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -9,6 +9,7 @@ local censored_names = { }; local function get_locals_table(level) + level = level + 1; -- Skip this function itself local locals = {}; for local_num = 1, math.huge do local name, value = debug.getlocal(level, local_num); -- cgit v1.2.3 From 995f757ab22f6c4bfbba4eb41d337a5314ef9086 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 22 Mar 2012 15:07:27 +0000 Subject: util.debug: Attempt to get debug.traceback() parameter handling correct (again) --- util/debug.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index 2170a6d1..f70e20dd 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -95,7 +95,11 @@ function debug.traceback(thread, message, level) if level and type(message) ~= "string" then return nil, "invalid message"; elseif not level then - level = message or 2; + if type(message) == "number" then + level, message = message, nil; + else + level = 2; + end end message = message and (message.."\n") or ""; -- cgit v1.2.3 From 5030d1d07c3cd2d9ec1770630f6b6e3ab3565233 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 22 Mar 2012 15:08:21 +0000 Subject: util.debug: Add catch for an "error in error handling" --- util/debug.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index f70e20dd..9fd0f9dd 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -88,7 +88,15 @@ function get_traceback_table(thread, start_level) return levels; end -function debug.traceback(thread, message, level) +function debug.traceback(...) + local ok, ret = pcall(debug._traceback, ...); + if not ok then + return "Error in error handling: "..ret; + end + return ret; +end + +function debug._traceback(thread, message, level) if type(thread) ~= "thread" then thread, message, level = coroutine.running(), thread, message; end -- cgit v1.2.3 From b5ff9d70ddb8c214316f3b81abfb6567be8207d6 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 22 Mar 2012 15:09:37 +0000 Subject: util.debug: Add markers in the output when crossing source file boundaries --- util/debug.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index 9fd0f9dd..6df249c0 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -114,11 +114,14 @@ function debug._traceback(thread, message, level) local levels = get_traceback_table(thread, level+2); + local last_source_desc; + local lines = {}; for nlevel, level in ipairs(levels) do local info = level.info; local line = "..."; local func_type = info.namewhat.." "; + local source_desc = (info.short_src == "[C]" and "C code") or info.short_src or "Unknown"; if func_type == " " then func_type = ""; end; if info.short_src == "[C]" then line = "[ C ] "..func_type.."C function "..(info.name and ("%q"):format(info.name) or "(unknown name)") @@ -134,6 +137,13 @@ function debug._traceback(thread, message, level) end line = "[Lua] "..info.short_src.." line "..info.currentline.." in "..func_type..name.." defined on line "..info.linedefined; end + if source_desc ~= last_source_desc then -- Venturing into a new source, add marker for previous + if last_source_desc then + local padding = string.rep("-", math.floor(((65 - 6) - #last_source_desc)/2)); + table.insert(lines, "\t ^"..padding.." "..last_source_desc.." "..padding..(#last_source_desc%2==0 and "-^" or "^ ")); + end + last_source_desc = source_desc; + end nlevel = nlevel-1; table.insert(lines, "\t"..(nlevel==0 and ">" or " ").."("..nlevel..") "..line); local npadding = (" "):rep(#tostring(nlevel)); @@ -146,5 +156,9 @@ function debug._traceback(thread, message, level) table.insert(lines, "\t "..npadding.."Upvals: "..upvalues_str); end end + + local padding = string.rep("-", math.floor(((65 - 6) - #last_source_desc) / 2)); + table.insert(lines, "\t ^"..padding.." "..last_source_desc.." "..padding..(#last_source_desc%2==0 and "-^" or "^ ")); + return message.."stack traceback:\n"..table.concat(lines, "\n"); end -- cgit v1.2.3 From 9749a46686265099965e0107a41544cea2a9709d Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 22 Mar 2012 15:10:38 +0000 Subject: util.debug: Move optimal line length (default 65) into a variable --- util/debug.lua | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index 6df249c0..9b1c4853 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -7,6 +7,8 @@ local censored_names = { pass = true; pwd = true; }; +local optimal_line_length = 65; + local function get_locals_table(level) level = level + 1; -- Skip this function itself @@ -139,7 +141,7 @@ function debug._traceback(thread, message, level) end if source_desc ~= last_source_desc then -- Venturing into a new source, add marker for previous if last_source_desc then - local padding = string.rep("-", math.floor(((65 - 6) - #last_source_desc)/2)); + local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc)/2)); table.insert(lines, "\t ^"..padding.." "..last_source_desc.." "..padding..(#last_source_desc%2==0 and "-^" or "^ ")); end last_source_desc = source_desc; @@ -147,17 +149,17 @@ function debug._traceback(thread, message, level) nlevel = nlevel-1; table.insert(lines, "\t"..(nlevel==0 and ">" or " ").."("..nlevel..") "..line); local npadding = (" "):rep(#tostring(nlevel)); - local locals_str = string_from_var_table(level.locals, 65, "\t "..npadding); + local locals_str = string_from_var_table(level.locals, optimal_line_length, "\t "..npadding); if locals_str then table.insert(lines, "\t "..npadding.."Locals: "..locals_str); end - local upvalues_str = string_from_var_table(level.upvalues, 65, "\t "..npadding); + local upvalues_str = string_from_var_table(level.upvalues, optimal_line_length, "\t "..npadding); if upvalues_str then table.insert(lines, "\t "..npadding.."Upvals: "..upvalues_str); end end - local padding = string.rep("-", math.floor(((65 - 6) - #last_source_desc) / 2)); + local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc) / 2)); table.insert(lines, "\t ^"..padding.." "..last_source_desc.." "..padding..(#last_source_desc%2==0 and "-^" or "^ ")); return message.."stack traceback:\n"..table.concat(lines, "\n"); -- cgit v1.2.3 From c184f4b0a3def733aae82f438d7956bfed4b4cbb Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 22 Mar 2012 16:07:57 +0000 Subject: util.debug: Add a bit of colour --- util/debug.lua | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index 9b1c4853..9d76c795 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -9,6 +9,18 @@ local censored_names = { }; local optimal_line_length = 65; +local termcolours = require "util.termcolours"; +local getstring = termcolours.getstring; +local styles; +do + _ = termcolours.getstyle; + styles = { + boundary_padding = _("bright", "white"); + filename = _("bright", "blue"); + level_num = _("green"); + funcname = _("yellow"); + }; +end local function get_locals_table(level) level = level + 1; -- Skip this function itself @@ -98,6 +110,11 @@ function debug.traceback(...) return ret; end +local function build_source_boundary_marker(last_source_desc) + local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc)/2)); + return getstring(styles.boundary_padding, "^"..padding).." "..getstring(styles.filename, last_source_desc).." "..getstring(styles.boundary_padding, padding..(#last_source_desc%2==0 and "-^" or "^ ")); +end + function debug._traceback(thread, message, level) if type(thread) ~= "thread" then thread, message, level = coroutine.running(), thread, message; @@ -137,17 +154,16 @@ function debug._traceback(thread, message, level) if func_type == "global " or func_type == "local " then func_type = func_type.."function "; end - line = "[Lua] "..info.short_src.." line "..info.currentline.." in "..func_type..name.." defined on line "..info.linedefined; + line = "[Lua] "..info.short_src.." line "..info.currentline.." in "..func_type..getstring(styles.funcname, name).." defined on line "..info.linedefined; end if source_desc ~= last_source_desc then -- Venturing into a new source, add marker for previous if last_source_desc then - local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc)/2)); - table.insert(lines, "\t ^"..padding.." "..last_source_desc.." "..padding..(#last_source_desc%2==0 and "-^" or "^ ")); + table.insert(lines, "\t "..build_source_boundary_marker(last_source_desc)); end last_source_desc = source_desc; end nlevel = nlevel-1; - table.insert(lines, "\t"..(nlevel==0 and ">" or " ").."("..nlevel..") "..line); + table.insert(lines, "\t"..(nlevel==0 and ">" or " ")..getstring(styles.level_num, "("..nlevel..") ")..line); local npadding = (" "):rep(#tostring(nlevel)); local locals_str = string_from_var_table(level.locals, optimal_line_length, "\t "..npadding); if locals_str then @@ -159,8 +175,7 @@ function debug._traceback(thread, message, level) end end - local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc) / 2)); - table.insert(lines, "\t ^"..padding.." "..last_source_desc.." "..padding..(#last_source_desc%2==0 and "-^" or "^ ")); + table.insert(lines, "\t "..build_source_boundary_marker(last_source_desc)); return message.."stack traceback:\n"..table.concat(lines, "\n"); end -- cgit v1.2.3 From 68e02ef7ba78a64216670f1e37a947f12d807a10 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 22 Mar 2012 16:39:28 +0000 Subject: util.debug: Add a touch of colour to source locations --- util/debug.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index 9d76c795..d63dce1b 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -19,6 +19,7 @@ do filename = _("bright", "blue"); level_num = _("green"); funcname = _("yellow"); + location = _("yellow"); }; end @@ -143,9 +144,9 @@ function debug._traceback(thread, message, level) local source_desc = (info.short_src == "[C]" and "C code") or info.short_src or "Unknown"; if func_type == " " then func_type = ""; end; if info.short_src == "[C]" then - line = "[ C ] "..func_type.."C function "..(info.name and ("%q"):format(info.name) or "(unknown name)") + line = "[ C ] "..func_type.."C function "..getstring(styles.location, (info.name and ("%q"):format(info.name) or "(unknown name)")); elseif info.what == "main" then - line = "[Lua] "..info.short_src.." line "..info.currentline; + line = "[Lua] "..getstring(styles.location, info.short_src.." line "..info.currentline); else local name = info.name or " "; if name ~= " " then @@ -154,7 +155,7 @@ function debug._traceback(thread, message, level) if func_type == "global " or func_type == "local " then func_type = func_type.."function "; end - line = "[Lua] "..info.short_src.." line "..info.currentline.." in "..func_type..getstring(styles.funcname, name).." defined on line "..info.linedefined; + line = "[Lua] "..getstring(styles.location, info.short_src.." line "..info.currentline).." in "..func_type..getstring(styles.funcname, name).." (defined on line "..info.linedefined..")"; end if source_desc ~= last_source_desc then -- Venturing into a new source, add marker for previous if last_source_desc then -- cgit v1.2.3 From 6537bcfb9aeff46801c2e60ec691ac6e11b4e9b5 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 22 Mar 2012 16:51:39 +0000 Subject: util.debug: Move boundary markers to top of relevant sections of the stack trace (easier to follow) --- util/debug.lua | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index d63dce1b..3736dd34 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -113,7 +113,7 @@ end local function build_source_boundary_marker(last_source_desc) local padding = string.rep("-", math.floor(((optimal_line_length - 6) - #last_source_desc)/2)); - return getstring(styles.boundary_padding, "^"..padding).." "..getstring(styles.filename, last_source_desc).." "..getstring(styles.boundary_padding, padding..(#last_source_desc%2==0 and "-^" or "^ ")); + 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 ")); end function debug._traceback(thread, message, level) @@ -158,10 +158,8 @@ function debug._traceback(thread, message, level) line = "[Lua] "..getstring(styles.location, info.short_src.." line "..info.currentline).." in "..func_type..getstring(styles.funcname, name).." (defined on line "..info.linedefined..")"; end if source_desc ~= last_source_desc then -- Venturing into a new source, add marker for previous - if last_source_desc then - table.insert(lines, "\t "..build_source_boundary_marker(last_source_desc)); - end last_source_desc = source_desc; + table.insert(lines, "\t "..build_source_boundary_marker(last_source_desc)); end nlevel = nlevel-1; table.insert(lines, "\t"..(nlevel==0 and ">" or " ")..getstring(styles.level_num, "("..nlevel..") ")..line); @@ -176,7 +174,7 @@ function debug._traceback(thread, message, level) end end - table.insert(lines, "\t "..build_source_boundary_marker(last_source_desc)); +-- table.insert(lines, "\t "..build_source_boundary_marker(last_source_desc)); return message.."stack traceback:\n"..table.concat(lines, "\n"); end -- cgit v1.2.3 From 97f896be36bb265ae0bae619e6e580b88bc704bd Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Tue, 24 Apr 2012 18:53:50 +0100 Subject: util.debug: Turn into a real-ish module ('debugx'), and require you call use() to override debug.traceback() --- util/debug.lua | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index 2170a6d1..aeb710d7 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -8,7 +8,9 @@ local censored_names = { pwd = true; }; -local function get_locals_table(level) +module("debugx", package.seeall); + +function get_locals_table(level) level = level + 1; -- Skip this function itself local locals = {}; for local_num = 1, math.huge do @@ -19,7 +21,7 @@ local function get_locals_table(level) return locals; end -local function get_upvalues_table(func) +function get_upvalues_table(func) local upvalues = {}; if func then for upvalue_num = 1, math.huge do @@ -31,7 +33,7 @@ local function get_upvalues_table(func) return upvalues; end -local function string_from_var_table(var_table, max_line_len, indent_str) +function string_from_var_table(var_table, max_line_len, indent_str) local var_string = {}; local col_pos = 0; max_line_len = max_line_len or math.huge; @@ -88,7 +90,7 @@ function get_traceback_table(thread, start_level) return levels; end -function debug.traceback(thread, message, level) +function traceback(thread, message, level) if type(thread) ~= "thread" then thread, message, level = coroutine.running(), thread, message; end @@ -136,3 +138,9 @@ function debug.traceback(thread, message, level) end return message.."stack traceback:\n"..table.concat(lines, "\n"); end + +function use() + debug.traceback = traceback; +end + +return _M; -- cgit v1.2.3 From 451a2148c933454059be4e606efc35883b3803ad Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Wed, 25 Apr 2012 23:16:37 +0100 Subject: util.debug: Some more magic constant fiddling. Don't ask me. --- util/debug.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index 7caf21ce..16773cd1 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -88,9 +88,9 @@ function get_traceback_table(thread, start_level) for level = start_level, math.huge do local info; if thread then - info = debug.getinfo(thread, level); + info = debug.getinfo(thread, level+1); else - info = debug.getinfo(level); + info = debug.getinfo(level+1); end if not info then break; end @@ -128,13 +128,13 @@ function _traceback(thread, message, level) if type(message) == "number" then level, message = message, nil; else - level = 2; + level = 1; end end message = message and (message.."\n") or ""; - local levels = get_traceback_table(thread, level+2); + local levels = get_traceback_table(thread, level+3); local last_source_desc; -- cgit v1.2.3 From 481b7855063ecd203e83afea3284b09d7ce636bf Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Apr 2012 05:58:39 +0100 Subject: util.debug: Remove 'white' from boundary style (leave at default colour) --- util/debug.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index 16773cd1..1d3b5648 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -15,7 +15,7 @@ local styles; do _ = termcolours.getstyle; styles = { - boundary_padding = _("bright", "white"); + boundary_padding = _("bright"); filename = _("bright", "blue"); level_num = _("green"); funcname = _("yellow"); -- cgit v1.2.3 From 04a6860173205a9cb77d3441e1bb04191d3ab020 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Sat, 28 Apr 2012 16:20:26 +0100 Subject: util.debug: Re-fix parameter handling (I think it matches debug.traceback() more accurately now) and document level fudge --- util/debug.lua | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index 1d3b5648..321b3267 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -119,21 +119,26 @@ end function _traceback(thread, message, level) - if type(thread) ~= "thread" then + -- Lua manual says: debug.traceback ([thread,] [message [, level]]) + -- I fathom this to mean one of: + -- () + -- (thread) + -- (message, level) + -- (thread, message, level) + + if thread == nil then -- Defaults + thread, message, level = coroutine.running(), message, level; + elseif type(thread) == "string" then thread, message, level = coroutine.running(), thread, message; + elseif type(thread) ~= "thread" then + return nil; -- debug.traceback() does this end - if level and type(message) ~= "string" then - return nil, "invalid message"; - elseif not level then - if type(message) == "number" then - level, message = message, nil; - else - level = 1; - end - end - + + level = level or 1; + message = message and (message.."\n") or ""; + -- +3 counts for this function, and the pcall() and wrapper above us local levels = get_traceback_table(thread, level+3); local last_source_desc; -- cgit v1.2.3 From 463e2326d96ba1e9633da1222d46833108950d04 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Sat, 28 Apr 2012 16:21:19 +0100 Subject: util.debug: Add +1 to level when getting locals table, to account for current function --- util/debug.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'util/debug.lua') diff --git a/util/debug.lua b/util/debug.lua index 321b3267..bff0e347 100644 --- a/util/debug.lua +++ b/util/debug.lua @@ -97,7 +97,7 @@ function get_traceback_table(thread, start_level) levels[(level-start_level)+1] = { level = level; info = info; - locals = get_locals_table(level); + locals = get_locals_table(level+1); upvalues = get_upvalues_table(info.func); }; end -- cgit v1.2.3