RFR (S) Remove SystemDictionary::InitOption enum
David Holmes
david.holmes at oracle.com
Fri Oct 19 03:55:12 UTC 2018
Hi Ioi,
On 19/10/2018 1:43 PM, Ioi Lam wrote:
> Hi David,
>
> Updated diff here:
>
> http://cr.openjdk.java.net/~iklam/jdk12/8212642-remove-sysdict-initoption.v01/delta_1.diff
Updates look good - thanks.
More below ...
>
>
> On 10/18/18 6:14 PM, David Holmes wrote:
>> Hi Ioi,
>>
>> Please include the bug number in RFR subject - thanks.
>>
>> On 19/10/2018 2:25 AM, Ioi Lam wrote:
>>> https://bugs.openjdk.java.net/browse/JDK-8212642
>>> http://cr.openjdk.java.net/~iklam/jdk12/8212642-remove-sysdict-initoption.v01/
>>>
>>>
>>> SystemDictionary::InitOption is no longer needed because we don't
>>> support
>>> multiple version of the JDK class libraries anymore. All classes
>>> preloaded
>>> by SystemDictionary must exist.
>>
>> In systemDictionary.cpp/hpp:
>>
>> 1974 bool SystemDictionary::resolve_wk_klass(WKID id, int init_opt,
>> TRAPS) {
>>
>> The init_opt parameter is now unused.
>>
>
> Removed.
>
>> ---
>>
>> src/hotspot/share/classfile/systemDictionary.hpp
>>
>> 96 // Each well-known class has a short klass name (like object_klass),
>> 97 // a vmSymbol name (like java_lang_Object), and a flag word
>> 98 // that makes some minor distinctions, like whether the klass
>> 99 // is preloaded, optional, release-specific, etc.
>>
>> The comment is no longer accurate/correct.
>>
>
> Fixed.
>
>> ---
>>
>> src/hotspot/share/runtime/reflection.cpp
>>
>> Why is MagicAccessorImpl still treated as optional?
>>
>>
> Reflection::verify_class_access() is called for every class that has a
> super class. So it gets called for String, which is loaded immediately
> after Object. At this point, MagicAccessorImpl is not loaded yet, so the
> old code marks it as "optional" to get around this.
But we should never get that far for core classes:
499 if ((current_class == NULL) ||
500 (current_class == new_class) ||
501 is_same_class_package(current_class, new_class)) {
502 return ACCESS_OK;
503 }
as they are in the same package. ??
> The old code is
> further convoluted by the fact that current_class->is_subclass_of(NULL)
> happily returns false :-(
That seems perfectly reasonable to me. What am I missing? :)
> I think the new code expresses what we want -- if MagicAccessorImpl is
> not loaded yet, obviously none of its subclasses are loaded, so there's
> nothing to check.
>
>>> The JVMCI classes were declared using InitOption::Jvmci, so that they
>>> are loaded
>>> only when EnableJVMCI==true. However, this is rather convoluted and
>>> I just added a few null checks instead.
>>
>> Can't help but think check_klass is redundant now. It would simplify
>> things if it were removed, then you wouldn't need to check is_loaded.
>> The only reason for the check is to avoid the NULL-check in the
>> assertion in check_klass when called from name(). The JVMCI code
>> either has to handle the NULL anyway, or else is never called unless
>> it can't be NULL.
>>
> check_klass() probably has a purpose -- before all the preloaded classes
> are resolved, someone may call SystemDictionary::xxx_klass() and store
> the result somewhere, and will get a crash only when the stored result
> is used later.
>
> A lot of code is executed inside
> SystemDictionary::resolve_preloaded_classes -- class file parsing,
> JVMTI, verification if requested by the user, etc. So I think it's
> better to preserve this check.
Ok. I suspect there will be other NULL checks in various places anyway,
but this is not a big deal.
Thanks,
David
> Thanks
> - Ioi
>> Thanks,
>> David
>>
>>> Tested using hs tiers 1-5
>>>
>>> Thanks
>>> - Ioi
>
More information about the hotspot-dev
mailing list