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