# HG changeset patch # User Christian Wimmer # Date 1348590225 25200 # Node ID 45f682f7fea857d53c8ac64d359e26ff28e9b7ab # Parent 460def61c04be04760a871357064c2f334069641 Add MetaAccessProvider.getResolvedJavaField to convert from reflection field to metadata field diff -r 460def61c04b -r 45f682f7fea8 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java Tue Sep 25 09:22:22 2012 -0700 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java Tue Sep 25 09:23:45 2012 -0700 @@ -59,11 +59,16 @@ boolean areConstantObjectsEqual(Constant x, Constant y); /** - * Provides the {@link JavaMethod} for a {@link Method} obtained via reflection. + * Provides the {@link ResolvedJavaMethod} for a {@link Method} obtained via reflection. */ ResolvedJavaMethod getResolvedJavaMethod(Method reflectionMethod); /** + * Provides the {@link ResolvedJavaField} for a {@link Field} obtained via reflection. + */ + ResolvedJavaField getResolvedJavaField(Field reflectionField); + + /** * Gets the length of the array that is wrapped in a Constant object. */ int getArrayLength(Constant array); diff -r 460def61c04b -r 45f682f7fea8 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 Sep 25 09:22:22 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Tue Sep 25 09:23:45 2012 -0700 @@ -101,6 +101,8 @@ JavaMethod getJavaMethod(Method reflectionMethod); + ResolvedJavaField getJavaField(Field reflectionField); + long getMaxCallTargetOffset(RuntimeCall rtcall); String disassembleNative(byte[] code, long address); diff -r 460def61c04b -r 45f682f7fea8 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 Sep 25 09:22:22 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Tue Sep 25 09:23:45 2012 -0700 @@ -41,6 +41,9 @@ public native JavaMethod getJavaMethod(Method reflectionMethod); @Override + public native ResolvedJavaField getJavaField(Field reflectionMethod); + + @Override public native byte[] JavaMethod_code(HotSpotResolvedJavaMethod method); @Override diff -r 460def61c04b -r 45f682f7fea8 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Tue Sep 25 09:22:22 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Tue Sep 25 09:23:45 2012 -0700 @@ -551,6 +551,11 @@ return (ResolvedJavaMethod) graalRuntime.getCompilerToVM().getJavaMethod(reflectionMethod); } + @Override + public ResolvedJavaField getResolvedJavaField(Field reflectionField) { + return graalRuntime.getCompilerToVM().getJavaField(reflectionField); + } + private static HotSpotCodeInfo makeInfo(ResolvedJavaMethod method, CompilationResult compResult, CodeInfo[] info) { HotSpotCodeInfo hsInfo = null; if (info != null && info.length > 0) { diff -r 460def61c04b -r 45f682f7fea8 src/share/vm/graal/graalCompiler.cpp --- a/src/share/vm/graal/graalCompiler.cpp Tue Sep 25 09:22:22 2012 -0700 +++ b/src/share/vm/graal/graalCompiler.cpp Tue Sep 25 09:23:45 2012 -0700 @@ -238,12 +238,23 @@ } } +Handle GraalCompiler::get_JavaTypeFromClass(Handle javaClassHandle, TRAPS) { + if (java_lang_Class::is_primitive(javaClassHandle())) { + BasicType basicType = java_lang_Class::primitive_type(javaClassHandle()); + return VMToCompiler::createPrimitiveJavaType((int) basicType, THREAD); + } else { + KlassHandle klass = java_lang_Class::as_klassOop(javaClassHandle()); + Handle name = java_lang_String::create_from_symbol(klass->name(), CHECK_NULL); + return GraalCompiler::createHotSpotResolvedJavaType(klass, name, CHECK_NULL); + } +} + Handle GraalCompiler::get_JavaType(KlassHandle klass, TRAPS) { Handle name = VmIds::toString(klass->name(), THREAD); return createHotSpotResolvedJavaType(klass, name, CHECK_NULL); } -Handle GraalCompiler::get_JavaField(int offset, int flags, Symbol* field_name, Handle field_holder, Handle field_type, Bytecodes::Code byteCode, TRAPS) { +Handle GraalCompiler::get_JavaField(int offset, int flags, Symbol* field_name, Handle field_holder, Handle field_type, TRAPS) { Handle name = VmIds::toString(field_name, CHECK_NULL); return VMToCompiler::createJavaField(field_holder, name, field_type, offset, flags, CHECK_NULL); } diff -r 460def61c04b -r 45f682f7fea8 src/share/vm/graal/graalCompiler.hpp --- a/src/share/vm/graal/graalCompiler.hpp Tue Sep 25 09:22:22 2012 -0700 +++ b/src/share/vm/graal/graalCompiler.hpp Tue Sep 25 09:23:45 2012 -0700 @@ -73,8 +73,9 @@ static Handle get_JavaTypeFromSignature(constantPoolHandle cp, int index, KlassHandle accessor, TRAPS); static Handle get_JavaType(constantPoolHandle cp, int index, KlassHandle accessor, TRAPS); static Handle get_JavaType(Symbol* klass_name, TRAPS); + static Handle get_JavaTypeFromClass(Handle javaClassHandle, TRAPS); static Handle get_JavaType(KlassHandle klass, TRAPS); - static Handle get_JavaField(int offset, int flags, Symbol* field_name, Handle field_holder, Handle field_type, Bytecodes::Code byteCode, TRAPS); + static Handle get_JavaField(int offset, int flags, Symbol* field_name, Handle field_holder, Handle field_type, TRAPS); static Handle createHotSpotResolvedJavaType(KlassHandle klass, Handle name, TRAPS); static Handle createHotSpotResolvedJavaMethod(methodHandle method, TRAPS); diff -r 460def61c04b -r 45f682f7fea8 src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Tue Sep 25 09:22:22 2012 -0700 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Tue Sep 25 09:23:45 2012 -0700 @@ -174,6 +174,22 @@ return JNIHandles::make_local(THREAD, ret()); } +C2V_VMENTRY(jobject, getJavaField, (JNIEnv *, jobject, jobject reflection_field_handle)) + oop reflection_field = JNIHandles::resolve(reflection_field_handle); + oop reflection_holder = java_lang_reflect_Field::clazz(reflection_field); + int slot = java_lang_reflect_Field::slot(reflection_field); + instanceKlass* holder = instanceKlass::cast(java_lang_Class::as_klassOop(reflection_holder)); + + int offset = holder->field_offset(slot); + int flags = holder->field_access_flags(slot); + Symbol* field_name = holder->field_name(slot); + Handle field_holder = GraalCompiler::get_JavaTypeFromClass(reflection_holder, CHECK_NULL); + Handle field_type = GraalCompiler::get_JavaTypeFromClass(java_lang_reflect_Field::type(reflection_field), CHECK_NULL); + + Handle ret = GraalCompiler::get_JavaField(offset, flags, field_name, field_holder, field_type, CHECK_NULL); + return JNIHandles::make_local(THREAD, ret()); +} + C2V_VMENTRY(jobject, JavaMethod_uniqueConcreteMethod, (JNIEnv *, jobject, jobject hotspot_method)) methodHandle method = getMethodFromHotSpotMethod(hotspot_method); KlassHandle holder = method->method_holder(); @@ -443,7 +459,7 @@ } Handle type = GraalCompiler::get_JavaTypeFromSignature(cp, sig_index, cp->pool_holder(), CHECK_NULL); - Handle field_handle = GraalCompiler::get_JavaField(offset, flags.as_int(), name, holder, type, code, THREAD); + Handle field_handle = GraalCompiler::get_JavaField(offset, flags.as_int(), name, holder, type, THREAD); return JNIHandles::make_local(THREAD, field_handle()); C2V_END @@ -608,16 +624,9 @@ if (javaClassOop == NULL) { fatal("argument to CompilerToVM.getType must not be NULL"); return NULL; - } else if (java_lang_Class::is_primitive(javaClassOop)) { - BasicType basicType = java_lang_Class::primitive_type(javaClassOop); - return JNIHandles::make_local(THREAD, VMToCompiler::createPrimitiveJavaType((int) basicType, THREAD)); - } else { - KlassHandle klass = java_lang_Class::as_klassOop(javaClassOop); - Handle name = java_lang_String::create_from_symbol(klass->name(), CHECK_NULL); - - Handle type = GraalCompiler::createHotSpotResolvedJavaType(klass, name, CHECK_NULL); - return JNIHandles::make_local(THREAD, type()); } + Handle type = GraalCompiler::get_JavaTypeFromClass(javaClassOop, CHECK_NULL); + return JNIHandles::make_local(THREAD, type()); C2V_END @@ -918,6 +927,7 @@ #define SIGNATURE "Lcom/oracle/graal/api/meta/Signature;" #define FIELD "Lcom/oracle/graal/api/meta/JavaField;" #define RESOLVED_FIELD "Lcom/oracle/graal/api/meta/ResolvedJavaField;" +#define REFLECT_FIELD "Ljava/lang/reflect/Field;" #define CONSTANT_POOL "Lcom/oracle/graal/api/meta/ConstantPool;" #define EXCEPTION_HANDLERS "[Lcom/oracle/graal/api/meta/ExceptionHandler;" #define HS_COMP_RESULT "Lcom/oracle/graal/hotspot/HotSpotCompilationResult;" @@ -969,7 +979,8 @@ {CC"getPrimitiveArrayType", CC"("KIND")"TYPE, FN_PTR(getPrimitiveArrayType)}, {CC"getMaxCallTargetOffset", CC"("RUNTIME_CALL")J", FN_PTR(getMaxCallTargetOffset)}, {CC"getType", CC"("CLASS")"TYPE, FN_PTR(getType)}, - {CC"getJavaMethod", CC"("REFLECT_METHOD")"METHOD, FN_PTR(getJavaMethod)}, + {CC"getJavaMethod", CC"("REFLECT_METHOD")"METHOD , FN_PTR(getJavaMethod)}, + {CC"getJavaField", CC"("REFLECT_FIELD")"RESOLVED_FIELD, FN_PTR(getJavaField)}, {CC"initializeConfiguration", CC"("CONFIG")V", FN_PTR(initializeConfiguration)}, {CC"installMethod", CC"("HS_COMP_RESULT"Z"HS_CODE_INFO")"HS_COMP_METHOD, FN_PTR(installMethod)}, {CC"disassembleNative", CC"([BJ)"STRING, FN_PTR(disassembleNative)},