diff options
Diffstat (limited to 'runtime/mirror/art_method.h')
| -rw-r--r-- | runtime/mirror/art_method.h | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/runtime/mirror/art_method.h b/runtime/mirror/art_method.h index f5c14547b2..da494e0ec9 100644 --- a/runtime/mirror/art_method.h +++ b/runtime/mirror/art_method.h @@ -42,6 +42,8 @@ namespace mirror { typedef void (EntryPointFromInterpreter)(Thread* self, MethodHelper* mh, const DexFile::CodeItem* code_item, ShadowFrame* shadow_frame, JValue* result); +#define ART_METHOD_HAS_PADDING_FIELD_ON_64_BIT + // C++ mirror of java.lang.reflect.ArtMethod. class MANAGED ArtMethod FINAL : public Object { public: @@ -208,14 +210,6 @@ class MANAGED ArtMethod FINAL : public Object { SetField32<false>(OFFSET_OF_OBJECT_MEMBER(ArtMethod, dex_method_index_), new_idx); } - ObjectArray<String>* GetDexCacheStrings() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void SetDexCacheStrings(ObjectArray<String>* new_dex_cache_strings) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - - static MemberOffset DexCacheStringsOffset() { - return OFFSET_OF_OBJECT_MEMBER(ArtMethod, dex_cache_strings_); - } - static MemberOffset DexCacheResolvedMethodsOffset() { return OFFSET_OF_OBJECT_MEMBER(ArtMethod, dex_cache_resolved_methods_); } @@ -278,7 +272,7 @@ class MANAGED ArtMethod FINAL : public Object { } ALWAYS_INLINE static MemberOffset EntryPointFromPortableCompiledCodeOffset(size_t pointer_size) { - return MemberOffset(PtrSizedFieldsOffset() + OFFSETOF_MEMBER( + return MemberOffset(PtrSizedFieldsOffset(pointer_size) + OFFSETOF_MEMBER( PtrSizedFields, entry_point_from_portable_compiled_code_) / sizeof(void*) * pointer_size); } @@ -445,17 +439,17 @@ class MANAGED ArtMethod FINAL : public Object { void UnregisterNative() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); static MemberOffset EntryPointFromInterpreterOffset(size_t pointer_size) { - return MemberOffset(PtrSizedFieldsOffset() + OFFSETOF_MEMBER( + return MemberOffset(PtrSizedFieldsOffset(pointer_size) + OFFSETOF_MEMBER( PtrSizedFields, entry_point_from_interpreter_) / sizeof(void*) * pointer_size); } static MemberOffset EntryPointFromJniOffset(size_t pointer_size) { - return MemberOffset(PtrSizedFieldsOffset() + OFFSETOF_MEMBER( + return MemberOffset(PtrSizedFieldsOffset(pointer_size) + OFFSETOF_MEMBER( PtrSizedFields, entry_point_from_jni_) / sizeof(void*) * pointer_size); } static MemberOffset EntryPointFromQuickCompiledCodeOffset(size_t pointer_size) { - return MemberOffset(PtrSizedFieldsOffset() + OFFSETOF_MEMBER( + return MemberOffset(PtrSizedFieldsOffset(pointer_size) + OFFSETOF_MEMBER( PtrSizedFields, entry_point_from_quick_compiled_code_) / sizeof(void*) * pointer_size); } @@ -581,13 +575,19 @@ class MANAGED ArtMethod FINAL : public Object { ALWAYS_INLINE ArtMethod* GetInterfaceMethodIfProxy() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static size_t SizeWithoutPointerFields() { - return sizeof(ArtMethod) - sizeof(PtrSizedFields); + static size_t SizeWithoutPointerFields(size_t pointer_size) { + size_t total = sizeof(ArtMethod) - sizeof(PtrSizedFields); +#ifdef ART_METHOD_HAS_PADDING_FIELD_ON_64_BIT + // Add 4 bytes if 64 bit, otherwise 0. + total += pointer_size - sizeof(uint32_t); +#endif + return total; } // Size of an instance of java.lang.reflect.ArtMethod not including its value array. static size_t InstanceSize(size_t pointer_size) { - return SizeWithoutPointerFields() + (sizeof(PtrSizedFields) / sizeof(void*)) * pointer_size; + return SizeWithoutPointerFields(pointer_size) + + (sizeof(PtrSizedFields) / sizeof(void*)) * pointer_size; } protected: @@ -601,9 +601,6 @@ class MANAGED ArtMethod FINAL : public Object { // Short cuts to declaring_class_->dex_cache_ member for fast compiled code access. HeapReference<ObjectArray<Class>> dex_cache_resolved_types_; - // Short cuts to declaring_class_->dex_cache_ member for fast compiled code access. - HeapReference<ObjectArray<String>> dex_cache_strings_; - // Access flags; low 16 bits are defined by spec. uint32_t access_flags_; @@ -622,7 +619,7 @@ class MANAGED ArtMethod FINAL : public Object { // ifTable. uint32_t method_index_; - // Add alignment word here if necessary. + // Fake padding field gets inserted here. // Must be the last fields in the method. struct PACKED(4) PtrSizedFields { @@ -653,8 +650,13 @@ class MANAGED ArtMethod FINAL : public Object { ALWAYS_INLINE ObjectArray<Class>* GetDexCacheResolvedTypes() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static size_t PtrSizedFieldsOffset() { - return OFFSETOF_MEMBER(ArtMethod, ptr_sized_fields_); + static size_t PtrSizedFieldsOffset(size_t pointer_size) { + size_t offset = OFFSETOF_MEMBER(ArtMethod, ptr_sized_fields_); +#ifdef ART_METHOD_HAS_PADDING_FIELD_ON_64_BIT + // Add 4 bytes if 64 bit, otherwise 0. + offset += pointer_size - sizeof(uint32_t); +#endif + return offset; } friend struct art::ArtMethodOffsets; // for verifying offset information |