From 109fb52d1ab5794d1f1358e049d21e7442554958 Mon Sep 17 00:00:00 2001 From: "Johnny C. Lam" Date: Fri, 19 Jul 2013 05:33:24 +0000 Subject: [PATCH] Cache computed values of custom functions when evaluating the script. * Split out parsing AddFunction statements into its own function. * Functions declared using AddFunction compile into a new node type. The new node type "customfunction" has a single child node that points to the master node for the function. * Give the script an age depending on how many times it has been evaluated. Cache the computed values of custom function so that subsequent calls to the same function within the same script pull from the cached values instead of re-computing from scratch. This fixes ticket 271 in the right way. git-svn-id: svn://svn.curseforge.net/wow/ovale/mainline/trunk@977 d5049fe3-3747-40f7-a4b5-f36d6801af5f --- OvaleBestAction.lua | 17 +++++++++++++++++ OvaleCompile.lua | 27 +++++++++++++++++++-------- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/OvaleBestAction.lua b/OvaleBestAction.lua index 15d2df5..9e3599f 100644 --- a/OvaleBestAction.lua +++ b/OvaleBestAction.lua @@ -43,6 +43,9 @@ local API_IsUsableAction = IsUsableAction local API_IsUsableSpell = IsUsableSpell local OVALE_DEFAULT_PRIORITY = 3 + +-- Age of the current computation. +local self_serial = 0 -- -- @@ -196,6 +199,18 @@ local function ComputeCompare(element) return nil end +local function ComputeCustomFunction(element) + Ovale:Logf("custom function %s", element.name) + local self = OvaleBestAction + if not element.serial or element.serial < self_serial then + element.startA, element.endA, element.priorityA, element.elementA = self:Compute(element.a) + element.serial = self_serial + else + Ovale:Logf("Using cached values for %s", element.name) + end + return element.startA, element.endA, element.priorityA, element.elementA +end + local function ComputeFromUntil(element) Ovale:Log("fromuntil") local self = OvaleBestAction @@ -676,6 +691,7 @@ local OVALE_COMPUTE_VISITOR = ["before"] = ComputeBefore, ["between"] = ComputeBetween, ["compare"] = ComputeCompare, + ["customfunction"] = ComputeCustomFunction, ["fromuntil"] = ComputeFromUntil, ["function"] = ComputeFunction, ["group"] = ComputeGroup, @@ -695,6 +711,7 @@ local OVALE_COMPUTE_VISITOR = function OvaleBestAction:StartNewAction() OvaleState:Reset() OvaleState:ApplyActiveSpells() + self_serial = self_serial + 1 end function OvaleBestAction:GetActionInfo(element) diff --git a/OvaleCompile.lua b/OvaleCompile.lua index 8608858..5bbaa17 100644 --- a/OvaleCompile.lua +++ b/OvaleCompile.lua @@ -617,11 +617,11 @@ local function ParseCommands(text) end end - local masterNode - if (text) then - masterNode = strmatch(text, "node(%d+)") + local nodeId + if text then + nodeId = strmatch(text, "node(%d+)") end - if (not masterNode) then + if not nodeId then Ovale:Print("no master node") return nil end @@ -633,7 +633,16 @@ local function ParseCommands(text) Ovale:FormatPrint("syntax error: %s", text) return nil end - return masterNode + return nodeId +end + +local function ParseAddFunction(name, text) + local nodeId = ParseCommands(text) + local node = self_pool:Get() + node.type = "customfunction" + node.name = name + node.a = self_node[tonumber(nodeId)] + return AddNode(node) end local function ParseAddIcon(params, text, secure) @@ -756,10 +765,10 @@ local function CompileScript(text) text = CompileDeclarations(text) text = CompileInputs(text) - for p,t in strgmatch(text, "AddFunction%s+(%w+)%s*(%b{})") do - local node = ParseCommands(t) + for name, t in strgmatch(text, "AddFunction%s+(%w+)%s*(%b{})") do + local node = ParseAddFunction(name, t) if node then - self_customFunctions[p] = "node"..node + self_customFunctions[name] = node end end @@ -886,6 +895,8 @@ function OvaleCompile:DebugNode(node) text = text .. k.."=" .. p .. " " end text = text .. ")" + elseif (node.type == "customfunction") then + text = self:DebugNode(node.a) elseif (node.type == "if") then text = "if "..self:DebugNode(node.a).." "..self:DebugNode(node.b) elseif (node.type == "unless") then -- 1.7.9.5