Files
2011-03-17 01:47:30 -04:00

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.