Nestmate same-package check

John Rose john.r.rose at oracle.com
Thu Apr 20 02:42:23 UTC 2017


On Apr 18, 2017, at 11:42 AM, Dan Smith <daniel.smith at oracle.com> wrote:
> I've uploaded a draft of JVMS changes for JEP 181 "Align JVM Checks with Java Language Rules for Nested Classes" to:
> http://cr.openjdk.java.net/~dlsmith/private-access.html <http://cr.openjdk.java.net/~dlsmith/private-access.html>


> classHasValidNest(Class) :-
> 
> 	classMemberOfNestName(Class, HostName),
> 	classDefiningLoader(Class, L1),
> 	loadedClass(HostName, L1, HostClass),
> 	samePackageName(Class, HostClass),
> 	classClassName(Class, Name),
> 	classNestMemberNames(HostClass, MemberNames),
> 	member(Name, MemberNames),
> 	classDefiningLoader(HostClass, L2),
> 	loadedClass(Name, L2, Class).

In English:

When validating nestmate attributes, if a class C with name
"C" has an attribute MemberOfNest("H"), it is valid only if the
following are all true:
 1. The string "H" resolves from C's loader (L1) as H.
 2. The strings "C" and "H" have the same package prefix.
 3. H contains an attribute of the form NestMembers(…"C"…).
 4. The string "C" resolves from H's loader (L2) as C.

Steps 1 and 4 are both CONSTANT_Class resolution operations.
Step 3 is a simple search of a symbol list, which is easy.

This logic can be simplified by testing that C and H must
be in the same runtime package.  In that case, L1 and L2 are
identical, and step 4 becomes:
 4'. C and H have the same defining loader.

Then we can refactor 2 and 4' into a more direct check on
runtime package (using the functor 'sameRuntimePackage'):
 1. The string "H" resolves from C's loader (L1) as H.
 2'. C and H have the same runtime package.
 3. H contains an attribute of the form NestMembers({... "C", ...}).

This is a simpler specification, and it also closes any possible
loopholes in package/nest alignment by insisting on equal
runtime packages from the start.

It also avoids a possibly wasteful class loading step, which
is only necessary if we allow L1 and L2 to differ.  That would
be a pathology IMO, not a use case.

The way I visualize this is that each newly arrived class
checks in with its host.  If the name is on the list, it gets in.

Sound good?

— John
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/valhalla-spec-experts/attachments/20170419/5090f3e9/attachment.html>


More information about the valhalla-spec-experts mailing list