# HG changeset patch # User Kim Alvefur # Date 1539296004 -7200 # Node ID c667887d78ad89cb3a4cd643d112490909aff084 # Parent 1d1541630c2033b9e5e0cc22fb4d42a3f021a9b2 util.serialization: Simpler metatable pre-processing It was too difficult to describe what it did. diff -r 1d1541630c20 -r c667887d78ad spec/util_serialization_spec.lua --- a/spec/util_serialization_spec.lua Thu Oct 11 23:00:45 2018 +0200 +++ b/spec/util_serialization_spec.lua Fri Oct 12 00:13:24 2018 +0200 @@ -44,6 +44,14 @@ test({foo={[100]={{"bar"},{baz=1}}}}); test({["goto"] = {["function"]={["do"]="keywords"}}}); end); + + it("can serialize with metatables", function () + local s = serialization.new({ freeze = true }); + local t = setmetatable({ a = "hi" }, { __freeze = function (t) return { t.a } end }); + local rt = serialization.deserialize(s(t)); + assert.same({"hi"}, rt); + end); + end); end); diff -r 1d1541630c20 -r c667887d78ad util/serialization.lua --- a/util/serialization.lua Thu Oct 11 23:00:45 2018 +0200 +++ b/util/serialization.lua Fri Oct 12 00:13:24 2018 +0200 @@ -139,25 +139,23 @@ end o[t] = true; - if freeze then + + if freeze == true then -- opportunity to do pre-serialization local mt = getmetatable(t); - local fr = (type(freeze) == "table" and freeze[mt]); - local mf = mt and mt.__freeze; - local tag; - if type(fr) == "string" then - tag = fr; - fr = mf; - elseif mt then - tag = mt.__type; - end - if type(fr) == "function" then - t = fr(t); - if type(tag) == "string" then - o[l], l = tag, l + 1; + if type(mt) == "table" then + local tag = mt.__name; + local fr = mt.__freeze; + + if type(fr) == "function" then + t = fr(t); + if type(tag) == "string" then + o[l], l = tag, l + 1; + end end end end + o[l], l = tstart, l + 1; local indent = s_rep(indentwith, d); local numkey = 1;