about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2023-11-10 08:41:56 -0800
committerKartik K. Agaram <vc@akkartik.com>2023-11-10 08:41:56 -0800
commita6738b49c4744431e49e075239203f4da7c76de3 (patch)
tree0396a15bb179b569d056c9769f3c0e6bf008d47e
parent8b70258978aca917f3979ceba9030f1e4b84b954 (diff)
downloadlines.love-a6738b49c4744431e49e075239203f4da7c76de3.tar.gz
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>
-rw-r--r--app.lua23
1 files changed, 22 insertions, 1 deletions
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.