Skip to content

8357987: [JVMCI] Add Support for Retrieving All Non-Static Methods of a ResolvedJavaType. #25498

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

teshull
Copy link

@teshull teshull commented May 28, 2025

Currently from ResolvedJavaType one can retrieve all declared methods, static methods, and constructors of the given type. However, internally in HotSpot there are also VM-internal methods, such as overpass methods, associated with a given type which we cannot access via the API.

To correct this, we should add a new method which enables VM-internal methods, such as overpass methods, to be accessed.


Progress

  • Change must be properly reviewed (1 review required, with at least 1 Reviewer)
  • Change must not contain extraneous whitespace
  • Commit message must refer to an issue

Integration blocker

 ⚠️ Title mismatch between PR and JBS for issue JDK-8357987

Warning

 ⚠️ Found trailing period in issue title for 8357987: [JVMCI] Add Support for Retrieving All Non-Static Methods of a ResolvedJavaType.

Issue

  • JDK-8357987: [JVMCI] Add support for retrieving all methods of a ResolvedJavaType (Bug - P4) ⚠️ Title mismatch between PR and JBS.

Reviewing

Using git

Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/25498/head:pull/25498
$ git checkout pull/25498

Update a local copy of the PR:
$ git checkout pull/25498
$ git pull https://git.openjdk.org/jdk.git pull/25498/head

Using Skara CLI tools

Checkout this PR locally:
$ git pr checkout 25498

View PR using the GUI difftool:
$ git pr show -t 25498

Using diff file

Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/25498.diff

Using Webrev

Link to Webrev Comment

@bridgekeeper bridgekeeper bot added the oca Needs verification of OCA signatory status label May 28, 2025
@bridgekeeper
Copy link

bridgekeeper bot commented May 28, 2025

Hi @teshull, welcome to this OpenJDK project and thanks for contributing!

We do not recognize you as Contributor and need to ensure you have signed the Oracle Contributor Agreement (OCA). If you have not signed the OCA, please follow the instructions. Please fill in your GitHub username in the "Username" field of the application. Once you have signed the OCA, please let us know by writing /signed in a comment in this pull request.

If you already are an OpenJDK Author, Committer or Reviewer, please click here to open a new issue so that we can record that fact. Please use "Add GitHub user teshull" as summary for the issue.

If you are contributing this work on behalf of your employer and your employer has signed the OCA, please let us know by writing /covered in a comment in this pull request.

@openjdk
Copy link

openjdk bot commented May 28, 2025

❗ This change is not yet ready to be integrated.
See the Progress checklist in the description for automated requirements.

@openjdk
Copy link

openjdk bot commented May 28, 2025

@teshull The following labels will be automatically applied to this pull request:

  • graal
  • hotspot-compiler

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

@openjdk openjdk bot added graal graal-dev@openjdk.org hotspot-compiler hotspot-compiler-dev@openjdk.org labels May 28, 2025
@teshull
Copy link
Author

teshull commented May 28, 2025

/covered

@bridgekeeper bridgekeeper bot added the oca-verify Needs verification of OCA signatory status label May 28, 2025
@bridgekeeper
Copy link

bridgekeeper bot commented May 28, 2025

Thank you! Please allow for a few business days to verify that your employer has signed the OCA. Also, please note that pull requests that are pending an OCA check will not usually be evaluated, so your patience is appreciated!

@teshull teshull changed the title 8357987: [JVMCI] Add Support for Retrieving All Non-Static Methods of a ResolvedJavaType. 8357987: [JVMCI] Add Support for Retrieving All Non-Static Methods of a ResolvedJavaType May 28, 2025
@openjdk openjdk bot changed the title 8357987: [JVMCI] Add Support for Retrieving All Non-Static Methods of a ResolvedJavaType 8357987: [JVMCI] Add Support for Retrieving All Non-Static Methods of a ResolvedJavaType. May 28, 2025
if (isConstructor() || isStatic()) {
return false;
}
return !compilerToVM().isOverpass(this);
Copy link
Member

Choose a reason for hiding this comment

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

I think you can do this with a direct flag check:

boolean isOverpass = (getConstMethodFlags() & config().constMethodIsOverpass) != 0;
return isOverpass;

See #20256 as an example of the other changes needed for this.

Copy link
Author

Choose a reason for hiding this comment

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

good call. changed

@@ -365,6 +366,13 @@ default ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) {
throw new UnsupportedOperationException();
}

/**
* Returns a list containing all the non-static methods present within this type.
Copy link
Member

Choose a reason for hiding this comment

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

Point out that the returned list is unmodifiable (like the API for Stream.toList() does).

*/
ResolvedJavaMethod[] getDeclaredMethods(HotSpotResolvedObjectTypeImpl klass) {
return getDeclaredMethods(klass, klass.getKlassPointer());
}

