Skip to content

Commit cb9243d

Browse files
committed
Fall back to older JVMCI API when HotSpotJDKReflection is not available
Closes #4655
1 parent bee6a87 commit cb9243d

File tree

1 file changed

+62
-13
lines changed

1 file changed

+62
-13
lines changed

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

Lines changed: 62 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,22 +107,56 @@ 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",
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",
121133
Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl"));
122-
hotSpotJDKReflectionGetField = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotJDKReflection"), "getField",
134+
temporaryHotSpotJDKReflectionGetField = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotJDKReflection"), "getField",
123135
Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedJavaFieldImpl"));
124-
} catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException e) {
125-
throw GraalError.shouldNotReachHere(e);
136+
} catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException | ReflectionUtil.ReflectionUtilError ex) {
137+
temporaryIsHotSpotJDKReflectionAvailable = false;
138+
}
139+
140+
isHotSpotJDKReflectionAvailable = temporaryIsHotSpotJDKReflectionAvailable;
141+
hotSpotJVMCIRuntimeReflection = temporaryHotSpotJVMCIRuntimeReflection;
142+
hotSpotJDKReflectionGetMirror = temporaryHotSpotJDKReflectionGetMirror;
143+
hotSpotJDKReflectionGetMethod = temporaryHotSpotJDKReflectionGetMethod;
144+
hotSpotJDKReflectionGetField = temporaryHotSpotJDKReflectionGetField;
145+
146+
if (isHotSpotJDKReflectionAvailable) {
147+
hotSpotResolvedObjectTypeImplMirror = null;
148+
hotSpotResolvedPrimitiveTypeMirror = null;
149+
hotSpotResolvedJavaMethodImplToJava = null;
150+
hotSpotResolvedJavaFieldImplToJava = null;
151+
} else {
152+
try {
153+
hotSpotResolvedObjectTypeImplMirror = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl"), "mirror");
154+
hotSpotResolvedPrimitiveTypeMirror = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedPrimitiveType"), "mirror");
155+
hotSpotResolvedJavaMethodImplToJava = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl"), "toJava");
156+
hotSpotResolvedJavaFieldImplToJava = ReflectionUtil.lookupMethod(Class.forName("jdk.vm.ci.hotspot.HotSpotResolvedJavaFieldImpl"), "toJava");
157+
} catch (ClassNotFoundException e) {
158+
throw GraalError.shouldNotReachHere(e);
159+
}
126160
}
127161
}
128162

@@ -380,14 +414,29 @@ private static AnnotatedElement getRoot(AnnotatedElement element) {
380414
if (element instanceof Package) {
381415
return (Class<?>) packageGetPackageInfo.invoke(element);
382416
} else if (element instanceof HotSpotResolvedObjectType || element instanceof HotSpotResolvedJavaType) {
383-
return (AnnotatedElement) hotSpotJDKReflectionGetMirror.invoke(hotSpotJVMCIRuntimeReflection, element);
417+
if (isHotSpotJDKReflectionAvailable) {
418+
return (AnnotatedElement) hotSpotJDKReflectionGetMirror.invoke(hotSpotJVMCIRuntimeReflection, element);
419+
} else {
420+
if (element instanceof HotSpotResolvedObjectType) {
421+
return (AnnotatedElement) hotSpotResolvedObjectTypeImplMirror.invoke(element);
422+
}
423+
return (AnnotatedElement) hotSpotResolvedPrimitiveTypeMirror.invoke(element);
424+
}
384425
} else if (element instanceof HotSpotResolvedJavaMethod) {
385426
if (((ResolvedJavaMethod) element).isClassInitializer()) {
386427
return null;
387428
}
388-
return (AnnotatedElement) hotSpotJDKReflectionGetMethod.invoke(hotSpotJVMCIRuntimeReflection, element);
429+
if (isHotSpotJDKReflectionAvailable) {
430+
return (AnnotatedElement) hotSpotJDKReflectionGetMethod.invoke(hotSpotJVMCIRuntimeReflection, element);
431+
} else {
432+
return (AnnotatedElement) hotSpotResolvedJavaMethodImplToJava.invoke(element);
433+
}
389434
} else if (element instanceof HotSpotResolvedJavaField) {
390-
return (AnnotatedElement) hotSpotJDKReflectionGetField.invoke(hotSpotJVMCIRuntimeReflection, element);
435+
if (isHotSpotJDKReflectionAvailable) {
436+
return (AnnotatedElement) hotSpotJDKReflectionGetField.invoke(hotSpotJVMCIRuntimeReflection, element);
437+
} else {
438+
return (AnnotatedElement) hotSpotResolvedJavaFieldImplToJava.invoke(element);
439+
}
391440
} else if (element instanceof AnnotationWrapper) {
392441
return getRoot(((AnnotationWrapper) element).getAnnotationRoot());
393442
}

0 commit comments

Comments
 (0)