Skip to content

Commit 42dec2e

Browse files
committed
[GR-71264] Verify that a type is linked before computing a stable signature.
PullRequest: graal/22577
2 parents 4a74b8f + 6552abe commit 42dec2e

File tree

3 files changed

+17
-13
lines changed

3 files changed

+17
-13
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replaycomp/CompilerInterfaceDeclarations.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,8 @@ public static CompilerInterfaceDeclarations build() {
807807
ResolvedJavaType holder = method.getDeclaringClass();
808808
if (holder.isHidden()) {
809809
ConstantPool constantPool = method.getConstantPool();
810-
calls.add(new MethodCallToRecord(holder, HotSpotResolvedObjectTypeProxy.getDeclaredConstructorsMethod, HotSpotResolvedObjectTypeProxy.getDeclaredConstructorsInvokable, null));
810+
calls.add(new MethodCallToRecord(holder, HotSpotResolvedObjectTypeProxy.isLinkedMethod, HotSpotResolvedJavaTypeProxy.isLinkedInvokable, null));
811+
calls.add(new MethodCallToRecord(holder, HotSpotResolvedObjectTypeProxy.getDeclaredConstructorsBooleanMethod, HotSpotResolvedObjectTypeProxy.getDeclaredConstructorsBooleanInvokable, new Object[]{false}));
811812
calls.add(new MethodCallToRecord(holder, HotSpotResolvedObjectTypeProxy.getInterfacesMethod, HotSpotResolvedObjectTypeProxy.getInterfacesInvokable, null));
812813
calls.add(new MethodCallToRecord(holder, HotSpotResolvedObjectTypeProxy.getDeclaredMethodsBooleanMethod, HotSpotResolvedObjectTypeProxy.getDeclaredMethodsBooleanInvokable, new Object[]{false}));
813814
calls.add(new MethodCallToRecord(method, HotSpotResolvedJavaMethodProxy.getConstantPoolMethod, HotSpotResolvedJavaMethodProxy.getConstantPoolInvokable, null));

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,8 @@ public final void initialize() {
224224
handle(initializeMethod, initializeInvokable);
225225
}
226226

227-
private static final SymbolicMethod isLinkedMethod = method("isLinked");
228-
private static final InvokableMethod isLinkedInvokable = (receiver, args) -> ((HotSpotResolvedJavaType) receiver).isLinked();
227+
public static final SymbolicMethod isLinkedMethod = method("isLinked");
228+
public static final InvokableMethod isLinkedInvokable = (receiver, args) -> ((HotSpotResolvedJavaType) receiver).isLinked();
229229

230230
@Override
231231
public final boolean isLinked() {
@@ -414,16 +414,16 @@ public List<? extends ResolvedJavaRecordComponent> getRecordComponents() {
414414
return (List<ResolvedJavaRecordComponent>) handle(getRecordComponentsMethod, getRecordComponentsInvokable);
415415
}
416416

417-
public static final SymbolicMethod getDeclaredConstructorsMethod = method("getDeclaredConstructors");
418-
public static final InvokableMethod getDeclaredConstructorsInvokable = (receiver, args) -> ((HotSpotResolvedJavaType) receiver).getDeclaredConstructors();
417+
private static final SymbolicMethod getDeclaredConstructorsMethod = method("getDeclaredConstructors");
418+
private static final InvokableMethod getDeclaredConstructorsInvokable = (receiver, args) -> ((HotSpotResolvedJavaType) receiver).getDeclaredConstructors();
419419

420420
@Override
421421
public final ResolvedJavaMethod[] getDeclaredConstructors() {
422422
return (ResolvedJavaMethod[]) handle(getDeclaredConstructorsMethod, getDeclaredConstructorsInvokable);
423423
}
424424

425-
private static final SymbolicMethod getDeclaredConstructorsBooleanMethod = method("getDeclaredConstructors", boolean.class);
426-
private static final InvokableMethod getDeclaredConstructorsBooleanInvokable = (receiver, args) -> ((HotSpotResolvedJavaType) receiver).getDeclaredConstructors((Boolean) args[0]);
425+
public static final SymbolicMethod getDeclaredConstructorsBooleanMethod = method("getDeclaredConstructors", boolean.class);
426+
public static final InvokableMethod getDeclaredConstructorsBooleanInvokable = (receiver, args) -> ((HotSpotResolvedJavaType) receiver).getDeclaredConstructors((Boolean) args[0]);
427427

428428
@Override
429429
public final ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) {

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/LambdaUtils.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public static String findStableLambdaName(ResolvedJavaType lambdaType) {
7373
String signature = getSignature(lambdaType);
7474
if (signature == null) {
7575
StringBuilder sb = new StringBuilder();
76-
sb.append("Lambda without a target invoke: ").append(lambdaType.toClassName());
76+
sb.append("Lambda without a signature: ").append(lambdaType.toClassName()).append(" (linked: ").append(lambdaType.isLinked()).append(")");
7777
for (ResolvedJavaMethod method : lambdaType.getDeclaredMethods(false)) {
7878
sb.append("\n Method: ").append(method);
7979
}
@@ -133,9 +133,9 @@ public static boolean isLambdaName(String name) {
133133
* Generates a signature for a given type by hashing its composing parts. The signature is
134134
* generated based on the methods invoked in the bytecode of a public non-bridge method, the
135135
* constructor parameter types, and the interfaces implemented by the type. Returns {@code null}
136-
* if the selected declared method does not invoke any other method. The procedure should
137-
* generate reasonable signatures for lambda proxy types, but it may fail to do so for general
138-
* hidden classes.
136+
* if the type is not linked or the selected declared method does not invoke any other method.
137+
* The procedure should generate reasonable signatures for lambda proxy types, but it may fail
138+
* to do so for general hidden classes.
139139
* <p>
140140
* Starting from JDK17, lambda classes can have additional interfaces that lambda should
141141
* implement. This further means that lambda can have more than one public method (public and
@@ -148,9 +148,12 @@ public static boolean isLambdaName(String name) {
148148
*
149149
* @param type the type to generate a signature for
150150
* @return a 32-character hexadecimal string representing the type signature or {@code null} if
151-
* the selected declared method does not have any invokes
151+
* the type is not linked or the selected declared method does not have any invokes
152152
*/
153153
public static String getSignature(ResolvedJavaType type) {
154+
if (!type.isLinked()) {
155+
return null;
156+
}
154157
/*
155158
* Take only the first method to find invoked methods, because the result would be the same
156159
* for all other methods (if it is a lambda type).
@@ -166,7 +169,7 @@ public static String getSignature(ResolvedJavaType type) {
166169
sb.append(method.format("%H.%n(%P)%R"));
167170
}
168171
/* Append constructor parameter types. */
169-
for (JavaMethod ctor : type.getDeclaredConstructors()) {
172+
for (JavaMethod ctor : type.getDeclaredConstructors(false)) {
170173
sb.append(ctor.format("%P"));
171174
}
172175
/* Append implemented interfaces. */

0 commit comments

Comments
 (0)