changeset 6442:45f682f7fea8

Add MetaAccessProvider.getResolvedJavaField to convert from reflection field to metadata field
author Christian Wimmer <christian.wimmer@oracle.com>
date Tue, 25 Sep 2012 09:23:45 -0700
parents 460def61c04b
children 5b419d76b406
files graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java src/share/vm/graal/graalCompiler.cpp src/share/vm/graal/graalCompiler.hpp src/share/vm/graal/graalCompilerToVM.cpp
diffstat 7 files changed, 52 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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);
--- 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
--- 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) {
--- 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<Handle>(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<Handle>(field_name, CHECK_NULL);
   return VMToCompiler::createJavaField(field_holder, name, field_type, offset, flags, CHECK_NULL);
 }
--- 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);
--- 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)},