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

Maurizio Cimadamore mcimadamore at openjdk.org
Mon Sep 25 08:53:20 UTC 2023

On Fri, 22 Sep 2023 22:02:04 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 incrementally with one additional commit since the last revision:
>   Remove obsolete flag "constructorArgs".

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java line 485:

> 483:         // Do something with all static or non-static field initializers and initialization blocks.
> 484:         // Note: This method also sends nested class definitions to the handler.
> 485:         protected void forEachInitializer(JCClassDecl classDef, boolean statik, Consumer<? super JCTree> handler) {


        protected void forEachInitializer(JCClassDecl classDef, boolean isStatic, Consumer<? super JCTree> handler) {

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java line 4613:

> 4611:      * early accesses within a constructor prologue.
> 4612:      */
> 4613:     class RefBeforeCtorCalledError extends InvalidSymbolError {

Why doesn't this subclass StaticError?


PR Review Comment: https://git.openjdk.org/jdk/pull/13656#discussion_r1335582828
PR Review Comment: https://git.openjdk.org/jdk/pull/13656#discussion_r1335580983

More information about the compiler-dev mailing list