RFR: 8194743: Compiler implementation for Statements before super() [v11]

Archie Cobbs acobbs at openjdk.org
Thu Sep 7 00:31:47 UTC 2023

On Sat, 8 Jul 2023 15:46:07 GMT, Archie Cobbs <acobbs at openjdk.org> wrote:

>> This is a first draft of a patch for JEP 447.
>> Summary of changes:
>> 1. Track when we're within a constructor "prologue" via new flag `AttrContext.ctorPrologue`
>> 1. Add checks for illegal early access to `this` in constructor prologues, and update existing checks to distinguish between static context vs. constructor prologue context
>> 1. Verify allowed placement of `super()`/`this()` calls via new method `Check.checkSuperInitCalls()`
>> 1. Remove/refactor assumptions in several places that `super()`/`this()` was always the first statement
>> The changes in `Flow.java` are an example of <span>#</span>4. `Flow.FlowAnalyzer` checks for uncaught checked exceptions. For initializer blocks, this was previously done by requiring that any checked exceptions thrown be declared as thrown by all constructors containing `super()`. This list of checked exceptions was being pre-calculated before recursing into the initial constructors. This worked because initializer blocks were executed at the beginning of each initial constructor right after `super()` is called.
>> Now initializer blocks are traversed as each `super()` invocation is encountered, reflecting what actually happens at runtime. Similarly, final fields are marked as DA after encountering `this()`, not automatically at the beginning of those  constructors. These changes produce equivalent checks, but are compatible with the new flexibility of placement of `super()`/`this()` as well as possible future changes that could occur along these same lines.
> Archie Cobbs has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 29 commits:
>  - Merge branch 'master' into SuperInit
>  - Create and cache a single instance of the oft-used SuperThisChecker.
>  - Add unit test verifying super() can't appear inside a lambda.
>  - Use TreeInfo.isConstructor() for detecting constructors.
>  - Merge branch 'master' into SuperInit
>  - Fix mistake in previous merge commit 80ba6be4.
>  - Merge branch 'master' into SuperInit
>  - Rename unit test to be consistent with other feature exampless.
>  - Update unit test after merged-in commit eaa80ad08.
>  - Add unit tests with local class decl's prior to super().
>  - ... and 19 more: https://git.openjdk.org/jdk/compare/4a1fcb60...e2f88137

Regarding the latest update: In some cases the compiler was treating code before `super()` differently from code inside `super()` parameter expressions, although they should be exactly the same (the constructor "prologue" rules apply to both). This is fixed by removing some leftover/redundant code.

In summary, the `isSelfCall` flag is made obsolete by the newer, more general flag `ctorPrologue`, so it can be removed.


PR Comment: https://git.openjdk.org/jdk/pull/13656#issuecomment-1709294538

More information about the compiler-dev mailing list