I have just pushed code to mlvm/{langtools,jdk} which reflects the following 
syntax change for method handle invocation:

  T x = mh.<T>invokeExact(...);
=>
  T x = (T) mh.invokeExact(...);

and:

  {mh.<void>invokeExact(...);}
=>
  {mh.invokeExact(...);}


In other words, we are replacing fake type parameters (void? int?) with real 
casts, as a better notation for the intended type of the MH invocation.

The old format still works temporarily in a compatibility mode, unless you turn 
off the compatibility mode.  If you want to compile your code in the strict 
mode, to catch old usages, compile like this:

 $ javac -XDallowTransitionalJSR292=no

At some point before JSR 292 PFD, the default will change, and the flag will be 
required to support the type parameter syntax:

 $ javac -XDallowTransitionalJSR292=yes

Warning:  The treatment of the "<void>" case is potentially a code-breaking 
change.  To avoid the breakage, you have to force your invocation statement to 
produce an explicit value:

  {mh.invokeExact(...);}
=>
  {Object junk = mh.invokeExact(...);}

See the paragraph in JLS 14.8 "Expression Statements" containing the phrase 
"such a trick" for discussion of this corner of the language.

Updated language rules are documented here:
  http://wikis.sun.com/display/mlvm/InterfaceDynamic

These rules are provisional, but I expect them to replace the old ones, which 
did more violence to the language.

Best wishes,
-- John

P.S. Similar changes apply to InvokeDynamic, which also has a statically 
checked requirement for an enclosing @BootstrapMethod annotation.  If you have 
been (a) writing InvokeDynamic invocation syntax in Java source code, or (b) 
spinning invokedynamic bytecodes, the recent addition of local bootstrap 
methods is a change you'll need to catch up with soon.

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to