86 lines
2.8 KiB
Lua
86 lines
2.8 KiB
Lua
-- ------------------------------------------------------------------------------ --
|
|
-- 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
|