Harden shared hook helper state
This commit is contained in:
+23
-18
@@ -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
|
||||
Reference in New Issue
Block a user