Skip to content

Commit 0cb56b1

Browse files
committed
Fall back to older JVMCI API when HotSpotJDKReflection is not available
Closes #4655
1 parent 2ddffab commit 0cb56b1

File tree

1 file changed

+65
-15
lines changed

1 file changed

+65
-15
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/SubstrateAnnotationExtracter.java

Lines changed: 65 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -107,22 +107,57 @@ public class SubstrateAnnotationExtracter implements AnnotationExtracter {
107107
private static final Method hotSpotJDKReflectionGetMirror;
108108
private static final Method hotSpotJDKReflectionGetMethod;
109109
private static final Method hotSpotJDKReflectionGetField;
110+
private static final boolean isHotSpotJDKReflectionAvailable;
111+
private static final Method hotSpotResolvedObjectTypeImplMirror;
112+
private static final Method hotSpotResolvedPrimitiveTypeMirror;
113+
private static final Method hotSpotResolvedJavaMethodImplToJava;
114+
private static final Method hotSpotResolvedJavaFieldImplToJava;
110115

111116
static {
117+
recordComponentClass = ReflectionUtil.lookupClass(true, "java.lang.reflect.RecordComponent");
118+
recordComponentAnnotations = recordComponentClass != null ? ReflectionUtil.lookupField(recordComponentClass, "annotations") : null;
119+
recordComponentTypeAnnotations = recordComponentClass != null ? ReflectionUtil.lookupField(recordComponentClass, "typeAnnotations") : null;
120+
recordComponentGetDeclaringRecord = recordComponentClass != null ? ReflectionUtil.lookupMethod(recordComponentClass, "getDeclaringRecord") : null;
121+
122+
Object temporaryHotSpotJVMCIRuntimeReflection = null;
123+
Method temporaryHotSpotJDKReflectionGetMirror = null;
124+
Method temporaryHotSpotJDKReflectionGetMethod = null;
125+
Method temporaryHotSpotJDKReflectionGetField = null;
126+
boolean temporaryIsHotSpotJDKReflectionAvailable = true;
127+
112128
try {
113-
recordComponentClass = ReflectionUtil.lookupClass(true, "java.lang.reflect.RecordComponent");
114-
recordComponentAnnotations = recordComponentClass != null ? ReflectionUtil.lookupField(recordComponentClass, "annotations") : null;
115-
recordComponentTypeAnnotations = recordComponentClass != null ? ReflectionUtil.lookupField(recordComponentClass, "typeAnnotations") : null;
116-
recordComponentGetDeclaringRecord = recordComponentClass != null ? ReflectionUtil.lookupMethod(recordComponentClass, "getDeclaringRecord") : null;
117129
Object hotSpotJVMCIRuntime = ReflectionUtil.lookupMethod(HotSpotJVMCIRuntime.class, "runtime").invoke(null);
118-
hotSpotJVMCIRuntimeReflection = ReflectionUtil.lookupMethod(HotSpotJVMCIRuntime.class, "getReflection").invoke(hotSpotJVMCIRuntime);
119-
hotSpotJDKReflectionGetMirror = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotJDKReflection"), "getMirror", HotSpotResolvedJavaType.class);
120-
hotSpotJDKReflectionGetMethod = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotJDKReflection"), "getMethod",
121-
Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl"));
122-
hotSpotJDKReflectionGetField = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotJDKReflection"), "getField",
123-
Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedJavaFieldImpl"));
124-
} catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException e) {
125-
throw GraalError.shouldNotReachHere(e);
130+
temporaryHotSpotJVMCIRuntimeReflection = ReflectionUtil.lookupMethod(HotSpotJVMCIRuntime.class, "getReflection").invoke(hotSpotJVMCIRuntime);
131+
temporaryHotSpotJDKReflectionGetMirror = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotJDKReflection"), "getMirror", HotSpotResolvedJavaType.class);
132+
temporaryHotSpotJDKReflectionGetMethod = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotJDKReflection"), "getMethod",
133+
Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl"));
134+
temporaryHotSpotJDKReflectionGetField = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotJDKReflection"), "getField",
135+
Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedJavaFieldImpl"));
136+
} catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException |
137+
ReflectionUtil.ReflectionUtilError ex ) {
138+
temporaryIsHotSpotJDKReflectionAvailable = false;
139+
}
140+
141+
isHotSpotJDKReflectionAvailable = temporaryIsHotSpotJDKReflectionAvailable;
142+
hotSpotJVMCIRuntimeReflection = temporaryHotSpotJVMCIRuntimeReflection;
143+
hotSpotJDKReflectionGetMirror = temporaryHotSpotJDKReflectionGetMirror;
144+
hotSpotJDKReflectionGetMethod = temporaryHotSpotJDKReflectionGetMethod;
145+
hotSpotJDKReflectionGetField = temporaryHotSpotJDKReflectionGetField;
146+
147+
if (isHotSpotJDKReflectionAvailable) {
148+
hotSpotResolvedObjectTypeImplMirror = null;
149+
hotSpotResolvedPrimitiveTypeMirror = null;
150+
hotSpotResolvedJavaMethodImplToJava = null;
151+
hotSpotResolvedJavaFieldImplToJava = null;
152+
} else {
153+
try {
154+
hotSpotResolvedObjectTypeImplMirror = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl"), "mirror");
155+
hotSpotResolvedPrimitiveTypeMirror = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedPrimitiveType"), "mirror");
156+
hotSpotResolvedJavaMethodImplToJava = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl"), "toJava");
157+
hotSpotResolvedJavaFieldImplToJava = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedJavaFieldImpl"), "toJava");
158+
} catch (ClassNotFoundException e) {
159+
throw GraalError.shouldNotReachHere(e);
160+
}
126161
}
127162
}
128163

