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