From cc88228d25be36c97a2c743dedd15e4518695fc4 Mon Sep 17 00:00:00 2001
From: Lars Mueller <appgurulars@gmx.de>
Date: Mon, 5 Jul 2021 18:00:54 +0200
Subject: [PATCH] Lua log file: Fix handling of circular tables

---
 persistence.lua | 20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)

diff --git a/persistence.lua b/persistence.lua
index 525e469..a4fb408 100644
--- a/persistence.lua
+++ b/persistence.lua
@@ -106,7 +106,6 @@ function lua_log_file:_dump(value, is_key)
 	end
 	reference = self.reference_count + 1
 	local key = "R[" .. reference .."]"
-	local formatted
 	local function create_reference()
 		self.reference_count = reference
 		self.references[value] = reference
@@ -117,32 +116,29 @@ function lua_log_file:_dump(value, is_key)
 			-- Short key
 			return value, true
 		end
-		formatted = ("%q"):format(value)
+		local formatted = ("%q"):format(value)
 		if (not reference_strings) or formatted:len() <= key:len()  then
 			-- Short string
 			return formatted
 		end
 		-- Use reference
 		create_reference()
+		self:log(key .. "=" .. formatted)
 	elseif _type == "table" then
 		-- Tables always need a reference before they are traversed to prevent infinite recursion
 		create_reference()
-		local entries = {}
-		for _, value in ipairs(value) do
-			table.insert(entries, self:_dump(value))
-		end
+		-- TODO traverse tables to determine whether this is actually needed
+		self:log(key .. "={}")
 		local tablelen = #value
-		for key, value in pairs(value) do
-			if type(key) ~= "number" or key % 1 ~= 0 or key < 1 or key > tablelen then
-				local dumped, short = self:_dump(key, true)
-				table.insert(entries, (short and dumped or ("[" .. dumped .. "]")) .. "=" .. self:_dump(value))
+		for k, v in pairs(value) do
+			if type(k) ~= "number" or k % 1 ~= 0 or k < 1 or k > tablelen then
+				local dumped, short = self:_dump(k, true)
+				self:log(key .. (short and ("." .. dumped) or ("[" .. dumped .. "]")) .. "=" .. self:_dump(v))
 			end
 		end
-		formatted = "{" .. table.concat(entries, ";") .. "}"
 	else
 		error("unsupported type: " .. _type)
 	end
-	self:log(key .. "=" .. formatted)
 	return key
 end