hg: mlvm/mlvm/langtools: meth: support transitional and native forms of invokedynamic in javac and javap

John Rose John.Rose at Sun.COM
Thu Oct 9 10:26:48 PDT 2008


On Oct 9, 2008, at 12:51 AM, Rémi Forax wrote:

> hum, it seems invokedynamic as now three encodings ?
> - invokedynamic (bytecode 186) which works like invokestatic
> - invokeinterface (like in JSR292 current spec)
> - invokestatic(on java/lang/Dynamic) i suppose.
>
> As the backport implementer, I don't understand why we need two
> way invokeinterface/invokestatic to emulate invokedynamic ?

That's not part of the spec. yet.  The javac stuff is highly  
experimental.

But I'm working on a post-EDR spec.  The 'invokestatic' form is in  
response to various comments about defects in the EDR design.

You and I and others were talking at the Summit about different  
possible representations for invokedynamic, and the trade-offs  
between a verifier-breaking representation "native" bytecode and a  
more compatible overloading of invokeinterface (in the EDR) or  
invokestatic.

Remember that Fredrik Öhrström was objecting on philosophical grounds  
to using a receiver-based instruction for a receiverless semantics.   
This mismatch causes several problems, which I have noticed people  
stumbling over repeatedly, and I want us to fix it if we can.

I think now (and would like your comments on this) that we should  
have a transitional (tool-friendly) encoding and a final  
"native" (tool-breaking) encoding.  The transitional encoding would  
be deprecated on final release, and is for use in 2008-2009, while  
tools have not yet updated to all the JDK 7 specs.

Given this strategy, we can give up the EDR invokeinterface-based  
encoding (which has flaws in its static typing due to the receiver- 
based format) and use invokestatic.  Although invokestatic has a too- 
short opcode size, this doesn't matter for a transitional form, if we  
know we are going to settle on a 5-byte invokedynamic instruction.   
(Size matters for the sake of some interpreter-based JVM  
implementations, since each invokedynamic instruction requires its  
own runtime linkage resources, unlike the other invokes.)

The typing and treatment of the implicit receiver argument of  
invokeinterface has confused people who are trying to implement and  
understand the EDR spec.  (I think the main problem in the IKVM  
version had to do with an off-by-one in the signature, right?)   
Perhaps the EDR spec. could have been better, but this is a real land- 
mine in the design, and if we have the opportunity to fix it, we  
should.  The fix will require going to a "native" invokedynamic,  
using the 186 bytecode-point, but we have plenty of time to do it, so  
we should.

The point of putting all three into javac is to to allow (or not to  
impede) experimentation with all currently-live possibilities.  As  
soon as the EG decides what to do (which I hope will be soon), we can  
delete one or two of the options from javac and from everything else.

So the short answer to your original question is, we don't need both,  
as soon as the EG makes a decision.  The reason you are seeing both  
is that I am letting the RI and the EG discussions unfold in  
parallel, as much as possible.  (Welcome to the bleeding edge!  :-)

Thanks for asking!

-- John



More information about the mlvm-dev mailing list