# HG changeset patch # User twisti # Date 1386568509 28800 # Node ID b23cbfb4366a301312465d0b94dfdd20d89dc660 # Parent 81055aacb98d8b9ba16069dd20bc9e9259e3bb57 merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod diff -r 81055aacb98d -r b23cbfb4366a 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 Sun Dec 08 18:06:28 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Sun Dec 08 21:55:09 2013 -0800 @@ -23,8 +23,6 @@ package com.oracle.graal.hotspot.bridge; -import java.lang.reflect.*; - import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; @@ -212,15 +210,14 @@ int getCompiledCodeSize(long metaspaceMethod); /** - * Gets the metaspace Method object corresponding to a given reflection {@link Method} object. + * Gets the metaspace Method object corresponding to a given {@link Class} object and slot + * number. * - * @param reflectionMethod - * @param resultHolder the holder of the result is put in element 0 of this array - * @return the metaspace Method result for {@code reflectionMethod} + * @param holder method holder + * @param slot slot number of the method + * @return the metaspace Method */ - long getMetaspaceMethod(Method reflectionMethod, HotSpotResolvedObjectType[] resultHolder); - - long getMetaspaceConstructor(Constructor reflectionConstructor, HotSpotResolvedObjectType[] resultHolder); + long getMetaspaceMethod(Class holder, int slot); long getMaxCallTargetOffset(long address); diff -r 81055aacb98d -r b23cbfb4366a 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 Sun Dec 08 18:06:28 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Sun Dec 08 21:55:09 2013 -0800 @@ -23,8 +23,6 @@ package com.oracle.graal.hotspot.bridge; -import java.lang.reflect.*; - import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.hotspot.*; @@ -43,10 +41,7 @@ } @Override - public native long getMetaspaceMethod(Method reflectionMethod, HotSpotResolvedObjectType[] resultHolder); - - @Override - public native long getMetaspaceConstructor(Constructor reflectionConstructor, HotSpotResolvedObjectType[] resultHolder); + public native long getMetaspaceMethod(Class holder, int slot); @Override public native byte[] initializeBytecode(long metaspaceMethod, byte[] code); diff -r 81055aacb98d -r b23cbfb4366a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java Sun Dec 08 18:06:28 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java Sun Dec 08 21:55:09 2013 -0800 @@ -29,7 +29,6 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.*; -import com.oracle.graal.hotspot.bridge.*; /** * HotSpot implementation of {@link MetaAccessProvider}. @@ -61,20 +60,46 @@ return new HotSpotSignature(signature); } + /** + * {@link Field} object of {@link Method#slot}. + */ + @SuppressWarnings("javadoc") private Field reflectionMethodSlot = getReflectionSlotField(Method.class); + + /** + * {@link Field} object of {@link Constructor#slot}. + */ + @SuppressWarnings("javadoc") private Field reflectionConstructorSlot = getReflectionSlotField(Constructor.class); + + private static Field getReflectionSlotField(Class reflectionClass) { + try { + Field field = reflectionClass.getDeclaredField("slot"); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException | SecurityException e) { + throw new GraalInternalError(e); + } + } + public ResolvedJavaMethod lookupJavaMethod(Method reflectionMethod) { - CompilerToVM c2vm = runtime.getCompilerToVM(); - HotSpotResolvedObjectType[] resultHolder = {null}; - long metaspaceMethod = c2vm.getMetaspaceMethod(reflectionMethod, resultHolder); - assert metaspaceMethod != 0L; - return resultHolder[0].createMethod(metaspaceMethod); + try { + Class holder = reflectionMethod.getDeclaringClass(); + final int slot = reflectionMethodSlot.getInt(reflectionMethod); + final long metaspaceMethod = runtime.getCompilerToVM().getMetaspaceMethod(holder, slot); + return HotSpotResolvedJavaMethod.fromMetaspace(metaspaceMethod); + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new GraalInternalError(e); + } } public ResolvedJavaMethod lookupJavaConstructor(Constructor reflectionConstructor) { - CompilerToVM c2vm = runtime.getCompilerToVM(); - HotSpotResolvedObjectType[] resultHolder = {null}; - long metaspaceMethod = c2vm.getMetaspaceConstructor(reflectionConstructor, resultHolder); - assert metaspaceMethod != 0L; - return resultHolder[0].createMethod(metaspaceMethod); + try { + Class holder = reflectionConstructor.getDeclaringClass(); + final int slot = reflectionConstructorSlot.getInt(reflectionConstructor); + final long metaspaceMethod = runtime.getCompilerToVM().getMetaspaceMethod(holder, slot); + return HotSpotResolvedJavaMethod.fromMetaspace(metaspaceMethod); + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new GraalInternalError(e); + } } public ResolvedJavaField lookupJavaField(Field reflectionField) { diff -r 81055aacb98d -r b23cbfb4366a 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 Sun Dec 08 18:06:28 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Sun Dec 08 21:55:09 2013 -0800 @@ -76,13 +76,10 @@ */ public static HotSpotResolvedObjectType getHolder(long metaspaceMethod) { HotSpotVMConfig config = runtime().getConfig(); - long constMethod = unsafe.getAddress(metaspaceMethod + config.methodConstMethodOffset); - assert constMethod != 0; - long constantPool = unsafe.getAddress(constMethod + config.constMethodConstantsOffset); - assert constantPool != 0; - long holder = unsafe.getAddress(constantPool + config.constantPoolHolderOffset); - assert holder != 0; - return (HotSpotResolvedObjectType) HotSpotResolvedObjectType.fromMetaspaceKlass(holder); + final long metaspaceConstMethod = unsafe.getAddress(metaspaceMethod + config.methodConstMethodOffset); + final long metaspaceConstantPool = unsafe.getAddress(metaspaceConstMethod + config.constMethodConstantsOffset); + final long metaspaceKlass = unsafe.getAddress(metaspaceConstantPool + config.constantPoolHolderOffset); + return (HotSpotResolvedObjectType) HotSpotResolvedObjectType.fromMetaspaceKlass(metaspaceKlass); } /** diff -r 81055aacb98d -r b23cbfb4366a src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Sun Dec 08 18:06:28 2013 -0800 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Sun Dec 08 21:55:09 2013 -0800 @@ -194,27 +194,10 @@ return true; C2V_END -// XXX getMetaspaceMethodBySlot -C2V_VMENTRY(jlong, getMetaspaceMethod, (JNIEnv *, jobject, jobject reflection_method_handle, jobject resultHolder)) - oop reflection_method = JNIHandles::resolve(reflection_method_handle); - oop reflection_holder = java_lang_reflect_Method::clazz(reflection_method); - int slot = java_lang_reflect_Method::slot(reflection_method); - Klass* holder = java_lang_Class::as_Klass(reflection_holder); +C2V_VMENTRY(jlong, getMetaspaceMethod, (JNIEnv *, jobject, jclass holder_handle, jint slot)) + oop java_class = JNIHandles::resolve(holder_handle); + Klass* holder = java_lang_Class::as_Klass(java_class); methodHandle method = InstanceKlass::cast(holder)->method_with_idnum(slot); - Handle type = GraalCompiler::createHotSpotResolvedObjectType(method, CHECK_0); - objArrayOop(JNIHandles::resolve(resultHolder))->obj_at_put(0, type()); - return (jlong) (address) method(); -} - -// XXX getMetaspaceConstructorBySlot -C2V_VMENTRY(jlong, getMetaspaceConstructor, (JNIEnv *, jobject, jobject reflection_ctor_handle, jobject resultHolder)) - oop reflection_ctor = JNIHandles::resolve(reflection_ctor_handle); - oop reflection_holder = java_lang_reflect_Constructor::clazz(reflection_ctor); - int slot = java_lang_reflect_Constructor::slot(reflection_ctor); - Klass* holder = java_lang_Class::as_Klass(reflection_holder); - methodHandle method = InstanceKlass::cast(holder)->method_with_idnum(slot); - Handle type = GraalCompiler::createHotSpotResolvedObjectType(method, CHECK_0); - objArrayOop(JNIHandles::resolve(resultHolder))->obj_at_put(0, type()); return (jlong) (address) method(); } @@ -986,8 +969,7 @@ {CC"getMethods", CC"("HS_RESOLVED_TYPE")["HS_RESOLVED_METHOD, FN_PTR(getMethods)}, {CC"hasFinalizableSubclass", CC"("HS_RESOLVED_TYPE")Z", FN_PTR(hasFinalizableSubclass)}, {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)}, - {CC"getMetaspaceMethod", CC"("REFLECT_METHOD"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getMetaspaceMethod)}, - {CC"getMetaspaceConstructor", CC"("REFLECT_CONSTRUCTOR"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getMetaspaceConstructor)}, + {CC"getMetaspaceMethod", CC"("CLASS"I)"METASPACE_METHOD, FN_PTR(getMetaspaceMethod)}, {CC"initializeConfiguration", CC"("HS_CONFIG")V", FN_PTR(initializeConfiguration)}, {CC"installCode0", CC"("HS_COMPILED_CODE HS_INSTALLED_CODE"[Z)I", FN_PTR(installCode0)}, {CC"notifyCompilationStatistics", CC"(I"HS_RESOLVED_METHOD"ZIJJ"HS_INSTALLED_CODE")V", FN_PTR(notifyCompilationStatistics)},