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);
+    }
 }

Reply via email to