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 a3fe9a60 JEXL-393: stop searching for a symbol constness when its declaration is found in a lexical scope; a3fe9a60 is described below commit a3fe9a60d2717c409ee5694747a2896b4bc58d56 Author: henrib <hen...@apache.org> AuthorDate: Fri Mar 17 15:19:35 2023 +0100 JEXL-393: stop searching for a symbol constness when its declaration is found in a lexical scope; --- .../org/apache/commons/jexl3/internal/Engine.java | 13 ++++++--- .../apache/commons/jexl3/parser/JexlParser.java | 8 ++--- .../org/apache/commons/jexl3/Issues300Test.java | 1 - .../java/org/apache/commons/jexl3/LexicalTest.java | 34 ++++++++++++++++++++++ 4 files changed, 47 insertions(+), 9 deletions(-) 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 ff228295..43266cf9 100644 --- a/src/main/java/org/apache/commons/jexl3/internal/Engine.java +++ b/src/main/java/org/apache/commons/jexl3/internal/Engine.java @@ -459,18 +459,23 @@ public class Engine extends JexlEngine { ns = new LinkedHashMap<>(); } processPragmaNamespace(ns, key, value); + if (!ns.isEmpty()) { + opts.setNamespaces(ns); + } } else if (key.startsWith(PRAGMA_MODULE)) { if (ns == null) { ns = new LinkedHashMap<>(); } - processModulePragma(ns, key, value, script.jexlInfo(), context); + processPragmaModule(ns, key, value, script.jexlInfo(), context); + if (!ns.isEmpty()) { + opts.setNamespaces(ns); + } } + // user defined processor may alter options if (processor != null) { - opts.setNamespaces(ns); processor.processPragma(opts, key, value); } } - opts.setNamespaces(ns); } } @@ -522,7 +527,7 @@ public class Engine extends JexlEngine { * @param info the expression info * @param context the value-as-expression evaluation context */ - private void processModulePragma(Map<String, Object> ns, String key, Object value, JexlInfo info, JexlContext context) { + private void processPragmaModule(Map<String, Object> ns, String key, Object value, JexlInfo info, JexlContext context) { // jexl.module.*** final String module = key.substring(PRAGMA_MODULE.length()); if (module.isEmpty()) { 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 eb2cbc0d..6dd134f4 100644 --- a/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java +++ b/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java @@ -691,8 +691,8 @@ public abstract class JexlParser extends StringParser { */ private boolean isConstant(int symbol) { if (symbol >= 0) { - if (block != null && block.isConstant(symbol)) { - return true; + if (block != null && block.hasSymbol(symbol)) { + return block.isConstant(symbol); } Scope blockScope = blockScopes.get(block); int lexical = symbol; @@ -708,8 +708,8 @@ public abstract class JexlParser extends StringParser { blockScope = unitScope; } } - if (unit.isConstant(lexical)) { - return true; + if (unit.hasSymbol(lexical)) { + return unit.isConstant(lexical); } } } diff --git a/src/test/java/org/apache/commons/jexl3/Issues300Test.java b/src/test/java/org/apache/commons/jexl3/Issues300Test.java index f3d087ba..a63239d4 100644 --- a/src/test/java/org/apache/commons/jexl3/Issues300Test.java +++ b/src/test/java/org/apache/commons/jexl3/Issues300Test.java @@ -1284,5 +1284,4 @@ public class Issues300Test { Assert.assertEquals("foo", x.toString()); } - } diff --git a/src/test/java/org/apache/commons/jexl3/LexicalTest.java b/src/test/java/org/apache/commons/jexl3/LexicalTest.java index 62ecfbc3..35462764 100644 --- a/src/test/java/org/apache/commons/jexl3/LexicalTest.java +++ b/src/test/java/org/apache/commons/jexl3/LexicalTest.java @@ -1017,6 +1017,40 @@ public class LexicalTest { } } + @Test public void testConst3a() { + JexlEngine jexl = new JexlBuilder().create(); + List<String> srcs = Arrays.asList( + "const f = ()->{ var foo = 3; foo = 5; }", + "const y = '42'; const f = (let y)->{ var foo = 3; foo = 5; }", + "const foo = '34'; const f = ()->{ var foo = 3; foo = 5; };", + "const bar = '34'; const f = ()->{ var f = 3; f = 5; };", + "const bar = '34'; const f = ()->{ var bar = 3; z ->{ bar += z; } };"); + for(String src: srcs) { + JexlScript script = jexl.createScript(src); + Object result = script.execute(null); + Assert.assertNotNull(src, result); + } + } + + @Test public void testConst3b() { + JexlEngine jexl = new JexlBuilder().create(); + List<String> srcs = Arrays.asList( + "const f = ()->{ var foo = 3; f = 5; }", + "const y = '42'; const f = (let z)->{ y += z; }", + "const foo = '34'; const f = ()->{ foo = 3; };", + "const bar = '34'; const f = ()->{ bar = 3; z ->{ bar += z; } };", + "let bar = '34'; const f = ()->{ const bar = 3; z ->{ bar += z; } };"); + for(String src: srcs) { + try { + JexlScript script = jexl.createScript(src); + Object result = script.execute(null); + Assert.fail(src); + } catch(JexlException.Assignment xassign) { + Assert.assertNotNull(src, xassign); // debug breakpoint + } + } + } + @Test public void testSingleStatementDeclFail() { List<String> srcs = Arrays.asList(