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 <hen...@apache.org> 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); + } }