[Nestmates] RFR (S): Dynamic nestmate update
David Holmes
david.holmes at oracle.com
Wed Oct 31 06:56:44 UTC 2018
Hi Lois,
I've pushed set_nest_host down into fill_instance_class, where it is set
as early as possible - which is after apply_parsed_class_metadata as
that sets the static nest attributes in the IK.
I also had to remove an assertion that's no longer valid at the time we
try to assert it.
Full webrev:
http://cr.openjdk.java.net/~dholmes/dynamic-nestmates/webrev.v3/
Incremental:
http://cr.openjdk.java.net/~dholmes/dynamic-nestmates/webrev.v3-incr/
This seems early enough to address all your concerns re super access,
initializers and JFR, even if we don't currently need to see the nest_host.
Thanks,
David
On 31/10/2018 8:25 AM, David Holmes wrote:
> Hi Lois,
>
> On 31/10/2018 3:43 AM, Lois Foltan wrote:
>> On 10/30/2018 3:28 AM, David Holmes wrote:
>>
>>> Hi Lois,
>>>
>>> Here's an update:
>>>
>>> http://cr.openjdk.java.net/~dholmes/dynamic-nestmates/webrev.v2
>>>
>>> Now we push the dynamic_nest_host through to the
>>> KlassFactory::create_from_stream level, where we set the nest-host
>>> directly after ClassFileParser.create_instance_klass has been called.
>>> That should ensure the class is not findable until after the
>>> nest-host has successfully been set, and doesn't require any further
>>> cleanup (as far as I can see) if the setting of the nest-host fails.
>>
>> Thank you! I think the parameter "nest_host" should be even pushed
>> further into ClassFileParser::create_instance_klass() & then into
>> ClassFileParser::fill_instance_klass(). The call to set_nest_host
>> should occur in ClassFileParser::fill_instance_klass for a couple of
>> reasons.
>> - 1. check_super_class_access and check_super_interface_access
>> could be affected by the setting of nest host?
>
> Not today - nest-based access checks are only for members. If we get to
> sealed classes and allow dynamic nest members to relate to such sealed
> classes then we are already in a position where the nest host has to be
> known much earlier - and there are problems with that. This could be a
> preemptive move towards supporting that.
>
>> - 2. when the mirror is created and static fields are initialized
>> one of those field's initializers could access a nest member? Would
>> this be an issue if nest_host is not set?
>
> This is default (and compile-time constant?) initialization of fields.
> Any non-default initialization happens at <clinit> time which is much
> later - well after the nest-host has been set.
>
>> - 3. JFR might want to know this information by the time
>> JFR_ONLY(INIT_ID(ik);) is invoked at the end of
>> ClassFileParser::fill_instance_klass()
>
> Okay - that may be true in the future.
>
>> And this brings me to my nest code review comment for both of us. I'm
>> passing 3 more parameters (nonfindable, is_weak and vm_annotations)
>> from jvm_lookup_define_class() all the way down into ClassFileParser
>> construction. We may need to consider creating a new data structure
>> much like ClassInfo or LinkInfo, something like ClassParseInfo that
>> contains information for not only our new parameters but existing
>> unsafe anonymous class information that is passed into
>> SystemDictionary::parse_stream as well. Let me know what you think?
>
> Yes - there is too much tramp data. Unclear whether to simply define a
> new holder class and pass that around everywhere, or whether to try and
> incorporate into existing strcutures e.g. perhaps attach it to the
> ClassFileParser? Depends on where the different bits of data are getting
> used.
>
> I'll simply pass the nest-host further down directly for now to test out
> how this works.
>
>>>
>>> No changes to InstanceKlass::set_nest_host from previous version
>>> (sorry I'm not setup to do incremental webrevs ... need to fix that).
>> A couple of minor comments for InstanceKlass::set_nest_host()
>> - line #325 - comment "are a" should be "are"
>
> Fixed.
>
>> - If host is NULL, would you consider setting _nest_host to the
>> current instance class? Aren't you your own nest host?
>
> In a static sense you are your own nest host if nothing else is
> specified. But for this dynamic API a NULL host is a programming error
> to me.
>
> Thanks,
> David
>
>>>
>>> I've also removed Mandy's temporary nestmate access check code in
>>> reflection.cpp as it is not needed. So InstanceKlass:raw_nest_host()
>>> is also removed.
>> Good, thank you, that had been something on my list to look at!
>>
>>>
>>> I also reworked jvm_lookup_define_class a little - the use of "const"
>>> caused flow-on problems that were simpler to avoid by not using "const".
>> Looks good.
>>
>> Thanks,
>> Lois
>>
>>>
>>> Thanks,
>>> David
>>>
>>> On 30/10/2018 9:35 AM, David Holmes wrote:
>>>> Hi Lois,
>>>>
>>>> On 30/10/2018 6:01 AM, Lois Foltan wrote:
>>>>> On 10/29/2018 2:37 AM, David Holmes wrote:
>>>>>
>>>>>> webrev: http://cr.openjdk.java.net/~dholmes/dynamic-nestmates/webrev/
>>>>>>
>>>>>> This fleshes out Mandy's initial implementation with additional
>>>>>> error checking on the VM side to match the defineClass API, and
>>>>>> with an additional VM test.
>>>>>>
>>>>>> Thanks,
>>>>>> David
>>>>> Hi David,
>>>>>
>>>>> I have a couple of concerns about this approach longer term for
>>>>> setting the nest host post return from either
>>>>> SystemDictionary::resolve_from_stream or
>>>>> SystemDictionary::parse_stream within jvm_lookup_define_class().
>>>>>
>>>>> - for a findable class as soon as that class is added to the
>>>>> SystemDictionary, is there any concern that another thread could
>>>>> request that class and access it before its nest host is
>>>>> legitimately set? Would it be better to pass nest host down into
>>>>> ClassFileParser so it is known at the point the InstanceKlass is
>>>>> created?
>>>>
>>>> Good question. I hadn't looked at exactly how and when the
>>>> defineClass logic set the nest host, I was only only updating the
>>>> actual set_nest_host internal logic.
>>>>
>>>> There are a couple of concerns here:
>>>>
>>>> 1. Finding the class before the nest-host has been set
>>>> 2. Cleaning up in the case that setting the nest-host failed
>>>>
>>>> I don't think either are currently handled correctly - and my change
>>>> triggers #2. We need a way to make the complete logical operation
>>>> atomic. That most likely requires pushing the setting of the
>>>> nest-host deeper into the class loading logic - possibly immediately
>>>> after IK creation as you suggest.
>>>>
>>>>> - At the time class file nest members attributes are parsed and the
>>>>> nest host setting within the byte stream matches the nest host used
>>>>> when jvm_lookup_define_class() is invoked, than in my opinion an
>>>>> error should not result.
>>>>
>>>> I disagree. You're either using dynamic nest membership or you're
>>>> using static nest membership - using both, even if the end result
>>>> would be the same, seems an error in the programming model to me.
>>>> Afterall if the defined class is already a valid static nest member
>>>> then you don't need to use the NESTMATE property to inject it. And
>>>> it is definitely an error to claim a static nest-host when the host
>>>> does not statically list you as a member!
>>>>
>>>>> - Finally, should the setting of nest_host be known at the point
>>>>> class file load hook is processed?
>>>>
>>>> I'm not sure what you mean. At what point in the current code would
>>>> the byte[] passed to defineClass be replaced by one from the CLFH?
>>>> As long as the byte[] is final before we actually set_nest_host, I
>>>> don't think it matters.
>>>>
>>>> Thanks,
>>>> David
>>>>
>>>>> Thanks,
>>>>> Lois
>>
More information about the valhalla-dev
mailing list