In recent days, the OpenJDK/JDK milestone 3 released, and the MLVM is one of the coolest features targeted in the milestone 3. So, I think it is the time to try how the MLVM tastes in the midst of my busy schedule:)
I download the JDK binary snapshot b59 for my windows. Install and re-setup my path. Then, copy below helloworld codes(shameless got from the repo of MLVM, thanks for John Rose, leader of MLVM/JSR292):
import java.dyn.*;
public class Hello {
public static void main(String... av) {
if (av.length == 0) av = new String[] { "world" };
greeter(av[0] + " (from a statically linked call site)");
for (String whom : av) {
greeter.
// previous line generates invokevirtual MethodHandle.invoke(String)void
Object x = whom;
InvokeDynamic.hail(x); // weakly typed invokedynamic
// previous line generates invokedynamic MethodHandle.invoke(Dynamic)Dynamic
}
}
static void greeter(String x) { System.out.println("Hello, "+x); }
// intentionally pun between the method and its reified handle:
static MethodHandle greeter
= MethodHandles.lookup().findStatic(Hello.class, "greeter",
MethodType.make(void.class, String.class));
// Set up a class-local bootstrap method.
static { Linkage.registerBootstrapMethod("bootstrapDynamic"); }
private static CallSite bootstrapDynamic(Class caller, String name, MethodType type) {
assert(type.parameterCount() == 1 && (Object)name == "hail"); // in lieu of MOP
System.out.println("set target to adapt "+greeter);
MethodHandle target = MethodHandles.convertArguments(greeter, type);
CallSite site = new CallSite(caller, name, type);
site.setTarget(target);
return site;
}
}
>>javac Hello.java
Oh, Error! Yes., that seem "a bug in the 1.7 compiler " discussed here.
try again,
>>javac -source 1.7 Hello.java
Cong!
>>java -XX:+EnableInvokeDynamic Hello
Hello, world (from a statically linked call site)
Hello, world
set target to adapt greeter(java.lang.String)void
Exception in thread "main" java.lang.UnsupportedOperationException: NYI
at sun.dyn.FromGeneric.buildAdapterFromBytecodes(FromGeneric.java:238)
at sun.dyn.FromGeneric.
at sun.dyn.FromGeneric.of(FromGeneric.java:185)
at sun.dyn.FromGeneric.make(FromGeneric.java:177)
at sun.dyn.MethodHandleImpl.convertArguments(MethodHandleImpl.java:247)
at java.dyn.MethodHandles.convertArguments(MethodHandles.java:764)
at Hello.bootstrapDynamic(Hello.java:58)
at sun.dyn.CallSiteImpl.makeSite(CallSiteImpl.java:64)
at Hello.main(Hello.java:42)
Cong too! Although the weakly typed invokedynamic entry seem throw the UnsupportedOperationException. (although it is odd why the helloworld example can not pass the test^_^)
It is super-cool! I guess some concepts such as MethodHandle will affect the implementation of the proposal of "closure" in Java.
One natural question is, how do our Eclipse get ready to work with MLVM?
Can ECJ emit the invokedynamic bytecode?
Can Equinox(OSGI) benifit from from the new dynamic behavior?
...
Come on!
No comments:
Post a Comment