diff --git a/src/main/java/lua/CallFrame.java b/src/main/java/lua/CallFrame.java index 8f4f0858..8e6ad251 100644 --- a/src/main/java/lua/CallFrame.java +++ b/src/main/java/lua/CallFrame.java @@ -367,15 +367,16 @@ public class CallFrame { case StackState.OP_SETLIST: { b = StackState.GETARG_B(i); c = StackState.GETARG_C(i); + int listBase = base + a; if (b == 0) { - b = top - 1; + b = top - listBase - 1; } if (c == 0) { c = code[pc++]; } table = this.stack[base + a]; for (int index = 1; index <= b; index++) { - val = this.stack[base + a + index]; + val = this.stack[listBase + index]; table.luaSetTable(this, this.state.avail, table, new LInteger(index), val); } diff --git a/src/test/java/lua/LuaJTest.java b/src/test/java/lua/LuaJTest.java index dcbb7957..dd15cc1b 100644 --- a/src/test/java/lua/LuaJTest.java +++ b/src/test/java/lua/LuaJTest.java @@ -51,6 +51,10 @@ public class LuaJTest extends TestCase { runTest( "upvalues2" ); } + public void testSetlist() throws IOException, InterruptedException { + runTest( "setlist" ); + } + private void runTest( String testName ) throws IOException, InterruptedException { // add LuaJava bindings LuaJava.install(); diff --git a/src/test/res/setlist.lua b/src/test/res/setlist.lua new file mode 100644 index 00000000..2a9ebbce --- /dev/null +++ b/src/test/res/setlist.lua @@ -0,0 +1,27 @@ +-- This file attemps to test that the setlist instruction works + +local list = { 1, 2, 3 } + +-- for now, can't just do: +-- for x, y in pairs( list ) do +-- since our tables don't iterate over keys in the same order +-- as regular Lua. + +print( #list ) +for i = 1, 3 do + print("list[", i, "]=", list[i]) +end + +local function printList( l ) + for i = 1, #l do + print(i, "->", l[i] ) + end +end + +printList( { "a", "b", "c" } ) + +local function foo() + return "d", "e", "f", "g" +end + +printList( { foo() } ) diff --git a/src/test/res/setlist.luac b/src/test/res/setlist.luac new file mode 100644 index 00000000..bb1cde93 Binary files /dev/null and b/src/test/res/setlist.luac differ