From 4572dfe4a2fd41f3c631ba14ff6945308136ba61 Mon Sep 17 00:00:00 2001 From: "Johnny C. Lam" Date: Fri, 18 Jul 2014 15:34:52 -0400 Subject: [PATCH] Encapsulate and enhance the logging facility within Ovale.lua. Cap the number of lines held by the log to a maximum of 4096 (2^14) lines to prevent table overflows causing memory allocation errors. This fixes the following tickets: ticket 392 by @ggrider ticket 396 by @sparrowlab --- Ovale.lua | 32 ++++++++++++++++++++++++++++---- OvaleOptions.lua | 7 ++----- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/Ovale.lua b/Ovale.lua index b0ce159..97e2b1b 100644 --- a/Ovale.lua +++ b/Ovale.lua @@ -22,6 +22,7 @@ local pairs = pairs local select = select local tconcat = table.concat local tostring = tostring +local unpack = unpack local wipe = table.wipe local API_GetTime = GetTime local API_IsInGroup = IsInGroup @@ -44,6 +45,10 @@ local OVALE_MSG_PREFIX = addonName local self_bug = false -- If "traced" flag is set, then the public "trace" property is toggled before the next frame refresh. local self_traced = false +-- Table of lines output using Log() or Logf() methods. +local self_traceLog = {} +-- Maximum length of the trace log. +local OVALE_TRACELOG_MAXLINES = 4096 -- 2^14 -- Table of strings to display once per session. local self_oneTimeMessage = {} -- @@ -63,7 +68,6 @@ Ovale.checkBoxWidget = {} Ovale.listWidget = {} -- Flag to activate tracing the function calls for the next frame refresh. Ovale.trace = false -Ovale.traceLog = {} --in combat? Ovale.enCombat = false Ovale.refreshNeeded = {} @@ -398,17 +402,37 @@ end function Ovale:Log(...) if self.trace then - local output = { ... } - self.traceLog[#self.traceLog + 1] = tconcat(output, "\t") + local N = #self_traceLog + if N < OVALE_TRACELOG_MAXLINES - 1 then + local output = { ... } + self_traceLog[N + 1] = tconcat(output, "\t") + elseif N == OVALE_TRACELOG_MAXLINES - 1 then + self_traceLog[N + 1] = "WARNING: Maximum length of trace log has been reached." + end end end function Ovale:Logf(...) + local N = #self_traceLog if self.trace then - self.traceLog[#self.traceLog + 1] = self:Format(...) + if N < OVALE_TRACELOG_MAXLINES - 1 then + self_traceLog[N + 1] = self:Format(...) + elseif N == OVALE_TRACELOG_MAXLINES - 1 then + self_traceLog[N + 1] = "WARNING: Maximum length of trace log has been reached." + end end end +-- Reset/empty the contents of the trace log. +function Ovale:ClearLog() + wipe(self_traceLog) +end + +-- Return the contents of the trace log as a string. +function Ovale:TraceLog() + return tconcat(self_traceLog, "\n") +end + function Ovale:OneTimeMessage(...) local s = Ovale:Format(...) if not self_oneTimeMessage[s] then diff --git a/OvaleOptions.lua b/OvaleOptions.lua index c35b13e..523755f 100644 --- a/OvaleOptions.lua +++ b/OvaleOptions.lua @@ -25,9 +25,6 @@ local OvaleState = nil local format = string.format local strgmatch = string.gmatch local strgsub = string.gsub -local tconcat = table.concat -local tostring = tostring -local wipe = table.wipe local API_GetSpellInfo = GetSpellInfo local API_GetTime = GetTime local API_UnitClass = UnitClass @@ -519,7 +516,7 @@ local self_options = type = "execute", name = "Trace next frame", func = function() - wipe(Ovale.traceLog) + Ovale:ClearLog() Ovale.trace = true Ovale:Logf("=== Trace @%f", API_GetTime()) end, @@ -591,7 +588,7 @@ local self_options = type = "input", multiline = 25, width = "full", - get = function() return tconcat(Ovale.traceLog, "\n") end, + get = function() return Ovale:TraceLog() end, }, }, }, -- 1.7.9.5