Nest host validation vs NestHost attribute performed by Lookup::defineHiddenClass

David Holmes david.holmes at oracle.com
Thu Sep 26 23:02:45 UTC 2019


On 27/09/2019 4:02 am, John Rose wrote:
> On Sep 25, 2019, at 11:54 PM, David Holmes <david.holmes at oracle.com 
> <mailto:david.holmes at oracle.com>> wrote:
>>
>> The spec for getNestMembers states:
>>
>> /**
>>  * Returns an array containing {@code Class} objects representing all the
>>  * classes and interfaces that are members of the nest to which the class
>>  * or interface represented by this {@code Class} object belongs.
>>
>> so if the hidden class has been injected into a nest then this would 
>> simply return hiddenClass.getNestHost().getNestMembers() - which I 
>> think is what John is also suggesting - and that is what 
>> JVM_GetNestMembers does. If any of the other purported nest members 
>> are bad then this will throw an exception as normal.
>>
>> We may have to clarify the wording if dynamic members are not to show 
>> up ... though perhaps the dynamic member being asked the question 
>> should show up?
>>
>> If the hidden class was not injected into a nest then this gets a bit 
>> messy if the current class is not returned as the sole nest member of 
>> its own nest.
> 
> This is reasonable.  I think we all agree that getNestHost should be 
> accurate, even if it is derived from a dynamic Lookup call instead of a 
> static attribute.
> 
> And we should not attempt to dynamically update the getNMs list of a 
> class just because one or more HCs have been attached to its nest, via 
> the Lookup API.
> 
> To me this suggests that getNMs is solely static and getHC is 
> additionally dynamic.

Yes all agreed.

> There are two questions about getNestMembers and HCs.
> 
> 1. In the common case where a HC is in a singleton nest (its own nest) 
> should it report itself as one of its nest members?  I think “yes”, 
> since that’s also done when a class has none of the static attributes. 
>   We make up a fake 1-array for the singleton nest, and this “fixup 
> rule" applies equally well to HCs and regular classes.

Yes I agree. (I was initially confusing "a hidden class should not 
appear in NM list" with "a hidden class injected into a nest should not 
appear in NM list". A non-NESTMATE hidden class is just like any other 
top-level class with no NH/NM attributes.

> 2. If an HC is injected into the nest of another class K, should it “see 
> itself” in its *own* getNMs array?  Thanks for raising this, David; I 
> had not considered this bit of mess.  I would prefer “no”, since that’s 
> a new bit of “fixup logic” to add, but “yes” is OK too.

"No" is good. getNMs remains the static view of the nest-hosts NM attribute.

Thanks,
David
-----

> We can say that, unlike getNH, getNMs reports only information 
> statically derivable at one point, after class loading and before any 
> dynamic injection of HCs.  Furthermore, I think I’d prefer saying that 
> the HC making the query doesn’t see itself, but the other choice is OK. 
>   I prefer to exclude the HC from its own list on the grounds that HCs 
> should appear in getNMs lists as seldom as possible, since they don’t 
> “belong” there.  The cost of excluding an HC from its own mono-nest is 
> probably too high, so put it in its own getNMs as an exception, but 
> don’t compound the problem by having it peep out of more complex getNMs 
> lists.  Anyway, that’s my take.
> 
> 
> 


More information about the valhalla-dev mailing list