From 688de3368eab2dd01f633f9998d6e047cbe2b635 Mon Sep 17 00:00:00 2001 From: rxi Date: Fri, 14 Aug 2015 20:50:42 +0100 Subject: [PATCH] Lots of tweaks to lume.serialize(); circular reference detection --- lume.lua | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/lume.lua b/lume.lua index ae2dbbe..33ff0ef 100644 --- a/lume.lua +++ b/lume.lua @@ -536,19 +536,36 @@ function lume.lambda(str) end -function lume.serialize(x) - local f = { string = function(v) return string.format("%q", v) end, - number = tostring, boolean = tostring } - f.table = function(t) +local serialize + +local serializemap = { + [ "number" ] = tostring, + [ "boolean" ] = tostring, + [ "nil" ] = tostring, + [ "string" ] = function(v) return string.format("%q", v) end, + [ "table" ] = function(t, stk) + stk = stk or {} + if stk[t] then error("circular reference") end local rtn = {} + stk[t] = true for k, v in pairs(t) do - rtn[#rtn + 1] = "[" .. f[type(k)](k) .. "]=" .. f[type(v)](v) .. "," + rtn[#rtn + 1] = "[" .. serialize(k, stk) .. "]=" .. serialize(v, stk) end - return "{" .. table.concat(rtn) .. "}" + stk[t] = nil + return "{" .. table.concat(rtn, ",") .. "}" end - local err = function(t,k) error("unsupported serialize type: " .. k) end - setmetatable(f, { __index = err }) - return f[type(x)](x) +} + +setmetatable(serializemap, { + __index = function(t, k) error("unsupported serialize type: " .. k) end +}) + +serialize = function(x, stk) + return serializemap[type(x)](x, stk) +end + +function lume.serialize(x) + return serialize(x) end