Fix Lua to Java coercion directly on Java classes.

This commit is contained in:
James Roseborough
2013-07-01 14:45:34 +00:00
parent 869f0e003c
commit 711c8c817f
3 changed files with 28 additions and 2 deletions

View File

@@ -848,6 +848,7 @@ Files are no longer hosted at LuaForge.
<li>Fix bug that didn't read package.path from environment.</li> <li>Fix bug that didn't read package.path from environment.</li>
<li>Fix pluggable scripting engine lookup, simplify implementation, and add unit tests.</li> <li>Fix pluggable scripting engine lookup, simplify implementation, and add unit tests.</li>
<li>Coerce script engine eval() return values to Java.</li> <li>Coerce script engine eval() return values to Java.</li>
<li>Fix Lua to Java coercion directly on Java classes.</li>
</ul></td></tr> </ul></td></tr>
</table></td></tr></table> </table></td></tr></table>

View File

@@ -131,11 +131,12 @@ public class CoerceJavaToLua {
public static LuaValue coerce(Object o) { public static LuaValue coerce(Object o) {
if ( o == null ) if ( o == null )
return LuaValue.NIL; return LuaValue.NIL;
if (o instanceof Class)
return JavaClass.forClass((Class) o);
Class clazz = o.getClass(); Class clazz = o.getClass();
Coercion c = (Coercion) COERCIONS.get( clazz ); Coercion c = (Coercion) COERCIONS.get( clazz );
if ( c == null ) { if ( c == null ) {
c = o instanceof Class? JavaClass.forClass((Class)o): c = clazz.isArray()? arrayCoercion:
clazz.isArray()? arrayCoercion:
instanceCoercion; instanceCoercion;
COERCIONS.put( clazz, c ); COERCIONS.put( clazz, c );
} }

View File

@@ -55,6 +55,30 @@ public class LuaJavaCoercionTest extends TestCase {
assertEquals( "777", o ); 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() { public void testJavaIntArrayToLuaTable() {
int[] i = { 222, 333 }; int[] i = { 222, 333 };
LuaValue v = CoerceJavaToLua.coerce(i); LuaValue v = CoerceJavaToLua.coerce(i);