Skip to content

Commit

Permalink
minetest.serialize: Reversible number serialization (#9722)
Browse files Browse the repository at this point in the history
* minetest.serialize: Reversible number to string conversion

The %a format is not supported in Lua 5.1.
This commit also adds two tests for number serialization.
  • Loading branch information
HybridDog committed Apr 22, 2020
1 parent 4361bfc commit 5355cb1
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 9 deletions.
11 changes: 2 additions & 9 deletions builtin/common/serialize.lua
Original file line number Diff line number Diff line change
Expand Up @@ -120,15 +120,8 @@ function core.serialize(x)
elseif tp == "function" then
return string.format("loadstring(%q)", string.dump(x))
elseif tp == "number" then
-- Serialize integers with string.format to prevent
-- scientific notation, which doesn't preserve
-- precision and breaks things like node position
-- hashes. Serialize floats normally.
if math.floor(x) == x then
return string.format("%d", x)
else
return tostring(x)
end
-- Serialize numbers reversibly with string.format
return string.format("%.17g", x)
elseif tp == "table" then
local vals = {}
local idx_dumped = {}
Expand Down
12 changes: 12 additions & 0 deletions builtin/common/tests/serialize_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,18 @@ describe("serialize", function()
assert.same(test_in, test_out)
end)

it("handles precise numbers", function()
local test_in = 0.2695949158945771
local test_out = core.deserialize(core.serialize(test_in))
assert.same(test_in, test_out)
end)

it("handles big integers", function()
local test_in = 269594915894577
local test_out = core.deserialize(core.serialize(test_in))
assert.same(test_in, test_out)
end)

it("handles recursive structures", function()
local test_in = { hello = "world" }
test_in.foo = test_in
Expand Down

0 comments on commit 5355cb1

Please sign in to comment.