]> git.lizzy.rs Git - minetest.git/blobdiff - builtin/common/serialize.lua
Fix ignored mod.conf mod name for world.mt (broken by e8eaab6)
[minetest.git] / builtin / common / serialize.lua
index 1054f8eacc5c74ece17fc030f6d97ea9a318aebe..692ddd5f0f132c37bca0967f947ea87f9e56a64e 100644 (file)
@@ -104,7 +104,7 @@ function core.serialize(x)
                local i = local_index
                local_index = local_index + 1
                var = "_["..i.."]"
-               table.insert(local_defs, var.." = "..val)
+               local_defs[#local_defs + 1] = var.." = "..val
                dumped[x] = var
                return var
        end
@@ -115,41 +115,49 @@ function core.serialize(x)
        function dump_val(x)
                local  tp = type(x)
                if     x  == nil        then return "nil"
-               elseif tp == "number"   then return tostring(x)
                elseif tp == "string"   then return string.format("%q", x)
                elseif tp == "boolean"  then return x and "true" or "false"
                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
                elseif tp == "table" then
                        local vals = {}
                        local idx_dumped = {}
                        local np = nest_points[x]
                        for i, v in ipairs(x) do
                                if not np or not np[i] then
-                                       table.insert(vals, dump_or_ref_val(v))
+                                       vals[#vals + 1] = dump_or_ref_val(v)
                                end
                                idx_dumped[i] = true
                        end
                        for k, v in pairs(x) do
                                if (not np or not np[k]) and
                                                not idx_dumped[k] then
-                                       table.insert(vals,
-                                               "["..dump_or_ref_val(k).."] = "
-                                               ..dump_or_ref_val(v))
+                                       vals[#vals + 1] = "["..dump_or_ref_val(k).."] = "
+                                               ..dump_or_ref_val(v)
                                end
                        end
                        return "{"..table.concat(vals, ", ").."}"
                else
-                       error("Can't serialize data of type "..t)
+                       error("Can't serialize data of type "..tp)
                end
        end
 
        local function dump_nest_points()
                for parent, vals in pairs(nest_points) do
                        for k, v in pairs(vals) do
-                               table.insert(local_defs, dump_or_ref_val(parent)
+                               local_defs[#local_defs + 1] = dump_or_ref_val(parent)
                                        .."["..dump_or_ref_val(k).."] = "
-                                       ..dump_or_ref_val(v))
+                                       ..dump_or_ref_val(v)
                        end
                end
        end
@@ -178,6 +186,10 @@ local safe_env = {
 }
 
 function core.deserialize(str, safe)
+       if type(str) ~= "string" then
+               return nil, "Cannot deserialize type '"..type(str)
+                       .."'. Argument must be a string."
+       end
        if str:byte(1) == 0x1B then
                return nil, "Bytecode prohibited"
        end