diff --git a/README.html b/README.html
index 4e4a189c..380e4793 100644
--- a/README.html
+++ b/README.html
@@ -920,6 +920,7 @@ Files are no longer hosted at LuaForge.
Add sample code for Android Application that uses luaj.
Add sample code for Applet that uses luaj.
Fix balanced match for empty string (fixes issue #23).
+Pass user-supplied ScriptContext to script engine evaluation (fixes issue #21).
diff --git a/src/jse/org/luaj/vm2/script/LuaScriptEngine.java b/src/jse/org/luaj/vm2/script/LuaScriptEngine.java
index e84d7793..415c885c 100644
--- a/src/jse/org/luaj/vm2/script/LuaScriptEngine.java
+++ b/src/jse/org/luaj/vm2/script/LuaScriptEngine.java
@@ -95,6 +95,21 @@ public class LuaScriptEngine extends AbstractScriptEngine implements ScriptEngin
}
}
+ @Override
+ public Object eval(Reader reader, Bindings bindings) throws ScriptException {
+ return ((LuajCompiledScript) compile(reader)).eval(context.globals, bindings);
+ }
+
+ @Override
+ public Object eval(String script, Bindings bindings) throws ScriptException {
+ return eval(new StringReader(script), bindings);
+ }
+
+ @Override
+ protected ScriptContext getScriptContext(Bindings nn) {
+ throw new IllegalStateException("LuajScriptEngine should not be allocating contexts.");
+ }
+
@Override
public Bindings createBindings() {
return new SimpleBindings();
@@ -109,7 +124,7 @@ public class LuaScriptEngine extends AbstractScriptEngine implements ScriptEngin
@Override
public Object eval(Reader reader, ScriptContext context)
throws ScriptException {
- return compile(reader).eval();
+ return compile(reader).eval(context);
}
@Override
@@ -142,7 +157,7 @@ public class LuaScriptEngine extends AbstractScriptEngine implements ScriptEngin
return eval(((LuajContext) context).globals, context.getBindings(ScriptContext.ENGINE_SCOPE));
}
- private Object eval(Globals g, Bindings b) throws ScriptException {
+ Object eval(Globals g, Bindings b) throws ScriptException {
g.setmetatable(new BindingsMetatable(b));
LuaFunction f = function;
if (f.isclosure())
diff --git a/test/junit/org/luaj/vm2/script/ScriptEngineTests.java b/test/junit/org/luaj/vm2/script/ScriptEngineTests.java
index 3ec80ae2..938be766 100644
--- a/test/junit/org/luaj/vm2/script/ScriptEngineTests.java
+++ b/test/junit/org/luaj/vm2/script/ScriptEngineTests.java
@@ -28,6 +28,7 @@ import java.io.Reader;
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
+import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
@@ -49,6 +50,7 @@ public class ScriptEngineTests extends TestSuite {
suite.addTest( new TestSuite( SimpleBindingsTest.class, "Simple Bindings" ) );
suite.addTest( new TestSuite( DefaultBindingsTest.class, "Default Bindings" ) );
suite.addTest( new TestSuite( LuaJCBindingsTest.class, "LuaJC Bindings" ) );
+ suite.addTest( new TestSuite( UserContextTest.class, "User Context" ) );
return suite;
}
@@ -245,4 +247,39 @@ public class ScriptEngineTests extends TestSuite {
return "some-user-value";
}
}
+
+ public static class UserContextTest extends TestCase {
+ protected ScriptEngine e;
+ protected Bindings b;
+ protected ScriptContext c;
+ public void setUp() {
+ this.e = new ScriptEngineManager().getEngineByName("luaj");
+ this.c = new LuajContext();
+ this.b = c.getBindings(ScriptContext.ENGINE_SCOPE);
+ }
+ public void testUncompiledScript() throws ScriptException {
+ b.put("x", 144);
+ assertEquals(12, e.eval("z = math.sqrt(x); return z", b));
+ assertEquals(12, b.get("z"));
+ assertEquals(null, e.getBindings(ScriptContext.ENGINE_SCOPE).get("z"));
+ assertEquals(null, e.getBindings(ScriptContext.GLOBAL_SCOPE).get("z"));
+
+ b.put("x", 25);
+ assertEquals(5, e.eval("z = math.sqrt(x); return z", c));
+ assertEquals(5, b.get("z"));
+ assertEquals(null, e.getBindings(ScriptContext.ENGINE_SCOPE).get("z"));
+ assertEquals(null, e.getBindings(ScriptContext.GLOBAL_SCOPE).get("z"));
+ }
+ public void testCompiledScript() throws ScriptException {
+ CompiledScript cs = ((Compilable)e).compile("z = math.sqrt(x); return z");
+
+ b.put("x", 144);
+ assertEquals(12, cs.eval(b));
+ assertEquals(12, b.get("z"));
+
+ b.put("x", 25);
+ assertEquals(5, cs.eval(c));
+ assertEquals(5, b.get("z"));
+ }
+ }
}