mirror of
https://github.com/appgurueu/modlib.git
synced 2024-08-20 13:24:11 +02:00
Fix handling of cross-referencing tables
This commit is contained in:
parent
e49cbdf9ff
commit
27df865b6e
43
luon.lua
43
luon.lua
@ -40,7 +40,7 @@ function write(value, write)
|
|||||||
write";"
|
write";"
|
||||||
references[object] = ref
|
references[object] = ref
|
||||||
if type_ == "table" then
|
if type_ == "table" then
|
||||||
to_fill[object] = true
|
to_fill[object] = ref
|
||||||
end
|
end
|
||||||
increment_reference(1)
|
increment_reference(1)
|
||||||
end
|
end
|
||||||
@ -67,25 +67,7 @@ function write(value, write)
|
|||||||
local ref = references[value]
|
local ref = references[value]
|
||||||
if ref then
|
if ref then
|
||||||
-- Referenced
|
-- Referenced
|
||||||
if not to_fill[value] then
|
|
||||||
return write(ref)
|
return write(ref)
|
||||||
end
|
|
||||||
-- Fill table
|
|
||||||
to_fill[value] = false
|
|
||||||
for k, v in pairs(value) do
|
|
||||||
write(ref)
|
|
||||||
if is_short_key(k) then
|
|
||||||
write"."
|
|
||||||
write(k)
|
|
||||||
else
|
|
||||||
write"["
|
|
||||||
dump(k)
|
|
||||||
write"]"
|
|
||||||
end
|
|
||||||
write"="
|
|
||||||
dump(v)
|
|
||||||
write";"
|
|
||||||
end
|
|
||||||
elseif type_ == "string" then
|
elseif type_ == "string" then
|
||||||
return write(quote(value))
|
return write(quote(value))
|
||||||
elseif type_ == "table" then
|
elseif type_ == "table" then
|
||||||
@ -117,18 +99,25 @@ function write(value, write)
|
|||||||
error("unsupported type: " .. type_)
|
error("unsupported type: " .. type_)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
local fill_root = to_fill[value]
|
for table, ref in pairs(to_fill) do
|
||||||
if fill_root then
|
for k, v in pairs(table) do
|
||||||
-- Root table is circular, must return by named reference
|
write(ref)
|
||||||
dump(value)
|
if is_short_key(k) then
|
||||||
write"return "
|
write"."
|
||||||
write(references[value])
|
write(k)
|
||||||
else
|
else
|
||||||
-- Root table is not circular, can directly start writing
|
write"["
|
||||||
|
dump(k)
|
||||||
|
write"]"
|
||||||
|
end
|
||||||
|
write"="
|
||||||
|
dump(v)
|
||||||
|
write";"
|
||||||
|
end
|
||||||
|
end
|
||||||
write"return "
|
write"return "
|
||||||
dump(value)
|
dump(value)
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
function write_file(value, file)
|
function write_file(value, file)
|
||||||
return write(value, function(text)
|
return write(value, function(text)
|
||||||
|
6
test.lua
6
test.lua
@ -195,6 +195,12 @@ local function serializer_test(assert_preserves)
|
|||||||
mixed.vec2 = modlib.table.copy(mixed.vec)
|
mixed.vec2 = modlib.table.copy(mixed.vec)
|
||||||
mixed.blah = "blah"
|
mixed.blah = "blah"
|
||||||
assert_preserves(mixed)
|
assert_preserves(mixed)
|
||||||
|
local a, b, c = {}, {}, {}
|
||||||
|
a[a] = a; a[b] = b; a[c] = c;
|
||||||
|
b[a] = a; b[b] = b; b[c] = c;
|
||||||
|
c[a] = a; c[b] = b; c[c] = c;
|
||||||
|
a.a = {"a", a = a}
|
||||||
|
assert_preserves(a)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- bluon
|
-- bluon
|
||||||
|
Loading…
Reference in New Issue
Block a user