diff --git a/README.html b/README.html index 2f97658b..4482cef7 100644 --- a/README.html +++ b/README.html @@ -847,6 +847,7 @@ Files are no longer hosted at LuaForge.   3.0-beta1 diff --git a/src/jse/org/luaj/vm2/lib/jse/JavaArray.java b/src/jse/org/luaj/vm2/lib/jse/JavaArray.java index a72a228f..cc361964 100644 --- a/src/jse/org/luaj/vm2/lib/jse/JavaArray.java +++ b/src/jse/org/luaj/vm2/lib/jse/JavaArray.java @@ -23,8 +23,10 @@ package org.luaj.vm2.lib.jse; import java.lang.reflect.Array; +import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaUserdata; import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.OneArgFunction; /** * LuaValue that represents a Java instance of array type. @@ -41,8 +43,19 @@ class JavaArray extends LuaUserdata { static final LuaValue LENGTH = valueOf("length"); + static final LuaTable array_metatable; + static { + array_metatable = new LuaTable(); + array_metatable.rawset(LuaValue.LEN, new OneArgFunction() { + public LuaValue call(LuaValue u) { + return LuaValue.valueOf(Array.getLength(((LuaUserdata)u).m_instance)); + } + }); + } + JavaArray(Object instance) { super(instance); + setmetatable(array_metatable); } public LuaValue get(LuaValue key) { diff --git a/src/jse/org/luaj/vm2/script/LuaScriptEngine.java b/src/jse/org/luaj/vm2/script/LuaScriptEngine.java index e726caea..ee44ff6b 100644 --- a/src/jse/org/luaj/vm2/script/LuaScriptEngine.java +++ b/src/jse/org/luaj/vm2/script/LuaScriptEngine.java @@ -155,7 +155,7 @@ public class LuaScriptEngine extends AbstractScriptEngine implements ScriptEngin } f.initupvalue1(g); } - return f.invoke(LuaValue.NONE); + return toJava(f.invoke(LuaValue.NONE)); } } @@ -215,23 +215,37 @@ public class LuaScriptEngine extends AbstractScriptEngine implements ScriptEngin } }); } - - static private Object toJava(LuaValue luajValue) { - switch ( luajValue.type() ) { - case LuaValue.TNIL: return null; - case LuaValue.TSTRING: return luajValue.tojstring(); - case LuaValue.TUSERDATA: return luajValue.checkuserdata(Object.class); - case LuaValue.TNUMBER: return luajValue.isinttype()? - (Object) new Integer(luajValue.toint()): - (Object) new Double(luajValue.todouble()); - default: return luajValue; - } - } + } + + static private LuaValue toLua(Object javaValue) { + return javaValue == null? LuaValue.NIL: + javaValue instanceof LuaValue? (LuaValue) javaValue: + CoerceJavaToLua.coerce(javaValue); + } - static private LuaValue toLua(Object javaValue) { - return javaValue == null? LuaValue.NIL: - javaValue instanceof LuaValue? (LuaValue) javaValue: - CoerceJavaToLua.coerce(javaValue); + static private Object toJava(LuaValue luajValue) { + switch ( luajValue.type() ) { + case LuaValue.TNIL: return null; + case LuaValue.TSTRING: return luajValue.tojstring(); + case LuaValue.TUSERDATA: return luajValue.checkuserdata(Object.class); + case LuaValue.TNUMBER: return luajValue.isinttype()? + (Object) new Integer(luajValue.toint()): + (Object) new Double(luajValue.todouble()); + default: return luajValue; } } + + static private Object toJava(Varargs v) { + final int n = v.narg(); + switch (n) { + case 0: return null; + case 1: return toJava(v.arg1()); + default: + Object[] o = new Object[n]; + for (int i=0; i