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 32bfdc9  JEXL-307: parser internal state clean up Task #JEXL-307 - 
Variable redeclaration option
32bfdc9 is described below

commit 32bfdc913223aac1282e9b64fdf198a1e4561dac
Author: Henri Biestro <hbies...@gmail.com>
AuthorDate: Fri Nov 1 11:17:16 2019 +0100

    JEXL-307: parser internal state clean up
    Task #JEXL-307 - Variable redeclaration option
---
 .../apache/commons/jexl3/parser/JexlParser.java    | 26 ++++++++++++----------
 .../java/org/apache/commons/jexl3/LexicalTest.java | 15 +++++++++++++
 2 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java 
b/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
index e557e7f..4aa2c05 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
+++ b/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
@@ -98,25 +98,25 @@ public abstract class JexlParser extends StringParser {
          * @return true if declaration was successful, false if symbol was 
already declared
          */
         boolean declareSymbol(int symbol);
-        
+
         /**
          * Checks whether a symbol is declared in this lexical unit.
          * @param symbol the symbol
          * @return true if declared, false otherwise
          */
         boolean hasSymbol(int symbol);
-        
+
         /**
-         * @return the number of local variables declared in this unit 
+         * @return the number of local variables declared in this unit
          */
         int getSymbolCount();
-        
+
         /**
          * Clears this unit.
          */
         void clearUnit();
     }
-    
+
     /**
      * Cleanup.
      * @param features the feature set to restore if any
@@ -130,6 +130,8 @@ public abstract class JexlParser extends StringParser {
         loopCounts.clear();
         loopCount = 0;
         blocks.clear();
+        block = null;
+        mergeBlock = false;
     }
     /**
      * Utility function to create '.' separated string from a list of string.
@@ -170,7 +172,7 @@ public abstract class JexlParser extends StringParser {
         }
         return msg;
     }
-    
+
     /**
      * Internal, for debug purpose only.
      * @param registers whether register syntax is recognized by this parser
@@ -252,13 +254,13 @@ public abstract class JexlParser extends StringParser {
         } else if (mergeBlock) {
             mergeBlock = false;
             return;
-        } 
+        }
         if (block != null) {
             blocks.push(block);
         }
         block = unit;
     }
-    
+
     /**
      * Pushes a block as new lexical unit.
      * @param unit the lexical unit
@@ -272,7 +274,7 @@ public abstract class JexlParser extends StringParser {
      * @param unit restores the previous lexical scope
      */
     protected void popUnit(LexicalUnit unit) {
-        if (block == unit){ 
+        if (block == unit){
             if (!blocks.isEmpty()) {
                 block = blocks.pop();
             } else {
@@ -281,7 +283,7 @@ public abstract class JexlParser extends StringParser {
             //unit.clearUnit();
         }
     }
-    
+
     /**
      * Checks whether an identifier is a local variable or argument, ie a 
symbol, stored in a register.
      * @param identifier the identifier
@@ -317,11 +319,11 @@ public abstract class JexlParser extends StringParser {
         }
         return true;
     }
-    
+
     /**
      * Declares a symbol.
      * @param symbol the symbol index
-     * @return true if symbol can be declared in lexical scope, false (error) 
+     * @return true if symbol can be declared in lexical scope, false (error)
      * if it is already declared
      */
     private boolean declareSymbol(int symbol) {
diff --git a/src/test/java/org/apache/commons/jexl3/LexicalTest.java 
b/src/test/java/org/apache/commons/jexl3/LexicalTest.java
index 5cf9bfd..0a6d7cf 100644
--- a/src/test/java/org/apache/commons/jexl3/LexicalTest.java
+++ b/src/test/java/org/apache/commons/jexl3/LexicalTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.commons.jexl3;
 
+import java.util.Set;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -240,4 +241,18 @@ public class LexicalTest {
             String ww = xany.toString();
         }
     }
+
+    @Test
+    public void testLexical3() throws Exception {
+        String str = "var s = {}; for (var i : [1]) s.add(i); s";
+        JexlEngine jexl = new JexlBuilder().strict(true).create();
+        JexlScript e = jexl.createScript(str);
+        JexlContext jc = new MapContext();
+        Object o = e.execute(jc);
+        Assert.assertEquals(Boolean.TRUE, ((Set)o).contains(1));
+
+        e = jexl.createScript(str);
+        o = e.execute(jc);
+        Assert.assertEquals(Boolean.TRUE, ((Set)o).contains(1));
+    }
 }

Reply via email to