constant-dynamic specification, updated

Brian Goetz brian.goetz at
Wed Jul 5 18:57:40 UTC 2017

This is very nice.

One thing that readers will wonder (doesn't belong in JVMS, but belongs 
somewhere) is what suggested practice are for using invocation name / 
constant name.  I don't see the name widely used in indy, but I could 
imagine it more widely used in condy, because constants often have names 
(like Pi.)  For a BSM that effectively has a single String parameter, I 
think we'll get more compact classfiles if we use the name and a shared 
no-arg BootstrapMethods entry, but is that a good reason?  For example, 
for a primitive-class bootstrap, would this be a good use of the name?

I don't understand this sentence: "A bootstrap specifier gives a method 
or fielddescriptor,/TD/."

On the API:

  - The type parameter T to BCI is "dangling", in that there is nothing 
to constrain it.  However, IIUC, it can only be MethodType or Class.  In 
an ideal world, T would be bounded by the common supertype of these two 
things (NominalConstantRepresentingMemberDescriptor).  We generally 
advise against use of unconstrained tvars like this in APIs, since it 
provides only the illusion of type safety, though I understand why you 
went this way -- you can have a BSM

     Foo bsm(Lookup lookup, BootstrapCallInfo<Class> bci) { ... }

and just proceed without casting, and it's both convenient and 

If we had a common supertype in the future, we'd not be able to add this 
as a bound in a binary-compatible manner, because invocationType()Object 
would be burned into client classfiles.  So it's kind of a dead-end.  In 
any case, I'd add a stronger note about the range of T here.  THere's 
room to put javadoc on tvars with "@param <T>"; you could say "Must be 
Class or MethodType."

  - In ConstantGroup, do you want to clarify that constants described by 
multiple CGs might be the same constant, and therefore might share the 
one-time transition to resolved? Readers could think that the 
one-transition lifecycle is a property of "entry #3 in CG at 234098", not 
the constant that CG at 234098 happens to refer to in slot 3.

I'd like to see some guidance about what a constant is.  Condy will 
happily serve up mutable objects in the guise of dynamic constants, and 
the VM will have no regrets.  However, this is likely to lead to pain 
(or security issues) for the user.  Some sort of guidance here would be 
good, perhaps in the package javadoc.

Also, related: what sort of facilities might we want to provide for 
caching/interning of equivalent constants across classes?  I could 
easily imagine a BSM wanting to preserve the invariant that any LDC with 
a given set of args from any class results in the same object.

On 6/24/2017 7:52 PM, John Rose wrote:
> I have updated the javadoc API that is relevant to the proposed
> JVM features for dynamic constants and more powerful bootstrap
> methods.
> Here is a rough draft of the corresponding JVMS changes:
> Please enjoy and comment.
> — John

More information about the valhalla-spec-observers mailing list