Harden shared hook helper state

This commit is contained in:
Dusk-92
2026-08-26 16:01:52 +02:00
parent 6f5ec7ffe6
commit 7aeaed6c5b
+23 -18
View File
@@ -1,17 +1,23 @@
local gfind = string.gmatch or string.gfind
local expansion
ShaguTweaks.GetExpansion = function()
if expansion then return expansion end
local _, _, _, client = GetBuildInfo()
client = client or 11200
-- detect client expansion
-- detect client expansion once; the client build cannot change during a
-- running session, so repeated helpers don't need to query it again.
if client >= 20000 and client <= 20400 then
return "tbc"
expansion = "tbc"
elseif client >= 30000 and client <= 30300 then
return "wotlk"
expansion = "wotlk"
else
return "vanilla"
expansion = "vanilla"
end
return expansion
end
ShaguTweaks.GetGlobalEnv = function()
@@ -84,32 +90,31 @@ ShaguTweaks.HookAddonOrVariable = function(addon, func)
end)
end
local hooks = {}
ShaguTweaks.hooksecurefunc = function(tbl, name, func, prepend)
if type(tbl) == "string" then
prepend, func, name, tbl = func, name, tbl, _G
end
if not tbl or not tbl[name] then return end
if not tbl or type(tbl[name]) ~= "function" or type(func) ~= "function" then return end
hooks[tostring(func)] = {}
hooks[tostring(func)]["old"] = tbl[name]
hooks[tostring(func)]["new"] = func
-- Capture each hook's state in its own closure. The old implementation keyed
-- shared state by tostring(func), so reusing the same callback for another
-- hook could overwrite the first wrapper's original function.
local old = tbl[name]
local new = func
if prepend then
hooks[tostring(func)]["function"] = function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
hooks[tostring(func)]["new"](a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
return hooks[tostring(func)]["old"](a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
tbl[name] = function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
new(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
return old(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
end
else
hooks[tostring(func)]["function"] = function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
local r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16 = hooks[tostring(func)]["old"](a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
hooks[tostring(func)]["new"](a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
tbl[name] = function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
local r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16 = old(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
new(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
return r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16
end
end
tbl[name] = hooks[tostring(func)]["function"]
end
local sanitize_cache = {}
@@ -446,4 +451,4 @@ ShaguTweaks.GetItemLinkByName = function(name)
return CacheItemLink(name, hyperLink)
end
end
end
end