From daaf3265806eb2eadb2e03302bd68022fab5ca28 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Tue, 24 Mar 2015 13:30:28 -0700 Subject: 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 --- runtime/reflection.cc | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) (limited to 'runtime/reflection.cc') diff --git a/runtime/reflection.cc b/runtime/reflection.cc index a54a39d5d6..d845e402e7 100644 --- a/runtime/reflection.cc +++ b/runtime/reflection.cc @@ -24,7 +24,6 @@ #include "mirror/art_field-inl.h" #include "mirror/art_method-inl.h" #include "mirror/class-inl.h" -#include "mirror/class.h" #include "mirror/object_array-inl.h" #include "mirror/object_array.h" #include "nth_caller_visitor.h" @@ -628,21 +627,6 @@ jobject InvokeMethod(const ScopedObjectAccessAlreadyRunnable& soa, jobject javaM return soa.AddLocalReference(BoxPrimitive(Primitive::GetType(shorty[0]), result)); } -bool VerifyObjectIsClass(mirror::Object* o, mirror::Class* c) { - if (o == nullptr) { - ThrowNullPointerException("null receiver"); - return false; - } else if (!o->InstanceOf(c)) { - std::string expected_class_name(PrettyDescriptor(c)); - std::string actual_class_name(PrettyTypeOf(o)); - ThrowIllegalArgumentException(StringPrintf("Expected receiver of type %s, but got %s", - expected_class_name.c_str(), - actual_class_name.c_str()).c_str()); - return false; - } - return true; -} - mirror::Object* BoxPrimitive(Primitive::Type src_class, const JValue& value) { if (src_class == Primitive::kPrimNot) { return value.GetL(); @@ -840,4 +824,12 @@ bool VerifyAccess(Thread* self, mirror::Object* obj, mirror::Class* declaring_cl return declaring_class->IsInSamePackage(caller_class); } +void InvalidReceiverError(mirror::Object* o, mirror::Class* c) { + std::string expected_class_name(PrettyDescriptor(c)); + std::string actual_class_name(PrettyTypeOf(o)); + ThrowIllegalArgumentException(StringPrintf("Expected receiver of type %s, but got %s", + expected_class_name.c_str(), + actual_class_name.c_str()).c_str()); +} + } // namespace art -- cgit v1.2.3