RFR: 8263632: Improve exception handling of APIs in classLoader.cpp [v4]

David Holmes david.holmes at oracle.com
Tue Mar 30 00:59:50 UTC 2021


On 30/03/2021 9:01 am, Ioi Lam wrote:
> On 3/28/21 9:40 PM, David Holmes wrote:
>> On Fri, 26 Mar 2021 16:12:54 GMT, Calvin Cheung <ccheung at openjdk.org> 
>> wrote:
>>
>>>> You can't use HAS_PENDING_EXCEPTION in 
>>>> create_class_path_entry_or_null without reintroducing THREAD.
>>> After offline discussion with Ioi, we've decided to get rid of the 
>>> `throw_exception` in `create_class_path_entry()`. This makes the code 
>>> cleaner. We could also drop the `TRAPS` parameter of a few other 
>>> related functions.
>> It is not at all clear to me how you now deal with the error cases 
>> without exceptions. How is it detected that 
>> ClassLoader::setup_module_search_path failed for example?
>>
> 
> During VM bootstrap, classLoader.cpp tries to open files on related to 
> -Xbootclasspath/a: and --patch-module.
> 
> For --patch-module handling, throw_exception=false was specified.
> 
> For bootclasspath handling, throw_exception=true was specified before 
> JDK-8263632:
> 
> https://github.com/openjdk/jdk/blame/59ed1fa28c80395ddc5e8d8611e2225349aaff1a/src/hotspot/share/classfile/classLoader.cpp#L672 
> 
> 
>     ClassLoader::initialize
>     -> ClassLoader::setup_bootstrap_search_path
>     -> ClassLoader::setup_bootstrap_search_path_impl
>     -> update_class_path_entry_list
>     -> create_class_path_entry(path, &st, /*throw_exception=*/true, ...)
> 
> But this will not throw any exception for invalid JAR files:
> 
>     [1] the file doesn't exist.
>     $ rm -f foo.jar
>     $ java -Xbootclasspath/a:foo.jar -version
>     openjdk version "15" 2020-09-15
>     OpenJDK Runtime Environment (build 15+36-1562)
>     OpenJDK 64-Bit Server VM (build 15+36-1562, mixed mode, sharing)
> 
> 
>     [2] the file exists but is not a ZIP file
>     $ touch foo.jar
>     $ java -Xbootclasspath/a:foo.jar -version
>     openjdk version "15" 2020-09-15
>     OpenJDK Runtime Environment (build 15+36-1562)
>     OpenJDK 64-Bit Server VM (build 15+36-1562, mixed mode, sharing)
> 
> 
> The behavior of [2] is due to this: is_init_completed() is false during 
> VM bootstrap.
> 
>     // Don't complain about bad jar files added via -Xbootclasspath/a:.
>     if (throw_exception && is_init_completed()) {
>       THROW_MSG_(vmSymbols::java_lang_ClassNotFoundException(), msg, NULL);
>     } else {
>       return NULL;
>     }
> 
> 
> create_class_path_entry() is called when is_init_completed() is true 
> only during CDS dumping code. We decided that we don't need the 
> exception in this case and will just ignore any non-existing or invalid 
> ZIP files. Getting rid of the throw_exception parameter makes things a 
> lot simpler.

Thanks for the explanations Ioi!

David
-----

> Thanks
> - Ioi
> 
>> -------------
>>
>> PR: https://git.openjdk.java.net/jdk/pull/3203
> 


More information about the hotspot-runtime-dev mailing list