Skip to content

Commit bc9456d

Browse files
committed
Include sticky resolution exceptions in UnresolvedJava* entries e.g. getCause().
1 parent 8a71bc3 commit bc9456d

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterConstantPool.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -229,12 +229,6 @@ public Object resolvedAt(int cpi, InterpreterResolvedObjectType accessingClass)
229229
}
230230
}
231231

232-
assert !isUnresolved(entry);
233-
if (entry instanceof Throwable throwable) {
234-
// Cached exception.
235-
throw uncheckedThrow(throwable);
236-
}
237-
238232
return entry;
239233
}
240234

@@ -243,7 +237,7 @@ private static boolean isUnresolved(Object entry) {
243237
}
244238

245239
@SuppressWarnings("unchecked")
246-
private static <T extends Throwable> RuntimeException uncheckedThrow(Throwable t) throws T {
240+
protected static <T extends Throwable> RuntimeException uncheckedThrow(Throwable t) throws T {
247241
throw (T) t;
248242
}
249243

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/constantpool/RuntimeInterpreterConstantPool.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ private InterpreterResolvedJavaType resolveClassConstant(int classIndex, Interpr
8787
Symbol<Name> className = this.className(classIndex);
8888
type = SymbolsSupport.getTypes().fromClassNameEntry(className);
8989
} else if (entry instanceof UnresolvedJavaType unresolvedJavaType) {
90+
Throwable cause = unresolvedJavaType.getCause();
91+
if (cause != null) {
92+
throw uncheckedThrow(cause);
93+
}
9094
// CP comes from build-time JVMCI type, derive type from UnresolvedJavaType.
9195
type = SymbolsSupport.getTypes().getOrCreateValidType(unresolvedJavaType.getName());
9296
} else {
@@ -103,7 +107,7 @@ private InterpreterResolvedJavaType resolveClassConstant(int classIndex, Interpr
103107
// Just throw the exception and don't prevent these classes from being loaded for
104108
// virtual machine errors like StackOverflow and OutOfMemoryError, etc.
105109
// Needs clarification to section 5.4.3 of the JVM spec (see 6308271)
106-
this.cachedEntries[classIndex] = e;
110+
this.cachedEntries[classIndex] = UnresolvedJavaType.create(type.toString(), e);
107111
throw e;
108112
}
109113
}
@@ -126,6 +130,10 @@ private InterpreterResolvedJavaField resolveFieldRefConstant(int fieldIndex, Int
126130
int memberClassIndex = this.memberClassIndex(fieldIndex);
127131
holder = (InterpreterResolvedJavaType) resolvedAt(memberClassIndex, accessingClass);
128132
} else if (entry instanceof UnresolvedJavaField unresolvedJavaField) {
133+
Throwable cause = unresolvedJavaField.getCause();
134+
if (cause != null) {
135+
throw uncheckedThrow(cause);
136+
}
129137
// CP comes from build-time JVMCI type, derive it from UnresolvedJavaField.
130138
fieldName = SymbolsSupport.getNames().getOrCreate(unresolvedJavaField.getName());
131139
fieldType = SymbolsSupport.getTypes().getOrCreateValidType(unresolvedJavaField.getType().getName());
@@ -159,6 +167,10 @@ private InterpreterResolvedJavaMethod resolveClassMethodRefConstant(int methodIn
159167
int memberClassIndex = this.memberClassIndex(methodIndex);
160168
holder = (InterpreterResolvedJavaType) resolvedAt(memberClassIndex, accessingClass);
161169
} else if (entry instanceof UnresolvedJavaMethod unresolvedJavaMethod) {
170+
Throwable cause = unresolvedJavaMethod.getCause();
171+
if (cause != null) {
172+
throw uncheckedThrow(cause);
173+
}
162174
// CP comes from build-time JVMCI type, derive it from UnresolvedJavaMethod.
163175
methodName = SymbolsSupport.getNames().getOrCreate(unresolvedJavaMethod.getName());
164176
methodSignature = SymbolsSupport.getSignatures().getOrCreateValidSignature(unresolvedJavaMethod.getSignature().toMethodDescriptor());
@@ -193,6 +205,10 @@ private InterpreterResolvedJavaMethod resolveInterfaceMethodRefConstant(int inte
193205
int memberClassIndex = this.memberClassIndex(interfaceMethodIndex);
194206
holder = (InterpreterResolvedJavaType) resolvedAt(memberClassIndex, accessingClass);
195207
} else if (entry instanceof UnresolvedJavaMethod unresolvedJavaMethod) {
208+
Throwable cause = unresolvedJavaMethod.getCause();
209+
if (cause != null) {
210+
throw uncheckedThrow(cause);
211+
}
196212
// CP comes from build-time JVMCI type, derive it from UnresolvedJavaMethod.
197213
methodName = SymbolsSupport.getNames().getOrCreate(unresolvedJavaMethod.getName());
198214
methodSignature = SymbolsSupport.getSignatures().getOrCreateValidSignature(unresolvedJavaMethod.getSignature().toMethodDescriptor());

0 commit comments

Comments
 (0)