[nestmates] validation of ClassFile for hidden classes

David Holmes david.holmes at oracle.com
Wed Nov 13 06:34:17 UTC 2019


Correction/clarification ...

On 13/11/2019 3:45 pm, David Holmes wrote:
> Hi Mandy,
> 
> On 13/11/2019 10:45 am, Mandy Chung wrote:
>> A recent review with Alex and John on [1][2] specifically on:
>> - Hidden classes cannot participate in static nest membership as
>>    they do not have names. NestHost/NestMembers attributes on hidden
>>    classes are ignored.
>>
>> Instead of making validation of ClassFile for hidden classes and ordinary
>> classes somewhat different, the alternative is to have the validation
>> for hidden classes and ordinary classes identical.  When another class
>> (whether ordinary or hidden) names a hidden class as its declaring class
>> or class member (via |InnerClasses| attribute), or as its nest host
>> (via |NestHost| attribute), or as a member of its nest
>> (via |NestMembers| attribute), the class may successfully be created
>> while it may fail at run time where there is any attempt to resolve
>> a hidden class by name via any of these attributes per existing
>> specification.  No special rule for validation of hidden classes.
> 
> The problem is not dealing with these attributes naming hidden classes 
> as you can't name a hidden class in the first place; the problem is 
> having these attributes in hidden classes themselves.
> 
> You can certainly allow the hidden class to have all these attributes 
> and reject their use at runtime (as and when that may happen). I don't 
> really see the benefit in doing so however as in some cases at least the 
> specification is going to have to account for this anyway e.g ignoring 
> static nest attributes when dynamically injecting into a nest.

I see from discussion on the experts list that there is move to not 
reject a classfile based on the semantics of attributes, so not 
ignoring/rejecting during classfile parsing is okay. But the 
specification will still have to address the interaction between static 
NestHost attribute and the use of dynamic nestmate injection.

Thanks,
David
-----

>> David,
>>
>> This is the revised webrev:
>> http://cr.openjdk.java.net/~mchung/valhalla/webrevs/8171335/webrev-hidden-class-validation/ 
>>
>>
>> If a hidden nestmate class has a `NestHost` or `NestMembers` attribute,
>> and it's created to add to a member of a dynamic nest host (H), then
>> the runtime nest host is set to `H` and these attributes will not
>> be validated subsequently.
> 
> Okay.
> 
>>
>> If a hidden class has a `NestHost` or `NestMembers` attribute and
>> created with Lookup::defineHiddenClass without NESTMATE option,
>> then the behavior is the same as an ordinary class with a bad
>> `NestHost` or `NestMembers` attribute (e.g. HC's nest host is
>> not yet validated.  When it attempts to access NH's private member,
>> it would fail to resolve NH.)
> 
> Okay.
> 
>> I'm not sure if this is the best way to implement
>> InstanceKlass::set_nest_host.  When there is a proposed JVMS draft,
>> we may make more adjustment to the implementation.  So I hope
>> this patch is good to push in the time being.
> 
> I have a number of minor comments, but nothing to stop pushing of the 
> patch.
> 
>   364 // So we know that current class is "pristine" and its _nest_host 
> must be NULL.
> 
> It's no longer really "pristine" if it has a NestHost or NestMember 
> attribute. I'd probably just add an additional comment:
> 
> // If it has an explicit _nest_host_index or _nest_members, these will 
> be ignored.
> 
> This change:
> 
> -  assert((host->_nest_host == NULL && host->_nest_host_index == 0) ||
> -         (host->_nest_host == host), "proposed host is not a valid 
> nest-host");
> +  assert(host->_nest_host == NULL || host->_nest_host == host, 
> "proposed host is not a valid nest-host");
> 
> is not correct. This is asserting something about the klass we're going 
> to be use as the hidden class's nest-host, not something about the 
> hidden class. The proposed nest-host must be a valid nest-host.
> 
> +      log_trace(class, nestmates)("Type %s is a dynamic nest member of 
> %s: the current class has a NestHost attribute",
> 
> I'd be more inclined to make these warnings rather than just logging 
> them. Either way it should state the static values are ignored.
> 
>> This patch also includes a small javadoc change.
> 
> +     * then the name is given by the JVM of the following format:
> 
> suggest:
> 
> +     * then the name is defined by the JVM with the following format:
> 
> similarly in the MethodHandle docs.
> 
> -- 
> 
> +     * NESTMATE} option, then the hidden class was added as a member to
> +     * the nest of a {@linkplain MethodHandles.Lookup#lookupClass() 
> lookup class}
> 
> suggest:
> 
> +     * NESTMATE} option, then the hidden class is added to
> +     * the nest of the {@linkplain MethodHandles.Lookup#lookupClass() 
> lookup class}
> 
> -- 
> 
> -     * Lookup::defineHiddenClass}.
> +     * Lookup::defineHiddenClass} dynamically.
> 
> Adding "dynamically" is not necessary here - the use of 
> defineHiddenClass is implicitly "dynamic".
> 
> Thanks,
> David
> -----
> 
> 
>> Mandy
>> [1] http://hg.openjdk.java.net/valhalla/valhalla/rev/ad257875959a
>> [2] 
>> https://mail.openjdk.java.net/pipermail/valhalla-dev/2019-September/006420.html 
>>


More information about the valhalla-dev mailing list