You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2019/11/02 09:47:01 UTC

[commons-jexl] branch master updated: JEXL-307: restored 3.1 var declaration behavior in non-lexical mode Task #JEXL-307 - Variable redeclaration option

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 4cc3fe9  JEXL-307: restored 3.1 var declaration behavior in non-lexical mode Task #JEXL-307 - Variable redeclaration option
     new 038e1d6  Merge origin/master
4cc3fe9 is described below

commit 4cc3fe927a2794597650ea3df2c00c613b20acec
Author: henrib <he...@apache.org>
AuthorDate: Sat Nov 2 10:45:16 2019 +0100

    JEXL-307: restored 3.1 var declaration behavior in non-lexical mode
    Task #JEXL-307 - Variable redeclaration option
---
 .../java/org/apache/commons/jexl3/JexlBuilder.java | 18 +++++++++++++++++-
 .../java/org/apache/commons/jexl3/JexlOptions.java |  3 ++-
 .../org/apache/commons/jexl3/internal/Engine.java  |  5 +++--
 .../apache/commons/jexl3/internal/Interpreter.java |  8 ++++++--
 .../org/apache/commons/jexl3/internal/Options.java | 14 +++++++-------
 .../org/apache/commons/jexl3/AnnotationTest.java   |  2 +-
 .../java/org/apache/commons/jexl3/IssuesTest.java  |  4 ++--
 .../java/org/apache/commons/jexl3/LexicalTest.java | 22 +++++++++++++++++-----
 8 files changed, 55 insertions(+), 21 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/JexlBuilder.java b/src/main/java/org/apache/commons/jexl3/JexlBuilder.java
