[ 
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)

Reply via email to