Improve JSR-223 bindings especially for values that are not primitives.
This commit is contained in:
41
README.html
41
README.html
@@ -16,7 +16,7 @@
|
||||
Getting Started with LuaJ
|
||||
|
||||
</h1>
|
||||
James Roseborough, Ian Farmer, Version 2.0.1
|
||||
James Roseborough, Ian Farmer, Version 2.0.2
|
||||
<p>
|
||||
<small>
|
||||
Copyright © 2009-2010 Luaj.org.
|
||||
@@ -106,7 +106,7 @@ in comparison with the standard C distribution.
|
||||
<td>16.794</td>
|
||||
<td>11.274</td>
|
||||
<td>Java</td>
|
||||
<td>java -cp luaj-jse-2.0.1.jar;bcel-5.2.jar lua <b>-b</b> fannkuch.lua 10</td></tr>
|
||||
<td>java -cp luaj-jse-2.0.2.jar;bcel-5.2.jar lua <b>-b</b> fannkuch.lua 10</td></tr>
|
||||
<tr valign="top">
|
||||
<td></td>
|
||||
<td></td>
|
||||
@@ -116,7 +116,7 @@ in comparison with the standard C distribution.
|
||||
<td>16.701</td>
|
||||
<td>13.789</td>
|
||||
<td></td>
|
||||
<td>java -cp luaj-jse-2.0.1.jar lua <b>-j</b> fannkuch.lua 10</td></tr>
|
||||
<td>java -cp luaj-jse-2.0.2.jar lua <b>-j</b> fannkuch.lua 10</td></tr>
|
||||
<tr valign="top">
|
||||
<td></td>
|
||||
<td></td>
|
||||
@@ -126,7 +126,7 @@ in comparison with the standard C distribution.
|
||||
<td>36.894</td>
|
||||
<td>15.163</td>
|
||||
<td></td>
|
||||
<td>java -cp luaj-jse-2.0.1.jar lua -n fannkuch.lua 10</td></tr>
|
||||
<td>java -cp luaj-jse-2.0.2.jar lua -n fannkuch.lua 10</td></tr>
|
||||
<tr valign="top">
|
||||
<td>lua</td>
|
||||
<td>5.1.4</td>
|
||||
@@ -182,7 +182,7 @@ It is also faster than Java-lua implementations Jill, Kahlua, and Mochalua for a
|
||||
From the main distribution directory line type:
|
||||
|
||||
<pre>
|
||||
java -cp lib/luaj-jse-2.0.1.jar lua examples/lua/hello.lua
|
||||
java -cp lib/luaj-jse-2.0.2.jar lua examples/lua/hello.lua
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
@@ -197,8 +197,8 @@ You should see the following output:
|
||||
From the main distribution directory line type:
|
||||
|
||||
<pre>
|
||||
java -cp lib/luaj-jse-2.0.1.jar luac examples/lua/hello.lua
|
||||
java -cp lib/luaj-jse-2.0.1.jar lua luac.out
|
||||
java -cp lib/luaj-jse-2.0.2.jar luac examples/lua/hello.lua
|
||||
java -cp lib/luaj-jse-2.0.2.jar lua luac.out
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
@@ -210,9 +210,9 @@ The compiled output "luac.out" is lua bytecode and should run and produce the sa
|
||||
Luaj can compile to lua source code to Java source code:
|
||||
|
||||
<pre>
|
||||
java -cp lib/luaj-jse-2.0.1.jar lua2java -s examples/lua -d . hello.lua
|
||||
javac -cp lib/luaj-jse-2.0.1.jar hello.java
|
||||
java -cp "lib/luaj-jse-2.0.1.jar;." lua -l hello
|
||||
java -cp lib/luaj-jse-2.0.2.jar lua2java -s examples/lua -d . hello.lua
|
||||
javac -cp lib/luaj-jse-2.0.2.jar hello.java
|
||||
java -cp "lib/luaj-jse-2.0.2.jar;." lua -l hello
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
@@ -223,7 +223,7 @@ There are no additional dependencies for compiling or running source-to-source c
|
||||
<p>
|
||||
Lua scripts can also be run directly in this mode without precompiling using the <em>lua</em> command with the <b><em>-j</em></b> option when run in JDK 1.5 or higher:
|
||||
<pre>
|
||||
java -cp lib/luaj-jse-2.0.1.jar lua -j examples/lua/hello.lua
|
||||
java -cp lib/luaj-jse-2.0.2.jar lua -j examples/lua/hello.lua
|
||||
</pre>
|
||||
|
||||
<h2>Compile lua bytecode to java bytecode</h2>
|
||||
@@ -233,8 +233,8 @@ Luaj can compile lua sources or binaries directly to java bytecode if the bcel l
|
||||
|
||||
<pre>
|
||||
ant bcel-lib
|
||||
java -cp "lib/luaj-jse-2.0.1.jar;lib/bcel-5.2.jar" luajc -s examples/lua -d . hello.lua
|
||||
java -cp "lib/luaj-jse-2.0.1.jar;." lua -l hello
|
||||
java -cp "lib/luaj-jse-2.0.2.jar;lib/bcel-5.2.jar" luajc -s examples/lua -d . hello.lua
|
||||
java -cp "lib/luaj-jse-2.0.2.jar;." lua -l hello
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
@@ -245,7 +245,7 @@ but the compiled classes must be in the class path at runtime, unless runtime ji
|
||||
<p>
|
||||
Lua scripts can also be run directly in this mode without precompiling using the <em>lua</em> command with the <b><em>-b</em></b> option and providing the <em>bcel</em> library in the class path:
|
||||
<pre>
|
||||
java -cp "lib/luaj-jse-2.0.1.jar;lib/bcel-5.2.jar" lua -b examples/lua/hello.lua
|
||||
java -cp "lib/luaj-jse-2.0.2.jar;lib/bcel-5.2.jar" lua -b examples/lua/hello.lua
|
||||
</pre>
|
||||
|
||||
|
||||
@@ -270,7 +270,7 @@ A simple example may be found in
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
You must include the library <b>lib/luaj-jse-2.0.1.jar</b> in your class path.
|
||||
You must include the library <b>lib/luaj-jse-2.0.2.jar</b> in your class path.
|
||||
|
||||
<h2>Run a script in a MIDlet</h2>
|
||||
|
||||
@@ -297,7 +297,7 @@ A simple example may be found in
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
You must include the library <b>lib/luaj-jme-2.0.1.jar</b> in your midlet jar.
|
||||
You must include the library <b>lib/luaj-jme-2.0.2.jar</b> in your midlet jar.
|
||||
|
||||
<p>
|
||||
An ant script to build and run the midlet is in
|
||||
@@ -325,7 +325,7 @@ The standard use of JSR-223 scripting engines may be used:
|
||||
All standard aspects of script engines including compiled statements should be supported.
|
||||
|
||||
<p>
|
||||
You must include the library <b>lib/luaj-jse-2.0.1.jar</b> in your class path.
|
||||
You must include the library <b>lib/luaj-jse-2.0.2.jar</b> in your class path.
|
||||
|
||||
<p>
|
||||
A working example may be found in
|
||||
@@ -337,7 +337,7 @@ To compile and run it using Java 1.6 or higher:
|
||||
|
||||
<pre>
|
||||
javac examples/jse/ScriptEngineSample.java
|
||||
java -cp "lib/luaj-jse-2.0.1.jar;examples/jse" ScriptEngineSample
|
||||
java -cp "lib/luaj-jse-2.0.2.jar;examples/jse" ScriptEngineSample
|
||||
</pre>
|
||||
|
||||
<h2>Excluding the lua bytecode compiler</h2>
|
||||
@@ -501,7 +501,7 @@ The following lua script will open a swiing frame on Java SE:
|
||||
<p>
|
||||
See a longer sample in <em>examples/lua/swingapp.lua</em> for details, or try running it using:
|
||||
<pre>
|
||||
java -cp lib/luaj-jse-2.0.1.jar lua examples/lua/swingapp.lua
|
||||
java -cp lib/luaj-jse-2.0.2.jar lua examples/lua/swingapp.lua
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
@@ -716,6 +716,9 @@ and LuaForge:
|
||||
<li>Fix nan-related error in constant folding logic that was failing on some JVMs
|
||||
<li>JSR-223 fixes: add META-INF/services entry in jse jar, improve bindings implementation
|
||||
</ul></td></tr>
|
||||
<tr valign="top"><td> <b>2.0.2</b></td><td><ul>
|
||||
<li>JSR-223 bindings will pass values that are not primitives as LuaValue
|
||||
</ul></td></tr>
|
||||
</table>
|
||||
|
||||
<h2>Known Issues</h2>
|
||||
|
||||
@@ -43,6 +43,18 @@ 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 ) {
|
||||
|
||||
@@ -25,6 +25,7 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
import java.io.StringReader;
|
||||
import java.util.Iterator;
|
||||
|
||||
import javax.script.Bindings;
|
||||
import javax.script.Compilable;
|
||||
@@ -44,8 +45,7 @@ import org.luaj.vm2.LuaFunction;
|
||||
import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
import org.luaj.vm2.Prototype;
|
||||
import org.luaj.vm2.lib.ThreeArgFunction;
|
||||
import org.luaj.vm2.lib.TwoArgFunction;
|
||||
import org.luaj.vm2.Varargs;
|
||||
import org.luaj.vm2.lib.jse.JsePlatform;
|
||||
|
||||
/**
|
||||
@@ -168,9 +168,11 @@ public class LuaScriptEngine implements ScriptEngine, Compilable {
|
||||
return new CompiledScript() {
|
||||
public Object eval(ScriptContext context) throws ScriptException {
|
||||
Bindings b = context.getBindings(ScriptContext.ENGINE_SCOPE);
|
||||
LuaValue env = newBindingsBackedEnv(b);
|
||||
LuaClosure c = new LuaClosure( p, env );
|
||||
return c.invoke(LuaValue.NONE);
|
||||
BindingsEnv env = new BindingsEnv(b);
|
||||
LuaClosure c = new LuaClosure( p, env.t );
|
||||
Varargs result = c.invoke(LuaValue.NONE);
|
||||
env.copyGlobalsToBindings();
|
||||
return result;
|
||||
}
|
||||
public ScriptEngine getEngine() {
|
||||
return LuaScriptEngine.this;
|
||||
@@ -181,15 +183,17 @@ public class LuaScriptEngine implements ScriptEngine, Compilable {
|
||||
return new CompiledScript() {
|
||||
public Object eval(ScriptContext context) throws ScriptException {
|
||||
Bindings b = context.getBindings(ScriptContext.ENGINE_SCOPE);
|
||||
LuaValue env = newBindingsBackedEnv(b);
|
||||
BindingsEnv env = new BindingsEnv(b);
|
||||
LuaFunction lf;
|
||||
try {
|
||||
lf = (LuaFunction) c.newInstance();
|
||||
} catch (Exception e) {
|
||||
throw new ScriptException("instantiation failed: "+e.toString());
|
||||
}
|
||||
lf.setfenv(env);
|
||||
return lf.invoke(LuaValue.NONE);
|
||||
lf.setfenv(env.t);
|
||||
Varargs result = lf.invoke(LuaValue.NONE);
|
||||
env.copyGlobalsToBindings();
|
||||
return result;
|
||||
}
|
||||
public ScriptEngine getEngine() {
|
||||
return LuaScriptEngine.this;
|
||||
@@ -207,58 +211,25 @@ public class LuaScriptEngine implements ScriptEngine, Compilable {
|
||||
}
|
||||
|
||||
// ------ lua bindings ----- private static final class BindingsBackedEnv extends LuaTable {
|
||||
public LuaTable newBindingsBackedEnv(Bindings b) {
|
||||
LuaTable t = new LuaTable();
|
||||
LuaTable mt = new LuaTable(0,2);
|
||||
mt.set(LuaValue.INDEX, new BindindsIndexFunction(b));
|
||||
mt.set(LuaValue.NEWINDEX, new BindingsNewindexFunction(b));
|
||||
t.setmetatable(mt);
|
||||
return t;
|
||||
}
|
||||
|
||||
private static final class BindingsNewindexFunction extends ThreeArgFunction {
|
||||
private final Bindings b;
|
||||
|
||||
private BindingsNewindexFunction(Bindings b) {
|
||||
public class BindingsEnv {
|
||||
public final Bindings b;
|
||||
public final LuaTable t;
|
||||
public BindingsEnv( Bindings b ) {
|
||||
this.b = b;
|
||||
this.t = new LuaTable();
|
||||
t.setmetatable(LuaTable.tableOf(new LuaValue[] { LuaValue.INDEX, _G }));
|
||||
this.copyBindingsToGlobals();
|
||||
}
|
||||
|
||||
public LuaValue call(LuaValue tbl, LuaValue key, LuaValue val) {
|
||||
String k = key.tojstring();
|
||||
if ( val.isnil() )
|
||||
b.remove(k);
|
||||
else
|
||||
b.put(k, toJava(val));
|
||||
return NIL;
|
||||
}
|
||||
|
||||
private Object toJava(LuaValue v) {
|
||||
switch ( v.type() ) {
|
||||
case LuaValue.TNIL: return null;
|
||||
case LuaValue.TSTRING: return v.tojstring();
|
||||
case LuaValue.TUSERDATA: return v.checkuserdata(Object.class);
|
||||
case LuaValue.TNUMBER: return v.isinttype()? (Object) new Integer(v.toint()): (Object) new Double(v.todouble());
|
||||
default:
|
||||
throw new java.lang.UnsupportedOperationException(
|
||||
"LuaBindings cannot convert lua type '"+v.typename()+"' to Java");
|
||||
public void copyBindingsToGlobals() {
|
||||
for ( Iterator<String> i = b.keySet().iterator(); i.hasNext(); ) {
|
||||
String key = i.next();
|
||||
Object val = b.get(key);
|
||||
LuaValue luakey = toLua(key);
|
||||
LuaValue luaval = toLua(val);
|
||||
t.set(luakey, luaval);
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final class BindindsIndexFunction extends TwoArgFunction {
|
||||
private final Bindings b;
|
||||
|
||||
private BindindsIndexFunction(Bindings b) {
|
||||
this.b = b;
|
||||
}
|
||||
|
||||
public LuaValue call(LuaValue tbl, LuaValue key) {
|
||||
String k = key.tojstring();
|
||||
if ( b.containsKey(k) )
|
||||
return toLua(b.get(k));
|
||||
return _G.get(key);
|
||||
}
|
||||
|
||||
private LuaValue toLua(Object javaValue) {
|
||||
if ( javaValue instanceof Number ) {
|
||||
return LuaValue.valueOf(((Number)javaValue).doubleValue());
|
||||
@@ -266,10 +237,31 @@ public class LuaScriptEngine implements ScriptEngine, Compilable {
|
||||
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);
|
||||
}
|
||||
}
|
||||
public void copyGlobalsToBindings() {
|
||||
LuaValue[] keys = t.keys();
|
||||
for ( int i=0; i<keys.length; i++ ) {
|
||||
LuaValue luakey = keys[i];
|
||||
LuaValue luaval = t.get(luakey);
|
||||
String key = luakey.tojstring();
|
||||
Object val = toJava( luaval );
|
||||
b.put(key,val);
|
||||
}
|
||||
}
|
||||
private Object toJava(LuaValue v) {
|
||||
switch ( v.type() ) {
|
||||
case LuaValue.TNIL: return null;
|
||||
case LuaValue.TSTRING: return v.tojstring();
|
||||
case LuaValue.TUSERDATA: return v.checkuserdata(Object.class);
|
||||
case LuaValue.TNUMBER: return v.isinttype()? (Object) new Integer(v.toint()): (Object) new Double(v.todouble());
|
||||
default: return v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ------ convert char stream to byte stream for lua compiler -----
|
||||
|
||||
@@ -1 +1 @@
|
||||
version: 2.0.1
|
||||
version: 2.0.2
|
||||
Reference in New Issue
Block a user