xref: /aosp_15_r20/art/runtime/art_field.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_ART_FIELD_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_ART_FIELD_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
21*795d594fSAndroid Build Coastguard Worker #include "dex/modifiers.h"
22*795d594fSAndroid Build Coastguard Worker #include "dex/primitive.h"
23*795d594fSAndroid Build Coastguard Worker #include "gc_root.h"
24*795d594fSAndroid Build Coastguard Worker #include "obj_ptr.h"
25*795d594fSAndroid Build Coastguard Worker #include "offsets.h"
26*795d594fSAndroid Build Coastguard Worker #include "read_barrier_option.h"
27*795d594fSAndroid Build Coastguard Worker #include "verify_object.h"
28*795d594fSAndroid Build Coastguard Worker 
29*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker class DexFile;
32*795d594fSAndroid Build Coastguard Worker template<typename T> class LengthPrefixedArray;
33*795d594fSAndroid Build Coastguard Worker class ScopedObjectAccessAlreadyRunnable;
34*795d594fSAndroid Build Coastguard Worker 
35*795d594fSAndroid Build Coastguard Worker namespace mirror {
36*795d594fSAndroid Build Coastguard Worker class Class;
37*795d594fSAndroid Build Coastguard Worker class ClassLoader;
38*795d594fSAndroid Build Coastguard Worker class DexCache;
39*795d594fSAndroid Build Coastguard Worker class Object;
40*795d594fSAndroid Build Coastguard Worker class String;
41*795d594fSAndroid Build Coastguard Worker }  // namespace mirror
42*795d594fSAndroid Build Coastguard Worker 
43*795d594fSAndroid Build Coastguard Worker class EXPORT ArtField final {
44*795d594fSAndroid Build Coastguard Worker  public:
45*795d594fSAndroid Build Coastguard Worker   // Visit declaring classes of all the art-fields in 'array' that reside
46*795d594fSAndroid Build Coastguard Worker   // in [start_boundary, end_boundary).
47*795d594fSAndroid Build Coastguard Worker   template<typename RootVisitorType>
48*795d594fSAndroid Build Coastguard Worker   static void VisitArrayRoots(RootVisitorType& visitor,
49*795d594fSAndroid Build Coastguard Worker                               uint8_t* start_boundary,
50*795d594fSAndroid Build Coastguard Worker                               uint8_t* end_boundary,
51*795d594fSAndroid Build Coastguard Worker                               LengthPrefixedArray<ArtField>* array)
52*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
53*795d594fSAndroid Build Coastguard Worker 
54*795d594fSAndroid Build Coastguard Worker   template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
55*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> GetDeclaringClass() REQUIRES_SHARED(Locks::mutator_lock_);
56*795d594fSAndroid Build Coastguard Worker 
57*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::ClassLoader> GetClassLoader() REQUIRES_SHARED(Locks::mutator_lock_);
58*795d594fSAndroid Build Coastguard Worker 
59*795d594fSAndroid Build Coastguard Worker   void SetDeclaringClass(ObjPtr<mirror::Class> new_declaring_class)
60*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
61*795d594fSAndroid Build Coastguard Worker 
GetDeclaringClassAddressWithoutBarrier()62*795d594fSAndroid Build Coastguard Worker   mirror::CompressedReference<mirror::Object>* GetDeclaringClassAddressWithoutBarrier() {
63*795d594fSAndroid Build Coastguard Worker     return declaring_class_.AddressWithoutBarrier();
64*795d594fSAndroid Build Coastguard Worker   }
65*795d594fSAndroid Build Coastguard Worker 
GetAccessFlags()66*795d594fSAndroid Build Coastguard Worker   uint32_t GetAccessFlags() {
67*795d594fSAndroid Build Coastguard Worker     return access_flags_;
68*795d594fSAndroid Build Coastguard Worker   }
69*795d594fSAndroid Build Coastguard Worker 
SetAccessFlags(uint32_t new_access_flags)70*795d594fSAndroid Build Coastguard Worker   void SetAccessFlags(uint32_t new_access_flags) {
71*795d594fSAndroid Build Coastguard Worker     // Not called within a transaction.
72*795d594fSAndroid Build Coastguard Worker     access_flags_ = new_access_flags;
73*795d594fSAndroid Build Coastguard Worker   }
74*795d594fSAndroid Build Coastguard Worker 
IsPublic()75*795d594fSAndroid Build Coastguard Worker   bool IsPublic() {
76*795d594fSAndroid Build Coastguard Worker     return (GetAccessFlags() & kAccPublic) != 0;
77*795d594fSAndroid Build Coastguard Worker   }
78*795d594fSAndroid Build Coastguard Worker 
IsStatic()79*795d594fSAndroid Build Coastguard Worker   bool IsStatic() {
80*795d594fSAndroid Build Coastguard Worker     return (GetAccessFlags() & kAccStatic) != 0;
81*795d594fSAndroid Build Coastguard Worker   }
82*795d594fSAndroid Build Coastguard Worker 
IsFinal()83*795d594fSAndroid Build Coastguard Worker   bool IsFinal() {
84*795d594fSAndroid Build Coastguard Worker     return (GetAccessFlags() & kAccFinal) != 0;
85*795d594fSAndroid Build Coastguard Worker   }
86*795d594fSAndroid Build Coastguard Worker 
IsPrivate()87*795d594fSAndroid Build Coastguard Worker   bool IsPrivate() {
88*795d594fSAndroid Build Coastguard Worker     return (GetAccessFlags() & kAccPrivate) != 0;
89*795d594fSAndroid Build Coastguard Worker   }
90*795d594fSAndroid Build Coastguard Worker 
GetDexFieldIndex()91*795d594fSAndroid Build Coastguard Worker   uint32_t GetDexFieldIndex() {
92*795d594fSAndroid Build Coastguard Worker     return field_dex_idx_;
93*795d594fSAndroid Build Coastguard Worker   }
94*795d594fSAndroid Build Coastguard Worker 
SetDexFieldIndex(uint32_t new_idx)95*795d594fSAndroid Build Coastguard Worker   void SetDexFieldIndex(uint32_t new_idx) {
96*795d594fSAndroid Build Coastguard Worker     // Not called within a transaction.
97*795d594fSAndroid Build Coastguard Worker     field_dex_idx_ = new_idx;
98*795d594fSAndroid Build Coastguard Worker   }
99*795d594fSAndroid Build Coastguard Worker 
100*795d594fSAndroid Build Coastguard Worker   // Offset to field within an Object.
GetOffset()101*795d594fSAndroid Build Coastguard Worker   MemberOffset GetOffset() {
102*795d594fSAndroid Build Coastguard Worker     return MemberOffset(offset_);
103*795d594fSAndroid Build Coastguard Worker   }
104*795d594fSAndroid Build Coastguard Worker 
OffsetOffset()105*795d594fSAndroid Build Coastguard Worker   static constexpr MemberOffset OffsetOffset() {
106*795d594fSAndroid Build Coastguard Worker     return MemberOffset(OFFSETOF_MEMBER(ArtField, offset_));
107*795d594fSAndroid Build Coastguard Worker   }
108*795d594fSAndroid Build Coastguard Worker 
DeclaringClassOffset()109*795d594fSAndroid Build Coastguard Worker   static constexpr MemberOffset DeclaringClassOffset() {
110*795d594fSAndroid Build Coastguard Worker     return MemberOffset(OFFSETOF_MEMBER(ArtField, declaring_class_));
111*795d594fSAndroid Build Coastguard Worker   }
112*795d594fSAndroid Build Coastguard Worker 
113*795d594fSAndroid Build Coastguard Worker   MemberOffset GetOffsetDuringLinking() REQUIRES_SHARED(Locks::mutator_lock_);
114*795d594fSAndroid Build Coastguard Worker 
115*795d594fSAndroid Build Coastguard Worker   void SetOffset(MemberOffset num_bytes) REQUIRES_SHARED(Locks::mutator_lock_);
116*795d594fSAndroid Build Coastguard Worker 
117*795d594fSAndroid Build Coastguard Worker   // field access, null object for static fields
118*795d594fSAndroid Build Coastguard Worker   uint8_t GetBoolean(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
119*795d594fSAndroid Build Coastguard Worker 
120*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
121*795d594fSAndroid Build Coastguard Worker   void SetBoolean(ObjPtr<mirror::Object> object, uint8_t z) REQUIRES_SHARED(Locks::mutator_lock_);
122*795d594fSAndroid Build Coastguard Worker 
123*795d594fSAndroid Build Coastguard Worker   int8_t GetByte(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
124*795d594fSAndroid Build Coastguard Worker 
125*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
126*795d594fSAndroid Build Coastguard Worker   void SetByte(ObjPtr<mirror::Object> object, int8_t b) REQUIRES_SHARED(Locks::mutator_lock_);
127*795d594fSAndroid Build Coastguard Worker 
128*795d594fSAndroid Build Coastguard Worker   uint16_t GetChar(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
129*795d594fSAndroid Build Coastguard Worker   uint16_t GetCharacter(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
130*795d594fSAndroid Build Coastguard Worker 
131*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
132*795d594fSAndroid Build Coastguard Worker   void SetChar(ObjPtr<mirror::Object> object, uint16_t c) REQUIRES_SHARED(Locks::mutator_lock_);
133*795d594fSAndroid Build Coastguard Worker 
134*795d594fSAndroid Build Coastguard Worker   int16_t GetShort(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
135*795d594fSAndroid Build Coastguard Worker 
136*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
137*795d594fSAndroid Build Coastguard Worker   void SetShort(ObjPtr<mirror::Object> object, int16_t s) REQUIRES_SHARED(Locks::mutator_lock_);
138*795d594fSAndroid Build Coastguard Worker 
139*795d594fSAndroid Build Coastguard Worker   int32_t GetInt(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
140*795d594fSAndroid Build Coastguard Worker   int32_t GetInteger(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
141*795d594fSAndroid Build Coastguard Worker 
142*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
143*795d594fSAndroid Build Coastguard Worker   void SetInt(ObjPtr<mirror::Object> object, int32_t i) REQUIRES_SHARED(Locks::mutator_lock_);
144*795d594fSAndroid Build Coastguard Worker 
145*795d594fSAndroid Build Coastguard Worker   int64_t GetLong(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
146*795d594fSAndroid Build Coastguard Worker 
147*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
148*795d594fSAndroid Build Coastguard Worker   void SetLong(ObjPtr<mirror::Object> object, int64_t j) REQUIRES_SHARED(Locks::mutator_lock_);
149*795d594fSAndroid Build Coastguard Worker 
150*795d594fSAndroid Build Coastguard Worker   float GetFloat(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
151*795d594fSAndroid Build Coastguard Worker 
152*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
153*795d594fSAndroid Build Coastguard Worker   void SetFloat(ObjPtr<mirror::Object> object, float f) REQUIRES_SHARED(Locks::mutator_lock_);
154*795d594fSAndroid Build Coastguard Worker 
155*795d594fSAndroid Build Coastguard Worker   double GetDouble(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
156*795d594fSAndroid Build Coastguard Worker 
157*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
158*795d594fSAndroid Build Coastguard Worker   void SetDouble(ObjPtr<mirror::Object> object, double d) REQUIRES_SHARED(Locks::mutator_lock_);
159*795d594fSAndroid Build Coastguard Worker 
160*795d594fSAndroid Build Coastguard Worker   template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
161*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> GetObject(ObjPtr<mirror::Object> object)
162*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
163*795d594fSAndroid Build Coastguard Worker 
164*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
165*795d594fSAndroid Build Coastguard Worker   void SetObject(ObjPtr<mirror::Object> object, ObjPtr<mirror::Object> l)
166*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
167*795d594fSAndroid Build Coastguard Worker 
168*795d594fSAndroid Build Coastguard Worker   // Raw field accesses.
169*795d594fSAndroid Build Coastguard Worker   uint32_t Get32(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
170*795d594fSAndroid Build Coastguard Worker 
171*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
172*795d594fSAndroid Build Coastguard Worker   void Set32(ObjPtr<mirror::Object> object, uint32_t new_value)
173*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
174*795d594fSAndroid Build Coastguard Worker 
175*795d594fSAndroid Build Coastguard Worker   uint64_t Get64(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
176*795d594fSAndroid Build Coastguard Worker 
177*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
178*795d594fSAndroid Build Coastguard Worker   void Set64(ObjPtr<mirror::Object> object, uint64_t new_value)
179*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
180*795d594fSAndroid Build Coastguard Worker 
181*795d594fSAndroid Build Coastguard Worker   template<class MirrorType = mirror::Object,
182*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
183*795d594fSAndroid Build Coastguard Worker   ObjPtr<MirrorType> GetObj(ObjPtr<mirror::Object> object)
184*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
185*795d594fSAndroid Build Coastguard Worker 
186*795d594fSAndroid Build Coastguard Worker   template<bool kTransactionActive>
187*795d594fSAndroid Build Coastguard Worker   void SetObj(ObjPtr<mirror::Object> object, ObjPtr<mirror::Object> new_value)
188*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
189*795d594fSAndroid Build Coastguard Worker 
190*795d594fSAndroid Build Coastguard Worker   // NO_THREAD_SAFETY_ANALYSIS since we don't know what the callback requires.
191*795d594fSAndroid Build Coastguard Worker   template<typename RootVisitorType>
VisitRoots(RootVisitorType & visitor)192*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE inline void VisitRoots(RootVisitorType& visitor) NO_THREAD_SAFETY_ANALYSIS {
193*795d594fSAndroid Build Coastguard Worker     visitor.VisitRoot(declaring_class_.AddressWithoutBarrier());
194*795d594fSAndroid Build Coastguard Worker   }
195*795d594fSAndroid Build Coastguard Worker 
IsVolatile()196*795d594fSAndroid Build Coastguard Worker   bool IsVolatile() {
197*795d594fSAndroid Build Coastguard Worker     return (GetAccessFlags() & kAccVolatile) != 0;
198*795d594fSAndroid Build Coastguard Worker   }
199*795d594fSAndroid Build Coastguard Worker 
200*795d594fSAndroid Build Coastguard Worker   // Returns an instance field with this offset in the given class or null if not found.
201*795d594fSAndroid Build Coastguard Worker   // If kExactOffset is true then we only find the matching offset, not the field containing the
202*795d594fSAndroid Build Coastguard Worker   // offset.
203*795d594fSAndroid Build Coastguard Worker   template <bool kExactOffset = true,
204*795d594fSAndroid Build Coastguard Worker             VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
205*795d594fSAndroid Build Coastguard Worker             ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
206*795d594fSAndroid Build Coastguard Worker   static ArtField* FindInstanceFieldWithOffset(ObjPtr<mirror::Class> klass, uint32_t field_offset)
207*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
208*795d594fSAndroid Build Coastguard Worker 
209*795d594fSAndroid Build Coastguard Worker   // Returns a static field with this offset in the given class or null if not found.
210*795d594fSAndroid Build Coastguard Worker   // If kExactOffset is true then we only find the matching offset, not the field containing the
211*795d594fSAndroid Build Coastguard Worker   // offset.
212*795d594fSAndroid Build Coastguard Worker   template <bool kExactOffset = true>
213*795d594fSAndroid Build Coastguard Worker   static ArtField* FindStaticFieldWithOffset(ObjPtr<mirror::Class> klass, uint32_t field_offset)
214*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
215*795d594fSAndroid Build Coastguard Worker 
216*795d594fSAndroid Build Coastguard Worker   const char* GetName() REQUIRES_SHARED(Locks::mutator_lock_);
217*795d594fSAndroid Build Coastguard Worker   std::string_view GetNameView() REQUIRES_SHARED(Locks::mutator_lock_);
218*795d594fSAndroid Build Coastguard Worker 
219*795d594fSAndroid Build Coastguard Worker   // Resolves / returns the name from the dex cache.
220*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::String> ResolveNameString() REQUIRES_SHARED(Locks::mutator_lock_);
221*795d594fSAndroid Build Coastguard Worker 
222*795d594fSAndroid Build Coastguard Worker   const char* GetTypeDescriptor() REQUIRES_SHARED(Locks::mutator_lock_);
223*795d594fSAndroid Build Coastguard Worker   std::string_view GetTypeDescriptorView() REQUIRES_SHARED(Locks::mutator_lock_);
224*795d594fSAndroid Build Coastguard Worker 
225*795d594fSAndroid Build Coastguard Worker   Primitive::Type GetTypeAsPrimitiveType() REQUIRES_SHARED(Locks::mutator_lock_);
226*795d594fSAndroid Build Coastguard Worker 
227*795d594fSAndroid Build Coastguard Worker   bool IsPrimitiveType() REQUIRES_SHARED(Locks::mutator_lock_);
228*795d594fSAndroid Build Coastguard Worker 
229*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> LookupResolvedType() REQUIRES_SHARED(Locks::mutator_lock_);
230*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> ResolveType() REQUIRES_SHARED(Locks::mutator_lock_);
231*795d594fSAndroid Build Coastguard Worker 
232*795d594fSAndroid Build Coastguard Worker   size_t FieldSize() REQUIRES_SHARED(Locks::mutator_lock_);
233*795d594fSAndroid Build Coastguard Worker 
234*795d594fSAndroid Build Coastguard Worker   template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
235*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::DexCache> GetDexCache() REQUIRES_SHARED(Locks::mutator_lock_);
236*795d594fSAndroid Build Coastguard Worker 
237*795d594fSAndroid Build Coastguard Worker   const DexFile* GetDexFile() REQUIRES_SHARED(Locks::mutator_lock_);
238*795d594fSAndroid Build Coastguard Worker 
239*795d594fSAndroid Build Coastguard Worker   const char* GetDeclaringClassDescriptor() REQUIRES_SHARED(Locks::mutator_lock_);
240*795d594fSAndroid Build Coastguard Worker   std::string_view GetDeclaringClassDescriptorView() REQUIRES_SHARED(Locks::mutator_lock_);
241*795d594fSAndroid Build Coastguard Worker 
DeclaringClassRoot()242*795d594fSAndroid Build Coastguard Worker   GcRoot<mirror::Class>& DeclaringClassRoot() {
243*795d594fSAndroid Build Coastguard Worker     return declaring_class_;
244*795d594fSAndroid Build Coastguard Worker   }
245*795d594fSAndroid Build Coastguard Worker 
246*795d594fSAndroid Build Coastguard Worker   // Returns a human-readable signature. Something like "a.b.C.f" or
247*795d594fSAndroid Build Coastguard Worker   // "int a.b.C.f" (depending on the value of 'with_type').
248*795d594fSAndroid Build Coastguard Worker   static std::string PrettyField(ArtField* f, bool with_type = true)
249*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
250*795d594fSAndroid Build Coastguard Worker   std::string PrettyField(bool with_type = true)
251*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
252*795d594fSAndroid Build Coastguard Worker 
253*795d594fSAndroid Build Coastguard Worker   // Returns true if a set-* instruction in the given method is allowable.
254*795d594fSAndroid Build Coastguard Worker   ALWAYS_INLINE inline bool CanBeChangedBy(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
255*795d594fSAndroid Build Coastguard Worker 
256*795d594fSAndroid Build Coastguard Worker  private:
257*795d594fSAndroid Build Coastguard Worker   bool IsProxyField() REQUIRES_SHARED(Locks::mutator_lock_);
258*795d594fSAndroid Build Coastguard Worker 
259*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Class> ProxyFindSystemClass(std::string_view descriptor)
260*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
261*795d594fSAndroid Build Coastguard Worker 
262*795d594fSAndroid Build Coastguard Worker   GcRoot<mirror::Class> declaring_class_;
263*795d594fSAndroid Build Coastguard Worker 
264*795d594fSAndroid Build Coastguard Worker   uint32_t access_flags_ = 0;
265*795d594fSAndroid Build Coastguard Worker 
266*795d594fSAndroid Build Coastguard Worker   // Dex cache index of field id
267*795d594fSAndroid Build Coastguard Worker   uint32_t field_dex_idx_ = 0;
268*795d594fSAndroid Build Coastguard Worker 
269*795d594fSAndroid Build Coastguard Worker   // Offset of field within an instance or in the Class' static fields
270*795d594fSAndroid Build Coastguard Worker   uint32_t offset_ = 0;
271*795d594fSAndroid Build Coastguard Worker };
272*795d594fSAndroid Build Coastguard Worker 
273*795d594fSAndroid Build Coastguard Worker }  // namespace art
274*795d594fSAndroid Build Coastguard Worker 
275*795d594fSAndroid Build Coastguard Worker #endif  // ART_RUNTIME_ART_FIELD_H_
276