summaryrefslogtreecommitdiffstats
path: root/runtime/jni_internal.cc
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2015-03-24 13:30:28 -0700
committerMathieu Chartier <mathieuc@google.com>2015-03-29 14:13:08 -0700
commitdaaf3265806eb2eadb2e03302bd68022fab5ca28 (patch)
treeaff5d6d53d6d2b65995aa204839f88ee66400989 /runtime/jni_internal.cc
parent68e22f3b982ff9ccbdfb3b65b7cfc16fcae907ba (diff)
downloadart-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.cc18
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) {