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