From a6738b49c4744431e49e075239203f4da7c76de3 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Fri, 10 Nov 2023 08:41:56 -0800 Subject: [PATCH] clean up some cruft from error callstacks before: stack traceback: [string "text.lua"]:9: in function 'draw' [string "edit.lua"]:200: in function 'draw' [string "run.lua"]:140: in function 'draw' [string "main.lua"]:162: in function <[string "main.lua"]:155> [C]: in function 'xpcall' [string "app.lua"]:38: in function <[string "app.lua"]:20> [C]: in function 'xpcall' [love "boot.lua"]:370: in function <[love "boot.lua"]:337> after: stack traceback: text.lua:9: in function 'draw' edit.lua:200: in function 'draw' run.lua:140: in function 'draw' main.lua:162: in function <[string "main.lua"]:155> [C]: in function 'xpcall' app.lua:38: in function <[string "app.lua"]:20> [C]: in function 'xpcall' [love "boot.lua"]:370: in function <[love "boot.lua"]:337> --- app.lua | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/app.lua b/app.lua index 8068e3f..a2f1f78 100644 --- a/app.lua +++ b/app.lua @@ -43,7 +43,8 @@ function love.run() end function handle_error(err) - Error_message = debug.traceback('Error: ' .. tostring(err), --[[stack frame]]2) + local callstack = debug.traceback('', --[[stack frame]]2) + Error_message = 'Error: ' .. tostring(err)..'\n'..clean_up_callstack(callstack) print(Error_message) if Current_app == 'run' then Settings.current_app = 'source' @@ -56,6 +57,26 @@ function handle_error(err) end end +-- I tend to read code from files myself (say using love.filesystem calls) +-- rather than offload that to load(). +-- Functions compiled in this manner have ugly filenames of the form [string "filename"] +-- This function cleans out this cruft from error callstacks. +function clean_up_callstack(callstack) + local frames = {} + print(callstack) + for frame in string.gmatch(callstack, '[^\n]+\n*') do + local line = frame:gsub('^%s*(.-)\n?$', '%1') + local filename, rest = line:match('([^:]*):(.*)') + local core_filename = filename:match('^%[string "(.*)"%]$') + -- pass through frames that don't match this format + -- this includes the initial line "stack traceback:" + local new_frame = (core_filename or filename)..':'..rest + table.insert(frames, new_frame) + end + -- the initial "stack traceback:" line was unindented and remains so + return table.concat(frames, '\n\t') +end + -- The rest of this file wraps around various LÖVE primitives to support -- automated tests. Often tests will run with a fake version of a primitive -- that redirects to the real love.* version once we're done with tests.