[
https://issues.apache.org/jira/browse/JEXL-318?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Henri Biestro resolved JEXL-318.
--------------------------------
Resolution: Fixed
Changeset: 12146f65fca5c24ac276c82e08b2ee52b3209225
Author: henrib <[email protected]>
Date: 2020-01-16 14:38
Message: JEXL-318: release notes and changes
> 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
>
> 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)