You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Dmitri Blinov (Jira)" <ji...@apache.org> on 2020/01/13 08:27:00 UTC

[jira] [Created] (JEXL-318) Annotation processing may fail in lexical mode

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)