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