98 lines
2.9 KiB
Lua
98 lines
2.9 KiB
Lua
if not debug then
|
|
-- stubs
|
|
debug = {}
|
|
debug.traceback = function() return "" end
|
|
return
|
|
end
|
|
|
|
-- Override debug.traceback.
|
|
function debug.traceback(...)
|
|
local thread = coroutine.running()
|
|
local msg = ""
|
|
local level = 1
|
|
local args = {...}
|
|
|
|
if type(args[1]) == "thread" then
|
|
thread = args[1]
|
|
table.remove(args)
|
|
end
|
|
if type(args[1]) == "string" then
|
|
msg = args[1]
|
|
table.remove(args)
|
|
end
|
|
if type(args[1]) == "number" then
|
|
level = args[1]
|
|
table.remove(args)
|
|
end
|
|
|
|
if thread == coroutine.running() then
|
|
level = level + 1 -- skip this function
|
|
end
|
|
|
|
local stack = {}
|
|
repeat
|
|
local info = debug.getinfo(level, "Sln")
|
|
table.insert( stack, info )
|
|
level = level + 1
|
|
until not info
|
|
|
|
if #stack == 0 then
|
|
return ""
|
|
end
|
|
|
|
-- The original caller is usually C; remove it.
|
|
if( stack[#stack].what == "C" ) then
|
|
table.remove( stack )
|
|
end
|
|
local function FormatFrame(level, frame)
|
|
local sFrameInfo = ""
|
|
sFrameInfo = sFrameInfo .. "#" .. level .. " "
|
|
if( frame.what == "tail" ) then
|
|
-- sFrameInfo = sFrameInfo .. "(tail call)"
|
|
-- return sFrameInfo
|
|
elseif( frame.what == "main" ) then
|
|
sFrameInfo = sFrameInfo .. "main in "
|
|
elseif frame.name then
|
|
sFrameInfo = sFrameInfo .. frame.name .. "() in "
|
|
else
|
|
sFrameInfo = sFrameInfo .. "... in "
|
|
end
|
|
sFrameInfo = sFrameInfo .. frame.short_src
|
|
|
|
if frame.currentline ~= -1 then
|
|
sFrameInfo = sFrameInfo .. ":" .. frame.currentline
|
|
end
|
|
|
|
return sFrameInfo
|
|
end
|
|
|
|
local FrameInfo = {}
|
|
for level, frame in ipairs(stack) do
|
|
FrameInfo[level] = FormatFrame(level, frame)
|
|
end
|
|
return table.concat( FrameInfo, "\n" )
|
|
end
|
|
|
|
-- (c) 2006 Glenn Maynard
|
|
-- All rights reserved.
|
|
--
|
|
-- Permission is hereby granted, free of charge, to any person obtaining a
|
|
-- copy of this software and associated documentation files (the
|
|
-- "Software"), to deal in the Software without restriction, including
|
|
-- without limitation the rights to use, copy, modify, merge, publish,
|
|
-- distribute, and/or sell copies of the Software, and to permit persons to
|
|
-- whom the Software is furnished to do so, provided that the above
|
|
-- copyright notice(s) and this permission notice appear in all copies of
|
|
-- the Software and that both the above copyright notice(s) and this
|
|
-- permission notice appear in supporting documentation.
|
|
--
|
|
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
-- THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
|
-- INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
|
-- OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
-- OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
-- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
-- PERFORMANCE OF THIS SOFTWARE.
|