diff --git a/src/core/org/luaj/vm/LTable.java b/src/core/org/luaj/vm/LTable.java index 5d275fe3..24ca9e70 100644 --- a/src/core/org/luaj/vm/LTable.java +++ b/src/core/org/luaj/vm/LTable.java @@ -568,6 +568,11 @@ public class LTable extends LValue { array = v; } + public void arrayPresize(int minSize) { + if ( array.length < minSize ) + arrayExpand(minSize); + } + // ============= Hashtable ================ public void hashSet(LValue key, Object value) { diff --git a/src/core/org/luaj/vm/LuaState.java b/src/core/org/luaj/vm/LuaState.java index 8748a8df..076c1a13 100644 --- a/src/core/org/luaj/vm/LuaState.java +++ b/src/core/org/luaj/vm/LuaState.java @@ -824,6 +824,7 @@ public class LuaState extends Lua { } int offset = (c-1) * LFIELDS_PER_FLUSH; LTable tbl = (LTable) this.stack[base + a]; + tbl.arrayPresize( offset + b ); for (int j=1; j<=b; j++) { tbl.put(offset+j, stack[listBase + j]); } diff --git a/src/test/res/table.lua b/src/test/res/table.lua index 2d7835ae..306f64ab 100644 --- a/src/test/res/table.lua +++ b/src/test/res/table.lua @@ -142,3 +142,21 @@ t[6] = 'six' testbothpairs(t) t[4] = nil testbothpairs(t) + +-- tests of setlist table constructors +local function a(...) return ... end +print('-',unpack({a()})) +print('a',unpack({a('a')})) +print('.',unpack({a(nil)})) +print('ab',unpack({a('a', 'b')})) +print('.b',unpack({a(nil, 'a')})) +print('a.',unpack({a('a', nil)})) +print('abc',unpack({a('a', 'b', 'c')})) +print('.ab',unpack({a(nil, 'a', 'b')})) +print('a.b',unpack({a('a', nil, 'b')})) +print('ab.',unpack({a('a', 'b', nil)})) +print('..b',unpack({a(nil, nil, 'b')})) +print('a..',unpack({a('a', nil, nil)})) +print('.b.',unpack({a(nil, 'b', nil)})) +print('...',unpack({a(nil, nil, nil)})) +