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`. ------------- Commit messages: - 8348240: Remove SystemDictionaryShared::lookup_super_for_unregistered_class() Changes: https://git.openjdk.org/jdk/pull/23226/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=23226&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8348240 Stats: 342 lines in 9 files changed: 193 ins; 113 del; 36 mod Patch: https://git.openjdk.org/jdk/pull/23226.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/23226/head:pull/23226 PR: https://git.openjdk.org/jdk/pull/23226