Skip to content

Conversation

@ChrisHegarty
Copy link
Member

@ChrisHegarty ChrisHegarty commented Dec 1, 2020

Update Class::isRecord to only return true for classes that are final.

The removal of non-specified JVM checks on classes with a Record Attribute (see JDK-8255342), has resulted in more types of loadable classes that may contain a Record Attribute. Since these checks are not performed by the JVM anymore, Class::isRecord, and by extension Class::getRecordComponents, may return true or component values, respectively, for classes that are not well-formed record classes (as per the JLS), .e.g. non-final or abstract classes, that contain a record Attribute.

Core Reflection, Class::isRecord, already asserts checks that the JVM does not, e.g. that the direct superclass is java.lang.Record. Some points from the Java Language Specification for record classes:

  1. It is a compile-time error if a record declaration has the modifier abstract.
  2. A record declaration is implicitly final.
  3. The direct superclass type of a record class is Record.

Class::isRecord already ensures no.3. This issue proposes to add explicit checks in Core Reflection to ensure no.1 and no.2, since the JVM now allows such classes that contain a Record Attribute to be loaded.


Progress

  • Change must not contain extraneous whitespace
  • Commit message must refer to an issue
  • Change must be properly reviewed

Issue

  • JDK-8255560: Class::isRecord should check that the current class is final and not abstract

Reviewers

Download

$ git fetch https://git.openjdk.java.net/jdk pull/1543/head:pull/1543
$ git checkout pull/1543

Class::isRecord should check that the current class is final and not abstract
@bridgekeeper
Copy link

bridgekeeper bot commented Dec 1, 2020

👋 Welcome back chegar! A progress list of the required criteria for merging this PR into master will be added to the body of your pull request. There are additional pull request commands available for use with this pull request.

@ChrisHegarty
Copy link
Member Author

/csr

@openjdk openjdk bot added rfr Pull request is ready for review csr Pull request needs approved CSR before integration labels Dec 1, 2020
@openjdk
Copy link

openjdk bot commented Dec 1, 2020

@ChrisHegarty this pull request will not be integrated until the CSR request JDK-8257520 for issue JDK-8255560 has been approved.

@openjdk
Copy link

openjdk bot commented Dec 1, 2020

@ChrisHegarty The following label will be automatically applied to this pull request:

  • core-libs

When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command.

@openjdk openjdk bot added the core-libs core-libs-dev@openjdk.org label Dec 1, 2020
@mlbridge
Copy link

mlbridge bot commented Dec 1, 2020

Webrevs

out.println("\n--- testBasicRecords ---");
record EmptyRecord () { }
assertTrue(EmptyRecord.class.isRecord());
assertTrue(EmptyRecord.class.getRecordComponents() != null);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Better to have a more precise check for empty array

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea - done.

Copy link
Member

@mlchung mlchung left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The change looks good with a couple of minor suggestion.

* record components, that is, {@link #getRecordComponents()} returns a
* non-null value.
* class is {@code java.lang.Record}. A record class is
* {@link Modifier#FINAL}. A record class has (possibly zero) record
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: {@linkplain Modifier#FINAL final}.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea - done.

Copy link
Member

@mlchung mlchung left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

{@link ... final} should be @linkplain. Otherwise, looks good.

@ChrisHegarty
Copy link
Member Author

{@link ... final} should be @linkplain. Otherwise, looks good.

Oops! Yes, changed.

@openjdk
Copy link

openjdk bot commented Dec 4, 2020

@ChrisHegarty this pull request can not be integrated into master due to one or more merge conflicts. To resolve these merge conflicts and update this pull request you can run the following commands in the local repository for your personal fork:

git checkout isRecord
git fetch https://git.openjdk.java.net/jdk master
git merge FETCH_HEAD
# resolve conflicts and follow the instructions given by git merge
git commit -m "Merge master"
git push

@openjdk openjdk bot added merge-conflict Pull request has merge conflict with target branch and removed csr Pull request needs approved CSR before integration labels Dec 4, 2020
@openjdk
Copy link

openjdk bot commented Dec 7, 2020

@ChrisHegarty This change now passes all automated pre-integration checks.

ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details.

After integration, the commit message for the final commit will be:

8255560: Class::isRecord should check that the current class is final and not abstract

Reviewed-by: mchung, darcy

You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed.

At the time when this comment was updated there had been 3 new commits pushed to the master branch:

  • f5a582c: 8257575: C2: "failed: only phis" assert failure in loop strip mining verification
  • d05401d: 8256679: Update serialization javadoc once JOSS changes for records are complete
  • 7620124: 8257230: assert(InitialHeapSize >= MinHeapSize) failed: Ergonomics decided on incompatible initial and minimum heap sizes

Please see this link for an up-to-date comparison between the source branch of this pull request and the master branch.
As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details.

➡️ To integrate this PR with the above commit message to the master branch, type /integrate in a new comment.

@openjdk openjdk bot added ready Pull request is ready to be integrated and removed merge-conflict Pull request has merge conflict with target branch labels Dec 7, 2020
@ChrisHegarty
Copy link
Member Author

/integrate

@openjdk openjdk bot closed this Dec 7, 2020
@openjdk openjdk bot added integrated Pull request has been integrated and removed ready Pull request is ready to be integrated rfr Pull request is ready for review labels Dec 7, 2020
@openjdk
Copy link

openjdk bot commented Dec 7, 2020

@ChrisHegarty Since your change was applied there have been 5 commits pushed to the master branch:

  • 8e8e584: 8257588: Make os::_page_sizes a bitmask
  • 566d77a: 8254802: ThrowingPushPromisesAsStringCustom.java fails in "try throwing in GET_BODY"
  • f5a582c: 8257575: C2: "failed: only phis" assert failure in loop strip mining verification
  • d05401d: 8256679: Update serialization javadoc once JOSS changes for records are complete
  • 7620124: 8257230: assert(InitialHeapSize >= MinHeapSize) failed: Ergonomics decided on incompatible initial and minimum heap sizes

Your commit was automatically rebased without conflicts.

Pushed as commit 5a03e47.

💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

core-libs core-libs-dev@openjdk.org integrated Pull request has been integrated

Development

Successfully merging this pull request may close these issues.

3 participants