# HG changeset patch # User twisti # Date 1387336169 28800 # Node ID 430c9f08728d9efa37f4311aa712e969f9e5e254 # Parent af10ee69a8ac5d8ce976e37b605bce61a9af7220 moved most CompilerToVM.getUniqueConcreteMethod logic up to Java and replace getUniqueConcreteMethod with findUniqueConcreteMethod diff -r af10ee69a8ac -r 430c9f08728d graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Tue Dec 17 17:58:16 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Tue Dec 17 19:09:29 2013 -0800 @@ -73,11 +73,10 @@ * Used to implement {@link ResolvedJavaType#findUniqueConcreteMethod(ResolvedJavaMethod)}. * * @param metaspaceMethod the metaspace Method on which to based the search - * @param resultHolder the holder of the result is put in element 0 of this array * @return the metaspace Method result or 0 is there is no unique concrete method for * {@code metaspaceMethod} */ - long getUniqueConcreteMethod(long metaspaceMethod, HotSpotResolvedObjectType[] resultHolder); + long findUniqueConcreteMethod(long metaspaceMethod); /** * Used to determine if an interface has exactly one implementor. diff -r af10ee69a8ac -r 430c9f08728d graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Tue Dec 17 17:58:16 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Tue Dec 17 19:09:29 2013 -0800 @@ -56,7 +56,7 @@ public native boolean isMethodCompilable(long metaspaceMethod); @Override - public native long getUniqueConcreteMethod(long metaspaceMethod, HotSpotResolvedObjectType[] resultHolder); + public native long findUniqueConcreteMethod(long metaspaceMethod); @Override public native ResolvedJavaType getUniqueImplementor(HotSpotResolvedObjectType interfaceType); diff -r af10ee69a8ac -r 430c9f08728d graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Tue Dec 17 17:58:16 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Tue Dec 17 19:09:29 2013 -0800 @@ -320,13 +320,22 @@ } public ResolvedJavaMethod uniqueConcreteMethod() { - HotSpotResolvedObjectType[] resultHolder = {null}; - long ucm = runtime().getCompilerToVM().getUniqueConcreteMethod(metaspaceMethod, resultHolder); - if (ucm != 0L) { - assert resultHolder[0] != null; - return resultHolder[0].createMethod(ucm); + if (holder.isInterface()) { + // Cannot trust interfaces. Because of: + // interface I { void foo(); } + // class A { public void foo() {} } + // class B extends A implements I { } + // class C extends B { public void foo() { } } + // class D extends B { } + // Would lead to identify C.foo() as the unique concrete method for I.foo() without + // seeing A.foo(). + return null; } - return null; + final long uniqueConcreteMethod = runtime().getCompilerToVM().findUniqueConcreteMethod(metaspaceMethod); + if (uniqueConcreteMethod == 0) { + return null; + } + return fromMetaspace(uniqueConcreteMethod); } @Override diff -r af10ee69a8ac -r 430c9f08728d src/share/vm/graal/graalCompiler.cpp --- a/src/share/vm/graal/graalCompiler.cpp Tue Dec 17 17:58:16 2013 -0800 +++ b/src/share/vm/graal/graalCompiler.cpp Tue Dec 17 19:09:29 2013 -0800 @@ -280,18 +280,6 @@ return VMToCompiler::createJavaField(field_holder, name, field_type, offset, flags, false, CHECK_NH); } -Handle GraalCompiler::createHotSpotResolvedObjectType(methodHandle method, TRAPS) { - KlassHandle klass = method->method_holder(); - oop java_class = klass->java_mirror(); - oop graal_mirror = java_lang_Class::graal_mirror(java_class); - if (graal_mirror != NULL) { - assert(graal_mirror->is_a(HotSpotResolvedObjectType::klass()), "unexpected class..."); - return graal_mirror; - } - Handle name = java_lang_String::create_from_symbol(klass->name(), CHECK_NH); - return GraalCompiler::createHotSpotResolvedObjectType(klass, name, CHECK_NH); -} - Handle GraalCompiler::createHotSpotResolvedObjectType(KlassHandle klass, Handle name, TRAPS) { oop java_class = klass->java_mirror(); oop graal_mirror = java_lang_Class::graal_mirror(java_class); diff -r af10ee69a8ac -r 430c9f08728d src/share/vm/graal/graalCompiler.hpp --- a/src/share/vm/graal/graalCompiler.hpp Tue Dec 17 17:58:16 2013 -0800 +++ b/src/share/vm/graal/graalCompiler.hpp Tue Dec 17 19:09:29 2013 -0800 @@ -78,7 +78,6 @@ static Handle get_JavaField(int offset, int flags, Symbol* field_name, Handle field_holder, Handle field_type, TRAPS); static Handle createHotSpotResolvedObjectType(KlassHandle klass, Handle name, TRAPS); - static Handle createHotSpotResolvedObjectType(methodHandle method, TRAPS); void exit(); diff -r af10ee69a8ac -r 430c9f08728d src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Tue Dec 17 17:58:16 2013 -0800 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Tue Dec 17 19:09:29 2013 -0800 @@ -171,33 +171,14 @@ return (jlong) (address) method(); } -C2V_VMENTRY(jlong, getUniqueConcreteMethod, (JNIEnv *, jobject, jlong metaspace_method, jobject resultHolder)) +C2V_VMENTRY(jlong, findUniqueConcreteMethod, (JNIEnv *, jobject, jlong metaspace_method)) methodHandle method = asMethod(metaspace_method); KlassHandle holder = method->method_holder(); - if (holder->is_interface()) { - // Cannot trust interfaces. Because of: - // interface I { void foo(); } - // class A { public void foo() {} } - // class B extends A implements I { } - // class C extends B { public void foo() { } } - // class D extends B { } - // Would lead to identify C.foo() as the unique concrete method for I.foo() without seeing A.foo(). - return 0L; - } - methodHandle ucm; - { - ResourceMark rm; - MutexLocker locker(Compile_lock); - ucm = Dependencies::find_unique_concrete_method(holder(), method()); - } - - if (ucm.is_null()) { - return 0L; - } - - Handle type = GraalCompiler::createHotSpotResolvedObjectType(ucm(), CHECK_0); - objArrayOop(JNIHandles::resolve(resultHolder))->obj_at_put(0, type()); - return (jlong) (address) ucm(); + assert(!holder->is_interface(), "should be handled in Java code"); + ResourceMark rm; + MutexLocker locker(Compile_lock); + Method* ucm = Dependencies::find_unique_concrete_method(holder(), method()); + return (jlong) (address) ucm; C2V_END C2V_VMENTRY(jobject, getUniqueImplementor, (JNIEnv *, jobject, jobject interface_type)) @@ -889,7 +870,7 @@ {CC"initializeBytecode", CC"("METASPACE_METHOD"[B)[B", FN_PTR(initializeBytecode)}, {CC"exceptionTableStart", CC"("METASPACE_METHOD")J", FN_PTR(exceptionTableStart)}, {CC"hasBalancedMonitors", CC"("METASPACE_METHOD")Z", FN_PTR(hasBalancedMonitors)}, - {CC"getUniqueConcreteMethod", CC"("METASPACE_METHOD"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getUniqueConcreteMethod)}, + {CC"findUniqueConcreteMethod", CC"("METASPACE_METHOD")"METASPACE_METHOD, FN_PTR(findUniqueConcreteMethod)}, {CC"getUniqueImplementor", CC"("HS_RESOLVED_TYPE")"RESOLVED_TYPE, FN_PTR(getUniqueImplementor)}, {CC"getStackTraceElement", CC"("METASPACE_METHOD"I)"STACK_TRACE_ELEMENT, FN_PTR(getStackTraceElement)}, {CC"initializeMethod", CC"("METASPACE_METHOD HS_RESOLVED_METHOD")V", FN_PTR(initializeMethod)},