On Fri, 29 May 2026 12:32:31 GMT, Maurizio Cimadamore <[email protected]> 
wrote:

> This PR removes some unnecessary coupling between Lower, Gen and 
> LocalProxyVarsGen.
> 
> It does so by making LocalProxyVarsGen no longer a standalone pass but, 
> rather, a helper for Gen::normalizeMethod.
> 
> The main idea is that we can make things more regular, by having Gen always 
> inserting variable initializer in the correct place.
> Then, LocalProxyVarGen will create a blank proxy, and use its visitor to 
> inspect the rest of the constructor body.
> Since the visitor _already_ rewires assignments to real fields as assignments 
> to proxies, this new arrangement has the desired effect of generating the 
> same code as before, but w/o too much coupling.
> 
> Some massaging to `Gen::normalizeMethod` was needed because now we need to 
> make sure it calls the proxy step for all constructors, not just in case 
> there's some pending var initializers.
> 
> Finally, when cleaning up `Lower` I noticed a likely bug: `freevardefs` was 
> no longer preserving the `LOCAL_CAPTURE_FIELD` -- sometimes it was replacing 
> it with `STRICT`. But `LOCAL_CAPTURE_FIELD` is used by LambdaToMethod, so 
> changing this probably results in bad downstream lowering.
> I've fixed this by adding both `STRICT` _and_ `LOCAL_CAPTURE_FIELD` to the 
> captured sym.
> 
> ---------
> - [x] I confirm that I make this contribution in accordance with the [OpenJDK 
> Interim AI Policy](https://openjdk.org/legal/ai).

I've pushed a new revision that deals with cases where we have early field 
initializers that refer to `Lower`-generated synthetic fields. Example:


class Test {
              class Inner { }
              value class V {
                  Object o = new Inner(); // this$0 ref
                  V() { super(); }
              }
}


Here, the field initializer needs `this$0`, but since that initializer is being 
"copied" into the constructor prologue, that `this$0` becomes an "early read". 
I've tried several approaches, and almost everything failed. What worked was to 
resurrect the initializer visitor @vicente-romero-oracle had, and generalize it 
a bit, to also deal with local captures.

-------------

PR Comment: https://git.openjdk.org/valhalla/pull/2488#issuecomment-4580852188

Reply via email to