12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 167e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_MIRROR_DEX_CACHE_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_MIRROR_DEX_CACHE_H_ 197e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 20e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "array.h" 2158a5af8568d224ca7eccf2483396ff9862f8d1eeAndreas Gampe#include "art_field.h" 22ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom#include "art_method.h" 2358a5af8568d224ca7eccf2483396ff9862f8d1eeAndreas Gampe#include "class.h" 247e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom#include "object.h" 252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "object_array.h" 267e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 277e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstromnamespace art { 287e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersstruct DexCacheOffsets; 302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass DexFile; 3169b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstromclass ImageWriter; 327e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstromunion JValue; 337e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yangclass String; 372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang// C++ mirror of java.lang.DexCache. 3998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yangclass MANAGED DexCache FINAL : public Object { 4083db7721aef15df6919c0ec072e087bef6041e2dBrian Carlstrom public: 4198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // Size of java.lang.DexCache.class. 42e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier static uint32_t ClassSize(size_t pointer_size); 4398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 4498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // Size of an instance of java.lang.DexCache not including referenced values. 4598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang static constexpr uint32_t InstanceSize() { 4698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang return sizeof(DexCache); 4798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang } 4898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 4905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko void Init(const DexFile* dex_file, 5005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko String* location, 5105792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko GcRoot<String>* strings, 5205792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint32_t num_strings, 5305792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko GcRoot<Class>* resolved_types, 5405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint32_t num_resolved_types, 5505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko ArtMethod** resolved_methods, 5605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint32_t num_resolved_methods, 5705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko ArtField** resolved_fields, 5805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint32_t num_resolved_fields, 5990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier size_t pointer_size) SHARED_REQUIRES(Locks::mutator_lock_); 607e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 61e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier void Fixup(ArtMethod* trampoline, size_t pointer_size) 6290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 631984651929744dd603fd082e23eacd877b9bc177Ian Rogers 6460bc39c8eb0e5d7328bf59a96e9eedfc6f0a4aebMathieu Chartier template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier, typename Visitor> 654b00d3415beb7a816a3b5948f43f3b2e4b856ea8Mathieu Chartier void FixupStrings(GcRoot<mirror::String>* dest, const Visitor& visitor) 664b00d3415beb7a816a3b5948f43f3b2e4b856ea8Mathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 674b00d3415beb7a816a3b5948f43f3b2e4b856ea8Mathieu Chartier 6860bc39c8eb0e5d7328bf59a96e9eedfc6f0a4aebMathieu Chartier template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier, typename Visitor> 694b00d3415beb7a816a3b5948f43f3b2e4b856ea8Mathieu Chartier void FixupResolvedTypes(GcRoot<mirror::Class>* dest, const Visitor& visitor) 704b00d3415beb7a816a3b5948f43f3b2e4b856ea8Mathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 714b00d3415beb7a816a3b5948f43f3b2e4b856ea8Mathieu Chartier 7290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier String* GetLocation() SHARED_REQUIRES(Locks::mutator_lock_) { 73b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers return GetFieldObject<String>(OFFSET_OF_OBJECT_MEMBER(DexCache, location_)); 74a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom } 75a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 76dd9d055ddfe4bd66fcf58fde4e8066670acce011Andreas Gampe static MemberOffset DexOffset() { 77dd9d055ddfe4bd66fcf58fde4e8066670acce011Andreas Gampe return OFFSET_OF_OBJECT_MEMBER(DexCache, dex_); 78dd9d055ddfe4bd66fcf58fde4e8066670acce011Andreas Gampe } 79dd9d055ddfe4bd66fcf58fde4e8066670acce011Andreas Gampe 805cd2180225421d7b94f6d978bc5c1a4d9ef34f1ebuzbee static MemberOffset StringsOffset() { 8166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier return OFFSET_OF_OBJECT_MEMBER(DexCache, strings_); 82c5ef046ba4a484b08d0286393574396669a57c03buzbee } 83c5ef046ba4a484b08d0286393574396669a57c03buzbee 8405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko static MemberOffset ResolvedTypesOffset() { 8505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return OFFSET_OF_OBJECT_MEMBER(DexCache, resolved_types_); 8605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko } 8705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko 881caa2c205e51dda670207828f25451fb7623cea6Brian Carlstrom static MemberOffset ResolvedFieldsOffset() { 8966f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier return OFFSET_OF_OBJECT_MEMBER(DexCache, resolved_fields_); 90c5ef046ba4a484b08d0286393574396669a57c03buzbee } 91c5ef046ba4a484b08d0286393574396669a57c03buzbee 921caa2c205e51dda670207828f25451fb7623cea6Brian Carlstrom static MemberOffset ResolvedMethodsOffset() { 9366f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier return OFFSET_OF_OBJECT_MEMBER(DexCache, resolved_methods_); 94c5ef046ba4a484b08d0286393574396669a57c03buzbee } 95c5ef046ba4a484b08d0286393574396669a57c03buzbee 9605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko static MemberOffset NumStringsOffset() { 9705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return OFFSET_OF_OBJECT_MEMBER(DexCache, num_strings_); 987e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom } 997e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 10005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko static MemberOffset NumResolvedTypesOffset() { 10105792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return OFFSET_OF_OBJECT_MEMBER(DexCache, num_resolved_types_); 1027e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom } 1037e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 10405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko static MemberOffset NumResolvedFieldsOffset() { 10505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return OFFSET_OF_OBJECT_MEMBER(DexCache, num_resolved_fields_); 1067e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom } 1077e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 10805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko static MemberOffset NumResolvedMethodsOffset() { 10905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return OFFSET_OF_OBJECT_MEMBER(DexCache, num_resolved_methods_); 1107e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom } 1117e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 11205792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko String* GetResolvedString(uint32_t string_idx) ALWAYS_INLINE 11305792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko SHARED_REQUIRES(Locks::mutator_lock_); 1147e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 115b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers void SetResolvedString(uint32_t string_idx, String* resolved) ALWAYS_INLINE 11605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko SHARED_REQUIRES(Locks::mutator_lock_); 1177e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 11805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko Class* GetResolvedType(uint32_t type_idx) SHARED_REQUIRES(Locks::mutator_lock_); 1197e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 12005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko void SetResolvedType(uint32_t type_idx, Class* resolved) SHARED_REQUIRES(Locks::mutator_lock_); 1217e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 122e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ALWAYS_INLINE ArtMethod* GetResolvedMethod(uint32_t method_idx, size_t ptr_size) 12390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 1247e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 125e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ALWAYS_INLINE void SetResolvedMethod(uint32_t method_idx, ArtMethod* resolved, size_t ptr_size) 12690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 1277e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 128c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartier // Pointer sized variant, used for patching. 129e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ALWAYS_INLINE ArtField* GetResolvedField(uint32_t idx, size_t ptr_size) 13090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 1317e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 132c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartier // Pointer sized variant, used for patching. 133e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ALWAYS_INLINE void SetResolvedField(uint32_t idx, ArtField* field, size_t ptr_size) 13490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 1357e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 13605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko GcRoot<String>* GetStrings() ALWAYS_INLINE SHARED_REQUIRES(Locks::mutator_lock_) { 13705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return GetFieldPtr<GcRoot<String>*>(StringsOffset()); 13805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko } 13905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko 140fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier void SetStrings(GcRoot<String>* strings) ALWAYS_INLINE SHARED_REQUIRES(Locks::mutator_lock_) { 141fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier SetFieldPtr<false>(StringsOffset(), strings); 142fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier } 143fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 14405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko GcRoot<Class>* GetResolvedTypes() ALWAYS_INLINE SHARED_REQUIRES(Locks::mutator_lock_) { 14505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return GetFieldPtr<GcRoot<Class>*>(ResolvedTypesOffset()); 1467e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom } 14766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 148fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier void SetResolvedTypes(GcRoot<Class>* resolved_types) 149fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier ALWAYS_INLINE 150fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 151fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier SetFieldPtr<false>(ResolvedTypesOffset(), resolved_types); 152fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier } 153fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 15405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko ArtMethod** GetResolvedMethods() ALWAYS_INLINE SHARED_REQUIRES(Locks::mutator_lock_) { 15505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return GetFieldPtr<ArtMethod**>(ResolvedMethodsOffset()); 1567e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom } 15766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 158fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier void SetResolvedMethods(ArtMethod** resolved_methods) 159fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier ALWAYS_INLINE 160fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 161fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier SetFieldPtr<false>(ResolvedMethodsOffset(), resolved_methods); 162fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier } 163fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 16405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko ArtField** GetResolvedFields() ALWAYS_INLINE SHARED_REQUIRES(Locks::mutator_lock_) { 16505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return GetFieldPtr<ArtField**>(ResolvedFieldsOffset()); 1667e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom } 16766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 168fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier void SetResolvedFields(ArtField** resolved_fields) 169fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier ALWAYS_INLINE 170fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 171fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier SetFieldPtr<false>(ResolvedFieldsOffset(), resolved_fields); 172fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier } 173fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 17405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko size_t NumStrings() SHARED_REQUIRES(Locks::mutator_lock_) { 17505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return GetField32(NumStringsOffset()); 17605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko } 17705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko 17805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko size_t NumResolvedTypes() SHARED_REQUIRES(Locks::mutator_lock_) { 17905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return GetField32(NumResolvedTypesOffset()); 18005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko } 18105792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko 18205792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko size_t NumResolvedMethods() SHARED_REQUIRES(Locks::mutator_lock_) { 18305792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return GetField32(NumResolvedMethodsOffset()); 18405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko } 18505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko 18605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko size_t NumResolvedFields() SHARED_REQUIRES(Locks::mutator_lock_) { 18705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return GetField32(NumResolvedFieldsOffset()); 188c4fa2c0c6302d3d9979e8d8a4030499c10d6b68bBrian Carlstrom } 18966f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 19090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier const DexFile* GetDexFile() ALWAYS_INLINE SHARED_REQUIRES(Locks::mutator_lock_) { 191b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers return GetFieldPtr<const DexFile*>(OFFSET_OF_OBJECT_MEMBER(DexCache, dex_file_)); 1924b620ffb1b4d0c96a94bb3afe314f35d53990ec6Brian Carlstrom } 193c4fa2c0c6302d3d9979e8d8a4030499c10d6b68bBrian Carlstrom 19476172164667d565c1d3316935a24b0d9712bb2f6Mathieu Chartier void SetDexFile(const DexFile* dex_file) SHARED_REQUIRES(Locks::mutator_lock_) { 19576172164667d565c1d3316935a24b0d9712bb2f6Mathieu Chartier SetFieldPtr<false>(OFFSET_OF_OBJECT_MEMBER(DexCache, dex_file_), dex_file); 1967e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom } 197a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes 19876172164667d565c1d3316935a24b0d9712bb2f6Mathieu Chartier void SetLocation(mirror::String* location) SHARED_REQUIRES(Locks::mutator_lock_); 19976172164667d565c1d3316935a24b0d9712bb2f6Mathieu Chartier 20005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko // NOTE: Get/SetElementPtrSize() are intended for working with ArtMethod** and ArtField** 20105792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko // provided by GetResolvedMethods/Fields() and ArtMethod::GetDexCacheResolvedMethods(), 20205792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko // so they need to be public. 20305792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko 20405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko template <typename PtrType> 20505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko static PtrType GetElementPtrSize(PtrType* ptr_array, size_t idx, size_t ptr_size); 20605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko 20705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko template <typename PtrType> 20805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko static void SetElementPtrSize(PtrType* ptr_array, size_t idx, PtrType ptr, size_t ptr_size); 20905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko 21066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier private: 21105792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko // Visit instance fields of the dex cache as well as its associated arrays. 212fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier template <bool kVisitNativeRoots, 213fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 214fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier ReadBarrierOption kReadBarrierOption = kWithReadBarrier, 215fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier typename Visitor> 21605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko void VisitReferences(mirror::Class* klass, const Visitor& visitor) 21705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::heap_bitmap_lock_); 21805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko 219ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers HeapReference<Object> dex_; 220ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers HeapReference<String> location_; 22105792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint64_t dex_file_; // const DexFile* 22205792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint64_t resolved_fields_; // ArtField*, array with num_resolved_fields_ elements. 22305792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint64_t resolved_methods_; // ArtMethod*, array with num_resolved_methods_ elements. 22405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint64_t resolved_types_; // GcRoot<Class>*, array with num_resolved_types_ elements. 22505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint64_t strings_; // GcRoot<String>*, array with num_strings_ elements. 22605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint32_t num_resolved_fields_; // Number of elements in the resolved_fields_ array. 22705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint32_t num_resolved_methods_; // Number of elements in the resolved_methods_ array. 22805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint32_t num_resolved_types_; // Number of elements in the resolved_types_ array. 22905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko uint32_t num_strings_; // Number of elements in the strings_ array. 23066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 2317934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom friend struct art::DexCacheOffsets; // for verifying offset information 23205792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko friend class Object; // For VisitReferences 233c4fa2c0c6302d3d9979e8d8a4030499c10d6b68bBrian Carlstrom DISALLOW_IMPLICIT_CONSTRUCTORS(DexCache); 2347e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom}; 2357e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 2362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 2377e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom} // namespace art 2387e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 239fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_MIRROR_DEX_CACHE_H_ 240