Nestmate same-package check

Dan Smith daniel.smith at oracle.com
Thu Apr 20 17:42:09 UTC 2017


> On Apr 19, 2017, at 8:42 PM, John Rose <john.r.rose at oracle.com> wrote:
> 
> 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
> 
>> 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?

Yep, good.

I failed to notice that "samePackageName(Class, HostClass)" isn't what I want, but "sameRuntimePackage(Class, HostName)". We want a strict guarantee that these classes are in the same (runtime) package.

And if we assume they're in the same package, then, yes, they have the same loaders, and so names in both classes resolve to the same thing.

Revised:

classHasValidNest(Class) :-

	classMemberOfNestName(Class, HostName),
	classDefiningLoader(Class, L),
	loadedClass(HostName, L, HostClass),
        classDefiningLoader(HostClass, L),
	samePackageName(Class, HostClass),
	classClassName(Class, Name),
	classNestMemberNames(HostClass, MemberNames),
	member(Name, MemberNames).

—Dan


More information about the valhalla-spec-observers mailing list