Draft JVMS changes for Nestmates
Brian Goetz
brian.goetz at oracle.com
Tue Apr 18 18:58:22 UTC 2017
> JEP name
>
> I don't know how permanent JEP names are supposed to be, but I'd prefer a different name at this point. Something like: "Expanded JVM Access to Private Members"—shorter, focused on the feature itself rather than its relationship to the Java language. Or maybe "Class Nests for Access to Private Members".
I like the latter; it captures the core feature here, which is
introducing a new concentric sphere of access control in the VM, which
we call "nests". That it was inspired by translation challenges in
Java, or useful to addressing those, is secondary.
> Terminology
>
> The term "nest" is nice because it's short and mostly unspoiled by overloading in this context (I think?); it's not great because it's informal and doesn't mean anything the first time you hear it. I thought about something more clinical like "access control context", but I'm not convinced that's an improvement. How do others feel?
Nest connotes "things in other things", like Matryoshka dolls, which I
think is a positive.
> The JEP uses "nest top" to describe the class that nest members reference; I prefer "host class", which better describes the class's role and isn't tied to the Java "top level class" concept. I know we use "host class" internally in Hotspot, perhaps when working with anonymous classes (of the JVM flavor), but I think in that context it will ultimately mean the same thing? Are we comfortable repurposing the term in this way?
Or: "nest host" or "nest host class" or "nest parent" ...
The primary purpose of having a nest top is so that there is a
well-defined canonical member of each nest, to which we can attach all
the nest metadata and ensure that computations regarding nest-ness are
well-defined. It doesn't have to be the "top" class at the language
level. I think the term should connote canonical-ness rather than top-ness.
> I follow Brian's model when it comes to nest membership (5.4.4): every class belongs to a nest, possibly (in the absence of MemberOfNest) the nest hosted by itself. Many nests are singletons without any associated explicit attributes.
More precisely: nests form a /partition/ over classes. This means every
class belongs to exactly one nest, so the function Nest(Class) is total.
> Compiler changes
>
> The JEP text can't seem to decide if compiler changes are part of it, or a follow-up exercise. I think we're best off explicitly including the compiler changes, which will provide opportunities for design validation and testing.
That was my bad. I was trying to capture that we didn't require an
immediate flag day -- that for any given compiler, dropping access
bridges out of the compiler implementation could happen any time after
the VM acquired nestmate support -- but for our own implementation, we'd
be silly to not get the test and validation benefit of dropping
unnecessary bridge generation ASAP.
> API changes
We need to decide whether we are delivering a reflection component, and
if so, what that looks like.
Minimal candidate:
class Nest {
Class<?> hostClass() { ... }
boolean isMember(Class<?> clazz) { .... }
}
class Class {
Nest getNest() { ... }
}
More information about the valhalla-spec-experts
mailing list