X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Fserialization.lua;h=8a259184c61b715326b03d176e95a6e5d56e60fe;hb=14b46085cf72301a35aaa02b9e25aef440994928;hp=2a1fad029f7ba53122076b262965958d10f6ece6;hpb=6b328d3660ebb9a61009e911f5a79206d4e5d513;p=prosody.git diff --git a/util/serialization.lua b/util/serialization.lua index 2a1fad02..8a259184 100644 --- a/util/serialization.lua +++ b/util/serialization.lua @@ -1,6 +1,6 @@ -- Prosody IM --- Copyright (C) 2008-2009 Matthew Wild --- Copyright (C) 2008-2009 Waqas Hussain +-- Copyright (C) 2008-2010 Matthew Wild +-- Copyright (C) 2008-2010 Waqas Hussain -- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. @@ -15,8 +15,13 @@ local error = error; local pairs = pairs; local next = next; +local loadstring = loadstring; +local pcall = pcall; + local debug_traceback = debug.traceback; local log = require "util.logger".init("serialization"); +local envload = require"util.envload".envload; + module "serialization" local indent = function(i) @@ -24,18 +29,24 @@ local indent = function(i) end local function basicSerialize (o) if type(o) == "number" or type(o) == "boolean" then - return tostring(o); + -- no need to check for NaN, as that's not a valid table index + if o == 1/0 then return "(1/0)"; + elseif o == -1/0 then return "(-1/0)"; + else return tostring(o); end else -- assume it is a string -- FIXME make sure it's a string. throw an error otherwise. return (("%q"):format(tostring(o)):gsub("\\\n", "\\n")); end end local function _simplesave(o, ind, t, func) if type(o) == "number" then - func(t, tostring(o)); + if o ~= o then func(t, "(0/0)"); + elseif o == 1/0 then func(t, "(1/0)"); + elseif o == -1/0 then func(t, "(-1/0)"); + else func(t, tostring(o)); end elseif type(o) == "string" then func(t, (("%q"):format(o):gsub("\\\n", "\\n"))); elseif type(o) == "table" then - if next(o) then + if next(o) ~= nil then func(t, "{\n"); for k,v in pairs(o) do func(t, indent(ind)); @@ -47,7 +58,7 @@ local function _simplesave(o, ind, t, func) else _simplesave(v, ind+1, t, func); end - func(t, ",\n"); + func(t, ";\n"); end func(t, indent(ind-1)); func(t, "}"); @@ -72,7 +83,13 @@ function serialize(o) end function deserialize(str) - error("Not implemented"); + if type(str) ~= "string" then return nil; end + str = "return "..str; + local f, err = envload(str, "@data", {}); + if not f then return nil, err; end + local success, ret = pcall(f); + if not success then return nil, ret; end + return ret; end return _M;