You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Henri Biestro (Jira)" <ji...@apache.org> on 2021/06/07 13:15:07 UTC

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

     [ https://issues.apache.org/jira/browse/JEXL-318?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Henri Biestro closed JEXL-318.
------------------------------

> 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
>            Priority: Major
>             Fix For: 3.2
>
>
> 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)