Skip to content

Commit 7b5f831

Browse files
committed
[GR-34003] Simplified metadata for non-reflection methods
PullRequest: graal/9998
2 parents a586f37 + 557ce47 commit 7b5f831

File tree

41 files changed

+1585
-1257
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1585
-1257
lines changed

compiler/src/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/FrequencyEncoder.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,17 +89,6 @@ public void addObject(T object) {
8989
entry.frequency++;
9090
}
9191

92-
/**
93-
* Returns whether the given object has been previously added to the array.
94-
*/
95-
public boolean contains(T object) {
96-
if (object == null && containsNull) {
97-
return true;
98-
}
99-
Entry<T> entry = map.get(object);
100-
return entry != null;
101-
}
102-
10392
/**
10493
* Returns the index of an object in the array. The object must have been
10594
* {@link #addObject(Object) added} before.

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,10 @@
4646
public interface RuntimeReflectionSupport extends ReflectionRegistry {
4747
// specific to java.lang.reflect reflection
4848
Set<Executable> getQueriedOnlyMethods();
49+
50+
/*
51+
* Returns the methods that shadow a superclass method registered for reflection, to be excluded
52+
* from reflection queries.
53+
*/
54+
Set<?> getHidingMethods();
4955
}

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/infrastructure/OriginalMethodProvider.java

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -40,44 +40,22 @@ static Executable getJavaMethod(SnippetReflectionProvider reflectionProvider, Re
4040
return ((OriginalMethodProvider) method).getJavaMethod();
4141
}
4242
try {
43-
return getJavaMethodInternal(reflectionProvider, method);
43+
ResolvedJavaMethod.Parameter[] parameters = method.getParameters();
44+
Class<?>[] parameterTypes = new Class<?>[parameters.length];
45+
ResolvedJavaType declaringClassType = method.getDeclaringClass();
46+
for (int i = 0; i < parameterTypes.length; i++) {
47+
parameterTypes[i] = OriginalClassProvider.getJavaClass(reflectionProvider, parameters[i].getType().resolve(declaringClassType));
48+
}
49+
Class<?> declaringClass = OriginalClassProvider.getJavaClass(reflectionProvider, declaringClassType);
50+
if (method.isConstructor()) {
51+
return declaringClass.getDeclaredConstructor(parameterTypes);
52+
} else {
53+
return declaringClass.getDeclaredMethod(method.getName(), parameterTypes);
54+
}
4455
} catch (NoSuchMethodException e) {
4556
throw AnalysisError.shouldNotReachHere();
4657
}
4758
}
4859

49-
static boolean hasJavaMethod(SnippetReflectionProvider reflectionProvider, ResolvedJavaMethod method) {
50-
if (method instanceof OriginalMethodProvider) {
51-
return ((OriginalMethodProvider) method).hasJavaMethod();
52-
}
53-
try {
54-
getJavaMethodInternal(reflectionProvider, method);
55-
return true;
56-
} catch (NoSuchMethodException | LinkageError | RuntimeException e) {
57-
/*
58-
* These exceptions may happen anytime during the lookup, so we can't simply use the
59-
* result of getJavaMethodInternal.
60-
*/
61-
return false;
62-
}
63-
}
64-
65-
static Executable getJavaMethodInternal(SnippetReflectionProvider reflectionProvider, ResolvedJavaMethod method) throws NoSuchMethodException {
66-
ResolvedJavaMethod.Parameter[] parameters = method.getParameters();
67-
Class<?>[] parameterTypes = new Class<?>[parameters.length];
68-
ResolvedJavaType declaringClassType = method.getDeclaringClass();
69-
for (int i = 0; i < parameterTypes.length; i++) {
70-
parameterTypes[i] = OriginalClassProvider.getJavaClass(reflectionProvider, parameters[i].getType().resolve(declaringClassType));
71-
}
72-
Class<?> declaringClass = OriginalClassProvider.getJavaClass(reflectionProvider, declaringClassType);
73-
if (method.isConstructor()) {
74-
return declaringClass.getDeclaredConstructor(parameterTypes);
75-
} else {
76-
return declaringClass.getDeclaredMethod(method.getName(), parameterTypes);
77-
}
78-
}
79-
8060
Executable getJavaMethod();
81-
82-
boolean hasJavaMethod();
8361
}

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -554,11 +554,6 @@ public Executable getJavaMethod() {
554554
return OriginalMethodProvider.getJavaMethod(universe.getOriginalSnippetReflection(), wrapped);
555555
}
556556

