diff options
author | Mathieu Chartier <mathieuc@google.com> | 2015-03-24 13:30:28 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2015-03-29 14:13:08 -0700 |
commit | daaf3265806eb2eadb2e03302bd68022fab5ca28 (patch) | |
tree | aff5d6d53d6d2b65995aa204839f88ee66400989 /runtime/jni_internal.cc | |
parent | 68e22f3b982ff9ccbdfb3b65b7cfc16fcae907ba (diff) | |
download | art-daaf3265806eb2eadb2e03302bd68022fab5ca28.zip art-daaf3265806eb2eadb2e03302bd68022fab5ca28.tar.gz art-daaf3265806eb2eadb2e03302bd68022fab5ca28.tar.bz2 |
Add AccessibleObject and Field to mirror
Main motivation is to remove all the functionality / field access on
java side to ArtField. Also comes with some reflection speedups /
slowdowns.
Summary results:
getDeclaredField/getField are slower mostly due to JNI overhead.
However, there is a large speedup in getInt, setInt,
GetInstanceField, and GetStaticField.
Before timings (N5 --compiler-filter=everything):
benchmark ns linear runtime
Class_getDeclaredField 782.86 ===
Class_getField 832.77 ===
Field_getInt 160.17 =
Field_setInt 195.88 =
GetInstanceField 3214.38 ==============
GetStaticField 6809.49 ==============================
After:
Class_getDeclaredField 1068.15 ============
Class_getField 1180.00 ==============
Field_getInt 121.85 =
Field_setInt 139.98 =
GetInstanceField 1986.15 =======================
GetStaticField 2523.63 ==============================
Bug: 19264997
Change-Id: Ic0d0fc1b56b95cd6d60f8e76f19caeaa23045c77
Diffstat (limited to 'runtime/jni_internal.cc')
-rw-r--r-- | runtime/jni_internal.cc | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/runtime/jni_internal.cc b/runtime/jni_internal.cc index 9a71ba4..5e38470 100644 --- a/runtime/jni_internal.cc +++ b/runtime/jni_internal.cc @@ -41,6 +41,7 @@ #include "mirror/art_method-inl.h" #include "mirror/class-inl.h" #include "mirror/class_loader.h" +#include "mirror/field.h" #include "mirror/object-inl.h" #include "mirror/object_array-inl.h" #include "mirror/string-inl.h" @@ -346,7 +347,13 @@ class JNI { static jfieldID FromReflectedField(JNIEnv* env, jobject jlr_field) { CHECK_NON_NULL_ARGUMENT(jlr_field); ScopedObjectAccess soa(env); - return soa.EncodeField(mirror::ArtField::FromReflectedField(soa, jlr_field)); + mirror::Object* obj_field = soa.Decode<mirror::Object*>(jlr_field); + if (obj_field->GetClass() != mirror::Field::StaticClass()) { + // Not even a java.lang.reflect.Field, return nullptr. + return nullptr; + } + auto* field = static_cast<mirror::Field*>(obj_field); + return soa.EncodeField(field->GetArtField()); } static jobject ToReflectedMethod(JNIEnv* env, jclass, jmethodID mid, jboolean) { @@ -373,14 +380,7 @@ class JNI { CHECK_NON_NULL_ARGUMENT(fid); ScopedObjectAccess soa(env); mirror::ArtField* f = soa.DecodeField(fid); - ScopedLocalRef<jobject> art_field(env, soa.AddLocalReference<jobject>(f)); - jobject reflect_field = env->AllocObject(WellKnownClasses::java_lang_reflect_Field); - if (env->ExceptionCheck()) { - return nullptr; - } - SetObjectField(env, reflect_field, - WellKnownClasses::java_lang_reflect_Field_artField, art_field.get()); - return reflect_field; + return soa.AddLocalReference<jobject>(mirror::Field::CreateFromArtField(soa.Self(), f, true)); } static jclass GetObjectClass(JNIEnv* env, jobject java_object) { |