native ResolvedJavaMethod[] getDeclaredMethods(HotSpotResolvedObjectTypeImpl klass, long klassPointer);

/**
* Gets the {@link ResolvedJavaMethod}s for all instance methods of {@code klass}.
Copy link
Member

Choose a reason for hiding this comment

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

instance -> non-static
Instance -> NonStatic

Copy link
Author

@teshull teshull May 28, 2025

Choose a reason for hiding this comment

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

I realized NonStatic is not accurate - we return everything except <init>s and <clinit> - so I switched to NonInitializerMethods everywhere. Does that seem fair?

Copy link
Author

@teshull teshull May 29, 2025

Choose a reason for hiding this comment

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

thinking about it more, it's probably better if we do no filtering and return all methods in InstanceKlass->_methods. How about something like getAllMethods:

 /**
     * Returns a list containing all methods present within this type. This list can include
     * methods implicitly created and used by the VM.
     * The returned List is unmodifiable; calls to any mutator method
     * will always cause {@code UnsupportedOperationException} to be thrown.
     *
     * @param forceLink if {@code true}, forces this type to be {@link #link linked}
     */
    List<ResolvedJavaMethod> getAllMethods(boolean forceLink);

Copy link
Member

Choose a reason for hiding this comment

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

Yes, that's a good idea - it's more future proof and lets the caller do the filtering.

This list can include methods implicitly created and used by the VM that are not present in {@link #getDeclaredMethods}.

Copy link
Author

Choose a reason for hiding this comment

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

I changed it now to be getAllMethods

@teshull teshull changed the title 8357987: [JVMCI] Add Support for Retrieving All Non-Static Methods of a ResolvedJavaType. 8357987: [JVMCI] Add Support for Retrieving All Non-Static Methods of a ResolvedJavaType May 28, 2025
@openjdk openjdk bot changed the title 8357987: [JVMCI] Add Support for Retrieving All Non-Static Methods of a ResolvedJavaType 8357987: [JVMCI] Add Support for Retrieving All Non-Static Methods of a ResolvedJavaType. May 28, 2025
@@ -176,6 +176,17 @@ boolean isCompilable(HotSpotResolvedJavaMethodImpl method) {

private native boolean isCompilable(HotSpotResolvedJavaMethodImpl method, long methodPointer);

/**
Copy link
Member

@dougxc dougxc May 29, 2025

Choose a reason for hiding this comment

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

Delete this method - it's no longer used.

@@ -577,6 +577,11 @@ C2V_VMENTRY_0(jboolean, isCompilable,(JNIEnv* env, jobject, ARGUMENT_PAIR(method
return !method->is_not_compilable(CompLevel_full_optimization);
C2V_END

C2V_VMENTRY_0(jboolean, isOverpass,(JNIEnv* env, jobject, ARGUMENT_PAIR(method)))
Copy link
Member

Choose a reason for hiding this comment

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

Delete this method - it's no longer used.

@@ -3280,6 +3312,7 @@ JNINativeMethod CompilerToVM::methods[] = {
{CC "methodIsIgnoredBySecurityStackWalk", CC "(" HS_METHOD2 ")Z", FN_PTR(methodIsIgnoredBySecurityStackWalk)},
{CC "setNotInlinableOrCompilable", CC "(" HS_METHOD2 ")V", FN_PTR(setNotInlinableOrCompilable)},
{CC "isCompilable", CC "(" HS_METHOD2 ")Z", FN_PTR(isCompilable)},
{CC "isOverpass", CC "(" HS_METHOD2 ")Z", FN_PTR(isOverpass)},
Copy link
Member

Choose a reason for hiding this comment

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

delete

for (Class<?> c : classes) {
ResolvedJavaType type = metaAccess.lookupJavaType(c);
Set<ResolvedJavaMethod> allMethods = new HashSet<>(type.getAllMethods(true));
boolean included = Arrays.stream(type.getDeclaredMethods()).allMatch(m -> allMethods.contains(m));
Copy link
Member

Choose a reason for hiding this comment

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

You can produce a more helpful error message by collecting the entries from getDeclaredMethods, getDeclaredConstructors and the class initialized that are not in allMethods.

@dougxc
Copy link
Member

dougxc commented May 30, 2025

I also updated the title of https://bugs.openjdk.org/browse/JDK-8357987 to Not Be All Capitalized so you'll need to fix the title of this PR.

@bridgekeeper bridgekeeper bot removed oca Needs verification of OCA signatory status oca-verify Needs verification of OCA signatory status labels May 30, 2025
@openjdk openjdk bot added the rfr Pull request is ready for review label May 30, 2025
@mlbridge
Copy link

mlbridge bot commented May 30, 2025

Webrevs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
graal graal-dev@openjdk.org hotspot-compiler hotspot-compiler-dev@openjdk.org rfr Pull request is ready for review
Development

Successfully merging this pull request may close these issues.

2 participants