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 };