diff --git a/src/core/org/luaj/vm2/LuaTable.java b/src/core/org/luaj/vm2/LuaTable.java index b8fd9a29..df706230 100644 --- a/src/core/org/luaj/vm2/LuaTable.java +++ b/src/core/org/luaj/vm2/LuaTable.java @@ -303,6 +303,8 @@ public class LuaTable extends LuaValue { break; } } + if ( hashKeys.length == 0 ) + error( "invalid key to 'next'" ); i = hashFindSlot(key); if ( hashKeys[i] == null ) error( "invalid key to 'next'" ); diff --git a/src/core/org/luaj/vm2/LuaUserdata.java b/src/core/org/luaj/vm2/LuaUserdata.java index 2fc4040f..e0aaca1a 100644 --- a/src/core/org/luaj/vm2/LuaUserdata.java +++ b/src/core/org/luaj/vm2/LuaUserdata.java @@ -36,6 +36,10 @@ public class LuaUserdata extends LuaValue { m_metatable = metatable; } + public String toString() { + return String.valueOf(m_instance); + } + public int type() { return LuaValue.TUSERDATA; } diff --git a/src/core/org/luaj/vm2/LuaValue.java b/src/core/org/luaj/vm2/LuaValue.java index e379793f..022ceb3d 100644 --- a/src/core/org/luaj/vm2/LuaValue.java +++ b/src/core/org/luaj/vm2/LuaValue.java @@ -150,8 +150,8 @@ public class LuaValue extends Varargs { public static LuaValue error(int iarg, String message) { throw new LuaError("arg "+iarg+": "+message); } public static void assert_(boolean b,String msg) { if(!b) throw new LuaError(msg); } public static void argerror(int i,String msg) { throw new LuaError("arg "+i+": "+msg); } - protected LuaValue typerror(String expected) { throw new LuaError("expected "+expected+" got "+typename()); } - protected LuaValue typerror(int iarg, String expected) { throw new LuaError("arg "+iarg+": expected "+expected+" got "+typename()); } + protected LuaValue typerror(String expected) { throw new LuaError(expected+" expected, got "+typename()); } + protected LuaValue typerror(int iarg, String expected) { throw new LuaError("arg "+iarg+": "+expected+" expected, got "+typename()); } protected LuaValue unimplemented(String fun) { throw new LuaError("'"+fun+"' not implemented for "+typename()); } protected LuaValue aritherror() { throw new LuaError("attempt to perform arithmetic on "+typename()); } protected LuaValue aritherror(String fun) { throw new LuaError("attempt to perform arithmetic '"+fun+"' on "+typename()); } @@ -178,9 +178,9 @@ public class LuaValue extends Varargs { public void rawset( String key, int value ) { rawset(valueOf(key),valueOf(value)); } public void rawset( String key, String value ) { rawset(valueOf(key),valueOf(value)); } public void rawsetlist( int key0, Varargs values ) { for ( int i=0, n=values.narg(); i env "getmetatable", // ( object ) -> table - "tostring", // (e) -> value } ); bind2( env, new String[] { "collectgarbage", // ( opt [,arg] ) -> value "error", // ( message [,level] ) -> ERR "rawequal", // (v1, v2) -> boolean "setfenv", // (f, table) -> void - "tonumber", // (e [,base]) -> value } ); bindv( env, new String[] { "assert", // ( v [,message] ) -> v, message | ERR @@ -104,6 +102,8 @@ public class BaseLib extends OneArgFunction implements ResourceFinder { "rawget", // (table, index) -> value "rawset", // (table, index, value) -> table "setmetatable", // (table, metatable) -> table + "tostring", // (e) -> value + "tonumber", // (e [,base]) -> value "pairs", // "pairs" (t) -> iter-func, t, nil "ipairs", // "ipairs", // (t) -> iter-func, t, 0 "next", // "next" ( table, [index] ) -> next-index, next-value @@ -139,8 +139,6 @@ public class BaseLib extends OneArgFunction implements ResourceFinder { case 1: // "getmetatable", // ( object ) -> table LuaValue mt = arg.getmetatable(); return mt!=null? mt: NIL; - case 2: // "tostring", // (e) -> value - return arg.type() == LuaValue.TSTRING? arg: valueOf(arg.toString()); } return NIL; } @@ -173,16 +171,6 @@ public class BaseLib extends OneArgFunction implements ResourceFinder { f.setfenv(t); return f.isthread()? NONE: f; } - case 4: // "tonumber", // (e [,base]) -> value - final int base = arg2.optint(10); - if (base == 10) { /* standard conversion */ - return arg1.tonumber(); - } else { - if ( base < 2 || base > 36 ) - argerror(2, "base out of range"); - final LuaString str = arg1.optstring(null); - return str!=null? str.tonumber(base): NIL; - } } return NIL; } @@ -332,13 +320,29 @@ public class BaseLib extends OneArgFunction implements ResourceFinder { t.setmetatable(mt.isnil()? null: mt.checktable()); return t; } - case 14: // "pairs" (t) -> iter-func, t, nil + case 14: { // "tostring", // (e) -> value + LuaValue arg = args.checkvalue(1); + return arg.type() == LuaValue.TSTRING? arg: valueOf(arg.toString()); + } + case 15: { // "tonumber", // (e [,base]) -> value + LuaValue arg1 = args.checkvalue(1); + final int base = args.optint(2,10); + if (base == 10) { /* standard conversion */ + return arg1.tonumber(); + } else { + if ( base < 2 || base > 36 ) + argerror(2, "base out of range"); + final LuaString str = arg1.optstring(null); + return str!=null? str.tonumber(base): NIL; + } + } + case 16: // "pairs" (t) -> iter-func, t, nil return varargsOf( next, args.checktable(1) ); - case 15: // "ipairs", // (t) -> iter-func, t, 0 + case 17: // "ipairs", // (t) -> iter-func, t, 0 return varargsOf( inext, args.checktable(1), ZERO ); - case 16: // "next" ( table, [index] ) -> next-index, next-value + case 18: // "next" ( table, [index] ) -> next-index, next-value return args.arg1().next(args.arg(2)); - case 17: // "inext" ( table, [int-index] ) -> next-index, next-value + case 19: // "inext" ( table, [int-index] ) -> next-index, next-value return args.arg1().inext(args.arg(2)); } return NONE; diff --git a/src/core/org/luaj/vm2/lib/PackageLib.java b/src/core/org/luaj/vm2/lib/PackageLib.java index 0ee1e705..d4eea5b2 100644 --- a/src/core/org/luaj/vm2/lib/PackageLib.java +++ b/src/core/org/luaj/vm2/lib/PackageLib.java @@ -177,7 +177,7 @@ public class PackageLib extends OneArgFunction { } // set the environment of the current function - LuaFunction f = LuaThread.getCallstackFunction(0); + LuaFunction f = LuaThread.getCallstackFunction(1); if ( f == null ) error(1, "no calling function"); f.setfenv(module); diff --git a/test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip b/test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip index 1528ada3..e7d45590 100644 Binary files a/test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip and b/test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip differ