Skip to content

Commit 4bbc1ca

Browse files
vjovanovzakkak
authored andcommitted
Use JVMCI for @delete classes
(cherry picked from commit 30ae9d3)
1 parent adc3f3f commit 4bbc1ca

File tree

1 file changed

+21
-9
lines changed

1 file changed

+21
-9
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -635,23 +635,35 @@ private static boolean hasDefaultValue(Field annotatedField) {
635635

636636
private void handleDeletedClass(Class<?> originalClass, Delete deleteAnnotation) {
637637
if (NativeImageOptions.ReportUnsupportedElementsAtRuntime.getValue()) {
638+
ResolvedJavaType type = metaAccess.lookupJavaType(originalClass);
639+
640+
try {
641+
type.link();
642+
} catch (LinkageError ignored) {
643+
/*
644+
* Ignore any linking errors. A type that cannot be linked doesn't need elements
645+
* replaced: it will simply fail at runtime with the same linkage error before
646+
* reaching those elements.
647+
*/
648+
return;
649+
}
650+
638651
/*
639652
* We register all methods and fields as deleted. That still allows usage of the type in
640653
* type checks.
641654
*/
642-
for (Executable m : originalClass.getDeclaredMethods()) {
643-
ResolvedJavaMethod method = metaAccess.lookupJavaMethod(m);
655+
for (ResolvedJavaMethod method : type.getDeclaredMethods()) {
644656
registerAsDeleted(null, method, deleteAnnotation);
645657
}
646-
for (Executable m : originalClass.getDeclaredConstructors()) {
647-
ResolvedJavaMethod method = metaAccess.lookupJavaMethod(m);
648-
registerAsDeleted(null, method, deleteAnnotation);
658+
for (ResolvedJavaMethod constructor : type.getDeclaredConstructors()) {
659+
registerAsDeleted(null, constructor, deleteAnnotation);
649660
}
650-
for (Field f : originalClass.getDeclaredFields()) {
651-
ResolvedJavaField field = metaAccess.lookupJavaField(f);
652-
registerAsDeleted(null, field, deleteAnnotation);
661+
for (ResolvedJavaField f : type.getInstanceFields(false)) {
662+
registerAsDeleted(null, f, deleteAnnotation);
663+
}
664+
for (ResolvedJavaField f : type.getStaticFields()) {
665+
registerAsDeleted(null, f, deleteAnnotation);
653666
}
654-
655667
} else {
656668
deleteAnnotations.put(metaAccess.lookupJavaType(originalClass), deleteAnnotation);
657669
}

0 commit comments

Comments
 (0)