dex_cache.h revision dd9d055ddfe4bd66fcf58fde4e8066670acce011
1aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian/* 2aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * Copyright (C) 2011 The Android Open Source Project 3aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * 4aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * Licensed under the Apache License, Version 2.0 (the "License"); 5aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * you may not use this file except in compliance with the License. 6aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * You may obtain a copy of the License at 7aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * 8aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * http://www.apache.org/licenses/LICENSE-2.0 9aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * 10aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * Unless required by applicable law or agreed to in writing, software 11aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * distributed under the License is distributed on an "AS IS" BASIS, 12aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * See the License for the specific language governing permissions and 14aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian * limitations under the License. 15aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian */ 16aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 17aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian#ifndef ART_RUNTIME_MIRROR_DEX_CACHE_H_ 18aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian#define ART_RUNTIME_MIRROR_DEX_CACHE_H_ 19aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 20aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian#include "art_field.h" 21aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian#include "art_method.h" 22aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian#include "class.h" 23aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian#include "object.h" 24aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian#include "object_array.h" 25aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 26aceeb80d4f706980aaf71b8e098d4c6718d8ac90Briannamespace art { 27aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 28aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brianstruct DexCacheOffsets; 29aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brianclass DexFile; 30aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brianclass ImageWriter; 31aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brianunion JValue; 32aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 33aceeb80d4f706980aaf71b8e098d4c6718d8ac90Briannamespace mirror { 34aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 35aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brianclass String; 36aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 37aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian// C++ mirror of java.lang.DexCache. 3828486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonsecaclass MANAGED DexCache FINAL : public Object { 396df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol public: 406df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol // Size of java.lang.DexCache.class. 414f25420bdd834e81a3e22733304efc5261c2998aBrian Paul static uint32_t ClassSize(); 424f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 43f6106566081978f663cf08e54bb8908cb58a5316Michal Krol // Size of an instance of java.lang.DexCache not including referenced values. 44aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian static constexpr uint32_t InstanceSize() { 45c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca return sizeof(DexCache); 46c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca } 47aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 48aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian void Init(const DexFile* dex_file, 49aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian String* location, 50507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell ObjectArray<String>* strings, 51aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian ObjectArray<Class>* types, 52aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian ObjectArray<ArtMethod>* methods, 536f2e9651a1a460a1f564d30844cb2c9bced71da5Brian Paul ObjectArray<ArtField>* fields) 546f2e9651a1a460a1f564d30844cb2c9bced71da5Brian Paul SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 556f2e9651a1a460a1f564d30844cb2c9bced71da5Brian Paul 566f2e9651a1a460a1f564d30844cb2c9bced71da5Brian Paul void Fixup(ArtMethod* trampoline) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 57aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 5807eb660fc92b63213b542d47671b0d944286b77aJosé Fonseca String* GetLocation() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 5907eb660fc92b63213b542d47671b0d944286b77aJosé Fonseca return GetFieldObject<String>(OFFSET_OF_OBJECT_MEMBER(DexCache, location_)); 6007eb660fc92b63213b542d47671b0d944286b77aJosé Fonseca } 6107eb660fc92b63213b542d47671b0d944286b77aJosé Fonseca 6207eb660fc92b63213b542d47671b0d944286b77aJosé Fonseca static MemberOffset DexOffset() { 63aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian return OFFSET_OF_OBJECT_MEMBER(DexCache, dex_); 6407eb660fc92b63213b542d47671b0d944286b77aJosé Fonseca } 6507eb660fc92b63213b542d47671b0d944286b77aJosé Fonseca 66aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian static MemberOffset StringsOffset() { 6707eb660fc92b63213b542d47671b0d944286b77aJosé Fonseca return OFFSET_OF_OBJECT_MEMBER(DexCache, strings_); 68aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 69aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 70aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian static MemberOffset ResolvedFieldsOffset() { 71aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian return OFFSET_OF_OBJECT_MEMBER(DexCache, resolved_fields_); 72aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 73aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 74aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian static MemberOffset ResolvedMethodsOffset() { 75aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian return OFFSET_OF_OBJECT_MEMBER(DexCache, resolved_methods_); 76aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 77aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 786579440ea98e61871fe781c1c9c681645ddcc075Brian size_t NumStrings() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 798cb85807d3bd42cb0e511970e4b409c542d2716bBrian Paul return GetStrings()->GetLength(); 80aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 81aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 82aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian size_t NumResolvedTypes() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 83aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian return GetResolvedTypes()->GetLength(); 84aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 85aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 86aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian size_t NumResolvedMethods() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 87aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian return GetResolvedMethods()->GetLength(); 88aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 89aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 90aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian size_t NumResolvedFields() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 91aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian return GetResolvedFields()->GetLength(); 92aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 93aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 942161b0fafcdc16703162dd489d2ec1e7114cce4cKeith Whitwell String* GetResolvedString(uint32_t string_idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 952161b0fafcdc16703162dd489d2ec1e7114cce4cKeith Whitwell return GetStrings()->Get(string_idx); 96aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 97aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 98287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell void SetResolvedString(uint32_t string_idx, String* resolved) ALWAYS_INLINE 99f6106566081978f663cf08e54bb8908cb58a5316Michal Krol SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 1004528287e040415c2071012d02f20979ff995c754Keith Whitwell // TODO default transaction support. 101f6106566081978f663cf08e54bb8908cb58a5316Michal Krol GetStrings()->Set(string_idx, resolved); 102aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 103aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 104aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian Class* GetResolvedType(uint32_t type_idx) ALWAYS_INLINE 105aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 106aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian return GetResolvedTypes()->Get(type_idx); 107aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 108aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 109aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian void SetResolvedType(uint32_t type_idx, Class* resolved) 110f6106566081978f663cf08e54bb8908cb58a5316Michal Krol SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 111aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 112aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian ArtMethod* GetResolvedMethod(uint32_t method_idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 113aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 114aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian void SetResolvedMethod(uint32_t method_idx, ArtMethod* resolved) ALWAYS_INLINE 115aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 116aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian GetResolvedMethods()->Set(method_idx, resolved); 117aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 118aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 119aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian ArtField* GetResolvedField(uint32_t field_idx) ALWAYS_INLINE 120aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 1214528287e040415c2071012d02f20979ff995c754Keith Whitwell ArtField* field = GetResolvedFields()->Get(field_idx); 1224528287e040415c2071012d02f20979ff995c754Keith Whitwell if (UNLIKELY(field == nullptr || field->GetDeclaringClass()->IsErroneous())) { 1238f3bdeaad610d7d5a5c6e73e1e9c721219595754Brian Paul return nullptr; 124f6106566081978f663cf08e54bb8908cb58a5316Michal Krol } else { 125f6106566081978f663cf08e54bb8908cb58a5316Michal Krol return field; 126f6106566081978f663cf08e54bb8908cb58a5316Michal Krol } 127aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 128aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 129aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian void SetResolvedField(uint32_t field_idx, ArtField* resolved) ALWAYS_INLINE 130aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 131aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian GetResolvedFields()->Set(field_idx, resolved); 132aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 133aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 134aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian ObjectArray<String>* GetStrings() ALWAYS_INLINE SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 135aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian return GetFieldObject< ObjectArray<String>>(StringsOffset()); 136aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 137aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 138aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian ObjectArray<Class>* GetResolvedTypes() ALWAYS_INLINE SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 1396579440ea98e61871fe781c1c9c681645ddcc075Brian return GetFieldObject<ObjectArray<Class>>( 1406579440ea98e61871fe781c1c9c681645ddcc075Brian OFFSET_OF_OBJECT_MEMBER(DexCache, resolved_types_)); 141aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 142aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 143aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian ObjectArray<ArtMethod>* GetResolvedMethods() ALWAYS_INLINE 144aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 145aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian return GetFieldObject< ObjectArray<ArtMethod>>(ResolvedMethodsOffset()); 146aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 147aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 148aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian ObjectArray<ArtField>* GetResolvedFields() ALWAYS_INLINE 149aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 150aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian return GetFieldObject<ObjectArray<ArtField>>(ResolvedFieldsOffset()); 151aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 152aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 153aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian const DexFile* GetDexFile() ALWAYS_INLINE SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 154aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian return GetFieldPtr<const DexFile*>(OFFSET_OF_OBJECT_MEMBER(DexCache, dex_file_)); 155aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian } 156aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 157aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian void SetDexFile(const DexFile* dex_file) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) 158763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell ALWAYS_INLINE { 159763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell return SetFieldPtr<false>(OFFSET_OF_OBJECT_MEMBER(DexCache, dex_file_), dex_file); 160fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell } 161aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 162aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian private: 1636579440ea98e61871fe781c1c9c681645ddcc075Brian HeapReference<Object> dex_; 164fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell HeapReference<String> location_; 165fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell HeapReference<ObjectArray<ArtField>> resolved_fields_; 1666579440ea98e61871fe781c1c9c681645ddcc075Brian HeapReference<ObjectArray<ArtMethod>> resolved_methods_; 1676579440ea98e61871fe781c1c9c681645ddcc075Brian HeapReference<ObjectArray<Class>> resolved_types_; 168aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian HeapReference<ObjectArray<String>> strings_; 169aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian uint64_t dex_file_; 170fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell 171fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell friend struct art::DexCacheOffsets; // for verifying offset information 172763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell DISALLOW_IMPLICIT_CONSTRUCTORS(DexCache); 173763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell}; 174763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell 175aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian} // namespace mirror 176aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian} // namespace art 177aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian 178aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian#endif // ART_RUNTIME_MIRROR_DEX_CACHE_H_ 179fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell