diff options
author | Mathieu Chartier <mathieuc@google.com> | 2015-04-16 18:00:39 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2015-04-21 15:51:29 -0700 |
commit | fc58af45e342ba9e18bbdf597f205a58ec731658 (patch) | |
tree | 3f93906235cb4d2462d237223b72ccf4eedef645 /runtime/mirror/abstract_method.h | |
parent | bbf02afc641a393d33342976e269218668c07386 (diff) | |
download | art-fc58af45e342ba9e18bbdf597f205a58ec731658.zip art-fc58af45e342ba9e18bbdf597f205a58ec731658.tar.gz art-fc58af45e342ba9e18bbdf597f205a58ec731658.tar.bz2 |
Add AbstractMethod, Constructor, Method
Moves functionality to ART from libcore. Precursor to moving
ArtMethods to native. Mostly performance improvements.
N5 perf before (irrelevant results removed):
Class_getConstructor 962.87 ===========
Class_getDeclaredMethod 2394.37 ============================
Class_getMethod 2509.20 ==============================
Class_newInstance 1999.81 =======================
Method_invokeI 1439.02 =================
Method_invokePreBoxedI 1415.82 ================
Method_invokeStaticI 1456.24 =================
Method_invokeStaticPreBoxedI 1427.32 =================
Method_invokeStaticV 814.47 =========
Method_invokeV 816.56 =========
After:
benchmark ns linear runtime
Class_getConstructor 1302.04 ================
Class_getDeclaredMethod 1459.01 ==================
Class_getMethod 1560.40 ===================
Class_newInstance 2029.94 =========================
Method_invokeI 1312.89 ================
Method_invokePreBoxedI 1255.01 ===============
Method_invokeStaticI 1289.13 ===============
Method_invokeStaticPreBoxedI 1196.52 ==============
Method_invokeStaticV 790.82 =========
Method_invokeV 791.73 =========
Performance improvements are more than just fixing regressions introduced
in: http://android-review.googlesource.com/#/c/146069/
Bug: 19264997
Change-Id: Ife79c469fdb09f30e3aefcfc3e0ce5ed32303fce
Diffstat (limited to 'runtime/mirror/abstract_method.h')
-rw-r--r-- | runtime/mirror/abstract_method.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/runtime/mirror/abstract_method.h b/runtime/mirror/abstract_method.h new file mode 100644 index 0000000..ef51d7f --- /dev/null +++ b/runtime/mirror/abstract_method.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ART_RUNTIME_MIRROR_ABSTRACT_METHOD_H_ +#define ART_RUNTIME_MIRROR_ABSTRACT_METHOD_H_ + +#include "accessible_object.h" +#include "gc_root.h" +#include "object.h" +#include "object_callbacks.h" +#include "read_barrier_option.h" + +namespace art { + +struct AbstractMethodOffsets; + +namespace mirror { + +class ArtMethod; + +// C++ mirror of java.lang.reflect.AbstractMethod. +class MANAGED AbstractMethod : public AccessibleObject { + public: + // Called from Constructor::CreateFromArtMethod, Method::CreateFromArtMethod. + bool CreateFromArtMethod(mirror::ArtMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + + mirror::ArtMethod* GetArtMethod() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + mirror::Class* GetDeclaringClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + + private: + static MemberOffset ArtMethodOffset() { + return MemberOffset(OFFSETOF_MEMBER(AbstractMethod, art_method_)); + } + static MemberOffset DeclaringClassOffset() { + return MemberOffset(OFFSETOF_MEMBER(AbstractMethod, declaring_class_)); + } + static MemberOffset DeclaringClassOfOverriddenMethodOffset() { + return MemberOffset(OFFSETOF_MEMBER(AbstractMethod, declaring_class_of_overridden_method_)); + } + static MemberOffset AccessFlagsOffset() { + return MemberOffset(OFFSETOF_MEMBER(AbstractMethod, access_flags_)); + } + static MemberOffset DexMethodIndexOffset() { + return MemberOffset(OFFSETOF_MEMBER(AbstractMethod, dex_method_index_)); + } + + HeapReference<mirror::ArtMethod> art_method_; + HeapReference<mirror::Class> declaring_class_; + HeapReference<mirror::Class> declaring_class_of_overridden_method_; + uint32_t access_flags_; + uint32_t dex_method_index_; + + friend struct art::AbstractMethodOffsets; // for verifying offset information + DISALLOW_IMPLICIT_CONSTRUCTORS(AbstractMethod); +}; + +} // namespace mirror +} // namespace art + +#endif // ART_RUNTIME_MIRROR_ABSTRACT_METHOD_H_ |