diff options
author | Matthew Wild <mwild1@gmail.com> | 2010-12-17 13:50:33 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2010-12-17 13:50:33 +0000 |
commit | 8ee0fb71fcba10a54760d4a047a4a91e2ab97ad1 (patch) | |
tree | 08ff2f81be281c7d1f399e2e3ff5b74f1671b77b /util/serialization.lua | |
parent | c1efda1ffd82e6988ab20b4be5f75ecf31fb551e (diff) | |
parent | 07e945631dc2abe7a2afe204919a72d25398c687 (diff) | |
download | prosody-8ee0fb71fcba10a54760d4a047a4a91e2ab97ad1.tar.gz prosody-8ee0fb71fcba10a54760d4a047a4a91e2ab97ad1.zip |
Merge Tobias->trunk
Diffstat (limited to 'util/serialization.lua')
-rw-r--r-- | util/serialization.lua | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/util/serialization.lua b/util/serialization.lua index bad2fe43..e193b64f 100644 --- a/util/serialization.lua +++ b/util/serialization.lua @@ -15,6 +15,10 @@ local error = error; local pairs = pairs; local next = next; +local loadstring = loadstring; +local setfenv = setfenv; +local pcall = pcall; + local debug_traceback = debug.traceback; local log = require "util.logger".init("serialization"); module "serialization" @@ -24,14 +28,20 @@ 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 @@ -72,7 +82,14 @@ function serialize(o) end function deserialize(str) - error("Not implemented"); + if type(str) ~= "string" then return nil; end + str = "return "..str; + local f, err = loadstring(str, "@data"); + if not f then return nil, err; end + setfenv(f, {}); + local success, ret = pcall(f); + if not success then return nil, ret; end + return ret; end return _M; |