index a02bfb2..aa2677e 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlBuilder.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlBuilder.java
@@ -296,7 +296,7 @@ public class JexlBuilder {
      * @return this builder
      */
     public JexlBuilder lexical(boolean flag) {
-        options.setLexical(true);
+        options.setLexical(flag);
         return this;
     }
     
@@ -304,6 +304,22 @@ public class JexlBuilder {
     public boolean lexical() {
         return options.isLexical();
     }
+           
+    /**
+     * Sets whether the engine is in lexical shading mode.
+     *
+     * @param flag true means lexical shading is in effect, false implies no lexical shading 
+     * @return this builder
+     */
+    public JexlBuilder lexicalShade(boolean flag) {
+        options.setLexicalShade(flag);
+        return this;
+    }
+    
+    /** @return whether lexical shading is enabled */
+    public boolean lexicalShade() {
+        return options.isLexicalShade();
+    }
     
     /**
      * Sets whether the engine will throw JexlException during evaluation when an error is triggered.
diff --git a/src/main/java/org/apache/commons/jexl3/JexlOptions.java b/src/main/java/org/apache/commons/jexl3/JexlOptions.java
index 4d1ba6e..200fcd0 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlOptions.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlOptions.java
@@ -153,8 +153,9 @@ public interface JexlOptions {
     /**
      * Set options from engine.
      * @param jexl the engine
+     * @return this instance
      */
-    void setOptions(JexlEngine jexl);
+    JexlOptions set(JexlEngine jexl);
 
     /**
      * Sets whether the engine considers null in navigation expression as errors
diff --git a/src/main/java/org/apache/commons/jexl3/internal/Engine.java b/src/main/java/org/apache/commons/jexl3/internal/Engine.java
index 3205cef..23d14ed 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Engine.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Engine.java
@@ -156,7 +156,7 @@ public class Engine extends JexlEngine {
     /**
      * A cached version of the options.
      */
-    protected final JexlOptions options =  new org.apache.commons.jexl3.internal.Options();
+    protected final JexlOptions options;
 
     /**
      * Creates an engine with default arguments.
@@ -204,7 +204,8 @@ public class Engine extends JexlEngine {
         if (uberspect == null) {
             throw new IllegalArgumentException("uberspect can not be null");
         }
-        options.setOptions(this);
+        // capture options
+        this.options = conf.options().copy().set(this);
     }
 
 
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 72a42b6..6c0d432 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
@@ -605,10 +605,14 @@ public class Interpreter extends InterpreterBase {
     @Override
     protected Object visit(ASTVar node, Object data) {
         int symbol = node.getSymbol();
-        if (options.isLexical() && !block.declareSymbol(symbol)) {
+        // if we have a var, we have a scope thus a frame
+        if (!options.isLexical()) {
+            if (frame.has(symbol)) {
+                return frame.get(symbol);
+            }
+        } else if (!block.declareSymbol(symbol)) {
             return redefinedVariable(node, node.getName());
         }
-        // if we have a var, we have a scope thus a frame
         frame.set(symbol, null);
         return null;
     }
diff --git a/src/main/java/org/apache/commons/jexl3/internal/Options.java b/src/main/java/org/apache/commons/jexl3/internal/Options.java
index f33ea5e..e2c7529 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Options.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Options.java
@@ -83,18 +83,18 @@ public class Options implements JexlOptions {
     /**
      * Set options from engine.
      * @param jexl the engine
+     * @return this instance
      */
     @Override
-    public void setOptions(JexlEngine jexl) {
+    public Options set(JexlEngine jexl) {
         mathContext = jexl.getArithmetic().getMathContext();
         mathScale = jexl.getArithmetic().getMathScale();
         strictArithmetic = jexl.getArithmetic().isStrict();
-        int mask = DEFAULT;
-        mask = set(STRICT, mask, jexl.isStrict());
-        mask = set(SILENT, mask, jexl.isSilent());
-        mask = set(SAFE, mask, jexl.isSafe());
-        mask = set(CANCELLABLE, mask, jexl.isCancellable());
-        flags = mask;
+        set(STRICT, flags, jexl.isStrict());
+        set(SILENT, flags, jexl.isSilent());
+        set(SAFE, flags, jexl.isSafe());
+        set(CANCELLABLE, flags, jexl.isCancellable());
+        return this;
     }
     
     @Override
diff --git a/src/test/java/org/apache/commons/jexl3/AnnotationTest.java b/src/test/java/org/apache/commons/jexl3/AnnotationTest.java
index c466153..b41eda5 100644
--- a/src/test/java/org/apache/commons/jexl3/AnnotationTest.java
+++ b/src/test/java/org/apache/commons/jexl3/AnnotationTest.java
@@ -122,7 +122,7 @@ public class AnnotationTest extends JexlTestCase {
         OptAnnotationContext jc = new OptAnnotationContext();
         JexlOptions options = jc.getEngineOptions();
         JexlEngine jexl = new JexlBuilder().strict(true).silent(false).create();
-        jc.getEngineOptions().setOptions(jexl);
+        jc.getEngineOptions().set(jexl);
         JexlScript e;
         Object r;
         e = jexl.createScript("(s, v)->{ @strict(s) @silent(v) var x = y ; 42; }");
diff --git a/src/test/java/org/apache/commons/jexl3/IssuesTest.java b/src/test/java/org/apache/commons/jexl3/IssuesTest.java
index bda7b35..be9c502 100644
--- a/src/test/java/org/apache/commons/jexl3/IssuesTest.java
+++ b/src/test/java/org/apache/commons/jexl3/IssuesTest.java
@@ -134,7 +134,7 @@ public class IssuesTest extends JexlTestCase {
         //jexl.setSilent(false);
         JexlEvalContext ctxt = new JexlEvalContext();
         JexlOptions options = ctxt.getEngineOptions();
-        options.setOptions(jexl);
+        options.set(jexl);
         options.setStrict(false);
         options.setStrictArithmetic(false);
         ctxt.set("ax", "ok");
@@ -162,7 +162,7 @@ public class IssuesTest extends JexlTestCase {
         JexlEngine jexl = new Engine();
         JexlEvalContext ctxt = new JexlEvalContext();
         JexlOptions options = ctxt.getEngineOptions();
-        options.setOptions(jexl);
+        options.set(jexl);
         // ensure errors will throw
         options.setSilent(false);
 
diff --git a/src/test/java/org/apache/commons/jexl3/LexicalTest.java b/src/test/java/org/apache/commons/jexl3/LexicalTest.java
index 686d65e..30ff319 100644
--- a/src/test/java/org/apache/commons/jexl3/LexicalTest.java
+++ b/src/test/java/org/apache/commons/jexl3/LexicalTest.java
@@ -228,13 +228,25 @@ public class LexicalTest {
     }
 
     @Test
-    public void testLexical2() throws Exception {
-        JexlEngine jexl = new JexlBuilder().strict(true).lexical(true).create();
-        JexlEvalContext ctxt = new JexlEvalContext();
-
+    public void testLexical2a() throws Exception {
+        runLexical2(true);
+    } 
+    
+    @Test
+    public void testLexical2b() throws Exception {
+        runLexical2(false);
+    }
+    
+    protected void runLexical2(boolean lexical) throws Exception {
+        JexlEngine jexl = new JexlBuilder().strict(true).lexical(lexical).create();
+        JexlContext ctxt = new MapContext();
         JexlScript script = jexl.createScript("{var x = 42}; {var x; return x; }");
         Object result = script.execute(ctxt);
-        Assert.assertNull(result);
+        if (lexical) {
+            Assert.assertNull(result);
+        } else {
+            Assert.assertEquals(42, result);
+        }
     }
 
     @Test