diff --git a/README.html b/README.html index 1247837e..a55e6202 100644 --- a/README.html +++ b/README.html @@ -970,6 +970,7 @@ Files are no longer hosted at LuaForge.
  • Rename Globals.FINDER to Globals.finder.
  • Fix bug in Globals.UTF8Stream affecting loading from Readers.
  • Add buffered input for compiling and loading of scripts.
  • +
  • Coerce byte[] to LuaString, pass LuaValue as-is in CoerceJavaToLua.coerce().
  • diff --git a/src/jse/org/luaj/vm2/lib/jse/CoerceJavaToLua.java b/src/jse/org/luaj/vm2/lib/jse/CoerceJavaToLua.java index a645f94e..d991e6a7 100644 --- a/src/jse/org/luaj/vm2/lib/jse/CoerceJavaToLua.java +++ b/src/jse/org/luaj/vm2/lib/jse/CoerceJavaToLua.java @@ -99,6 +99,16 @@ public class CoerceJavaToLua { return LuaString.valueOf( javaValue.toString() ); } } ; + Coercion bytesCoercion = new Coercion() { + public LuaValue coerce( Object javaValue ) { + return LuaValue.valueOf((byte[]) javaValue); + } + } ; + Coercion classCoercion = new Coercion() { + public LuaValue coerce( Object javaValue ) { + return JavaClass.forClass((Class) javaValue); + } + } ; COERCIONS.put( Boolean.class, boolCoercion ); COERCIONS.put( Byte.class, intCoercion ); COERCIONS.put( Character.class, charCoercion ); @@ -108,6 +118,8 @@ public class CoerceJavaToLua { COERCIONS.put( Float.class, doubleCoercion ); COERCIONS.put( Double.class, doubleCoercion ); COERCIONS.put( String.class, stringCoercion ); + COERCIONS.put( byte[].class, bytesCoercion ); + COERCIONS.put( Class.class, classCoercion ); } /** @@ -117,6 +129,7 @@ public class CoerceJavaToLua { * will become {@link LuaInteger}; * {@code long}, {@code float}, and {@code double} will become {@link LuaDouble}; * {@code String} and {@code byte[]} will become {@link LuaString}; + * types inheriting from {@link LuaValue} will be returned without coercion; * other types will become {@link LuaUserdata}. * @param o Java object needing conversion * @return {@link LuaValue} corresponding to the supplied Java value. @@ -129,13 +142,12 @@ public class CoerceJavaToLua { public static LuaValue coerce(Object o) { if ( o == null ) return LuaValue.NIL; - if (o instanceof Class) - return JavaClass.forClass((Class) o); Class clazz = o.getClass(); Coercion c = (Coercion) COERCIONS.get( clazz ); if ( c == null ) { c = clazz.isArray()? arrayCoercion: - instanceCoercion; + o instanceof LuaValue ? luaCoercion: + instanceCoercion; COERCIONS.put( clazz, c ); } return c.coerce(o); @@ -153,4 +165,10 @@ public class CoerceJavaToLua { return new JavaArray(javaValue); } }; + + static final Coercion luaCoercion = new Coercion() { + public LuaValue coerce( Object javaValue ) { + return (LuaValue) javaValue; + } + } ; } diff --git a/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java b/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java index 623db069..86bc898b 100644 --- a/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java +++ b/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java @@ -8,6 +8,7 @@ import org.luaj.vm2.LuaString; import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Varargs; +import org.luaj.vm2.lib.MathLib; public class LuaJavaCoercionTest extends TestCase { @@ -423,8 +424,23 @@ public class LuaJavaCoercionTest extends TestCase { assertEquals( CoerceLuaToJava.SCORE_UNCOERCIBLE, CoerceLuaToJava.inheritanceLevels(IC.class, A.class) ); assertEquals( CoerceLuaToJava.SCORE_UNCOERCIBLE, CoerceLuaToJava.inheritanceLevels(IC.class, B.class) ); assertEquals( CoerceLuaToJava.SCORE_UNCOERCIBLE, CoerceLuaToJava.inheritanceLevels(IB.class, IA.class) ); - assertEquals( 1, CoerceLuaToJava.inheritanceLevels(IA.class, IB.class) ); - + assertEquals( 1, CoerceLuaToJava.inheritanceLevels(IA.class, IB.class) ); + } + + public void testCoerceJavaToLuaLuaValue() { + assertSame(LuaValue.NIL, CoerceJavaToLua.coerce(LuaValue.NIL)); + assertSame(LuaValue.ZERO, CoerceJavaToLua.coerce(LuaValue.ZERO)); + assertSame(LuaValue.ONE, CoerceJavaToLua.coerce(LuaValue.ONE)); + assertSame(LuaValue.INDEX, CoerceJavaToLua.coerce(LuaValue.INDEX)); + LuaTable table = LuaValue.tableOf(); + assertSame(table, CoerceJavaToLua.coerce(table)); + } + + public void testCoerceJavaToLuaByeArray() { + byte[] bytes = "abcd".getBytes(); + LuaValue value = CoerceJavaToLua.coerce(bytes); + assertEquals(LuaString.class, value.getClass()); + assertEquals(LuaValue.valueOf("abcd"), value); } }