diff --git a/README.html b/README.html index 6847f51b..6f5ac567 100644 --- a/README.html +++ b/README.html @@ -974,6 +974,7 @@ Files are no longer hosted at LuaForge.
  • collectgarbage() now behaves same as collectgarbage("collect") (fixes issue #41).
  • Allow access to Java inner classes using lua field syntax (fixes issue #40).
  • List keyeq() and keyindex() methods as abstract on LuaTable.Entry (issue #37).
  • +
  • Fix return value for table.remove() and table.insert() (issue #39)
  • diff --git a/src/core/org/luaj/vm2/lib/TableLib.java b/src/core/org/luaj/vm2/lib/TableLib.java index 2d07c5d4..76fc35e8 100644 --- a/src/core/org/luaj/vm2/lib/TableLib.java +++ b/src/core/org/luaj/vm2/lib/TableLib.java @@ -90,18 +90,23 @@ public class TableLib extends TwoArgFunction { } } - // "insert" (table, [pos,] value) -> prev-ele - static class insert extends TableLibFunction { - public LuaValue call(LuaValue list) { - return argerror(2, "value expected"); - } - public LuaValue call(LuaValue table, LuaValue value) { - table.checktable().insert(table.length()+1,value); - return NONE; - } - public LuaValue call(LuaValue table, LuaValue pos, LuaValue value) { - table.checktable().insert(pos.checkint(),value); - return NONE; + // "insert" (table, [pos,] value) + static class insert extends VarArgFunction { + public Varargs invoke(Varargs args) { + switch (args.narg()) { + case 0: case 1: { + return argerror(2, "value expected"); + } + case 2: { + LuaTable table = args.arg1().checktable(); + table.insert(table.length()+1,args.arg(2)); + return NONE; + } + default: { + args.arg1().checktable().insert(args.checkint(2),args.arg(3)); + return NONE; + } + } } } @@ -115,23 +120,22 @@ public class TableLib extends TwoArgFunction { } // "remove" (table [, pos]) -> removed-ele - static class remove extends TableLibFunction { - public LuaValue call(LuaValue list) { - return list.checktable().remove(0); - } - public LuaValue call(LuaValue list, LuaValue pos) { - return list.checktable().remove(pos.checkint()); + static class remove extends VarArgFunction { + public Varargs invoke(Varargs args) { + return args.arg1().checktable().remove(args.optint(2, 0)); } } // "sort" (table [, comp]) - static class sort extends TwoArgFunction { - public LuaValue call(LuaValue table, LuaValue compare) { - table.checktable().sort(compare.isnil()? NIL: compare.checkfunction()); + static class sort extends VarArgFunction { + public Varargs invoke(Varargs args) { + args.arg1().checktable().sort( + args.arg(2).isnil()? NIL: args.arg(2).checkfunction()); return NONE; } } + // "unpack", // (list [,i [,j]]) -> result1, ... static class unpack extends VarArgFunction { public Varargs invoke(Varargs args) { diff --git a/test/junit/org/luaj/vm2/FragmentsTest.java b/test/junit/org/luaj/vm2/FragmentsTest.java index 0e21f22e..b80b7c80 100644 --- a/test/junit/org/luaj/vm2/FragmentsTest.java +++ b/test/junit/org/luaj/vm2/FragmentsTest.java @@ -594,5 +594,11 @@ public class FragmentsTest extends TestSuite { public void testBalancedMatchOnEmptyString() { runFragment(LuaValue.NIL, "return (\"\"):match(\"%b''\")\n"); } + public void testReturnValueForTableRemove() { + runFragment(LuaValue.NONE, "return table.remove({ })"); + } + public void testTypeOfTableRemoveReturnValue() { + runFragment(LuaValue.valueOf("nil"), "local k = table.remove({ }) return type(k)"); + } } }