Final nestmates spec
David Holmes
david.holmes at oracle.com
Tue Dec 12 21:55:55 UTC 2017
Hi John,
On 13/12/2017 7:22 AM, John Rose wrote:
> On Dec 11, 2017, at 11:52 PM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>>
>> I have one query with regards to the processing of the NestMembers
>> attribute. Originally when I wrote the draft I copied the InnerClasses
>> text and that included prohibiting duplicate entries in NestMembers.
>> You dropped that restriction from the spec (though I haven't yet
>> removed it from the VM). How does that interact with the
>> Class.getNestMembers() API? Should it return the raw NestMembers
>> contents (which may include duplicates - including additional
>> references to "self") or should it return the set of members (ie no
>> duplicates, including self)?
>
> My take:
>
> We have landed on laissez-faire for this kind of format check
> at class load time. The access checking rules are cleverly
> written so that garbage in the list is ignored. This is noted
> by the non-normative language in 4.7.29:
>
>> This array is consulted during access checking (5.4.4). It should
>> consist of references to other classes and interfaces that belong to
>> the same run-time package and have NestHost attributes referencing
>> this class or interface. Items that do not meet this description are
>> discouraged and will be ignored by access checking.
>
> There are four kinds of garbage:
>
> 1. [self] the nest host class itself (the one containing NestMs)
> 2. [outsider] valid classes whose package prefix differs form that of
> the nest host class
> 3. [duplicate] duplicate entries (either the same CONSTANT_Class or a
> homonym)
> 4. [not-found] references to classes which will not exist when resolved
>
> The spec. says these are *allowed* and *ignored*.
>
> (A fifth kind of garbage, syntax errors in class names, is caught
> by routine processing of CONSTANT_Class items. Maybe this is worth
> a unit test. The other four cases are worth a unit test, for that matter.)
A sixth kind of garbage, or an expansion of #2, are classes that don't
list the current class as their nest host.
> Each of these four cases poses a question for reflection: Do we hide
> it or expose it as an anomalous entry in the reflected list?
>
> In an earlier conversation, I think we agree that case 4 should just
> throw an error when reflection is performed, following a similar
> precedent with Class.getDefinedClasses.
>
> I don't remember our resolution of what to do about 1/2/3. The overall
I recall no discussion of #1 and #3. For #2, #4 and #6 - ie any listed
member that is not validated as being a member - we throw exceptions.
* <p>Each listed nest member must be validated by checking its own
* declared {@linkplain #getNestHost() nest host}. Any exceptions that
occur
* as part of this process will be thrown.
* @throws LinkageError if there is any problem loading or validating
* a nest member or its nest host
In practice these will be IncompatibleClassChangeError for #2 and #6,
and NoClassDefFoundError for #4.
For #5, depending on exactly what you mean by "syntax error", it could
be rejected at classfile parsing time; or it simply forms the wrong name
and will then come under #2, #4 or #6.
> choice is to sanitize on reflection or just pass through the garbage.
> Given the action on 4 (just let it hit the fan), I suggest that we should
> also let self, outsider, and duplicate entries show through on reflection.
>
> Counterargument: We could sanitize the reflected data, and also sort
> or randomize its order for good measure, to prevent buggy reflection users
> from accidentally depending on irrelevant specifics of classfile input.
> Remember how we got into trouble with reflected method lists, which
> when they were reordered caused some buggy reflectors to break.
> See also iteration order of maps and ImmutableCollections.SALT.
>
> My recommendation: Just let the bad data through reflection, and
> rely on javac to avoid putting bad data there in the first place.
>
> The javadoc could be adorned with weasel words saying that response
> to bad data (of forms 1..4 above) and sequence order are undefined
> and may change without notice.
Recommendation noted. :)
Personally I'd prefer it if the array elements did form a set, but I
don't want every correct use of this API to pay the cost of ensuring
that is the case. So some additional words will be needed I think. I'll
file a RFE to track that change and propose it here.
Thanks,
David
> — John
More information about the valhalla-spec-observers
mailing list