From 711c8c817fc20b7048a61df5a5254a5bdb25dea8 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Mon, 1 Jul 2013 14:45:34 +0000 Subject: [PATCH] Fix Lua to Java coercion directly on Java classes. --- README.html | 1 + .../org/luaj/vm2/lib/jse/CoerceJavaToLua.java | 5 ++-- .../luaj/vm2/lib/jse/LuaJavaCoercionTest.java | 24 +++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/README.html b/README.html index 4482cef7..2509a51a 100644 --- a/README.html +++ b/README.html @@ -848,6 +848,7 @@ Files are no longer hosted at LuaForge.
  • Fix bug that didn't read package.path from environment.
  • Fix pluggable scripting engine lookup, simplify implementation, and add unit tests.
  • Coerce script engine eval() return values to Java.
  • +
  • Fix Lua to Java coercion directly on Java classes.
  • diff --git a/src/jse/org/luaj/vm2/lib/jse/CoerceJavaToLua.java b/src/jse/org/luaj/vm2/lib/jse/CoerceJavaToLua.java index 452f2b93..795cc8cb 100644 --- a/src/jse/org/luaj/vm2/lib/jse/CoerceJavaToLua.java +++ b/src/jse/org/luaj/vm2/lib/jse/CoerceJavaToLua.java @@ -131,11 +131,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 = o instanceof Class? JavaClass.forClass((Class)o): - clazz.isArray()? arrayCoercion: + c = clazz.isArray()? arrayCoercion: instanceCoercion; COERCIONS.put( clazz, c ); } diff --git a/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java b/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java index ab9317c8..5db90743 100644 --- a/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java +++ b/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java @@ -54,6 +54,30 @@ public class LuaJavaCoercionTest extends TestCase { assertEquals( String.class, o.getClass() ); assertEquals( "777", o ); } + + public void testJavaClassToLuaUserdata() { + LuaValue va = CoerceJavaToLua.coerce(ClassA.class); + LuaValue va1 = CoerceJavaToLua.coerce(ClassA.class); + LuaValue vb = CoerceJavaToLua.coerce(ClassB.class); + assertSame(va, va1); + assertNotSame(va, vb); + LuaValue vi = CoerceJavaToLua.coerce(new ClassA()); + assertNotSame(va, vi); + assertTrue(vi.isuserdata()); + assertTrue(vi.isuserdata(ClassA.class)); + assertFalse(vi.isuserdata(ClassB.class)); + LuaValue vj = CoerceJavaToLua.coerce(new ClassB()); + assertNotSame(vb, vj); + assertTrue(vj.isuserdata()); + assertFalse(vj.isuserdata(ClassA.class)); + assertTrue(vj.isuserdata(ClassB.class)); + } + + static class ClassA { + } + + static class ClassB { + } public void testJavaIntArrayToLuaTable() { int[] i = { 222, 333 };