public void createClassLoaders(ClassLoader loader) { if (loader == null) { return; } Map<ClassLoader, Target_java_lang_ClassLoader> loaders = ClassLoaderSupport.getInstance().classLoaders; if (!loaders.containsKey(loader)) { ClassLoader parent = loader.getParent(); if (parent != null) { createClassLoaders(parent); loaders.put(loader, new Target_java_lang_ClassLoader(loaders.get(parent))); } else { loaders.put(loader, new Target_java_lang_ClassLoader()); } } } }
private DynamicHub createHub(AnalysisType type) { DynamicHub superHub = null; if ((type.isInstanceClass() && type.getSuperclass() != null) || type.isArray()) { superHub = dynamicHub(type.getSuperclass()); } DynamicHub componentHub = null; if (type.isArray()) { componentHub = dynamicHub(type.getComponentType()); } Class<?> javaClass = type.getJavaClass(); int modifiers = javaClass.getModifiers(); Target_java_lang_ClassLoader hubClassLoader = ClassLoaderSupport.getInstance().getOrCreate(javaClass.getClassLoader()); /* Class names must be interned strings according to the Java specification. */ String className = type.toClassName().intern(); /* * There is no need to have file names as interned strings. So we perform our own * de-duplication. */ String sourceFileName = stringTable.deduplicate(type.getSourceFileName(), true); return new DynamicHub(className, type.isLocal(), superHub, componentHub, sourceFileName, modifiers, hubClassLoader); }
public Target_java_lang_ClassLoader getOrCreate(ClassLoader classLoader) { createClassLoaders(classLoader); return classLoaders.get(classLoader); }
@Override public void afterRegistration(AfterRegistrationAccess access) { ImageSingletons.add(ClassLoaderSupport.class, new ClassLoaderSupport()); }
@Substitute public static ClassLoader getSystemClassLoader() { return KnownIntrinsics.unsafeCast(ClassLoaderSupport.getInstance().systemClassLoader, ClassLoader.class); }
@Override public void duringSetup(DuringSetupAccess access) { access.registerObjectReplacer(object -> { if (object instanceof ClassLoader) { ClassLoaderSupport.getInstance().createClassLoaders((ClassLoader) object); return ClassLoaderSupport.getInstance().classLoaders.get(object); } return object; }); } }
@Override public void beforeAnalysis(BeforeAnalysisAccess access) { ClassLoaderSupport.getInstance().createClassLoaders(ClassLoader.getSystemClassLoader()); ClassLoaderSupport.getInstance().systemClassLoader = ClassLoaderSupport.getInstance().classLoaders.get(ClassLoader.getSystemClassLoader()); }
@Override public boolean execute(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode[] args) { com.oracle.svm.core.jdk.JavaLangSubstitutions.ClassLoaderSupport result = com.oracle.svm.core.jdk.JavaLangSubstitutions.ClassLoaderSupport.getInstance(); JavaConstant constant = snippetReflection.forObject(result); ConstantNode node = ConstantNode.forConstant(constant, b.getMetaAccess(), b.getGraph()); b.push(JavaKind.Object, node); b.notifyReplacedCall(targetMethod, node); return true; } @Override