Skip to content

Commit 5884321

Browse files
committed
Fix table.merge for array-based tables.
1 parent 5174a98 commit 5884321

File tree

2 files changed

+35
-8
lines changed

2 files changed

+35
-8
lines changed

src/base/table.lua

+12-8
Original file line numberDiff line numberDiff line change
@@ -373,18 +373,22 @@
373373
local result = {}
374374
local arg = {...}
375375
for _,t in ipairs(arg) do
376-
377376
if type(t) == "table" then
378-
for k,v in pairs(t) do
379-
if type(result[k]) == "table" and type(v) == "table" then
380-
result[k] = table.merge(result[k], v)
381-
else
382-
result[k] = v
377+
if #t > 0 then -- Array-based table
378+
for i = 1, #t do
379+
table.insert(result, t[i])
380+
end
381+
else -- Key-value table
382+
for k, v in pairs(t) do
383+
if type(result[k]) == "table" and type(v) == "table" then
384+
result[k] = table.merge(result[k], v)
385+
else
386+
result[k] = v
387+
end
383388
end
384389
end
385-
386390
else
387-
error("invalid value")
391+
error("invalid value, expected table")
388392
end
389393
end
390394

tests/base/test_table.lua

+23
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,26 @@
9595
test.istrue(t[4] == 5)
9696
test.istrue(t[5] == 8)
9797
end
98+
99+
--
100+
-- table.merge() tests
101+
--
102+
103+
function suite.merge()
104+
t = { "a", "b" }
105+
t2 = { "c", "d" }
106+
test.isequal({ "a", "b", "c", "d" }, table.merge(t, t2))
107+
108+
t = { "a", "b" }
109+
t2 = { "c", "d", { "e" } }
110+
test.isequal({ "a", "b", "c", "d", { "e" } }, table.merge(t, t2))
111+
112+
t = { a = 1, b = 2 }
113+
t2 = { c = 3, d = 4 }
114+
test.isequal({ a = 1, b = 2, c = 3, d = 4 }, table.merge(t, t2))
115+
116+
t = { a = 1, b = 2 }
117+
t2 = { c = 3, d = 4, e = { a = 5 } }
118+
print(table.tostring(table.merge(t, t2), 2))
119+
test.isequal({ a = 1, b = 2, c = 3, d = 4, e = { a = 5 } }, table.merge(t, t2))
120+
end

0 commit comments

Comments
 (0)