@@ -380,14 +415,29 @@ private static AnnotatedElement getRoot(AnnotatedElement element) {
380415
if (element instanceof Package) {
381416
return (Class<?>) packageGetPackageInfo.invoke(element);
382417
} else if (element instanceof HotSpotResolvedObjectType || element instanceof HotSpotResolvedJavaType) {
383-
return (AnnotatedElement) hotSpotJDKReflectionGetMirror.invoke(hotSpotJVMCIRuntimeReflection, element);
418+
if (isHotSpotJDKReflectionAvailable) {
419+
return (AnnotatedElement) hotSpotJDKReflectionGetMirror.invoke(hotSpotJVMCIRuntimeReflection, element);
420+
} else {
421+
if (element instanceof HotSpotResolvedObjectType) {
422+
return (AnnotatedElement) hotSpotResolvedObjectTypeImplMirror.invoke(element);
423+
}
424+
return (AnnotatedElement) hotSpotResolvedPrimitiveTypeMirror.invoke(element);
425+
}
384426
} else if (element instanceof HotSpotResolvedJavaMethod) {
385427
if (((ResolvedJavaMethod) element).isClassInitializer()) {
386428
return null;
387429
}
388-
return (AnnotatedElement) hotSpotJDKReflectionGetMethod.invoke(hotSpotJVMCIRuntimeReflection, element);
430+
if (isHotSpotJDKReflectionAvailable) {
431+
return (AnnotatedElement) hotSpotJDKReflectionGetMethod.invoke(hotSpotJVMCIRuntimeReflection, element);
432+
} else {
433+
return (AnnotatedElement) hotSpotResolvedJavaMethodImplToJava.invoke(element);
434+
}
389435
} else if (element instanceof HotSpotResolvedJavaField) {
390-
return (AnnotatedElement) hotSpotJDKReflectionGetField.invoke(hotSpotJVMCIRuntimeReflection, element);
436+
if (isHotSpotJDKReflectionAvailable) {
437+
return (AnnotatedElement) hotSpotJDKReflectionGetField.invoke(hotSpotJVMCIRuntimeReflection, element);
438+
} else {
439+
return (AnnotatedElement) hotSpotResolvedJavaFieldImplToJava.invoke(element);
440+
}
391441
} else if (element instanceof AnnotationWrapper) {
392442
return getRoot(((AnnotationWrapper) element).getAnnotationRoot());
393443
}

0 commit comments

Comments
 (0)