jdk7 b58, VM doesn't smell good
Chanwit Kaewkasi
chanwit at gmail.com
Sun May 10 08:53:27 PDT 2009
Some more update:
I've compiled Remi's program with target -7, run with
-XX:+EnableInvokeDynamic. And here's the error message:
[java] Exception in thread "main" java.lang.NullPointerException
[java] at sun.dyn.DirectMethodHandle.<init>(DirectMethodHandle.java:49)
[java] at sun.dyn.MethodHandleImpl.findMethod(MethodHandleImpl.java:156)
[java] at java.dyn.MethodHandles.unreflectImpl(MethodHandles.java:431)
[java] at java.dyn.MethodHandles$Lookup.unreflect(MethodHandles.java:307)
[java] at
fr.umlv.indy.visitor.AbstractVisitor.<init>(AbstractVisitor.java:43)
[java] at fr.umlv.indy.visitor.test.Main0$1.<init>(Main0.java:8)
[java] at fr.umlv.indy.visitor.test.Main0.main(Main0.java:8)
Cheers,
Chanwit
On Sun, May 10, 2009 at 4:37 PM, Chanwit Kaewkasi <chanwit at gmail.com> wrote:
> Hi Remi,
>
> I am running John's FidgetDemo with b58 and everything is fine.
>
> I am using -XX:+EnableInvokeDynamic.
> I compile the program with -target 7.
>
> Perhaps, I'll try your program posted here and see if I get the same error.
>
> Cheers,
>
> Chanwit
>
> On Sun, May 10, 2009 at 4:02 PM, Rémi Forax <forax at univ-mlv.fr> wrote:
>> The runtime of jdk7 b58 doesn't work too.
>>
>> java -cp test-classes/ fr.umlv.indy.visitor.test.Main0
>> Java HotSpot(TM) Server VM warning: JSR 292 method handles are disabled
>> in this JVM. Use -XX:+EnableMethodHandles to enable.
>> Exception in thread "main" java.lang.UnsatisfiedLinkError:
>> sun.dyn.MethodHandleNatives.getConstant(I)I
>> at sun.dyn.MethodHandleNatives.getConstant(Native Method)
>> at sun.dyn.MethodHandleNatives.<clinit>(MethodHandleNatives.java:133)
>> at sun.dyn.MemberName.<init>(MemberName.java:291)
>> at java.dyn.MethodHandles$Lookup.unreflect(MethodHandles.java:307)
>> at fr.umlv.indy.visitor.AbstractVisitor.<init>(AbstractVisitor.java:41)
>> at fr.umlv.indy.visitor.test.Main0$1.<init>(Main0.java:7)
>> at fr.umlv.indy.visitor.test.Main0.main(Main0.java:7)
>>
>> Here, the behavior is Ok, I need to enable method handles.
>>
>> java -cp test-classes/ -XX:+EnableMethodHandles
>> fr.umlv.indy.visitor.test.Main0
>> Java HotSpot(TM) Server VM warning: JSR 292 invokedynamic is disabled in
>> this JVM. Use -XX:+EnableInvokeDynamic to enable.
>> Exception in thread "main" java.lang.NoClassDefFoundError:
>> fr/umlv/indy/visitor/AbstractVisitor
>> at
>> fr.umlv.indy.visitor.AbstractVisitor.genericVisit(AbstractVisitor.java:73)
>> at fr.umlv.indy.visitor.test.Main0.main(Main0.java:19)
>>
>> I love this error message, NoClassDefFound AbstractVisitor in
>> genericVisit of AbstractVisitor ??
>> Ok, perhaps the message is just not the good one.
>>
>> Moreover, the VM asks for enabling invoke dynamic but the code (below)
>> doesn't use it ?
>> The line 73 of AbstractVisitor.genericVisit is an invokevistual on a
>> MethodHandle.
>> handle(target.getClass()).<void>invoke(this, target);
>>
>> It's a regression, this code was working with tl/hotspot (changeset
>> 738:53d9bf689e80).
>>
>> I have checked if it is not because the compiler use invokedynamic
>> instead of invokevirtual
>> but this is not the case :
>> public void genericVisit(java.lang.Object);
>> Code:
>> 0: aload_0
>> 1: aload_1
>> 2: invokevirtual #5; //Method
>> java/lang/Object.getClass:()Ljava/lang/Class;
>> 5: invokevirtual #40; //Method
>> handle:(Ljava/lang/Class;)Ljava/dyn/MethodHandle;
>> 8: aload_0
>> 9: aload_1
>> 10: invokevirtual #41; //Method
>> java/dyn/MethodHandle.invoke:(Lfr/umlv/indy/visitor/AbstractVisitor;Ljava/lang/Object;)V
>> 13: return
>>
>> Trying to enable invoke dynamic :
>> java -cp test-classes/ -XX:+EnableInvokeDynamic
>> fr.umlv.indy.visitor.test.Main0
>> Exception in thread "main" java.lang.NoClassDefFoundError:
>> fr/umlv/indy/visitor/AbstractVisitor
>> at
>> fr.umlv.indy.visitor.AbstractVisitor.genericVisit(AbstractVisitor.java:73)
>> at fr.umlv.indy.visitor.test.Main0.main(Main0.java:19)
>>
>> It doesn't work, same stupid error.
>>
>> It seems that something goes wrong between hotspot code in tl and its
>> integration
>> in jdk7 workspace.
>>
>> I hope this mail will help !
>>
>> Rémi
>> PS: here are the two classes I have used, if you want to reproduce the bug.
>>
>> -----------------------------------------------------------------------------------------------------------------
>> package fr.umlv.indy.visitor;
>>
>> import java.dyn.MethodHandle;
>> import java.dyn.MethodHandles;
>> import java.dyn.MethodType;
>> import java.dyn.MethodHandles.Lookup;
>> import java.lang.reflect.Method;
>> import java.util.ArrayList;
>> import java.util.List;
>> import java.util.Map;
>> import java.util.Map.Entry;
>> import java.util.concurrent.ConcurrentHashMap;
>>
>> public abstract class AbstractVisitor {
>> private final ConcurrentHashMap<Class<?>, MethodHandle> map;
>>
>> protected AbstractVisitor() {
>> ConcurrentHashMap<Class<?>, MethodHandle> map=
>> new ConcurrentHashMap<Class<?>, MethodHandle>();
>>
>> // should use public lookup but NPE (bug, fixed in mlvm repository)
>> // Lookup lookup = MethodHandles.Lookup.PUBLIC_LOOKUP;
>> Lookup lookup = MethodHandles.lookup();
>>
>> for(Method method : getClass().getMethods()) {
>> if ("visit".equals(method.getName())) {
>>
>> Class<?>[] types = method.getParameterTypes();
>> if (types.length!=1)
>> throw new IllegalStateException("wrong number of parameter
>> "+method);
>> Class<?> type=types[0];
>> if (type.isInterface() || type.isPrimitive() ||
>> method.getReturnType()!=void.class)
>> throw new IllegalStateException("invalid method signature
>> "+method);
>>
>> //System.out.println("register "+method);
>>
>> // should be not needed but generate currently a NPE
>> method.setAccessible(true);
>>
>> //MethodHandle methodHandle =
>> MethodHandles.Lookup.PUBLIC_LOOKUP.unreflect(method);
>> MethodHandle methodHandle = lookup.unreflect(method);
>>
>> //System.out.println("methodHandle type "+methodHandle.type());
>> methodHandle = MethodHandles.convertArguments(methodHandle,
>> MethodType.make(void.class, AbstractVisitor.class, Object.class));
>>
>> //System.out.println("mh type "+methodHandle.type());
>>
>> map.put(type, methodHandle);
>> }
>> }
>>
>> this.map=map;
>> }
>>
>> private MethodHandle findNewMethodHandle(Class<?> type) {
>> MethodHandle methodHandle=superHandle(type);
>> map.put(type, methodHandle);
>> return methodHandle;
>> }
>>
>> private MethodHandle superHandle(Class<?> type) {
>> ConcurrentHashMap<Class<?>, MethodHandle> map = this.map;
>> for(Class<?>
>> clazz=type.getSuperclass();clazz!=null;clazz=clazz.getSuperclass()) {
>> MethodHandle methodHandle = map.get(clazz);
>> if (methodHandle != null) {
>> return methodHandle;
>> }
>> }
>> throw new RuntimeException("no visit method applicable for "+type);
>> }
>>
>> public void genericVisit(Object target) {
>> handle(target.getClass()).<void>invoke(this, target);
>> }
>>
>> public MethodHandle handle(Class<?> type) {
>> MethodHandle methodHandle=map.get(type);
>> if (methodHandle!=null) {
>> return methodHandle;
>> }
>> return findNewMethodHandle(type);
>> }
>>
>> public MethodHandle oneApplicable(Class<?> type) {
>> MethodHandle oneApplicable=null;
>> for(Entry<Class<?>, MethodHandle> entry:map.entrySet()) {
>> if (type.isAssignableFrom(entry.getKey())) {
>> if (oneApplicable==null)
>> oneApplicable=entry.getValue();
>> else
>> return null;
>> }
>> }
>> return oneApplicable;
>> }
>> }
>>
>> -------------------------------------------------------------------------------------------------------------------
>> package fr.umlv.indy.visitor.test;
>>
>> import fr.umlv.indy.visitor.AbstractVisitor;
>>
>> public class Main0 {
>> public static void main(String[] args) {
>> AbstractVisitor visitor=new AbstractVisitor() {
>> public void visit(String text) {
>> System.out.println("text "+text);
>> }
>> public void visit(Integer integer) {
>> System.out.println("integer "+integer);
>> }
>> public void visit(Object o) {
>> System.out.println("object "+o);
>> }
>> };
>>
>> visitor.genericVisit("toto");
>> visitor.genericVisit(3);
>> visitor.genericVisit(4.0);
>> }
>> }
>>
>> _______________________________________________
>> mlvm-dev mailing list
>> mlvm-dev at openjdk.java.net
>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>>
>
>
>
> --
> Chanwit Kaewkasi
> PhD Candidate,
> Centre for Novel Computing
> School of Computer Science
> The University of Manchester
> Oxford Road
> Manchester
> M13 9PL, UK
>
--
Chanwit Kaewkasi
PhD Candidate,
Centre for Novel Computing
School of Computer Science
The University of Manchester
Oxford Road
Manchester
M13 9PL, UK
More information about the mlvm-dev
mailing list