This is an automated email from the ASF dual-hosted git repository.
henrib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git
The following commit(s) were added to refs/heads/master by this push:
new 2fdb427 JEXL-271: simplified curry(...) after being hinted it was a
form of closure
2fdb427 is described below
commit 2fdb4278d755b85c9c1d9f767a92bde1b9d098cb
Author: henrib <[email protected]>
AuthorDate: Mon Sep 10 15:15:28 2018 +0200
JEXL-271: simplified curry(...) after being hinted it was a form of closure
---
.../org/apache/commons/jexl3/internal/Closure.java | 23 +++++----
.../apache/commons/jexl3/internal/Interpreter.java | 28 ----------
.../org/apache/commons/jexl3/internal/Script.java | 60 +---------------------
.../org/apache/commons/jexl3/Issues200Test.java | 18 +++++++
4 files changed, 32 insertions(+), 97 deletions(-)
diff --git a/src/main/java/org/apache/commons/jexl3/internal/Closure.java
b/src/main/java/org/apache/commons/jexl3/internal/Closure.java
index 863adad..c297db0 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Closure.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Closure.java
@@ -37,17 +37,18 @@ public class Closure extends Script {
super(theCaller.jexl, null, lambda);
frame = lambda.createFrame(theCaller.frame);
}
-
- @Override
- public String toString() {
- return getParsedText();
- }
-
- @Override
- public String getParsedText() {
- Debugger debug = new Debugger();
- debug.debug(script, false);
- return debug.toString();
+
+ /**
+ * Creates a curried version of a script.
+ * @param base the base script
+ * @param args the script arguments
+ */
+ protected Closure(Script base, Object[] args) {
+ super(base.jexl, base.source, base.script);
+ Scope.Frame sf = (base instanceof Closure) ? ((Closure) base).frame :
null;
+ frame = sf == null
+ ? script.createFrame(args)
+ : sf.assign(args);
}
@Override
diff --git a/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
b/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
index 89db12a..09c229f 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
@@ -133,12 +133,6 @@ public class Interpreter extends InterpreterBase {
protected Map<String, Object> functors;
/**
- * The thread local interpreter.
- */
- protected static final java.lang.ThreadLocal<Interpreter> INTER =
- new java.lang.ThreadLocal<Interpreter>();
-
- /**
* Creates an interpreter.
* @param engine the engine creating this interpreter
* @param aContext the context to evaluate expression
@@ -172,25 +166,6 @@ public class Interpreter extends InterpreterBase {
functions = ii.functions;
functors = ii.functors;
}
-
- /**
- * @return the current interpreter frame
- */
- static Scope.Frame getCurrentFrame() {
- Interpreter inter = INTER.get();
- return inter != null? inter.frame : null;
- }
-
- /**
- * Swaps the current thread local interpreter.
- * @param inter the interpreter or null
- * @return the previous thread local interpreter
- */
- protected Interpreter putThreadInterpreter(Interpreter inter) {
- Interpreter pinter = INTER.get();
- INTER.set(inter);
- return pinter;
- }
/**
* Interpret the given script/expression.
@@ -204,10 +179,8 @@ public class Interpreter extends InterpreterBase {
public Object interpret(JexlNode node) {
JexlContext.ThreadLocal tcontext = null;
JexlEngine tjexl = null;
- Interpreter tinter = null;
try {
cancelCheck(node);
- tinter = putThreadInterpreter(this);
if (context instanceof JexlContext.ThreadLocal) {
tcontext = jexl.putThreadLocal((JexlContext.ThreadLocal)
context);
}
@@ -243,7 +216,6 @@ public class Interpreter extends InterpreterBase {
if (context instanceof JexlContext.ThreadLocal) {
jexl.putThreadLocal(tcontext);
}
- putThreadInterpreter(tinter);
}
return null;
}
diff --git a/src/main/java/org/apache/commons/jexl3/internal/Script.java
b/src/main/java/org/apache/commons/jexl3/internal/Script.java
index 9cf4343..f7450cf 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Script.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Script.java
@@ -22,7 +22,6 @@ import org.apache.commons.jexl3.JexlScript;
import org.apache.commons.jexl3.JexlExpression;
import org.apache.commons.jexl3.parser.ASTJexlScript;
-import org.apache.commons.jexl3.parser.JexlNode;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -192,69 +191,14 @@ public class Script implements JexlScript, JexlExpression
{
Interpreter interpreter = createInterpreter(context, frame);
return interpreter.interpret(script);
}
-
- /**
- * A script whose parameters are (partially) bound.
- */
- public static class Curried extends Script {
- /** The evaluation frame. */
- private final Scope.Frame frame;
-
- /**
- * Creates a curried version of this script.
- * @param base the base script
- * @param args the arguments
- */
- protected Curried(Script base, Object[] args) {
- super(base.jexl, base.source, base.script);
- Scope.Frame sf = (base instanceof Curried) ? ((Curried)
base).frame : null;
- if (sf != null) {
- frame = sf.assign(args);
- } else {
- sf = Interpreter.getCurrentFrame();
- frame = script.createFrame(sf, args);
- }
- }
-
- @Override
- protected Scope.Frame createFrame(Object[] args) {
- return frame != null? frame.assign(args) : super.createFrame(args);
- }
-
- @Override
- public boolean equals(Object obj) {
- return this == obj;
- }
-
- @Override
- public int hashCode() {
- return System.identityHashCode(this);
- }
-
- @Override
- public Object execute(JexlContext context) {
- return execute(context, (Object[])null);
- }
-
- @Override
- public Object execute(JexlContext context, Object... args) {
- Scope.Frame callFrame = null;
- if (frame != null) {
- callFrame = frame.assign(args);
- }
- Interpreter interpreter = jexl.createInterpreter(context,
callFrame);
- JexlNode block = script.jjtGetChild(script.jjtGetNumChildren() -
1);
- return interpreter.interpret(block);
- }
- }
-
+
@Override
public JexlScript curry(Object... args) {
String[] parms = script.getParameters();
if (parms == null || parms.length == 0) {
return this;
}
- return new Curried(this, args);
+ return new Closure(this, args);
}
/**
diff --git a/src/test/java/org/apache/commons/jexl3/Issues200Test.java
b/src/test/java/org/apache/commons/jexl3/Issues200Test.java
index 7d4d47f..1102c07 100644
--- a/src/test/java/org/apache/commons/jexl3/Issues200Test.java
+++ b/src/test/java/org/apache/commons/jexl3/Issues200Test.java
@@ -687,4 +687,22 @@ public class Issues200Test extends JexlTestCase {
Object result = base.execute(null);
Assert.assertEquals(8, result);
}
+
+ @Test
+ public void test271c() throws Exception {
+ JexlEngine jexl = new JexlBuilder().strict(false).create();
+ JexlScript base = jexl.createScript("(x, y, z)->{ 2 + x + y + z };");
+ JexlScript y = base.curry(1);
+ Object result = y.execute((JexlContext) null, 2, 3);
+ Assert.assertEquals(8, result);
+ }
+
+ @Test
+ public void test271d() throws Exception {
+ JexlEngine jexl = new JexlBuilder().strict(false).create();
+ JexlScript base = jexl.createScript("var base = 2; return (x, y, z)->{
base + x + y + z };");
+ JexlScript y = ((JexlScript) base.execute(null)).curry(1);
+ Object result = y.execute((JexlContext) null, 2, 3);
+ Assert.assertEquals(8, result);
+ }
}