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

David Holmes dholmes at openjdk.java.net
Fri Mar 26 06:07:25 UTC 2021


On Thu, 25 Mar 2021 20:05:55 GMT, Ioi Lam <iklam at openjdk.org> wrote:

>> Please review this change which includes:
>> 
>> -  adding `ClassLoader::create_class_path_entry_or_fail()` and `ClassLoader::create_class_path_entry_or_fail()` functions for better readability. They will call the existing `ClassLoader::create_class_path_entry()`.
>> - replacing the TRAPS parameter with `Thread* current` for the functions which never throw exception.
>> 
>> Testing: tiers 1,2 (passed); tiers 3,4 (in progress).
>
> src/hotspot/share/classfile/classLoader.cpp line 554:
> 
>> 552:   // File or directory found
>> 553:   ClassPathEntry* new_entry = NULL;
>> 554:   new_entry = create_class_path_entry_or_fail(path, &st,
> 
> Ideally, there's should be no need to check for new_entry == NULL when calling  calling create_class_path_entry_or_fail(). This will make the code easier to read.
> 
> But currently the create_class_path_entry_or_fail() is still "tri-state":
> 
> - success: non-null
> - throw vmSymbols::java_io_IOException()
> - return NULL
> 
> The third case is this:
> 
>         // 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; <<<<< here
>         }
> 
> I am wondering if we can get rid of this logic. That way, we can add asserts like:
> 
> ClassPathEntry* ClassLoader::create_class_path_entry_or_fail(...) {
>   ClassPathEntry* entry = create_class_path_entry(, THREAD);
>   assert(entry != NULL || HAS_PENDING_EXCEPTION, "must throw or return valid entry");
>   return entry;
> }
> 
> ClassPathEntry* ClassLoader::create_class_path_entry_or_null(...) {
>   ClassPathEntry* entry = create_class_path_entry(, current);
>   assert(!HAS_PENDING_EXCEPTION, "must not throw");
>   return entry;
> }

You can't use HAS_PENDING_EXCEPTION in create_class_path_entry_or_null without reintroducing THREAD.

-------------

PR: https://git.openjdk.java.net/jdk/pull/3203


More information about the hotspot-runtime-dev mailing list