diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotConstantPool.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotConstantPool.java index 6a9167e687bcf..93956a5a525c2 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotConstantPool.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotConstantPool.java @@ -798,11 +798,10 @@ public JavaField lookupField(int rawIndex, ResolvedJavaMethod method, int opcode HotSpotResolvedObjectTypeImpl resolvedHolder; try { resolvedHolder = compilerToVM().resolveFieldInPool(this, rawIndex, (HotSpotResolvedJavaMethodImpl) method, (byte) opcode, info); - } catch (Throwable t) { - resolvedHolder = null; + } catch (Throwable cause) { + return new UnresolvedJavaField(fieldHolder, lookupUtf8(getNameRefIndexAt(nameAndTypeIndex)), type, cause); } if (resolvedHolder == null) { - // There was an exception resolving the field or it returned null so return an unresolved field. return new UnresolvedJavaField(fieldHolder, lookupUtf8(getNameRefIndexAt(nameAndTypeIndex)), type); } final int flags = info[0]; diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaField.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaField.java index 9a28b8c60efbe..d3c874ca26b3a 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaField.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaField.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,10 +31,27 @@ public final class UnresolvedJavaField implements JavaField { private final JavaType holder; private final JavaType type; - public UnresolvedJavaField(JavaType holder, String name, JavaType type) { + /** + * The reason field resolution failed. Can be null. + */ + private final Throwable cause; + + public UnresolvedJavaField(JavaType holder, String name, JavaType type, Throwable cause) { this.name = name; this.type = type; this.holder = holder; + this.cause = cause; + } + + public UnresolvedJavaField(JavaType holder, String name, JavaType type) { + this(holder, name, type, null); + } + + /** + * Gets the exception, if any, representing the reason field resolution resulted in this object. + */ + public Throwable getCause() { + return cause; } @Override diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaMethod.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaMethod.java index e2888c31ba617..1ec73cc8030da 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaMethod.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaMethod.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,10 +31,27 @@ public final class UnresolvedJavaMethod implements JavaMethod { private final Signature signature; protected JavaType holder; - public UnresolvedJavaMethod(String name, Signature signature, JavaType holder) { + /** + * The reason method resolution failed. Can be null. + */ + private final Throwable cause; + + public UnresolvedJavaMethod(String name, Signature signature, JavaType holder, Throwable cause) { this.name = name; this.holder = holder; this.signature = signature; + this.cause = cause; + } + + public UnresolvedJavaMethod(String name, Signature signature, JavaType holder) { + this(name, signature, holder, null); + } + + /** + * Gets the exception, if any, representing the reason method resolution resulted in this object. + */ + public Throwable getCause() { + return cause; } @Override diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaType.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaType.java index 845887369e311..1740744b4b1fd 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaType.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/UnresolvedJavaType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,13 +28,19 @@ public final class UnresolvedJavaType implements JavaType { private final String name; + /** + * The reason type resolution failed. Can be null. + */ + private final Throwable cause; + @Override public String getName() { return name; } - private UnresolvedJavaType(String name) { + private UnresolvedJavaType(String name, Throwable cause) { this.name = name; + this.cause = cause; assert name.length() == 1 && JavaKind.fromPrimitiveOrVoidTypeChar(name.charAt(0)) != null || name.charAt(0) == '[' || name.charAt(name.length() - 1) == ';' : name; } @@ -42,20 +48,34 @@ private UnresolvedJavaType(String name) { * Creates an unresolved type for a valid {@link JavaType#getName() type name}. */ public static UnresolvedJavaType create(String name) { - return new UnresolvedJavaType(name); + return new UnresolvedJavaType(name, null); + } + + /** + * Creates an unresolved type for a valid {@link JavaType#getName() type name}. + */ + public static UnresolvedJavaType create(String name, Throwable cause) { + return new UnresolvedJavaType(name, cause); + } + + /** + * Gets the exception, if any, representing the reason type resolution resulted in this object. + */ + public Throwable getCause() { + return cause; } @Override public JavaType getComponentType() { if (getName().charAt(0) == '[') { - return new UnresolvedJavaType(getName().substring(1)); + return new UnresolvedJavaType(getName().substring(1), null); } return null; } @Override public JavaType getArrayClass() { - return new UnresolvedJavaType('[' + getName()); + return new UnresolvedJavaType('[' + getName(), null); } @Override