From 81ad4455dcd7f3d4b05b021ab78f25f77ac39906 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Fri, 3 Dec 2010 15:39:26 +0000 Subject: [PATCH] User luajava coersion logic for JSR-223 binding value coercions from Java to lua --- examples/jse/ScriptEngineSample.java | 71 +++++++++++++++---- .../org/luaj/vm2/script/LuaScriptEngine.java | 15 ++-- .../luaj/vm2/lib/jse/LuaJavaCoercionTest.java | 1 - 3 files changed, 63 insertions(+), 24 deletions(-) diff --git a/examples/jse/ScriptEngineSample.java b/examples/jse/ScriptEngineSample.java index b4f7b7dc..a1fc0793 100644 --- a/examples/jse/ScriptEngineSample.java +++ b/examples/jse/ScriptEngineSample.java @@ -9,6 +9,8 @@ import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.script.SimpleBindings; +import org.luaj.vm2.LuaValue; + public class ScriptEngineSample { public static void main(String [] args) { @@ -43,28 +45,73 @@ public class ScriptEngineSample { System.out.println( "eval: "+cs.eval(sb) ); System.out.println( "y="+sb.get("y") ); - cs = ((Compilable)e).compile( - "print( 'luajava', luajava )\n" + -// "_G.lua2java = require( 'org.luaj.vm2.lib.jse.LuajavaLib' )\n" + -// "print( 'lua2java', lua2java )\n" + -// "print( 'lua2java.newInstance', lua2java.newInstance )\n" + - "test = luajava.newInstance(\"java.lang.String\", \"test\")\n" + - "return test:toString()"); - b = e.createBindings(); - System.out.println( "eval: "+cs.eval(b) ); - Object t = b.get("test"); - System.out.println( "t="+t ); - try { e.eval("\n\nbogus example\n\n"); } catch ( ScriptException se ) { System.out.println("script threw ScriptException as expected, message is '"+se.getMessage()+"'"); } + testClientBindings(e); + testUserClasses(e); } catch (ScriptException ex) { ex.printStackTrace(); } } + public static class SomeUserClass { + public String toString() { + return "user-class-instance-"+this.hashCode(); + } + } + + public static void testClientBindings(ScriptEngine e) throws ScriptException { + CompiledScript cs = ((Compilable)e).compile( + "print( 'somejavaint', type(somejavaint), somejavaint )\n" + + "print( 'somejavadouble', type(somejavadouble), somejavadouble )\n" + + "print( 'somejavastring', type(somejavastring), somejavastring )\n" + + "print( 'somejavaobject', type(somejavaobject), somejavaobject )\n" + + "print( 'somejavaarray', type(somejavaarray), somejavaarray, somejavaarray[1] )\n" + + "someluaint = 444\n" + + "someluadouble = 555.666\n" + + "someluastring = 'def'\n" + + "someluauserdata = somejavaobject\n" + + "someluatable = { 999, 111 }\n" + + "someluafunction = function(x) print( 'hello, world', x ) return 678 end\n" + + "" ); + Bindings b = e.createBindings(); + b.put("somejavaint", 111); + b.put("somejavadouble", 222.333); + b.put("somejavastring", "abc"); + b.put("somejavaobject", new SomeUserClass()); + b.put("somejavaarray", new int[] { 777, 888 } ); + System.out.println( "eval: "+cs.eval(b) ); + Object someluaint = b.get("someluaint"); + Object someluadouble = b.get("someluaint"); + Object someluastring = b.get("someluastring"); + Object someluauserdata = b.get("someluauserdata"); + Object someluatable = b.get("someluatable"); + Object someluafunction = b.get("someluafunction"); + System.out.println( "someluaint: "+someluaint.getClass()+" "+someluaint ); + System.out.println( "someluadouble: "+someluadouble.getClass()+" "+someluadouble ); + System.out.println( "someluastring: "+someluastring.getClass()+" "+someluastring ); + System.out.println( "someluauserdata: "+someluauserdata.getClass()+" "+someluauserdata ); + System.out.println( "someluatable: "+someluatable.getClass()+" "+someluatable ); + System.out.println( "someluafunction: "+someluafunction.getClass()+" "+someluafunction ); + System.out.println( "someluafunction(345): "+((LuaValue) someluafunction).call(LuaValue.valueOf(345)) ); + } + + public static void testUserClasses(ScriptEngine e) throws ScriptException { + CompiledScript cs = ((Compilable)e).compile( + "test = test or luajava.newInstance(\"java.lang.String\", \"test\")\n" + + "print( 'test', type(test), test, tostring(test) )\n" + + "return test:toString()"); + Bindings b = e.createBindings(); + Object resultstring = cs.eval(b); + b.put("test", new SomeUserClass()); + Object resultuserclass = cs.eval(b); + System.out.println( "eval(string): "+resultstring.getClass()+" "+resultstring ); + System.out.println( "eval(userclass): "+resultuserclass.getClass()+" "+resultuserclass ); + } + } diff --git a/src/jse/org/luaj/vm2/script/LuaScriptEngine.java b/src/jse/org/luaj/vm2/script/LuaScriptEngine.java index 2bf26a30..3ccd1cfb 100644 --- a/src/jse/org/luaj/vm2/script/LuaScriptEngine.java +++ b/src/jse/org/luaj/vm2/script/LuaScriptEngine.java @@ -46,6 +46,7 @@ import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Prototype; import org.luaj.vm2.Varargs; +import org.luaj.vm2.lib.jse.CoerceJavaToLua; import org.luaj.vm2.lib.jse.JsePlatform; /** @@ -231,17 +232,9 @@ public class LuaScriptEngine implements ScriptEngine, Compilable { } } private LuaValue toLua(Object javaValue) { - if ( javaValue instanceof Number ) { - return LuaValue.valueOf(((Number)javaValue).doubleValue()); - } else if ( javaValue instanceof String ) { - return LuaValue.valueOf(javaValue.toString()); - } else if ( javaValue == null ) { - return LuaValue.NIL; - } else if ( javaValue instanceof LuaValue ) { - return (LuaValue) javaValue; - } else { - return LuaValue.userdataOf(javaValue); - } + return javaValue == null? LuaValue.NIL: + javaValue instanceof LuaValue? (LuaValue) javaValue: + CoerceJavaToLua.coerce(javaValue); } public void copyGlobalsToBindings() { LuaValue[] keys = t.keys(); diff --git a/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java b/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java index a555c4e9..5b795894 100644 --- a/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java +++ b/test/junit/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java @@ -9,7 +9,6 @@ import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaUserdata; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Varargs; -import org.luaj.vm2.compiler.LuaC; public class LuaJavaCoercionTest extends TestCase {