Dmitri Blinov created JEXL-318: ---------------------------------- Summary: Annotation processing may fail in lexical mode Key: JEXL-318 URL: https://issues.apache.org/jira/browse/JEXL-318 Project: Commons JEXL Issue Type: Bug Affects Versions: 3.1 Reporter: Dmitri Blinov
I fave found that the annotation processing under certain conditions may lead to NPE {code:java} public static class OptAnnotationContext extends JexlEvalContext implements JexlContext.AnnotationProcessor { @Override public Object processAnnotation(String name, Object[] args, Callable<Object> statement) throws Exception { JexlOptions options = this.getEngineOptions(); // transient side effect for strict if ("scale".equals(name)) { int scale = options.getMathScale(); int newScale = (Integer) args[0]; options.setMathScale(newScale); try { return statement.call(); } finally { options.setMathScale(scale); } } return statement.call(); } } @Test public void testAnnotation() throws Exception { JexlFeatures f = new JexlFeatures(); f.lexical(true); JexlEngine jexl = new JexlBuilder().strict(true).features(f).create(); JexlScript script = jexl.createScript("@scale(13) @test var i = 42"); JexlContext jc = new OptAnnotationContext(); Object result = script.execute(jc); Assert.assertEquals(result, 42); } {code} This is because new instance of Interpeter is created to process annotation under certain conditions, and this new instance does not inherit the current lexical block. Furthermore, the constructor of InterperterBase {{InterpreterBase(InterpreterBase ii, JexlArithmetic jexla)}} now silently ignores JexlArithmetic passed to it, which is possibly another bug. As a suggestion, can we refactor the code to simply make JexlArithmetic non final in InterpreterBase? There would be no need to create new instance of Interpeter and complicate code with sync-state code? -- This message was sent by Atlassian Jira (v8.3.4#803005)