RFR: 8194743: Compiler implementation for Statements before super()

Archie Cobbs acobbs at openjdk.org
Tue Apr 25 20:47:57 UTC 2023


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.

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

Commit messages:
 - Use for() loop instead of stream for efficiency.
 - Fix typo in comment.
 - Merge branch 'master' into SuperInit
 - Fix Javadoc comment.
 - Merge branch 'master' into SuperInit
 - Merge branch 'master' into SuperInit
 - Merge branch 'master' into SuperInit
 - Merge branch 'master' into SuperInit
 - Merge branch 'master' into SuperInit
 - Merge branch 'master' into SuperInit
 - ... and 4 more: https://git.openjdk.org/jdk/compare/bad6aa68...0eac8b68

Changes: https://git.openjdk.org/jdk/pull/13656/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=13656&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8194743
  Stats: 1340 lines in 20 files changed: 1076 ins; 162 del; 102 mod
  Patch: https://git.openjdk.org/jdk/pull/13656.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/13656/head:pull/13656

PR: https://git.openjdk.org/jdk/pull/13656


More information about the kulla-dev mailing list