package com.oracle.svm.reflect.target;
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
import com.oracle.svm.core.SubstrateUtil;
import com.oracle.svm.core.util.VMError;
class ReflectionHelper {
static Target_java_lang_reflect_Executable getHolder(Target_java_lang_reflect_Executable executable) {
Target_java_lang_reflect_Executable holder = getRoot(executable);
if (holder == null) {
holder = executable;
}
return holder;
}
static Target_java_lang_reflect_Method getHolder(Target_java_lang_reflect_Method method) {
Target_java_lang_reflect_Method holder = getRoot(method);
if (holder == null) {
holder = method;
}
return holder;
}
static Target_java_lang_reflect_Constructor getHolder(Target_java_lang_reflect_Constructor constructor) {
Target_java_lang_reflect_Constructor holder = getRoot(constructor);
if (holder == null) {
holder = constructor;
}
return holder;
}
static Target_java_lang_reflect_Field getHolder(Target_java_lang_reflect_Field field) {
Target_java_lang_reflect_Field holder = field.root;
if (holder == null) {
holder = field;
}
return holder;
}
static <T> T requireNonNull(T object, String errorMessage) {
if (object == null) {
throw VMError.shouldNotReachHere(errorMessage);
}
return object;
}
private static Target_java_lang_reflect_Executable getRoot(Target_java_lang_reflect_Executable executable) {
if (JavaVersionUtil.JAVA_SPEC <= 8) {
return executable.getRoot();
} else {
return SubstrateUtil.cast(SubstrateUtil.cast(executable, Target_java_lang_reflect_AccessibleObject.class).getRoot(), Target_java_lang_reflect_Executable.class);
}
}
private static Target_java_lang_reflect_Method getRoot(Target_java_lang_reflect_Method method) {
if (JavaVersionUtil.JAVA_SPEC <= 8) {
return SubstrateUtil.cast(SubstrateUtil.cast(method, Target_java_lang_reflect_Executable.class).getRoot(), Target_java_lang_reflect_Method.class);
} else {
return SubstrateUtil.cast(SubstrateUtil.cast(method, Target_java_lang_reflect_AccessibleObject.class).getRoot(), Target_java_lang_reflect_Method.class);
}
}
private static Target_java_lang_reflect_Constructor getRoot(Target_java_lang_reflect_Constructor constructor) {
if (JavaVersionUtil.JAVA_SPEC <= 8) {
return SubstrateUtil.cast(SubstrateUtil.cast(constructor, Target_java_lang_reflect_Executable.class).getRoot(), Target_java_lang_reflect_Constructor.class);
} else {
return SubstrateUtil.cast(SubstrateUtil.cast(constructor, Target_java_lang_reflect_AccessibleObject.class).getRoot(), Target_java_lang_reflect_Constructor.class);
}
}
}