TradeSkillMaster/LibTSM/Util/Debug.lua

86 lines
2.8 KiB
Lua
Raw Permalink Normal View History

2020-11-13 14:13:12 -05:00
-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
--- Debug Functions
-- @module Debug
local _, TSM = ...
local Debug = TSM.Init("Util.Debug")
local private = {
startSystemTimeMs = floor(GetTime() * 1000),
startTimeMs = time() * 1000 + (floor(GetTime() * 1000) % 1000),
}
local ADDON_NAME_SHORTEN_PATTERN = {
-- shorten "TradeSkillMaster" to "TSM"
[".-lMaster\\"] = "TSM\\",
[".-r\\LibTSM"] = "TSM\\LibTSM",
}
local IGNORED_STACK_LEVEL_MATCHERS = {
-- ignore wrapper code from LibTSMClass
"LibTSMClass%.lua:",
}
-- ============================================================================
-- Module Functions
-- ============================================================================
--- Gets the current time in milliseconds since epoch
-- The time returned could be up to a second off absolutely, but relative times are guarenteed to be accurate.
-- @treturn number The current time in milliseconds since epoch
function Debug.GetTimeMilliseconds()
local systemTimeMs = floor(GetTime() * 1000)
return private.startTimeMs + (systemTimeMs - private.startSystemTimeMs)
end
--- Gets the location string for the specified stack level
-- @tparam number targetLevel The stack level to get the location for
-- @tparam[opt] thread thread The thread to get the location for
-- @treturn string The location string
function Debug.GetStackLevelLocation(targetLevel, thread)
targetLevel = targetLevel + 1
assert(targetLevel > 0)
local level = 1
while true do
local stackLine = nil
if thread then
stackLine = debugstack(thread, level, 1, 0)
else
stackLine = debugstack(level, 1, 0)
end
if not stackLine or stackLine == "" then
return
end
if TSM.IsWowClassic() or TSM.__IS_TEST_ENV then
stackLine = strmatch(stackLine, "^%.*([^:]+:%d+):")
else
local numSubs = nil
stackLine, numSubs = gsub(stackLine, "^%[string \"@([^%.]+%.lua)\"%](:%d+).*$", "%1%2")
stackLine = numSubs > 0 and stackLine or nil
end
if stackLine then
local ignored = false
for _, matchStr in ipairs(IGNORED_STACK_LEVEL_MATCHERS) do
if strmatch(stackLine, matchStr) then
ignored = true
break
end
end
if not ignored then
targetLevel = targetLevel - 1
if targetLevel == 0 then
stackLine = gsub(stackLine, "/", "\\")
for matchStr, replaceStr in pairs(ADDON_NAME_SHORTEN_PATTERN) do
stackLine = gsub(stackLine, matchStr, replaceStr)
end
return stackLine
end
end
end
level = level + 1
end
end