On Wed, 22 Jan 2025 03:28:00 GMT, Ioi Lam <ik...@openjdk.org> wrote: > I reimplemented > `SystemDictionaryShared::lookup_super_for_unregistered_class()` with Java > code. This removes hacks in > `SystemDictionary::resolve_with_circularity_detection()` to facilitate future > clean-ups there that are planned by @coleenp. Please see the [JBS > issue](https://bugs.openjdk.org/browse/JDK-8348240) for a discussion of why > the hack was there. > > The new Java code is in the `jdk/internal/misc/CDS$UnregisteredClassLoader` > class. I also simplified `UnregisteredClasses::create_classloader()` by > moving some unwieldy C++ `JavaCalls` code into Java. > > ### How this works: > > For example, let's assume you have the following classfiles in foo.jar: > > > interface MyInterface1 {} > interface MyInterface2 {} > class MyClass extends Object implements MyInterface1, MyInterface2 {} > > > The CDS classlist file can look like this: > > > java/lang/Object id: 1 > MyInterface1: id: 2 super: 1 source: foo.jar > MyInterface2: id: 3 super: 1 source: foo.jar > MyClass: id: 4 super: 1 interfaces: 2 3 source: foo.jar > > > When CDS handles the `MyClass: id: 4` line, it calls > `CDS$UnregisteredClassLoader::load()` with the following parameters: > > - `name` = "MyClass" > - `superClass` = java.lang.Object > - `interfaces` = {MyInterface1, MyInterface2} > > `CDS$UnregisteredClassLoader::load()` will start parsing MyClass.class from > foo.jar. The ClassFileParser will see symbolic references to the supertypes > of `MyClass`. These supertypes will be resolved by > `CDS$UnregisteredClassLoader::findClass()`, using the classes provided by > `superClass` and `interfaces`.
Looks like a good cleanup. I have couple of comments. src/hotspot/share/cds/unregisteredClasses.cpp line 72: > 70: > 71: JavaValue result(T_OBJECT); > 72: JavaCallArguments args(2); Should the 2 be increased to 3? src/hotspot/share/classfile/vmSymbols.hpp line 742: > 740: template(toFileURL_name, "toFileURL") > \ > 741: template(toFileURL_signature, > "(Ljava/lang/String;)Ljava/net/URL;") \ > 742: template(url_array_classloader_void_signature, > "([Ljava/net/URL;Ljava/lang/ClassLoader;)V") \ I think you can also remove the following since `URLClassLoader` is not used directly anymore: `do_klass(URLClassLoader_klass, java_net_URLClassLoader ) ` ------------- PR Review: https://git.openjdk.org/jdk/pull/23226#pullrequestreview-2568629771 PR Review Comment: https://git.openjdk.org/jdk/pull/23226#discussion_r1926215557 PR Review Comment: https://git.openjdk.org/jdk/pull/23226#discussion_r1926205535