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