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 9f0e5c15 JEXL-373: fixing regression in error reporting and lexical frame cleansing; 9f0e5c15 is described below commit 9f0e5c151183d34c3a1d1d9ffbd41ca4d0726bd4 Author: henrib <hen...@apache.org> AuthorDate: Fri Aug 26 19:12:37 2022 +0200 JEXL-373: fixing regression in error reporting and lexical frame cleansing; --- .../java/org/apache/commons/jexl3/JexlException.java | 2 +- .../org/apache/commons/jexl3/internal/LexicalScope.java | 16 ++++++++++------ .../java/org/apache/commons/jexl3/parser/JexlParser.java | 11 ++++++++--- .../java/org/apache/commons/jexl3/Issues300Test.java | 14 ++++++++++++++ 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/apache/commons/jexl3/JexlException.java b/src/main/java/org/apache/commons/jexl3/JexlException.java index a683596f..19f73d45 100644 --- a/src/main/java/org/apache/commons/jexl3/JexlException.java +++ b/src/main/java/org/apache/commons/jexl3/JexlException.java @@ -446,7 +446,7 @@ public class JexlException extends RuntimeException { } /** - * Thrown when parsing fails due to an invalid assigment. + * Thrown when parsing fails due to an invalid assignment. * * @since 3.0 */ diff --git a/src/main/java/org/apache/commons/jexl3/internal/LexicalScope.java b/src/main/java/org/apache/commons/jexl3/internal/LexicalScope.java index 4be5d755..2f983e01 100644 --- a/src/main/java/org/apache/commons/jexl3/internal/LexicalScope.java +++ b/src/main/java/org/apache/commons/jexl3/internal/LexicalScope.java @@ -21,9 +21,8 @@ import java.util.BitSet; /** * The set of symbols declared in a lexical scope. * <p>The symbol identifiers are determined by the functional scope.</p> - * <p>We use 3 bits per symbol; bit 0 sets the actual symbol as lexical (let), - * bit 1 as a const, bit 2 as a defined (valued) const. - * There are actually only 4 used states: 0, 1, 3, 7</p> + * <p>We use 2 bits per symbol; bit 0 sets the actual symbol as lexical (let), bit 1 as a const. + * There are actually only 4 used states: 0, 1, 3</p> */ public class LexicalScope { /** @@ -35,6 +34,11 @@ public class LexicalScope { * Declared, const, defined. */ protected static final int BITS_PER_SYMBOL = 2; + /** + * Bitmask for symbols. + * Declared, const, defined. + */ + protected static final long SYMBOL_MASK = (1L << BITS_PER_SYMBOL) - 1; // 3, as 1+2, 2 bits /** * Number of symbols. */ @@ -170,15 +174,15 @@ public class LexicalScope { long clean = symbols; while (clean != 0L) { final int s = Long.numberOfTrailingZeros(clean); - // call clean for symbol definition (7 as a mask for 3 bits,1+2+4) - clean &= ~(7L << s); + // call clean for symbol definition (3 as a mask for 2 bits,1+2) + clean &= ~(SYMBOL_MASK << s); cleanSymbol.accept(s >> BITS_PER_SYMBOL); } } symbols = 0L; if (moreSymbols != null) { if (cleanSymbol != null) { - // step over const and definition (3 bits per symbol) + // step by bits per symbol for (int s = moreSymbols.nextSetBit(0); s != -1; s = moreSymbols.nextSetBit(s + BITS_PER_SYMBOL)) { cleanSymbol.accept(s + LONGBITS); } 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 bae8e971..157ae9c2 100644 --- a/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java +++ b/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java @@ -629,14 +629,19 @@ public abstract class JexlParser extends StringParser { } else if (ASSIGN_NODES.contains(node.getClass())) { final JexlNode lv = node.jjtGetChild(0); if (!lv.isLeftValue()) { - throw new JexlException.Assignment(lv.jexlInfo(), null).clean(); + JexlInfo xinfo = lv.jexlInfo(); + xinfo = info.at(xinfo.getLine(), xinfo.getColumn()); + final String msg = readSourceLine(source, xinfo.getLine()); + throw new JexlException.Assignment(xinfo, msg).clean(); } if (lv instanceof ASTIdentifier && !(lv instanceof ASTVar)) { ASTIdentifier var = (ASTIdentifier) lv; int symbol = var.getSymbol(); boolean isconst = symbol >= 0 && block != null && block.isConstant(symbol); - if (isconst) { // if not a declaration... - throw new JexlException.Parsing(var.jexlInfo(), var.getName() +": const assignment.").clean(); + if (isconst) { // if constant, fail... + JexlInfo xinfo = lv.jexlInfo(); + xinfo = info.at(xinfo.getLine(), xinfo.getColumn()); + throw new JexlException.Assignment(xinfo, var.getName()).clean(); } } } diff --git a/src/test/java/org/apache/commons/jexl3/Issues300Test.java b/src/test/java/org/apache/commons/jexl3/Issues300Test.java index 94005566..6477243a 100644 --- a/src/test/java/org/apache/commons/jexl3/Issues300Test.java +++ b/src/test/java/org/apache/commons/jexl3/Issues300Test.java @@ -897,4 +897,18 @@ public class Issues300Test { Assert.assertTrue(result instanceof LinkedHashMap); Assert.assertEquals(1, ((Map) result).size()); } + + @Test + public void test373b() { + final String src = "var i = ++1"; + JexlEngine jexl = new JexlBuilder().safe(true).create(); + JexlInfo info = new JexlInfo("badscript", 0, 0); + try { + JexlScript script = jexl.createScript(info, src); + Assert.fail("should not parse"); + } catch(JexlException.Parsing xparse) { + String msg = xparse.getMessage(); + Assert.assertTrue(msg.contains("badscript")); + } + } }