557-
@Override
558-
public boolean hasJavaMethod() {
559-
return OriginalMethodProvider.hasJavaMethod(universe.getOriginalSnippetReflection(), wrapped);
560-
}
561-
562557
/**
563558
* Unique, per method, context insensitive invoke. The context insensitive invoke uses the
564559
* receiver type of the method, i.e., its declaring class. Therefore this invoke will link with

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,6 @@ public Object replaceObject(Object source) {
575575

576576
private void collectMethodImplementations() {
577577
for (AnalysisMethod method : methods.values()) {
578-
579578
Set<AnalysisMethod> implementations = getMethodImplementations(bb, method, false);
580579
method.implementations = implementations.toArray(new AnalysisMethod[implementations.size()]);
581580
}
@@ -613,7 +612,13 @@ private static boolean collectMethodImplementations(AnalysisMethod method, Analy
613612
* method. The method cannot be marked as invoked.
614613
*/
615614
if (holderOrSubtypeInstantiated || method.isIntrinsicMethod()) {
616-
AnalysisMethod aResolved = holder.resolveConcreteMethod(method, null);
615+
AnalysisMethod aResolved;
616+
try {
617+
aResolved = holder.resolveConcreteMethod(method, null);
618+
} catch (UnsupportedFeatureException e) {
619+
/* An unsupported overriding method is not reachable. */
620+
aResolved = null;
621+
}
617622
if (aResolved != null) {
618623
/*
619624
* aResolved == null means that the method in the base class was called, but never

substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/OmitPreviousConfigTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ void doTest() {
310310
Assert.assertNotNull("Generated configuration type " + name + " does not exist. Has the test code changed?", configurationType);
311311

312312
for (Map.Entry<ConfigurationMethod, ConfigurationMemberDeclaration> methodEntry : methodsThatMustExist.entrySet()) {
313-
ConfigurationMemberDeclaration kind = ConfigurationType.TestBackdoor.getMethodInfoIfPresent(configurationType, methodEntry.getKey()).getMemberKind();
313+
ConfigurationMemberDeclaration kind = ConfigurationType.TestBackdoor.getMethodInfoIfPresent(configurationType, methodEntry.getKey()).getDeclaration();
314314
Assert.assertNotNull("Method " + methodEntry.getKey() + " unexpectedly NOT found in the new configuration.", kind);
315315
Assert.assertEquals("Method " + methodEntry.getKey() + " contains a different kind than expected in the new configuration.", kind, methodEntry.getValue());
316316
}

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ConfigurationMemberInfo.java

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,20 @@ public final class ConfigurationMemberInfo {
3535
}
3636
}
3737

38-
private final ConfigurationMemberDeclaration memberKind;
39-
private final ConfigurationMemberAccessibility accessKind;
38+
private final ConfigurationMemberDeclaration declaration;
39+
private final ConfigurationMemberAccessibility accessibility;
4040

41-
private ConfigurationMemberInfo(ConfigurationMemberDeclaration memberKind, ConfigurationMemberAccessibility accessKind) {
42-
this.memberKind = memberKind;
43-
this.accessKind = accessKind;
41+
private ConfigurationMemberInfo(ConfigurationMemberDeclaration declaration, ConfigurationMemberAccessibility accessibility) {
42+
this.declaration = declaration;
43+
this.accessibility = accessibility;
4444
}
4545

46-
public ConfigurationMemberDeclaration getMemberKind() {
47-
return memberKind;
46+
public ConfigurationMemberDeclaration getDeclaration() {
47+
return declaration;
4848
}
4949

50-
public ConfigurationMemberAccessibility getAccessKind() {
51-
return accessKind;
50+
public ConfigurationMemberAccessibility getAccessibility() {
51+
return accessibility;
5252
}
5353

5454
public static ConfigurationMemberInfo get(ConfigurationMemberDeclaration memberKind, ConfigurationMemberAccessibility accessKind) {
@@ -103,8 +103,19 @@ public boolean includes(ConfigurationMemberDeclaration other) {
103103
}
104104

105105
public enum ConfigurationMemberAccessibility {
106+
/**
107+
* The member is not accessed reflectively.
108+
*/
106109
NONE,
110+
111+
/**
112+
* The member is queried reflectively but never invoked (only for methods and constructors).
113+
*/
107114
QUERIED,
115+
116+
/**
117+
* The member is fully accessed reflectively.
118+
*/
108119
ACCESSED;
109120

110121
public ConfigurationMemberAccessibility combine(ConfigurationMemberAccessibility other) {
@@ -121,14 +132,14 @@ public boolean includes(ConfigurationMemberAccessibility other) {
121132
}
122133

123134
public ConfigurationMemberInfo intersect(ConfigurationMemberInfo other) {
124-
return get(memberKind.intersect(other.memberKind), accessKind.combine(other.accessKind));
135+
return get(declaration.intersect(other.declaration), accessibility.combine(other.accessibility));
125136
}
126137

127138
public ConfigurationMemberInfo union(ConfigurationMemberInfo other) {
128-
return get(memberKind.union(other.memberKind), accessKind.combine(other.accessKind));
139+
return get(declaration.union(other.declaration), accessibility.combine(other.accessibility));
129140
}
130141

131142
public boolean includes(ConfigurationMemberInfo other) {
132-
return memberKind.includes(other.memberKind) && accessKind.includes(other.accessKind);
143+
return declaration.includes(other.declaration) && accessibility.includes(other.accessibility);
133144
}
134145
}

0 commit comments

Comments
 (0)