Skip to content

Commit 86d0880

Browse files
committed
[JVMCI] Add ResolvedJavaType#getEnclosingMethod [GR-70132]
1 parent 8b77e42 commit 86d0880

File tree

15 files changed

+85
-14
lines changed

15 files changed

+85
-14
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,11 @@ public ResolvedJavaType getEnclosingType() {
317317
throw new UnsupportedOperationException();
318318
}
319319

320+
@Override
321+
public ResolvedJavaMethod getEnclosingMethod() {
322+
throw new UnsupportedOperationException();
323+
}
324+
320325
@Override
321326
public ResolvedJavaMethod[] getDeclaredConstructors() {
322327
return getDeclaredConstructors(true);

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replaycomp/proxy/HotSpotResolvedJavaTypeProxy.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import java.lang.annotation.Annotation;
4343
import java.util.List;
4444

45+
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
4546
import jdk.vm.ci.hotspot.HotSpotResolvedJavaType;
4647
import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
4748
import jdk.vm.ci.meta.Assumptions;
@@ -86,6 +87,14 @@ public final HotSpotResolvedObjectType getArrayClass() {
8687
return (HotSpotResolvedObjectType) handle(getArrayClassMethod, getArrayClassInvokable);
8788
}
8889

90+
private static final SymbolicMethod getEnclosingMethodMethod = method("getEnclosingMethod");
91+
private static final InvokableMethod getEnclosingMethodInvokable = (receiver, args) -> ((HotSpotResolvedJavaType) receiver).getEnclosingMethod();
92+
93+
@Override
94+
public HotSpotResolvedJavaMethod getEnclosingMethod() {
95+
return (HotSpotResolvedJavaMethod) handle(getEnclosingMethodMethod, getEnclosingMethodInvokable);
96+
}
97+
8998
private static final SymbolicMethod isHiddenMethod = method("isHidden");
9099
private static final InvokableMethod isHiddenInvokable = (receiver, args) -> ((HotSpotResolvedObjectType) receiver).isHidden();
91100

espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedArrayType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,11 @@ public ResolvedJavaType getEnclosingType() {
294294
return null;
295295
}
296296

297+
@Override
298+
public ResolvedJavaMethod getEnclosingMethod() {
299+
return null;
300+
}
301+
297302
@Override
298303
public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) {
299304
return NO_METHODS;

espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedInstanceType.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import static java.util.Objects.requireNonNull;
3535

3636
import java.lang.annotation.Annotation;
37+
import java.lang.reflect.Executable;
38+
import java.lang.reflect.Method;
3739
import java.lang.reflect.Modifier;
3840
import java.util.Arrays;
3941
import java.util.Collections;
@@ -495,6 +497,16 @@ public ResolvedJavaType getEnclosingType() {
495497
return runtime().getHostJVMCIBackend().getMetaAccess().lookupJavaType(enclosingClass);
496498
}
497499

500+
@Override
501+
public ResolvedJavaMethod getEnclosingMethod() {
502+
Method enclosingMethod = getMirror().getEnclosingMethod();
503+
Executable enclosingExecutable = enclosingMethod != null ? enclosingMethod : getMirror().getEnclosingConstructor();
504+
if (enclosingExecutable != null) {
505+
return runtime().getHostJVMCIBackend().getMetaAccess().lookupJavaMethod(enclosingExecutable);
506+
}
507+
return null;
508+
}
509+
498510
@Override
499511
public native void link();
500512

espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedPrimitiveType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,11 @@ public ResolvedJavaType getEnclosingType() {
264264
return null;
265265
}
266266

267+
@Override
268+
public ResolvedJavaMethod getEnclosingMethod() {
269+
return null;
270+
}
271+
267272
@Override
268273
public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) {
269274
return NO_METHODS;

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,6 +1338,11 @@ public AnalysisType getEnclosingType() {
13381338
return universe.lookup(wrapped.getEnclosingType());
13391339
}
13401340

1341+
@Override
1342+
public AnalysisMethod getEnclosingMethod() {
1343+
return universe.lookup(wrapped.getEnclosingMethod());
1344+
}
1345+
13411346
@Override
13421347
public ResolvedJavaType[] getDeclaredTypes() {
13431348
ResolvedJavaType[] declaredTypes = wrapped.getDeclaredTypes();

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,11 @@ public ResolvedJavaType getEnclosingType() {
326326
return enclosingType;
327327
}
328328

329+
@Override
330+
public ResolvedJavaMethod getEnclosingMethod() {
331+
throw AnalysisError.shouldNotReachHere("This type is incomplete and should not be used.");
332+
}
333+
329334
@Override
330335
public ResolvedJavaMethod[] getDeclaredConstructors() {
331336
throw AnalysisError.shouldNotReachHere("This type is incomplete and should not be used.");

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/crema/CremaResolvedJavaType.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,6 @@ public interface CremaResolvedJavaType extends ResolvedJavaType {
8181
*/
8282
byte[] getRawTypeAnnotations();
8383

84-
/**
85-
* If this object represents a local or anonymous class within a method, returns a
86-
* {@link CremaEnclosingMethodInfo} object representing the immediately enclosing method of the
87-
* underlying class. Returns {@code null} otherwise.
88-
*
89-
* @return the immediately enclosing method of the underlying class, if that class is a local or
90-
* anonymous class; otherwise {@code null}.
91-
*/
92-
CremaEnclosingMethodInfo getEnclosingMethod();
93-
9484
/**
9585
* Returns an array of {@code JavaType} objects reflecting all the classes and interfaces
9686
* declared as members of the class represented by this object. This includes public, protected,
@@ -128,7 +118,4 @@ public interface CremaResolvedJavaType extends ResolvedJavaType {
128118
* @return a JavaType representing the nest host
129119
*/
130120
ResolvedJavaType getNestHost();
131-
132-
record CremaEnclosingMethodInfo(JavaType enclosingType, String name, String description) {
133-
}
134121
}

substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateType.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
package com.oracle.svm.graal.meta;
2626

2727
import java.lang.annotation.Annotation;
28+
import java.lang.reflect.Executable;
29+
import java.lang.reflect.Method;
2830
import java.util.Arrays;
2931
import java.util.Collections;
3032
import java.util.List;
@@ -458,6 +460,17 @@ public ResolvedJavaType getEnclosingType() {
458460
return SubstrateMetaAccess.singleton().lookupJavaType(enclosingClass);
459461
}
460462

463+
@Override
464+
public ResolvedJavaMethod getEnclosingMethod() {
465+
Class<?> cls = DynamicHub.toClass(hub);
466+
Method enclosingMethod = cls.getEnclosingMethod();
467+
Executable enclosingExecutable = enclosingMethod != null ? enclosingMethod : cls.getEnclosingConstructor();
468+
if (enclosingExecutable != null) {
469+
return SubstrateMetaAccess.singleton().lookupJavaMethod(enclosingExecutable);
470+
}
471+
return null;
472+
}
473+
461474
@Override
462475
public ResolvedJavaMethod[] getDeclaredConstructors() {
463476
return getDeclaredConstructors(true);

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,11 @@ public ResolvedJavaType getEnclosingType() {
266266
return original.getEnclosingType();
267267
}
268268

269+
@Override
270+
public ResolvedJavaMethod getEnclosingMethod() {
271+
return original.getEnclosingMethod();
272+
}
273+
269274
@Override
270275
public ResolvedJavaMethod[] getDeclaredConstructors() {
271276
return getDeclaredConstructors(true);

0 commit comments

Comments
 (0)