clean up some cruft from error callstacks

akkartik
Nov 11, 2023, 5:03 AM
5EU7N6E6XAIFJ5Q4ZLBPZADPH6Q2EZH3FBYNCBHBP7Y62O7CGKOAC

Dependencies

Change contents

  • replacement in main.lua at line 451
    [2.1239][3.2:110](),[3.11256][3.2:110](),[3.11642][3.291:330](),[3.330][2.1240:1314]()
    local stack_trace = debug.traceback('Error: ' .. tostring(err), --[[stack frame]]2):gsub('\n[^\n]+$', '')
    app.send_run_time_error(stack_trace)
    Error_message = 'Something is wrong. Sorry!\n\n'..stack_trace..'\n\n'..
    [2.1239]
    [2.1314]
    local callstack = debug.traceback('', --[[stack frame]]2)
    local cleaned_up_error = 'Error: ' .. cleaned_up_frame(tostring(err))..'\n'..cleaned_up_callstack(callstack)
    app.send_run_time_error(cleaned_up_error)
    Error_message = 'Something is wrong. Sorry!\n\n'..cleaned_up_error..'\n\n'..
  • edit in main.lua at line 467
    [3.11799]
    [3.11799]
    -- 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.
    -- It also strips out the numeric prefixes we introduce in filenames.
    function cleaned_up_callstack(callstack)
    local frames = {}
    for frame in string.gmatch(callstack, '[^\n]+\n*') do
    table.insert(frames, cleaned_up_frame(frame))
    end
    -- the initial "stack traceback:" line was unindented and remains so
    return table.concat(frames, '\n\t')
    end
    function cleaned_up_frame(frame)
    local line = frame:gsub('^%s*(.-)\n?$', '%1')
    local filename, rest = line:match('([^:]*):(.*)')
    return cleaned_up_filename(filename)..':'..rest
    end
    function cleaned_up_filename(filename)
    -- pass through frames that don't match this format
    -- this includes the initial line "stack traceback:"
    local core_filename = filename:match('^%[string "(.*)"%]$')
    if core_filename == nil then return filename end
    -- strip out the numeric prefixes we introduce in filenames
    local _, core_filename2 = core_filename:match('^(%d+)-(.+)')
    return core_filename2 or core_filename
    end