[ https://issues.apache.org/jira/browse/JEXL-426?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Henri Biestro reopened JEXL-426: -------------------------------- Incorrect scoping when local variable shades a captured one in stack frame. > Enable pass-by-reference for Captured Variables > ------------------------------------------------ > > Key: JEXL-426 > URL: https://issues.apache.org/jira/browse/JEXL-426 > Project: Commons JEXL > Issue Type: Improvement > Affects Versions: 3.4.0 > Reporter: Xu Pengcheng > Assignee: Henri Biestro > Priority: Major > Fix For: 3.5.0 > > > For the code > {code:java} > let x = 10; > function foo() { > x += 2; > } > foo(); > return x;{code} > By default the return value of x is 10 because `x` inside `foo` is a captured > value, re-assign value not affect the variable outside `foo`, which some > times confuse the developer, therefore a new feature `constCapture` was > introduced to prevent such kind of re-assignment, which is the same behavior > of Java code. > But the problem is variable `x` outside of function is not const, for the > following code > > {code:java} > 1: let x = 10; > 2: function foo() { > 3: someCall(x); > 4: } > 5: x = 20; > 6: foo(); > 7: return x; {code} > This code is valid with constCapture = true (similar code in java is invalid > because x needs to be 'final'), but the value inside `foo` is 10, not 20, I > checked the JEXL source codes and found the value inside `foo` is captured > when defining `foo` function (line 3), which is 10, even when calling `foo` > in line 6 the value of x is already be 20, this case is also somehow confuse. > > I tried extending Interpreter to change the behavior of captured variable to: > # re-assign the captured variable to latest value from parent frame before > executing. > # populate the value to parent scope while assigning new value to a captured > variable > with this interpreter, the value of x in line 3 and 7 are 22, which I think > is more easy to understand. > {code:java} > 1: let x = 10; > 2: function foo() { > 3: x += 2; // here x = 22 > 4: } > 5: x = 20; > 6: foo(); > 7: return x; // here x = 22{code} > > Is it possible to add a new feature to support this behavior? > or provide more apis, i.e. > # api to get whole frame stack (now I store it in JexlContext) > # read/write value by variable name for a frame (now I reflect the > get/set/getSymbol methods of Frame class) > # get parent of Scope. > Thanks very much! -- This message was sent by Atlassian Jira (v8.20.10#820010)