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_MIRROR_CLASS_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_MIRROR_CLASS_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <string_view> 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include "base/bit_utils.h" 23*795d594fSAndroid Build Coastguard Worker #include "base/casts.h" 24*795d594fSAndroid Build Coastguard Worker #include "class_flags.h" 25*795d594fSAndroid Build Coastguard Worker #include "class_status.h" 26*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file_types.h" 27*795d594fSAndroid Build Coastguard Worker #include "dex/modifiers.h" 28*795d594fSAndroid Build Coastguard Worker #include "dex/primitive.h" 29*795d594fSAndroid Build Coastguard Worker #include "object.h" 30*795d594fSAndroid Build Coastguard Worker #include "object_array.h" 31*795d594fSAndroid Build Coastguard Worker #include "read_barrier_option.h" 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 34*795d594fSAndroid Build Coastguard Worker 35*795d594fSAndroid Build Coastguard Worker namespace dex { 36*795d594fSAndroid Build Coastguard Worker struct ClassDef; 37*795d594fSAndroid Build Coastguard Worker class TypeList; 38*795d594fSAndroid Build Coastguard Worker } // namespace dex 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker namespace gc { 41*795d594fSAndroid Build Coastguard Worker enum AllocatorType : char; 42*795d594fSAndroid Build Coastguard Worker } // namespace gc 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker namespace hiddenapi { 45*795d594fSAndroid Build Coastguard Worker class AccessContext; 46*795d594fSAndroid Build Coastguard Worker } // namespace hiddenapi 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard Worker namespace linker { 49*795d594fSAndroid Build Coastguard Worker class ImageWriter; 50*795d594fSAndroid Build Coastguard Worker } // namespace linker 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker template<typename T> class ArraySlice; 53*795d594fSAndroid Build Coastguard Worker class ArtField; 54*795d594fSAndroid Build Coastguard Worker class ArtMethod; 55*795d594fSAndroid Build Coastguard Worker struct ClassOffsets; 56*795d594fSAndroid Build Coastguard Worker class DexFile; 57*795d594fSAndroid Build Coastguard Worker template<class T> class Handle; 58*795d594fSAndroid Build Coastguard Worker class ImTable; 59*795d594fSAndroid Build Coastguard Worker enum InvokeType : uint32_t; 60*795d594fSAndroid Build Coastguard Worker template <typename Iter> class IterationRange; 61*795d594fSAndroid Build Coastguard Worker template<typename T> class LengthPrefixedArray; 62*795d594fSAndroid Build Coastguard Worker enum class PointerSize : uint32_t; 63*795d594fSAndroid Build Coastguard Worker class Signature; 64*795d594fSAndroid Build Coastguard Worker template<typename T> class StrideIterator; 65*795d594fSAndroid Build Coastguard Worker template<size_t kNumReferences> class PACKED(4) StackHandleScope; 66*795d594fSAndroid Build Coastguard Worker class Thread; 67*795d594fSAndroid Build Coastguard Worker class DexCacheVisitor; 68*795d594fSAndroid Build Coastguard Worker class RuntimeImageHelper; 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker namespace mirror { 71*795d594fSAndroid Build Coastguard Worker 72*795d594fSAndroid Build Coastguard Worker class ClassExt; 73*795d594fSAndroid Build Coastguard Worker class ClassLoader; 74*795d594fSAndroid Build Coastguard Worker class Constructor; 75*795d594fSAndroid Build Coastguard Worker class DexCache; 76*795d594fSAndroid Build Coastguard Worker class Field; 77*795d594fSAndroid Build Coastguard Worker class IfTable; 78*795d594fSAndroid Build Coastguard Worker class Method; 79*795d594fSAndroid Build Coastguard Worker template <typename T> struct alignas(8) DexCachePair; 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Worker // C++ mirror of java.lang.Class 82*795d594fSAndroid Build Coastguard Worker class EXPORT MANAGED Class final : public Object { 83*795d594fSAndroid Build Coastguard Worker public: 84*795d594fSAndroid Build Coastguard Worker MIRROR_CLASS("Ljava/lang/Class;"); 85*795d594fSAndroid Build Coastguard Worker 86*795d594fSAndroid Build Coastguard Worker // 'reference_instance_offsets_' may contain up to 31 reference offsets. If 87*795d594fSAndroid Build Coastguard Worker // more bits are required, then we set the most-significant bit and store the 88*795d594fSAndroid Build Coastguard Worker // number of 32-bit bitmap entries required in the remaining bits. All the 89*795d594fSAndroid Build Coastguard Worker // required bitmap entries after stored after static fields (at the end of the class). 90*795d594fSAndroid Build Coastguard Worker static constexpr uint32_t kVisitReferencesSlowpathShift = 31; 91*795d594fSAndroid Build Coastguard Worker static constexpr uint32_t kVisitReferencesSlowpathMask = 1u << kVisitReferencesSlowpathShift; 92*795d594fSAndroid Build Coastguard Worker 93*795d594fSAndroid Build Coastguard Worker // Shift primitive type by kPrimitiveTypeSizeShiftShift to get the component type size shift 94*795d594fSAndroid Build Coastguard Worker // Used for computing array size as follows: 95*795d594fSAndroid Build Coastguard Worker // array_bytes = header_size + (elements << (primitive_type >> kPrimitiveTypeSizeShiftShift)) 96*795d594fSAndroid Build Coastguard Worker static constexpr uint32_t kPrimitiveTypeSizeShiftShift = 16; 97*795d594fSAndroid Build Coastguard Worker static constexpr uint32_t kPrimitiveTypeMask = (1u << kPrimitiveTypeSizeShiftShift) - 1; 98*795d594fSAndroid Build Coastguard Worker 99*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 100*795d594fSAndroid Build Coastguard Worker bool kWithSynchronizationBarrier = true> GetStatus()101*795d594fSAndroid Build Coastguard Worker ClassStatus GetStatus() REQUIRES_SHARED(Locks::mutator_lock_) { 102*795d594fSAndroid Build Coastguard Worker // Reading the field without barrier is used exclusively for IsVisiblyInitialized(). 103*795d594fSAndroid Build Coastguard Worker int32_t field_value = kWithSynchronizationBarrier 104*795d594fSAndroid Build Coastguard Worker ? GetField32Volatile<kVerifyFlags>(StatusOffset()) 105*795d594fSAndroid Build Coastguard Worker : GetField32<kVerifyFlags>(StatusOffset()); 106*795d594fSAndroid Build Coastguard Worker // Avoid including "subtype_check_bits_and_status.h" to get the field. 107*795d594fSAndroid Build Coastguard Worker // The ClassStatus is always in the 4 most-significant bits of status_. 108*795d594fSAndroid Build Coastguard Worker return enum_cast<ClassStatus>(static_cast<uint32_t>(field_value) >> (32 - 4)); 109*795d594fSAndroid Build Coastguard Worker } 110*795d594fSAndroid Build Coastguard Worker 111*795d594fSAndroid Build Coastguard Worker // This is static because 'this' may be moved by GC. 112*795d594fSAndroid Build Coastguard Worker static void SetStatus(Handle<Class> h_this, ClassStatus new_status, Thread* self) 113*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); 114*795d594fSAndroid Build Coastguard Worker 115*795d594fSAndroid Build Coastguard Worker // Used for structural redefinition to directly set the class-status while 116*795d594fSAndroid Build Coastguard Worker // holding a strong mutator-lock. 117*795d594fSAndroid Build Coastguard Worker void SetStatusLocked(ClassStatus new_status) REQUIRES(Locks::mutator_lock_); 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker void SetStatusForPrimitiveOrArray(ClassStatus new_status) REQUIRES_SHARED(Locks::mutator_lock_); 120*795d594fSAndroid Build Coastguard Worker StatusOffset()121*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset StatusOffset() { 122*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSET_OF_OBJECT_MEMBER(Class, status_)); 123*795d594fSAndroid Build Coastguard Worker } 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker // Returns true if the class has been retired. 126*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsRetired()127*795d594fSAndroid Build Coastguard Worker bool IsRetired() REQUIRES_SHARED(Locks::mutator_lock_) { 128*795d594fSAndroid Build Coastguard Worker return GetStatus<kVerifyFlags>() == ClassStatus::kRetired; 129*795d594fSAndroid Build Coastguard Worker } 130*795d594fSAndroid Build Coastguard Worker 131*795d594fSAndroid Build Coastguard Worker // Returns true if the class has failed to link. 132*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsErroneousUnresolved()133*795d594fSAndroid Build Coastguard Worker bool IsErroneousUnresolved() REQUIRES_SHARED(Locks::mutator_lock_) { 134*795d594fSAndroid Build Coastguard Worker return GetStatus<kVerifyFlags>() == ClassStatus::kErrorUnresolved; 135*795d594fSAndroid Build Coastguard Worker } 136*795d594fSAndroid Build Coastguard Worker 137*795d594fSAndroid Build Coastguard Worker // Returns true if the class has failed to initialize. 138*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsErroneousResolved()139*795d594fSAndroid Build Coastguard Worker bool IsErroneousResolved() REQUIRES_SHARED(Locks::mutator_lock_) { 140*795d594fSAndroid Build Coastguard Worker return GetStatus<kVerifyFlags>() == ClassStatus::kErrorResolved; 141*795d594fSAndroid Build Coastguard Worker } 142*795d594fSAndroid Build Coastguard Worker 143*795d594fSAndroid Build Coastguard Worker // Returns true if the class status indicets that the class has failed to link or initialize. IsErroneous(ClassStatus status)144*795d594fSAndroid Build Coastguard Worker static bool IsErroneous(ClassStatus status) { 145*795d594fSAndroid Build Coastguard Worker return status == ClassStatus::kErrorUnresolved || status == ClassStatus::kErrorResolved; 146*795d594fSAndroid Build Coastguard Worker } 147*795d594fSAndroid Build Coastguard Worker 148*795d594fSAndroid Build Coastguard Worker // Returns true if the class has failed to link or initialize. 149*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsErroneous()150*795d594fSAndroid Build Coastguard Worker bool IsErroneous() REQUIRES_SHARED(Locks::mutator_lock_) { 151*795d594fSAndroid Build Coastguard Worker return IsErroneous(GetStatus<kVerifyFlags>()); 152*795d594fSAndroid Build Coastguard Worker } 153*795d594fSAndroid Build Coastguard Worker 154*795d594fSAndroid Build Coastguard Worker // Returns true if the class has been loaded. 155*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsIdxLoaded()156*795d594fSAndroid Build Coastguard Worker bool IsIdxLoaded() REQUIRES_SHARED(Locks::mutator_lock_) { 157*795d594fSAndroid Build Coastguard Worker return GetStatus<kVerifyFlags>() >= ClassStatus::kIdx; 158*795d594fSAndroid Build Coastguard Worker } 159*795d594fSAndroid Build Coastguard Worker 160*795d594fSAndroid Build Coastguard Worker // Returns true if the class has been loaded. 161*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsLoaded()162*795d594fSAndroid Build Coastguard Worker bool IsLoaded() REQUIRES_SHARED(Locks::mutator_lock_) { 163*795d594fSAndroid Build Coastguard Worker return GetStatus<kVerifyFlags>() >= ClassStatus::kLoaded; 164*795d594fSAndroid Build Coastguard Worker } 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker // Returns true if the class has been linked. 167*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsResolved()168*795d594fSAndroid Build Coastguard Worker bool IsResolved() REQUIRES_SHARED(Locks::mutator_lock_) { 169*795d594fSAndroid Build Coastguard Worker ClassStatus status = GetStatus<kVerifyFlags>(); 170*795d594fSAndroid Build Coastguard Worker return status >= ClassStatus::kResolved || status == ClassStatus::kErrorResolved; 171*795d594fSAndroid Build Coastguard Worker } 172*795d594fSAndroid Build Coastguard Worker 173*795d594fSAndroid Build Coastguard Worker // Returns true if the class should be verified at runtime. 174*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> ShouldVerifyAtRuntime()175*795d594fSAndroid Build Coastguard Worker bool ShouldVerifyAtRuntime() REQUIRES_SHARED(Locks::mutator_lock_) { 176*795d594fSAndroid Build Coastguard Worker return GetStatus<kVerifyFlags>() == ClassStatus::kRetryVerificationAtRuntime; 177*795d594fSAndroid Build Coastguard Worker } 178*795d594fSAndroid Build Coastguard Worker 179*795d594fSAndroid Build Coastguard Worker // Returns true if the class has been verified at compile time, but should be 180*795d594fSAndroid Build Coastguard Worker // executed with access checks. 181*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsVerifiedNeedsAccessChecks()182*795d594fSAndroid Build Coastguard Worker bool IsVerifiedNeedsAccessChecks() REQUIRES_SHARED(Locks::mutator_lock_) { 183*795d594fSAndroid Build Coastguard Worker return GetStatus<kVerifyFlags>() == ClassStatus::kVerifiedNeedsAccessChecks; 184*795d594fSAndroid Build Coastguard Worker } 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Worker // Returns true if the class has been verified. 187*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsVerified()188*795d594fSAndroid Build Coastguard Worker bool IsVerified() REQUIRES_SHARED(Locks::mutator_lock_) { 189*795d594fSAndroid Build Coastguard Worker return GetStatus<kVerifyFlags>() >= ClassStatus::kVerified; 190*795d594fSAndroid Build Coastguard Worker } 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker // Returns true if the class is initializing. 193*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsInitializing()194*795d594fSAndroid Build Coastguard Worker bool IsInitializing() REQUIRES_SHARED(Locks::mutator_lock_) { 195*795d594fSAndroid Build Coastguard Worker return GetStatus<kVerifyFlags>() >= ClassStatus::kInitializing; 196*795d594fSAndroid Build Coastguard Worker } 197*795d594fSAndroid Build Coastguard Worker 198*795d594fSAndroid Build Coastguard Worker // Returns true if the class is initialized. 199*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsInitialized()200*795d594fSAndroid Build Coastguard Worker bool IsInitialized() REQUIRES_SHARED(Locks::mutator_lock_) { 201*795d594fSAndroid Build Coastguard Worker return GetStatus<kVerifyFlags>() >= ClassStatus::kInitialized; 202*795d594fSAndroid Build Coastguard Worker } 203*795d594fSAndroid Build Coastguard Worker 204*795d594fSAndroid Build Coastguard Worker // Returns true if the class is visibly initialized. 205*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsVisiblyInitialized()206*795d594fSAndroid Build Coastguard Worker bool IsVisiblyInitialized() REQUIRES_SHARED(Locks::mutator_lock_) { 207*795d594fSAndroid Build Coastguard Worker // Note: Avoiding the synchronization barrier for the visibly initialized check. 208*795d594fSAndroid Build Coastguard Worker ClassStatus status = GetStatus<kVerifyFlags, /*kWithSynchronizationBarrier=*/ false>(); 209*795d594fSAndroid Build Coastguard Worker 210*795d594fSAndroid Build Coastguard Worker // We need to prevent the compiler from reordering loads that depend 211*795d594fSAndroid Build Coastguard Worker // on the class being visibly initialized before the status load above. 212*795d594fSAndroid Build Coastguard Worker asm volatile ("" : : : "memory"); 213*795d594fSAndroid Build Coastguard Worker 214*795d594fSAndroid Build Coastguard Worker return status == ClassStatus::kVisiblyInitialized; 215*795d594fSAndroid Build Coastguard Worker } 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker // Returns true if this class is ever accessed through a C++ mirror. 218*795d594fSAndroid Build Coastguard Worker bool IsMirrored() REQUIRES_SHARED(Locks::mutator_lock_); 219*795d594fSAndroid Build Coastguard Worker 220*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> GetAccessFlags()221*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t GetAccessFlags() REQUIRES_SHARED(Locks::mutator_lock_) { 222*795d594fSAndroid Build Coastguard Worker if (kIsDebugBuild) { 223*795d594fSAndroid Build Coastguard Worker GetAccessFlagsDCheck<kVerifyFlags>(); 224*795d594fSAndroid Build Coastguard Worker } 225*795d594fSAndroid Build Coastguard Worker return GetField32<kVerifyFlags>(AccessFlagsOffset()); 226*795d594fSAndroid Build Coastguard Worker } 227*795d594fSAndroid Build Coastguard Worker AccessFlagsOffset()228*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset AccessFlagsOffset() { 229*795d594fSAndroid Build Coastguard Worker return OFFSET_OF_OBJECT_MEMBER(Class, access_flags_); 230*795d594fSAndroid Build Coastguard Worker } 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> GetClassFlags()233*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t GetClassFlags() REQUIRES_SHARED(Locks::mutator_lock_) { 234*795d594fSAndroid Build Coastguard Worker return GetField32<kVerifyFlags>(OFFSET_OF_OBJECT_MEMBER(Class, class_flags_)); 235*795d594fSAndroid Build Coastguard Worker } 236*795d594fSAndroid Build Coastguard Worker void SetClassFlags(uint32_t new_flags) REQUIRES_SHARED(Locks::mutator_lock_); 237*795d594fSAndroid Build Coastguard Worker 238*795d594fSAndroid Build Coastguard Worker // Set access flags during linking, these cannot be rolled back by a Transaction. 239*795d594fSAndroid Build Coastguard Worker void SetAccessFlagsDuringLinking(uint32_t new_access_flags) REQUIRES_SHARED(Locks::mutator_lock_); 240*795d594fSAndroid Build Coastguard Worker 241*795d594fSAndroid Build Coastguard Worker // Set access flags, recording the change if running inside a Transaction. 242*795d594fSAndroid Build Coastguard Worker void SetAccessFlags(uint32_t new_access_flags) REQUIRES_SHARED(Locks::mutator_lock_); 243*795d594fSAndroid Build Coastguard Worker SetInBootImageAndNotInPreloadedClasses()244*795d594fSAndroid Build Coastguard Worker void SetInBootImageAndNotInPreloadedClasses() REQUIRES_SHARED(Locks::mutator_lock_) { 245*795d594fSAndroid Build Coastguard Worker uint32_t flags = GetAccessFlags(); 246*795d594fSAndroid Build Coastguard Worker SetAccessFlags(flags | kAccInBootImageAndNotInPreloadedClasses); 247*795d594fSAndroid Build Coastguard Worker } 248*795d594fSAndroid Build Coastguard Worker IsInBootImageAndNotInPreloadedClasses()249*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsInBootImageAndNotInPreloadedClasses() REQUIRES_SHARED(Locks::mutator_lock_) { 250*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags() & kAccInBootImageAndNotInPreloadedClasses) != 0; 251*795d594fSAndroid Build Coastguard Worker } 252*795d594fSAndroid Build Coastguard Worker 253*795d594fSAndroid Build Coastguard Worker // Returns true if the class is an enum. IsEnum()254*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsEnum() REQUIRES_SHARED(Locks::mutator_lock_) { 255*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags() & kAccEnum) != 0; 256*795d594fSAndroid Build Coastguard Worker } 257*795d594fSAndroid Build Coastguard Worker 258*795d594fSAndroid Build Coastguard Worker // Returns true if the class is an interface. 259*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsInterface()260*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsInterface() REQUIRES_SHARED(Locks::mutator_lock_) { 261*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags<kVerifyFlags>() & kAccInterface) != 0; 262*795d594fSAndroid Build Coastguard Worker } 263*795d594fSAndroid Build Coastguard Worker 264*795d594fSAndroid Build Coastguard Worker // Returns true if the class is declared public. IsPublic()265*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsPublic() REQUIRES_SHARED(Locks::mutator_lock_) { 266*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags() & kAccPublic) != 0; 267*795d594fSAndroid Build Coastguard Worker } 268*795d594fSAndroid Build Coastguard Worker 269*795d594fSAndroid Build Coastguard Worker // Returns true if the class is declared final. IsFinal()270*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsFinal() REQUIRES_SHARED(Locks::mutator_lock_) { 271*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags() & kAccFinal) != 0; 272*795d594fSAndroid Build Coastguard Worker } 273*795d594fSAndroid Build Coastguard Worker IsFinalizable()274*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsFinalizable() REQUIRES_SHARED(Locks::mutator_lock_) { 275*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags() & kAccClassIsFinalizable) != 0; 276*795d594fSAndroid Build Coastguard Worker } 277*795d594fSAndroid Build Coastguard Worker ShouldSkipHiddenApiChecks()278*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool ShouldSkipHiddenApiChecks() REQUIRES_SHARED(Locks::mutator_lock_) { 279*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags() & kAccSkipHiddenapiChecks) != 0; 280*795d594fSAndroid Build Coastguard Worker } 281*795d594fSAndroid Build Coastguard Worker SetSkipHiddenApiChecks()282*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetSkipHiddenApiChecks() REQUIRES_SHARED(Locks::mutator_lock_) { 283*795d594fSAndroid Build Coastguard Worker uint32_t flags = GetAccessFlags(); 284*795d594fSAndroid Build Coastguard Worker SetAccessFlags(flags | kAccSkipHiddenapiChecks); 285*795d594fSAndroid Build Coastguard Worker } 286*795d594fSAndroid Build Coastguard Worker 287*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetRecursivelyInitialized() REQUIRES_SHARED(Locks::mutator_lock_); 288*795d594fSAndroid Build Coastguard Worker 289*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetHasDefaultMethods() REQUIRES_SHARED(Locks::mutator_lock_); 290*795d594fSAndroid Build Coastguard Worker SetFinalizable()291*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFinalizable() REQUIRES_SHARED(Locks::mutator_lock_) { 292*795d594fSAndroid Build Coastguard Worker uint32_t flags = GetField32(OFFSET_OF_OBJECT_MEMBER(Class, access_flags_)); 293*795d594fSAndroid Build Coastguard Worker SetAccessFlagsDuringLinking(flags | kAccClassIsFinalizable); 294*795d594fSAndroid Build Coastguard Worker } 295*795d594fSAndroid Build Coastguard Worker 296*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void ClearFinalizable() REQUIRES_SHARED(Locks::mutator_lock_); 297*795d594fSAndroid Build Coastguard Worker 298*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsStringClass()299*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsStringClass() REQUIRES_SHARED(Locks::mutator_lock_) { 300*795d594fSAndroid Build Coastguard Worker return (GetClassFlags<kVerifyFlags>() & kClassFlagString) != 0; 301*795d594fSAndroid Build Coastguard Worker } 302*795d594fSAndroid Build Coastguard Worker SetStringClass()303*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetStringClass() REQUIRES_SHARED(Locks::mutator_lock_) { 304*795d594fSAndroid Build Coastguard Worker SetClassFlags(kClassFlagString | kClassFlagNoReferenceFields); 305*795d594fSAndroid Build Coastguard Worker } 306*795d594fSAndroid Build Coastguard Worker 307*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsClassLoaderClass()308*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsClassLoaderClass() REQUIRES_SHARED(Locks::mutator_lock_) { 309*795d594fSAndroid Build Coastguard Worker return GetClassFlags<kVerifyFlags>() == kClassFlagClassLoader; 310*795d594fSAndroid Build Coastguard Worker } 311*795d594fSAndroid Build Coastguard Worker SetClassLoaderClass()312*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetClassLoaderClass() REQUIRES_SHARED(Locks::mutator_lock_) { 313*795d594fSAndroid Build Coastguard Worker SetClassFlags(kClassFlagClassLoader); 314*795d594fSAndroid Build Coastguard Worker } 315*795d594fSAndroid Build Coastguard Worker 316*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsDexCacheClass()317*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsDexCacheClass() REQUIRES_SHARED(Locks::mutator_lock_) { 318*795d594fSAndroid Build Coastguard Worker return (GetClassFlags<kVerifyFlags>() & kClassFlagDexCache) != 0; 319*795d594fSAndroid Build Coastguard Worker } 320*795d594fSAndroid Build Coastguard Worker SetDexCacheClass()321*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetDexCacheClass() REQUIRES_SHARED(Locks::mutator_lock_) { 322*795d594fSAndroid Build Coastguard Worker SetClassFlags(GetClassFlags() | kClassFlagDexCache); 323*795d594fSAndroid Build Coastguard Worker } 324*795d594fSAndroid Build Coastguard Worker 325*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsRecordClass()326*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsRecordClass() REQUIRES_SHARED(Locks::mutator_lock_) { 327*795d594fSAndroid Build Coastguard Worker return (GetClassFlags<kVerifyFlags>() & kClassFlagRecord) != 0; 328*795d594fSAndroid Build Coastguard Worker } 329*795d594fSAndroid Build Coastguard Worker SetRecordClass()330*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetRecordClass() REQUIRES_SHARED(Locks::mutator_lock_) { 331*795d594fSAndroid Build Coastguard Worker SetClassFlags(GetClassFlags() | kClassFlagRecord); 332*795d594fSAndroid Build Coastguard Worker } 333*795d594fSAndroid Build Coastguard Worker 334*795d594fSAndroid Build Coastguard Worker // Returns true if the class is abstract. 335*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsAbstract()336*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsAbstract() REQUIRES_SHARED(Locks::mutator_lock_) { 337*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags<kVerifyFlags>() & kAccAbstract) != 0; 338*795d594fSAndroid Build Coastguard Worker } 339*795d594fSAndroid Build Coastguard Worker 340*795d594fSAndroid Build Coastguard Worker // Returns true if the class is an annotation. IsAnnotation()341*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsAnnotation() REQUIRES_SHARED(Locks::mutator_lock_) { 342*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags() & kAccAnnotation) != 0; 343*795d594fSAndroid Build Coastguard Worker } 344*795d594fSAndroid Build Coastguard Worker 345*795d594fSAndroid Build Coastguard Worker // Returns true if the class is synthetic. IsSynthetic()346*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsSynthetic() REQUIRES_SHARED(Locks::mutator_lock_) { 347*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags() & kAccSynthetic) != 0; 348*795d594fSAndroid Build Coastguard Worker } 349*795d594fSAndroid Build Coastguard Worker IsObsoleteObject()350*795d594fSAndroid Build Coastguard Worker bool IsObsoleteObject() REQUIRES_SHARED(Locks::mutator_lock_) { 351*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags() & kAccObsoleteObject) != 0; 352*795d594fSAndroid Build Coastguard Worker } 353*795d594fSAndroid Build Coastguard Worker SetObsoleteObject()354*795d594fSAndroid Build Coastguard Worker void SetObsoleteObject() REQUIRES_SHARED(Locks::mutator_lock_) { 355*795d594fSAndroid Build Coastguard Worker uint32_t flags = GetField32(OFFSET_OF_OBJECT_MEMBER(Class, access_flags_)); 356*795d594fSAndroid Build Coastguard Worker if ((flags & kAccObsoleteObject) == 0) { 357*795d594fSAndroid Build Coastguard Worker SetAccessFlags(flags | kAccObsoleteObject); 358*795d594fSAndroid Build Coastguard Worker } 359*795d594fSAndroid Build Coastguard Worker } 360*795d594fSAndroid Build Coastguard Worker 361*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsTypeOfReferenceClass()362*795d594fSAndroid Build Coastguard Worker bool IsTypeOfReferenceClass() REQUIRES_SHARED(Locks::mutator_lock_) { 363*795d594fSAndroid Build Coastguard Worker return (GetClassFlags<kVerifyFlags>() & kClassFlagReference) != 0; 364*795d594fSAndroid Build Coastguard Worker } 365*795d594fSAndroid Build Coastguard Worker 366*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsWeakReferenceClass()367*795d594fSAndroid Build Coastguard Worker bool IsWeakReferenceClass() REQUIRES_SHARED(Locks::mutator_lock_) { 368*795d594fSAndroid Build Coastguard Worker return GetClassFlags<kVerifyFlags>() == kClassFlagWeakReference; 369*795d594fSAndroid Build Coastguard Worker } 370*795d594fSAndroid Build Coastguard Worker 371*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsSoftReferenceClass()372*795d594fSAndroid Build Coastguard Worker bool IsSoftReferenceClass() REQUIRES_SHARED(Locks::mutator_lock_) { 373*795d594fSAndroid Build Coastguard Worker return GetClassFlags<kVerifyFlags>() == kClassFlagSoftReference; 374*795d594fSAndroid Build Coastguard Worker } 375*795d594fSAndroid Build Coastguard Worker 376*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsFinalizerReferenceClass()377*795d594fSAndroid Build Coastguard Worker bool IsFinalizerReferenceClass() REQUIRES_SHARED(Locks::mutator_lock_) { 378*795d594fSAndroid Build Coastguard Worker return GetClassFlags<kVerifyFlags>() == kClassFlagFinalizerReference; 379*795d594fSAndroid Build Coastguard Worker } 380*795d594fSAndroid Build Coastguard Worker 381*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsPhantomReferenceClass()382*795d594fSAndroid Build Coastguard Worker bool IsPhantomReferenceClass() REQUIRES_SHARED(Locks::mutator_lock_) { 383*795d594fSAndroid Build Coastguard Worker return GetClassFlags<kVerifyFlags>() == kClassFlagPhantomReference; 384*795d594fSAndroid Build Coastguard Worker } 385*795d594fSAndroid Build Coastguard Worker 386*795d594fSAndroid Build Coastguard Worker // Can references of this type be assigned to by things of another type? For non-array types 387*795d594fSAndroid Build Coastguard Worker // this is a matter of whether sub-classes may exist - which they can't if the type is final. 388*795d594fSAndroid Build Coastguard Worker // For array classes, where all the classes are final due to there being no sub-classes, an 389*795d594fSAndroid Build Coastguard Worker // Object[] may be assigned to by a String[] but a String[] may not be assigned to by other 390*795d594fSAndroid Build Coastguard Worker // types as the component is final. 391*795d594fSAndroid Build Coastguard Worker bool CannotBeAssignedFromOtherTypes() REQUIRES_SHARED(Locks::mutator_lock_); 392*795d594fSAndroid Build Coastguard Worker 393*795d594fSAndroid Build Coastguard Worker // Returns true if this class is the placeholder and should retire and 394*795d594fSAndroid Build Coastguard Worker // be replaced with a class with the right size for embedded imt/vtable. 395*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsTemp()396*795d594fSAndroid Build Coastguard Worker bool IsTemp() REQUIRES_SHARED(Locks::mutator_lock_) { 397*795d594fSAndroid Build Coastguard Worker ClassStatus s = GetStatus<kVerifyFlags>(); 398*795d594fSAndroid Build Coastguard Worker return s < ClassStatus::kResolving && 399*795d594fSAndroid Build Coastguard Worker s != ClassStatus::kErrorResolved && 400*795d594fSAndroid Build Coastguard Worker ShouldHaveEmbeddedVTable<kVerifyFlags>(); 401*795d594fSAndroid Build Coastguard Worker } 402*795d594fSAndroid Build Coastguard Worker 403*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 404*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 405*795d594fSAndroid Build Coastguard Worker ObjPtr<String> GetName() REQUIRES_SHARED(Locks::mutator_lock_); // Returns the cached name. 406*795d594fSAndroid Build Coastguard Worker void SetName(ObjPtr<String> name) REQUIRES_SHARED(Locks::mutator_lock_); // Sets the cached name. 407*795d594fSAndroid Build Coastguard Worker // Computes the name, then sets the cached value. 408*795d594fSAndroid Build Coastguard Worker static ObjPtr<String> ComputeName(Handle<Class> h_this) REQUIRES_SHARED(Locks::mutator_lock_) 409*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 410*795d594fSAndroid Build Coastguard Worker 411*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsProxyClass()412*795d594fSAndroid Build Coastguard Worker bool IsProxyClass() REQUIRES_SHARED(Locks::mutator_lock_) { 413*795d594fSAndroid Build Coastguard Worker // Read access flags without using getter as whether something is a proxy can be check in 414*795d594fSAndroid Build Coastguard Worker // any loaded state 415*795d594fSAndroid Build Coastguard Worker // TODO: switch to a check if the super class is java.lang.reflect.Proxy? 416*795d594fSAndroid Build Coastguard Worker uint32_t access_flags = GetField32<kVerifyFlags>(OFFSET_OF_OBJECT_MEMBER(Class, access_flags_)); 417*795d594fSAndroid Build Coastguard Worker return (access_flags & kAccClassIsProxy) != 0; 418*795d594fSAndroid Build Coastguard Worker } 419*795d594fSAndroid Build Coastguard Worker PrimitiveTypeOffset()420*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset PrimitiveTypeOffset() { 421*795d594fSAndroid Build Coastguard Worker return OFFSET_OF_OBJECT_MEMBER(Class, primitive_type_); 422*795d594fSAndroid Build Coastguard Worker } 423*795d594fSAndroid Build Coastguard Worker 424*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 425*795d594fSAndroid Build Coastguard Worker Primitive::Type GetPrimitiveType() ALWAYS_INLINE REQUIRES_SHARED(Locks::mutator_lock_); 426*795d594fSAndroid Build Coastguard Worker SetPrimitiveType(Primitive::Type new_type)427*795d594fSAndroid Build Coastguard Worker void SetPrimitiveType(Primitive::Type new_type) REQUIRES_SHARED(Locks::mutator_lock_) { 428*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(sizeof(Primitive::Type), sizeof(int32_t)); 429*795d594fSAndroid Build Coastguard Worker uint32_t v32 = static_cast<uint32_t>(new_type); 430*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(v32 & kPrimitiveTypeMask, v32) << "upper 16 bits aren't zero"; 431*795d594fSAndroid Build Coastguard Worker // Store the component size shift in the upper 16 bits. 432*795d594fSAndroid Build Coastguard Worker v32 |= Primitive::ComponentSizeShift(new_type) << kPrimitiveTypeSizeShiftShift; 433*795d594fSAndroid Build Coastguard Worker SetField32</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>( 434*795d594fSAndroid Build Coastguard Worker OFFSET_OF_OBJECT_MEMBER(Class, primitive_type_), v32); 435*795d594fSAndroid Build Coastguard Worker } 436*795d594fSAndroid Build Coastguard Worker 437*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 438*795d594fSAndroid Build Coastguard Worker size_t GetPrimitiveTypeSizeShift() ALWAYS_INLINE REQUIRES_SHARED(Locks::mutator_lock_); 439*795d594fSAndroid Build Coastguard Worker 440*795d594fSAndroid Build Coastguard Worker // Returns true if the class is a primitive type. 441*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsPrimitive()442*795d594fSAndroid Build Coastguard Worker bool IsPrimitive() REQUIRES_SHARED(Locks::mutator_lock_) { 443*795d594fSAndroid Build Coastguard Worker return GetPrimitiveType<kVerifyFlags>() != Primitive::kPrimNot; 444*795d594fSAndroid Build Coastguard Worker } 445*795d594fSAndroid Build Coastguard Worker 446*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsPrimitiveBoolean()447*795d594fSAndroid Build Coastguard Worker bool IsPrimitiveBoolean() REQUIRES_SHARED(Locks::mutator_lock_) { 448*795d594fSAndroid Build Coastguard Worker return GetPrimitiveType<kVerifyFlags>() == Primitive::kPrimBoolean; 449*795d594fSAndroid Build Coastguard Worker } 450*795d594fSAndroid Build Coastguard Worker 451*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsPrimitiveByte()452*795d594fSAndroid Build Coastguard Worker bool IsPrimitiveByte() REQUIRES_SHARED(Locks::mutator_lock_) { 453*795d594fSAndroid Build Coastguard Worker return GetPrimitiveType<kVerifyFlags>() == Primitive::kPrimByte; 454*795d594fSAndroid Build Coastguard Worker } 455*795d594fSAndroid Build Coastguard Worker 456*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsPrimitiveChar()457*795d594fSAndroid Build Coastguard Worker bool IsPrimitiveChar() REQUIRES_SHARED(Locks::mutator_lock_) { 458*795d594fSAndroid Build Coastguard Worker return GetPrimitiveType<kVerifyFlags>() == Primitive::kPrimChar; 459*795d594fSAndroid Build Coastguard Worker } 460*795d594fSAndroid Build Coastguard Worker 461*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsPrimitiveShort()462*795d594fSAndroid Build Coastguard Worker bool IsPrimitiveShort() REQUIRES_SHARED(Locks::mutator_lock_) { 463*795d594fSAndroid Build Coastguard Worker return GetPrimitiveType<kVerifyFlags>() == Primitive::kPrimShort; 464*795d594fSAndroid Build Coastguard Worker } 465*795d594fSAndroid Build Coastguard Worker 466*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsPrimitiveInt()467*795d594fSAndroid Build Coastguard Worker bool IsPrimitiveInt() REQUIRES_SHARED(Locks::mutator_lock_) { 468*795d594fSAndroid Build Coastguard Worker return GetPrimitiveType() == Primitive::kPrimInt; 469*795d594fSAndroid Build Coastguard Worker } 470*795d594fSAndroid Build Coastguard Worker 471*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsPrimitiveLong()472*795d594fSAndroid Build Coastguard Worker bool IsPrimitiveLong() REQUIRES_SHARED(Locks::mutator_lock_) { 473*795d594fSAndroid Build Coastguard Worker return GetPrimitiveType<kVerifyFlags>() == Primitive::kPrimLong; 474*795d594fSAndroid Build Coastguard Worker } 475*795d594fSAndroid Build Coastguard Worker 476*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsPrimitiveFloat()477*795d594fSAndroid Build Coastguard Worker bool IsPrimitiveFloat() REQUIRES_SHARED(Locks::mutator_lock_) { 478*795d594fSAndroid Build Coastguard Worker return GetPrimitiveType<kVerifyFlags>() == Primitive::kPrimFloat; 479*795d594fSAndroid Build Coastguard Worker } 480*795d594fSAndroid Build Coastguard Worker 481*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsPrimitiveDouble()482*795d594fSAndroid Build Coastguard Worker bool IsPrimitiveDouble() REQUIRES_SHARED(Locks::mutator_lock_) { 483*795d594fSAndroid Build Coastguard Worker return GetPrimitiveType<kVerifyFlags>() == Primitive::kPrimDouble; 484*795d594fSAndroid Build Coastguard Worker } 485*795d594fSAndroid Build Coastguard Worker 486*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> IsPrimitiveVoid()487*795d594fSAndroid Build Coastguard Worker bool IsPrimitiveVoid() REQUIRES_SHARED(Locks::mutator_lock_) { 488*795d594fSAndroid Build Coastguard Worker return GetPrimitiveType<kVerifyFlags>() == Primitive::kPrimVoid; 489*795d594fSAndroid Build Coastguard Worker } 490*795d594fSAndroid Build Coastguard Worker 491*795d594fSAndroid Build Coastguard Worker // Depth of class from java.lang.Object 492*795d594fSAndroid Build Coastguard Worker uint32_t Depth() REQUIRES_SHARED(Locks::mutator_lock_); 493*795d594fSAndroid Build Coastguard Worker 494*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 495*795d594fSAndroid Build Coastguard Worker bool IsArrayClass() REQUIRES_SHARED(Locks::mutator_lock_); 496*795d594fSAndroid Build Coastguard Worker 497*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 498*795d594fSAndroid Build Coastguard Worker bool IsClassClass() REQUIRES_SHARED(Locks::mutator_lock_); 499*795d594fSAndroid Build Coastguard Worker 500*795d594fSAndroid Build Coastguard Worker bool IsThrowableClass() REQUIRES_SHARED(Locks::mutator_lock_); 501*795d594fSAndroid Build Coastguard Worker ComponentTypeOffset()502*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset ComponentTypeOffset() { 503*795d594fSAndroid Build Coastguard Worker return OFFSET_OF_OBJECT_MEMBER(Class, component_type_); 504*795d594fSAndroid Build Coastguard Worker } 505*795d594fSAndroid Build Coastguard Worker 506*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 507*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 508*795d594fSAndroid Build Coastguard Worker ObjPtr<Class> GetComponentType() REQUIRES_SHARED(Locks::mutator_lock_); 509*795d594fSAndroid Build Coastguard Worker 510*795d594fSAndroid Build Coastguard Worker void SetComponentType(ObjPtr<Class> new_component_type) REQUIRES_SHARED(Locks::mutator_lock_); 511*795d594fSAndroid Build Coastguard Worker 512*795d594fSAndroid Build Coastguard Worker size_t GetComponentSize() REQUIRES_SHARED(Locks::mutator_lock_); 513*795d594fSAndroid Build Coastguard Worker 514*795d594fSAndroid Build Coastguard Worker template<ReadBarrierOption kReadBarrierOption = kWithoutReadBarrier> 515*795d594fSAndroid Build Coastguard Worker size_t GetComponentSizeShift() REQUIRES_SHARED(Locks::mutator_lock_); 516*795d594fSAndroid Build Coastguard Worker 517*795d594fSAndroid Build Coastguard Worker bool IsObjectClass() REQUIRES_SHARED(Locks::mutator_lock_); 518*795d594fSAndroid Build Coastguard Worker 519*795d594fSAndroid Build Coastguard Worker bool IsInstantiableNonArray() REQUIRES_SHARED(Locks::mutator_lock_); 520*795d594fSAndroid Build Coastguard Worker 521*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 522*795d594fSAndroid Build Coastguard Worker bool IsInstantiable() REQUIRES_SHARED(Locks::mutator_lock_); 523*795d594fSAndroid Build Coastguard Worker 524*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 525*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithoutReadBarrier> 526*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsObjectArrayClass() REQUIRES_SHARED(Locks::mutator_lock_); 527*795d594fSAndroid Build Coastguard Worker 528*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 529*795d594fSAndroid Build Coastguard Worker bool IsPrimitiveArray() REQUIRES_SHARED(Locks::mutator_lock_); 530*795d594fSAndroid Build Coastguard Worker 531*795d594fSAndroid Build Coastguard Worker // Enum used to control whether we try to add a finalizer-reference for object alloc or not. 532*795d594fSAndroid Build Coastguard Worker enum class AddFinalizer { 533*795d594fSAndroid Build Coastguard Worker // Don't create a finalizer reference regardless of what the class-flags say. 534*795d594fSAndroid Build Coastguard Worker kNoAddFinalizer, 535*795d594fSAndroid Build Coastguard Worker // Use the class-flags to figure out if we should make a finalizer reference. 536*795d594fSAndroid Build Coastguard Worker kUseClassTag, 537*795d594fSAndroid Build Coastguard Worker }; 538*795d594fSAndroid Build Coastguard Worker 539*795d594fSAndroid Build Coastguard Worker // Creates a raw object instance but does not invoke the default constructor. 540*795d594fSAndroid Build Coastguard Worker // kCheckAddFinalizer controls whether we use a DCHECK to check that we create a 541*795d594fSAndroid Build Coastguard Worker // finalizer-reference if needed. This should only be disabled when doing structural class 542*795d594fSAndroid Build Coastguard Worker // redefinition. 543*795d594fSAndroid Build Coastguard Worker template <bool kIsInstrumented = true, 544*795d594fSAndroid Build Coastguard Worker AddFinalizer kAddFinalizer = AddFinalizer::kUseClassTag, 545*795d594fSAndroid Build Coastguard Worker bool kCheckAddFinalizer = true> 546*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ObjPtr<Object> Alloc(Thread* self, gc::AllocatorType allocator_type) 547*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); 548*795d594fSAndroid Build Coastguard Worker 549*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> AllocObject(Thread* self) 550*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); 551*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> AllocNonMovableObject(Thread* self) 552*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); 553*795d594fSAndroid Build Coastguard Worker 554*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 555*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsVariableSize() REQUIRES_SHARED(Locks::mutator_lock_); 556*795d594fSAndroid Build Coastguard Worker 557*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> SizeOf()558*795d594fSAndroid Build Coastguard Worker uint32_t SizeOf() REQUIRES_SHARED(Locks::mutator_lock_) { 559*795d594fSAndroid Build Coastguard Worker return GetField32<kVerifyFlags>(OFFSET_OF_OBJECT_MEMBER(Class, class_size_)); 560*795d594fSAndroid Build Coastguard Worker } 561*795d594fSAndroid Build Coastguard Worker 562*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> GetClassSize()563*795d594fSAndroid Build Coastguard Worker uint32_t GetClassSize() REQUIRES_SHARED(Locks::mutator_lock_) { 564*795d594fSAndroid Build Coastguard Worker return GetField32<kVerifyFlags>(OFFSET_OF_OBJECT_MEMBER(Class, class_size_)); 565*795d594fSAndroid Build Coastguard Worker } 566*795d594fSAndroid Build Coastguard Worker 567*795d594fSAndroid Build Coastguard Worker void SetClassSize(uint32_t new_class_size) 568*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 569*795d594fSAndroid Build Coastguard Worker 570*795d594fSAndroid Build Coastguard Worker // Adjust class-size during linking in case an overflow bitmap for reference 571*795d594fSAndroid Build Coastguard Worker // offsets is required. 572*795d594fSAndroid Build Coastguard Worker static size_t AdjustClassSizeForReferenceOffsetBitmapDuringLinking(ObjPtr<Class> klass, 573*795d594fSAndroid Build Coastguard Worker size_t class_size) 574*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 575*795d594fSAndroid Build Coastguard Worker 576*795d594fSAndroid Build Coastguard Worker // Compute how many bytes would be used a class with the given elements. 577*795d594fSAndroid Build Coastguard Worker static uint32_t ComputeClassSize(bool has_embedded_vtable, 578*795d594fSAndroid Build Coastguard Worker uint32_t num_vtable_entries, 579*795d594fSAndroid Build Coastguard Worker uint32_t num_8bit_static_fields, 580*795d594fSAndroid Build Coastguard Worker uint32_t num_16bit_static_fields, 581*795d594fSAndroid Build Coastguard Worker uint32_t num_32bit_static_fields, 582*795d594fSAndroid Build Coastguard Worker uint32_t num_64bit_static_fields, 583*795d594fSAndroid Build Coastguard Worker uint32_t num_ref_static_fields, 584*795d594fSAndroid Build Coastguard Worker uint32_t num_ref_bitmap_entries, 585*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size); 586*795d594fSAndroid Build Coastguard Worker 587*795d594fSAndroid Build Coastguard Worker // The size of java.lang.Class.class. ClassClassSize(PointerSize pointer_size)588*795d594fSAndroid Build Coastguard Worker static uint32_t ClassClassSize(PointerSize pointer_size) { 589*795d594fSAndroid Build Coastguard Worker // The number of vtable entries in java.lang.Class. 590*795d594fSAndroid Build Coastguard Worker uint32_t vtable_entries = Object::kVTableLength + 83; 591*795d594fSAndroid Build Coastguard Worker return ComputeClassSize(true, vtable_entries, 0, 0, 4, 1, 0, 0, pointer_size); 592*795d594fSAndroid Build Coastguard Worker } 593*795d594fSAndroid Build Coastguard Worker 594*795d594fSAndroid Build Coastguard Worker // The size of a java.lang.Class representing a primitive such as int.class. PrimitiveClassSize(PointerSize pointer_size)595*795d594fSAndroid Build Coastguard Worker static uint32_t PrimitiveClassSize(PointerSize pointer_size) { 596*795d594fSAndroid Build Coastguard Worker return ComputeClassSize(false, 0, 0, 0, 0, 0, 0, 0, pointer_size); 597*795d594fSAndroid Build Coastguard Worker } 598*795d594fSAndroid Build Coastguard Worker 599*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 600*795d594fSAndroid Build Coastguard Worker uint32_t GetObjectSize() REQUIRES_SHARED(Locks::mutator_lock_); ObjectSizeOffset()601*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset ObjectSizeOffset() { 602*795d594fSAndroid Build Coastguard Worker return OFFSET_OF_OBJECT_MEMBER(Class, object_size_); 603*795d594fSAndroid Build Coastguard Worker } ObjectSizeAllocFastPathOffset()604*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset ObjectSizeAllocFastPathOffset() { 605*795d594fSAndroid Build Coastguard Worker return OFFSET_OF_OBJECT_MEMBER(Class, object_size_alloc_fast_path_); 606*795d594fSAndroid Build Coastguard Worker } ClinitThreadIdOffset()607*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset ClinitThreadIdOffset() { 608*795d594fSAndroid Build Coastguard Worker return OFFSET_OF_OBJECT_MEMBER(Class, clinit_thread_id_); 609*795d594fSAndroid Build Coastguard Worker } 610*795d594fSAndroid Build Coastguard Worker 611*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetObjectSize(uint32_t new_object_size) REQUIRES_SHARED(Locks::mutator_lock_); 612*795d594fSAndroid Build Coastguard Worker 613*795d594fSAndroid Build Coastguard Worker void SetObjectSizeAllocFastPath(uint32_t new_object_size) REQUIRES_SHARED(Locks::mutator_lock_); 614*795d594fSAndroid Build Coastguard Worker 615*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 616*795d594fSAndroid Build Coastguard Worker uint32_t GetObjectSizeAllocFastPath() REQUIRES_SHARED(Locks::mutator_lock_); 617*795d594fSAndroid Build Coastguard Worker SetObjectSizeWithoutChecks(uint32_t new_object_size)618*795d594fSAndroid Build Coastguard Worker void SetObjectSizeWithoutChecks(uint32_t new_object_size) 619*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 620*795d594fSAndroid Build Coastguard Worker // Not called within a transaction. 621*795d594fSAndroid Build Coastguard Worker return SetField32<false, false, kVerifyNone>( 622*795d594fSAndroid Build Coastguard Worker OFFSET_OF_OBJECT_MEMBER(Class, object_size_), new_object_size); 623*795d594fSAndroid Build Coastguard Worker } 624*795d594fSAndroid Build Coastguard Worker 625*795d594fSAndroid Build Coastguard Worker // Returns true if this class is in the same packages as that class. 626*795d594fSAndroid Build Coastguard Worker bool IsInSamePackage(ObjPtr<Class> that) REQUIRES_SHARED(Locks::mutator_lock_); 627*795d594fSAndroid Build Coastguard Worker 628*795d594fSAndroid Build Coastguard Worker static bool IsInSamePackage(std::string_view descriptor1, std::string_view descriptor2); 629*795d594fSAndroid Build Coastguard Worker 630*795d594fSAndroid Build Coastguard Worker // Returns true if a class member should be discoverable with reflection given 631*795d594fSAndroid Build Coastguard Worker // the criteria. Some reflection calls only return public members 632*795d594fSAndroid Build Coastguard Worker // (public_only == true), some members should be hidden from non-boot class path 633*795d594fSAndroid Build Coastguard Worker // callers (hiddenapi_context). 634*795d594fSAndroid Build Coastguard Worker template<typename T> 635*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE static bool IsDiscoverable(bool public_only, 636*795d594fSAndroid Build Coastguard Worker const hiddenapi::AccessContext& access_context, 637*795d594fSAndroid Build Coastguard Worker T* member) 638*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 639*795d594fSAndroid Build Coastguard Worker 640*795d594fSAndroid Build Coastguard Worker // Returns true if this class can access that class. 641*795d594fSAndroid Build Coastguard Worker bool CanAccess(ObjPtr<Class> that) REQUIRES_SHARED(Locks::mutator_lock_); 642*795d594fSAndroid Build Coastguard Worker 643*795d594fSAndroid Build Coastguard Worker // Can this class access a member in the provided class with the provided member access flags? 644*795d594fSAndroid Build Coastguard Worker // Note that access to the class isn't checked in case the declaring class is protected and the 645*795d594fSAndroid Build Coastguard Worker // method has been exposed by a public sub-class 646*795d594fSAndroid Build Coastguard Worker bool CanAccessMember(ObjPtr<Class> access_to, uint32_t member_flags) 647*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 648*795d594fSAndroid Build Coastguard Worker 649*795d594fSAndroid Build Coastguard Worker // Can this class access a resolved field? 650*795d594fSAndroid Build Coastguard Worker // Note that access to field's class is checked and this may require looking up the class 651*795d594fSAndroid Build Coastguard Worker // referenced by the FieldId in the DexFile in case the declaring class is inaccessible. 652*795d594fSAndroid Build Coastguard Worker bool CanAccessResolvedField(ObjPtr<Class> access_to, 653*795d594fSAndroid Build Coastguard Worker ArtField* field, 654*795d594fSAndroid Build Coastguard Worker ObjPtr<DexCache> dex_cache, 655*795d594fSAndroid Build Coastguard Worker uint32_t field_idx) 656*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 657*795d594fSAndroid Build Coastguard Worker bool CheckResolvedFieldAccess(ObjPtr<Class> access_to, 658*795d594fSAndroid Build Coastguard Worker ArtField* field, 659*795d594fSAndroid Build Coastguard Worker ObjPtr<DexCache> dex_cache, 660*795d594fSAndroid Build Coastguard Worker uint32_t field_idx) 661*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 662*795d594fSAndroid Build Coastguard Worker 663*795d594fSAndroid Build Coastguard Worker bool IsSubClass(ObjPtr<Class> klass) REQUIRES_SHARED(Locks::mutator_lock_); 664*795d594fSAndroid Build Coastguard Worker 665*795d594fSAndroid Build Coastguard Worker // Can src be assigned to this class? For example, String can be assigned to Object (by an 666*795d594fSAndroid Build Coastguard Worker // upcast), however, an Object cannot be assigned to a String as a potentially exception throwing 667*795d594fSAndroid Build Coastguard Worker // downcast would be necessary. Similarly for interfaces, a class that implements (or an interface 668*795d594fSAndroid Build Coastguard Worker // that extends) another can be assigned to its parent, but not vice-versa. All Classes may assign 669*795d594fSAndroid Build Coastguard Worker // to themselves. Classes for primitive types may not assign to each other. 670*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool IsAssignableFrom(ObjPtr<Class> src) REQUIRES_SHARED(Locks::mutator_lock_); 671*795d594fSAndroid Build Coastguard Worker 672*795d594fSAndroid Build Coastguard Worker // Check if this class implements a given interface. 673*795d594fSAndroid Build Coastguard Worker bool Implements(ObjPtr<Class> klass) REQUIRES_SHARED(Locks::mutator_lock_); 674*795d594fSAndroid Build Coastguard Worker 675*795d594fSAndroid Build Coastguard Worker // Checks if 'klass' is a redefined version of this. 676*795d594fSAndroid Build Coastguard Worker bool IsObsoleteVersionOf(ObjPtr<Class> klass) REQUIRES_SHARED(Locks::mutator_lock_); 677*795d594fSAndroid Build Coastguard Worker 678*795d594fSAndroid Build Coastguard Worker ObjPtr<Class> GetObsoleteClass() REQUIRES_SHARED(Locks::mutator_lock_); 679*795d594fSAndroid Build Coastguard Worker 680*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 681*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 682*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ObjPtr<Class> GetSuperClass() REQUIRES_SHARED(Locks::mutator_lock_); 683*795d594fSAndroid Build Coastguard Worker 684*795d594fSAndroid Build Coastguard Worker // Get first common super class. It will never return null. 685*795d594fSAndroid Build Coastguard Worker // `This` and `klass` must be classes. 686*795d594fSAndroid Build Coastguard Worker ObjPtr<Class> GetCommonSuperClass(Handle<Class> klass) REQUIRES_SHARED(Locks::mutator_lock_); 687*795d594fSAndroid Build Coastguard Worker 688*795d594fSAndroid Build Coastguard Worker void SetSuperClass(ObjPtr<Class> new_super_class) REQUIRES_SHARED(Locks::mutator_lock_); 689*795d594fSAndroid Build Coastguard Worker 690*795d594fSAndroid Build Coastguard Worker bool HasSuperClass() REQUIRES_SHARED(Locks::mutator_lock_); 691*795d594fSAndroid Build Coastguard Worker SuperClassOffset()692*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset SuperClassOffset() { 693*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(Class, super_class_)); 694*795d594fSAndroid Build Coastguard Worker } 695*795d594fSAndroid Build Coastguard Worker 696*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 697*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 698*795d594fSAndroid Build Coastguard Worker ObjPtr<ClassLoader> GetClassLoader() ALWAYS_INLINE REQUIRES_SHARED(Locks::mutator_lock_); 699*795d594fSAndroid Build Coastguard Worker 700*795d594fSAndroid Build Coastguard Worker void SetClassLoader(ObjPtr<ClassLoader> new_cl) REQUIRES_SHARED(Locks::mutator_lock_); 701*795d594fSAndroid Build Coastguard Worker DexCacheOffset()702*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset DexCacheOffset() { 703*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(Class, dex_cache_)); 704*795d594fSAndroid Build Coastguard Worker } 705*795d594fSAndroid Build Coastguard Worker IfTableOffset()706*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset IfTableOffset() { 707*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(Class, iftable_)); 708*795d594fSAndroid Build Coastguard Worker } 709*795d594fSAndroid Build Coastguard Worker 710*795d594fSAndroid Build Coastguard Worker enum { 711*795d594fSAndroid Build Coastguard Worker kDumpClassFullDetail = 1, 712*795d594fSAndroid Build Coastguard Worker kDumpClassClassLoader = (1 << 1), 713*795d594fSAndroid Build Coastguard Worker kDumpClassInitialized = (1 << 2), 714*795d594fSAndroid Build Coastguard Worker }; 715*795d594fSAndroid Build Coastguard Worker 716*795d594fSAndroid Build Coastguard Worker void DumpClass(std::ostream& os, int flags) REQUIRES_SHARED(Locks::mutator_lock_); 717*795d594fSAndroid Build Coastguard Worker 718*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 719*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 720*795d594fSAndroid Build Coastguard Worker ObjPtr<DexCache> GetDexCache() REQUIRES_SHARED(Locks::mutator_lock_); 721*795d594fSAndroid Build Coastguard Worker 722*795d594fSAndroid Build Coastguard Worker // Also updates the dex_cache_strings_ variable from new_dex_cache. 723*795d594fSAndroid Build Coastguard Worker void SetDexCache(ObjPtr<DexCache> new_dex_cache) REQUIRES_SHARED(Locks::mutator_lock_); 724*795d594fSAndroid Build Coastguard Worker 725*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetDirectMethods(PointerSize pointer_size) 726*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 727*795d594fSAndroid Build Coastguard Worker 728*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE LengthPrefixedArray<ArtMethod>* GetMethodsPtr() 729*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 730*795d594fSAndroid Build Coastguard Worker MethodsOffset()731*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset MethodsOffset() { 732*795d594fSAndroid Build Coastguard Worker return MemberOffset(OFFSETOF_MEMBER(Class, methods_)); 733*795d594fSAndroid Build Coastguard Worker } 734*795d594fSAndroid Build Coastguard Worker 735*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetMethods(PointerSize pointer_size) 736*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 737*795d594fSAndroid Build Coastguard Worker 738*795d594fSAndroid Build Coastguard Worker void SetMethodsPtr(LengthPrefixedArray<ArtMethod>* new_methods, 739*795d594fSAndroid Build Coastguard Worker uint32_t num_direct, 740*795d594fSAndroid Build Coastguard Worker uint32_t num_virtual) 741*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 742*795d594fSAndroid Build Coastguard Worker // Used by image writer. 743*795d594fSAndroid Build Coastguard Worker void SetMethodsPtrUnchecked(LengthPrefixedArray<ArtMethod>* new_methods, 744*795d594fSAndroid Build Coastguard Worker uint32_t num_direct, 745*795d594fSAndroid Build Coastguard Worker uint32_t num_virtual) 746*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 747*795d594fSAndroid Build Coastguard Worker 748*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 749*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetDirectMethodsSlice(PointerSize pointer_size) 750*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 751*795d594fSAndroid Build Coastguard Worker 752*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArtMethod* GetDirectMethod(size_t i, PointerSize pointer_size) 753*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 754*795d594fSAndroid Build Coastguard Worker 755*795d594fSAndroid Build Coastguard Worker // Use only when we are allocating populating the method arrays. 756*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArtMethod* GetDirectMethodUnchecked(size_t i, PointerSize pointer_size) 757*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 758*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArtMethod* GetVirtualMethodUnchecked(size_t i, PointerSize pointer_size) 759*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 760*795d594fSAndroid Build Coastguard Worker 761*795d594fSAndroid Build Coastguard Worker // Returns the number of static, private, and constructor methods. 762*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t NumDirectMethods() REQUIRES_SHARED(Locks::mutator_lock_); 763*795d594fSAndroid Build Coastguard Worker 764*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 765*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetMethodsSlice(PointerSize pointer_size) 766*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 767*795d594fSAndroid Build Coastguard Worker 768*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 769*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetDeclaredMethodsSlice(PointerSize pointer_size) 770*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 771*795d594fSAndroid Build Coastguard Worker 772*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetDeclaredMethods( 773*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 774*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 775*795d594fSAndroid Build Coastguard Worker 776*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize> 777*795d594fSAndroid Build Coastguard Worker static ObjPtr<Method> GetDeclaredMethodInternal( 778*795d594fSAndroid Build Coastguard Worker Thread* self, 779*795d594fSAndroid Build Coastguard Worker ObjPtr<Class> klass, 780*795d594fSAndroid Build Coastguard Worker ObjPtr<String> name, 781*795d594fSAndroid Build Coastguard Worker ObjPtr<ObjectArray<Class>> args, 782*795d594fSAndroid Build Coastguard Worker const std::function<hiddenapi::AccessContext()>& fn_get_access_context) 783*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 784*795d594fSAndroid Build Coastguard Worker 785*795d594fSAndroid Build Coastguard Worker template <PointerSize kPointerSize> 786*795d594fSAndroid Build Coastguard Worker static ObjPtr<Constructor> GetDeclaredConstructorInternal(Thread* self, 787*795d594fSAndroid Build Coastguard Worker ObjPtr<Class> klass, 788*795d594fSAndroid Build Coastguard Worker ObjPtr<ObjectArray<Class>> args) 789*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 790*795d594fSAndroid Build Coastguard Worker 791*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 792*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetDeclaredVirtualMethodsSlice(PointerSize pointer_size) 793*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 794*795d594fSAndroid Build Coastguard Worker 795*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetDeclaredVirtualMethods( 796*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 797*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 798*795d594fSAndroid Build Coastguard Worker 799*795d594fSAndroid Build Coastguard Worker // The index in the methods_ array where the first copied method is. 800*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t GetCopiedMethodsStartOffset() REQUIRES_SHARED(Locks::mutator_lock_); 801*795d594fSAndroid Build Coastguard Worker 802*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 803*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetCopiedMethodsSlice(PointerSize pointer_size) 804*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 805*795d594fSAndroid Build Coastguard Worker 806*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetCopiedMethods(PointerSize pointer_size) 807*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 808*795d594fSAndroid Build Coastguard Worker 809*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 810*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetVirtualMethodsSlice(PointerSize pointer_size) 811*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 812*795d594fSAndroid Build Coastguard Worker 813*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetVirtualMethods( 814*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 815*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 816*795d594fSAndroid Build Coastguard Worker 817*795d594fSAndroid Build Coastguard Worker // Returns the number of non-inherited virtual methods (sum of declared and copied methods). 818*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t NumVirtualMethods() REQUIRES_SHARED(Locks::mutator_lock_); 819*795d594fSAndroid Build Coastguard Worker 820*795d594fSAndroid Build Coastguard Worker // Returns the number of copied virtual methods. 821*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t NumCopiedVirtualMethods() REQUIRES_SHARED(Locks::mutator_lock_); 822*795d594fSAndroid Build Coastguard Worker 823*795d594fSAndroid Build Coastguard Worker // Returns the number of declared virtual methods. 824*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t NumDeclaredVirtualMethods() REQUIRES_SHARED(Locks::mutator_lock_); 825*795d594fSAndroid Build Coastguard Worker 826*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t NumMethods() REQUIRES_SHARED(Locks::mutator_lock_); 827*795d594fSAndroid Build Coastguard Worker static ALWAYS_INLINE uint32_t NumMethods(LengthPrefixedArray<ArtMethod>* methods) 828*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 829*795d594fSAndroid Build Coastguard Worker 830*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 831*795d594fSAndroid Build Coastguard Worker ArtMethod* GetVirtualMethod(size_t i, PointerSize pointer_size) 832*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 833*795d594fSAndroid Build Coastguard Worker 834*795d594fSAndroid Build Coastguard Worker ArtMethod* GetVirtualMethodDuringLinking(size_t i, PointerSize pointer_size) 835*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 836*795d594fSAndroid Build Coastguard Worker 837*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 838*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 839*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ObjPtr<PointerArray> GetVTable() REQUIRES_SHARED(Locks::mutator_lock_); 840*795d594fSAndroid Build Coastguard Worker 841*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ObjPtr<PointerArray> GetVTableDuringLinking() REQUIRES_SHARED(Locks::mutator_lock_); 842*795d594fSAndroid Build Coastguard Worker 843*795d594fSAndroid Build Coastguard Worker void SetVTable(ObjPtr<PointerArray> new_vtable) REQUIRES_SHARED(Locks::mutator_lock_); 844*795d594fSAndroid Build Coastguard Worker VTableOffset()845*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset VTableOffset() { 846*795d594fSAndroid Build Coastguard Worker return OFFSET_OF_OBJECT_MEMBER(Class, vtable_); 847*795d594fSAndroid Build Coastguard Worker } 848*795d594fSAndroid Build Coastguard Worker EmbeddedVTableLengthOffset()849*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset EmbeddedVTableLengthOffset() { 850*795d594fSAndroid Build Coastguard Worker return MemberOffset(sizeof(Class)); 851*795d594fSAndroid Build Coastguard Worker } 852*795d594fSAndroid Build Coastguard Worker ImtPtrOffset(PointerSize pointer_size)853*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset ImtPtrOffset(PointerSize pointer_size) { 854*795d594fSAndroid Build Coastguard Worker return MemberOffset( 855*795d594fSAndroid Build Coastguard Worker RoundUp(EmbeddedVTableLengthOffset().Uint32Value() + sizeof(uint32_t), 856*795d594fSAndroid Build Coastguard Worker static_cast<size_t>(pointer_size))); 857*795d594fSAndroid Build Coastguard Worker } 858*795d594fSAndroid Build Coastguard Worker EmbeddedVTableOffset(PointerSize pointer_size)859*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset EmbeddedVTableOffset(PointerSize pointer_size) { 860*795d594fSAndroid Build Coastguard Worker return MemberOffset( 861*795d594fSAndroid Build Coastguard Worker ImtPtrOffset(pointer_size).Uint32Value() + static_cast<size_t>(pointer_size)); 862*795d594fSAndroid Build Coastguard Worker } 863*795d594fSAndroid Build Coastguard Worker 864*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 865*795d594fSAndroid Build Coastguard Worker bool ShouldHaveImt() REQUIRES_SHARED(Locks::mutator_lock_); 866*795d594fSAndroid Build Coastguard Worker 867*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 868*795d594fSAndroid Build Coastguard Worker bool ShouldHaveEmbeddedVTable() REQUIRES_SHARED(Locks::mutator_lock_); 869*795d594fSAndroid Build Coastguard Worker 870*795d594fSAndroid Build Coastguard Worker bool HasVTable() REQUIRES_SHARED(Locks::mutator_lock_); 871*795d594fSAndroid Build Coastguard Worker 872*795d594fSAndroid Build Coastguard Worker static MemberOffset EmbeddedVTableEntryOffset(uint32_t i, PointerSize pointer_size); 873*795d594fSAndroid Build Coastguard Worker 874*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 875*795d594fSAndroid Build Coastguard Worker int32_t GetVTableLength() REQUIRES_SHARED(Locks::mutator_lock_); 876*795d594fSAndroid Build Coastguard Worker 877*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 878*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 879*795d594fSAndroid Build Coastguard Worker ArtMethod* GetVTableEntry(uint32_t i, PointerSize pointer_size) 880*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 881*795d594fSAndroid Build Coastguard Worker 882*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 883*795d594fSAndroid Build Coastguard Worker int32_t GetEmbeddedVTableLength() REQUIRES_SHARED(Locks::mutator_lock_); 884*795d594fSAndroid Build Coastguard Worker 885*795d594fSAndroid Build Coastguard Worker void SetEmbeddedVTableLength(int32_t len) REQUIRES_SHARED(Locks::mutator_lock_); 886*795d594fSAndroid Build Coastguard Worker 887*795d594fSAndroid Build Coastguard Worker ImTable* GetImt(PointerSize pointer_size) REQUIRES_SHARED(Locks::mutator_lock_); 888*795d594fSAndroid Build Coastguard Worker 889*795d594fSAndroid Build Coastguard Worker void SetImt(ImTable* imt, PointerSize pointer_size) REQUIRES_SHARED(Locks::mutator_lock_); 890*795d594fSAndroid Build Coastguard Worker 891*795d594fSAndroid Build Coastguard Worker ImTable* FindSuperImt(PointerSize pointer_size) REQUIRES_SHARED(Locks::mutator_lock_); 892*795d594fSAndroid Build Coastguard Worker 893*795d594fSAndroid Build Coastguard Worker ArtMethod* GetEmbeddedVTableEntry(uint32_t i, PointerSize pointer_size) 894*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 895*795d594fSAndroid Build Coastguard Worker 896*795d594fSAndroid Build Coastguard Worker void SetEmbeddedVTableEntry(uint32_t i, ArtMethod* method, PointerSize pointer_size) 897*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 898*795d594fSAndroid Build Coastguard Worker 899*795d594fSAndroid Build Coastguard Worker inline void SetEmbeddedVTableEntryUnchecked(uint32_t i, 900*795d594fSAndroid Build Coastguard Worker ArtMethod* method, 901*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 902*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 903*795d594fSAndroid Build Coastguard Worker 904*795d594fSAndroid Build Coastguard Worker void PopulateEmbeddedVTable(PointerSize pointer_size) 905*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 906*795d594fSAndroid Build Coastguard Worker 907*795d594fSAndroid Build Coastguard Worker template <VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 908*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 909*795d594fSAndroid Build Coastguard Worker void VerifyOverflowReferenceBitmap() REQUIRES_SHARED(Locks::mutator_lock_); 910*795d594fSAndroid Build Coastguard Worker // If the bitmap in `reference_instance_offsets_` was found to be insufficient 911*795d594fSAndroid Build Coastguard Worker // in CreateReferenceInstanceOffsets(), then populate the overflow bitmap, 912*795d594fSAndroid Build Coastguard Worker // which is at the end of class object. 913*795d594fSAndroid Build Coastguard Worker void PopulateReferenceOffsetBitmap() REQUIRES_SHARED(Locks::mutator_lock_); 914*795d594fSAndroid Build Coastguard Worker 915*795d594fSAndroid Build Coastguard Worker // Given a method implemented by this class but potentially from a super class, return the 916*795d594fSAndroid Build Coastguard Worker // specific implementation method for this class. 917*795d594fSAndroid Build Coastguard Worker ArtMethod* FindVirtualMethodForVirtual(ArtMethod* method, PointerSize pointer_size) 918*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 919*795d594fSAndroid Build Coastguard Worker 920*795d594fSAndroid Build Coastguard Worker // Given a method implemented by this class' super class, return the specific implementation 921*795d594fSAndroid Build Coastguard Worker // method for this class. 922*795d594fSAndroid Build Coastguard Worker ArtMethod* FindVirtualMethodForSuper(ArtMethod* method, PointerSize pointer_size) 923*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 924*795d594fSAndroid Build Coastguard Worker 925*795d594fSAndroid Build Coastguard Worker // Given a method from some implementor of this interface, return the specific implementation 926*795d594fSAndroid Build Coastguard Worker // method for this class. 927*795d594fSAndroid Build Coastguard Worker ArtMethod* FindVirtualMethodForInterfaceSuper(ArtMethod* method, PointerSize pointer_size) 928*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 929*795d594fSAndroid Build Coastguard Worker 930*795d594fSAndroid Build Coastguard Worker // Given a method implemented by this class, but potentially from a 931*795d594fSAndroid Build Coastguard Worker // super class or interface, return the specific implementation 932*795d594fSAndroid Build Coastguard Worker // method for this class. 933*795d594fSAndroid Build Coastguard Worker ArtMethod* FindVirtualMethodForInterface(ArtMethod* method, PointerSize pointer_size) 934*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) ALWAYS_INLINE; 935*795d594fSAndroid Build Coastguard Worker 936*795d594fSAndroid Build Coastguard Worker ArtMethod* FindVirtualMethodForVirtualOrInterface(ArtMethod* method, PointerSize pointer_size) 937*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 938*795d594fSAndroid Build Coastguard Worker 939*795d594fSAndroid Build Coastguard Worker // Find a method with the given name and signature in an interface class. 940*795d594fSAndroid Build Coastguard Worker // 941*795d594fSAndroid Build Coastguard Worker // Search for the method declared in the class, then search for a method declared in any 942*795d594fSAndroid Build Coastguard Worker // superinterface, then search the superclass java.lang.Object (implicitly declared methods 943*795d594fSAndroid Build Coastguard Worker // in an interface without superinterfaces, see JLS 9.2, can be inherited, see JLS 9.4.1). 944*795d594fSAndroid Build Coastguard Worker // TODO: Implement search for a unique maximally-specific non-abstract superinterface method. 945*795d594fSAndroid Build Coastguard Worker 946*795d594fSAndroid Build Coastguard Worker ArtMethod* FindInterfaceMethod(std::string_view name, 947*795d594fSAndroid Build Coastguard Worker std::string_view signature, 948*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 949*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 950*795d594fSAndroid Build Coastguard Worker 951*795d594fSAndroid Build Coastguard Worker ArtMethod* FindInterfaceMethod(std::string_view name, 952*795d594fSAndroid Build Coastguard Worker const Signature& signature, 953*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 954*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 955*795d594fSAndroid Build Coastguard Worker 956*795d594fSAndroid Build Coastguard Worker ArtMethod* FindInterfaceMethod(ObjPtr<DexCache> dex_cache, 957*795d594fSAndroid Build Coastguard Worker uint32_t dex_method_idx, 958*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 959*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 960*795d594fSAndroid Build Coastguard Worker 961*795d594fSAndroid Build Coastguard Worker // Return the first public SDK method from the list of interfaces implemented by 962*795d594fSAndroid Build Coastguard Worker // this class. 963*795d594fSAndroid Build Coastguard Worker ArtMethod* FindAccessibleInterfaceMethod(ArtMethod* implementation_method, 964*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 965*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 966*795d594fSAndroid Build Coastguard Worker 967*795d594fSAndroid Build Coastguard Worker // Find a method with the given name and signature in a non-interface class. 968*795d594fSAndroid Build Coastguard Worker // 969*795d594fSAndroid Build Coastguard Worker // Search for the method in the class, following the JLS rules which conflict with the RI 970*795d594fSAndroid Build Coastguard Worker // in some cases. The JLS says that inherited methods are searched (JLS 15.12.2.1) and 971*795d594fSAndroid Build Coastguard Worker // these can come from a superclass or a superinterface (JLS 8.4.8). We perform the 972*795d594fSAndroid Build Coastguard Worker // following search: 973*795d594fSAndroid Build Coastguard Worker // 1. Search the methods declared directly in the class. If we find a method with the 974*795d594fSAndroid Build Coastguard Worker // given name and signature, return that method. 975*795d594fSAndroid Build Coastguard Worker // 2. Search the methods declared in superclasses until we find a method with the given 976*795d594fSAndroid Build Coastguard Worker // signature or complete the search in java.lang.Object. If we find a method with the 977*795d594fSAndroid Build Coastguard Worker // given name and signature, check if it's been inherited by the class where we're 978*795d594fSAndroid Build Coastguard Worker // performing the lookup (qualifying type). If it's inherited, return it. Otherwise, 979*795d594fSAndroid Build Coastguard Worker // just remember the method and its declaring class and proceed to step 3. 980*795d594fSAndroid Build Coastguard Worker // 3. Search "copied" methods (containing methods inherited from interfaces) in the class 981*795d594fSAndroid Build Coastguard Worker // and its superclass chain. If we found a method in step 2 (which was not inherited, 982*795d594fSAndroid Build Coastguard Worker // otherwise we would not be performing step 3), end the search when we reach its 983*795d594fSAndroid Build Coastguard Worker // declaring class, otherwise search the entire superclass chain. If we find a method 984*795d594fSAndroid Build Coastguard Worker // with the given name and signature, return that method. 985*795d594fSAndroid Build Coastguard Worker // 4. Return the method found in step 2 if any (not inherited), or null. 986*795d594fSAndroid Build Coastguard Worker // 987*795d594fSAndroid Build Coastguard Worker // It's the responsibility of the caller to throw exceptions if the returned method (or null) 988*795d594fSAndroid Build Coastguard Worker // does not satisfy the request. Special consideration should be given to the case where this 989*795d594fSAndroid Build Coastguard Worker // function returns a method that's not inherited (found in step 2, returned in step 4). 990*795d594fSAndroid Build Coastguard Worker 991*795d594fSAndroid Build Coastguard Worker ArtMethod* FindClassMethod(std::string_view name, 992*795d594fSAndroid Build Coastguard Worker std::string_view signature, 993*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 994*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 995*795d594fSAndroid Build Coastguard Worker 996*795d594fSAndroid Build Coastguard Worker ArtMethod* FindClassMethod(std::string_view name, 997*795d594fSAndroid Build Coastguard Worker const Signature& signature, 998*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 999*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1000*795d594fSAndroid Build Coastguard Worker 1001*795d594fSAndroid Build Coastguard Worker ArtMethod* FindClassMethod(ObjPtr<DexCache> dex_cache, 1002*795d594fSAndroid Build Coastguard Worker uint32_t dex_method_idx, 1003*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 1004*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1005*795d594fSAndroid Build Coastguard Worker 1006*795d594fSAndroid Build Coastguard Worker ArtMethod* FindConstructor(std::string_view signature, PointerSize pointer_size) 1007*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1008*795d594fSAndroid Build Coastguard Worker 1009*795d594fSAndroid Build Coastguard Worker ArtMethod* FindDeclaredVirtualMethodByName(std::string_view name, PointerSize pointer_size) 1010*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1011*795d594fSAndroid Build Coastguard Worker 1012*795d594fSAndroid Build Coastguard Worker ArtMethod* FindDeclaredDirectMethodByName(std::string_view name, PointerSize pointer_size) 1013*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1014*795d594fSAndroid Build Coastguard Worker 1015*795d594fSAndroid Build Coastguard Worker ArtMethod* FindClassInitializer(PointerSize pointer_size) REQUIRES_SHARED(Locks::mutator_lock_); 1016*795d594fSAndroid Build Coastguard Worker HasDefaultMethods()1017*795d594fSAndroid Build Coastguard Worker bool HasDefaultMethods() REQUIRES_SHARED(Locks::mutator_lock_) { 1018*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags() & kAccHasDefaultMethod) != 0; 1019*795d594fSAndroid Build Coastguard Worker } 1020*795d594fSAndroid Build Coastguard Worker HasBeenRecursivelyInitialized()1021*795d594fSAndroid Build Coastguard Worker bool HasBeenRecursivelyInitialized() REQUIRES_SHARED(Locks::mutator_lock_) { 1022*795d594fSAndroid Build Coastguard Worker return (GetAccessFlags() & kAccRecursivelyInitialized) != 0; 1023*795d594fSAndroid Build Coastguard Worker } 1024*795d594fSAndroid Build Coastguard Worker 1025*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 1026*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE int32_t GetIfTableCount() REQUIRES_SHARED(Locks::mutator_lock_); 1027*795d594fSAndroid Build Coastguard Worker 1028*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 1029*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 1030*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ObjPtr<IfTable> GetIfTable() REQUIRES_SHARED(Locks::mutator_lock_); 1031*795d594fSAndroid Build Coastguard Worker 1032*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetIfTable(ObjPtr<IfTable> new_iftable) 1033*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1034*795d594fSAndroid Build Coastguard Worker 1035*795d594fSAndroid Build Coastguard Worker // Get instance fields of the class (See also GetSFields). 1036*795d594fSAndroid Build Coastguard Worker LengthPrefixedArray<ArtField>* GetIFieldsPtr() REQUIRES_SHARED(Locks::mutator_lock_); 1037*795d594fSAndroid Build Coastguard Worker 1038*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE IterationRange<StrideIterator<ArtField>> GetIFields() 1039*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1040*795d594fSAndroid Build Coastguard Worker 1041*795d594fSAndroid Build Coastguard Worker void SetIFieldsPtr(LengthPrefixedArray<ArtField>* new_ifields) 1042*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1043*795d594fSAndroid Build Coastguard Worker 1044*795d594fSAndroid Build Coastguard Worker // Unchecked edition has no verification flags. 1045*795d594fSAndroid Build Coastguard Worker void SetIFieldsPtrUnchecked(LengthPrefixedArray<ArtField>* new_sfields) 1046*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1047*795d594fSAndroid Build Coastguard Worker 1048*795d594fSAndroid Build Coastguard Worker uint32_t NumInstanceFields() REQUIRES_SHARED(Locks::mutator_lock_); 1049*795d594fSAndroid Build Coastguard Worker ArtField* GetInstanceField(uint32_t i) REQUIRES_SHARED(Locks::mutator_lock_); 1050*795d594fSAndroid Build Coastguard Worker 1051*795d594fSAndroid Build Coastguard Worker // Returns the number of instance fields containing reference types. Does not count fields in any 1052*795d594fSAndroid Build Coastguard Worker // super classes. 1053*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> NumReferenceInstanceFields()1054*795d594fSAndroid Build Coastguard Worker uint32_t NumReferenceInstanceFields() REQUIRES_SHARED(Locks::mutator_lock_) { 1055*795d594fSAndroid Build Coastguard Worker DCHECK(IsResolved<kVerifyFlags>()); 1056*795d594fSAndroid Build Coastguard Worker return GetField32<kVerifyFlags>(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_instance_fields_)); 1057*795d594fSAndroid Build Coastguard Worker } 1058*795d594fSAndroid Build Coastguard Worker NumReferenceInstanceFieldsDuringLinking()1059*795d594fSAndroid Build Coastguard Worker uint32_t NumReferenceInstanceFieldsDuringLinking() REQUIRES_SHARED(Locks::mutator_lock_) { 1060*795d594fSAndroid Build Coastguard Worker DCHECK(IsLoaded() || IsErroneous()); 1061*795d594fSAndroid Build Coastguard Worker return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_instance_fields_)); 1062*795d594fSAndroid Build Coastguard Worker } 1063*795d594fSAndroid Build Coastguard Worker SetNumReferenceInstanceFields(uint32_t new_num)1064*795d594fSAndroid Build Coastguard Worker void SetNumReferenceInstanceFields(uint32_t new_num) REQUIRES_SHARED(Locks::mutator_lock_) { 1065*795d594fSAndroid Build Coastguard Worker // Not called within a transaction. 1066*795d594fSAndroid Build Coastguard Worker SetField32<false>(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_instance_fields_), new_num); 1067*795d594fSAndroid Build Coastguard Worker } 1068*795d594fSAndroid Build Coastguard Worker 1069*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 1070*795d594fSAndroid Build Coastguard Worker uint32_t GetReferenceInstanceOffsets() ALWAYS_INLINE REQUIRES_SHARED(Locks::mutator_lock_); 1071*795d594fSAndroid Build Coastguard Worker 1072*795d594fSAndroid Build Coastguard Worker void SetReferenceInstanceOffsets(uint32_t new_reference_offsets) 1073*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1074*795d594fSAndroid Build Coastguard Worker 1075*795d594fSAndroid Build Coastguard Worker // Get the offset of the first reference instance field. Other reference instance fields follow. 1076*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 1077*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 1078*795d594fSAndroid Build Coastguard Worker MemberOffset GetFirstReferenceInstanceFieldOffset() 1079*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1080*795d594fSAndroid Build Coastguard Worker 1081*795d594fSAndroid Build Coastguard Worker // Returns the number of static fields containing reference types. 1082*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> NumReferenceStaticFields()1083*795d594fSAndroid Build Coastguard Worker uint32_t NumReferenceStaticFields() REQUIRES_SHARED(Locks::mutator_lock_) { 1084*795d594fSAndroid Build Coastguard Worker DCHECK(IsResolved<kVerifyFlags>()); 1085*795d594fSAndroid Build Coastguard Worker return GetField32<kVerifyFlags>(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_static_fields_)); 1086*795d594fSAndroid Build Coastguard Worker } 1087*795d594fSAndroid Build Coastguard Worker NumReferenceStaticFieldsDuringLinking()1088*795d594fSAndroid Build Coastguard Worker uint32_t NumReferenceStaticFieldsDuringLinking() REQUIRES_SHARED(Locks::mutator_lock_) { 1089*795d594fSAndroid Build Coastguard Worker DCHECK(IsLoaded() || IsErroneous() || IsRetired()); 1090*795d594fSAndroid Build Coastguard Worker return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_static_fields_)); 1091*795d594fSAndroid Build Coastguard Worker } 1092*795d594fSAndroid Build Coastguard Worker SetNumReferenceStaticFields(uint32_t new_num)1093*795d594fSAndroid Build Coastguard Worker void SetNumReferenceStaticFields(uint32_t new_num) REQUIRES_SHARED(Locks::mutator_lock_) { 1094*795d594fSAndroid Build Coastguard Worker // Not called within a transaction. 1095*795d594fSAndroid Build Coastguard Worker SetField32<false>(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_static_fields_), new_num); 1096*795d594fSAndroid Build Coastguard Worker } 1097*795d594fSAndroid Build Coastguard Worker 1098*795d594fSAndroid Build Coastguard Worker // Get the offset of the first reference static field. Other reference static fields follow. 1099*795d594fSAndroid Build Coastguard Worker template <VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 1100*795d594fSAndroid Build Coastguard Worker MemberOffset GetFirstReferenceStaticFieldOffset(PointerSize pointer_size) 1101*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1102*795d594fSAndroid Build Coastguard Worker 1103*795d594fSAndroid Build Coastguard Worker // Get the offset of the first reference static field. Other reference static fields follow. 1104*795d594fSAndroid Build Coastguard Worker MemberOffset GetFirstReferenceStaticFieldOffsetDuringLinking(PointerSize pointer_size) 1105*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1106*795d594fSAndroid Build Coastguard Worker 1107*795d594fSAndroid Build Coastguard Worker // Gets the static fields of the class. 1108*795d594fSAndroid Build Coastguard Worker LengthPrefixedArray<ArtField>* GetSFieldsPtr() REQUIRES_SHARED(Locks::mutator_lock_); 1109*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE IterationRange<StrideIterator<ArtField>> GetSFields() 1110*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1111*795d594fSAndroid Build Coastguard Worker 1112*795d594fSAndroid Build Coastguard Worker void SetSFieldsPtr(LengthPrefixedArray<ArtField>* new_sfields) 1113*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1114*795d594fSAndroid Build Coastguard Worker 1115*795d594fSAndroid Build Coastguard Worker // Unchecked edition has no verification flags. 1116*795d594fSAndroid Build Coastguard Worker void SetSFieldsPtrUnchecked(LengthPrefixedArray<ArtField>* new_sfields) 1117*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1118*795d594fSAndroid Build Coastguard Worker 1119*795d594fSAndroid Build Coastguard Worker uint32_t NumStaticFields() REQUIRES_SHARED(Locks::mutator_lock_); 1120*795d594fSAndroid Build Coastguard Worker 1121*795d594fSAndroid Build Coastguard Worker // TODO: uint16_t 1122*795d594fSAndroid Build Coastguard Worker ArtField* GetStaticField(uint32_t i) REQUIRES_SHARED(Locks::mutator_lock_); 1123*795d594fSAndroid Build Coastguard Worker 1124*795d594fSAndroid Build Coastguard Worker // Find a static or instance field using the JLS resolution order 1125*795d594fSAndroid Build Coastguard Worker ArtField* FindField(ObjPtr<mirror::DexCache> dex_cache, uint32_t field_idx) 1126*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1127*795d594fSAndroid Build Coastguard Worker 1128*795d594fSAndroid Build Coastguard Worker // Finds the given instance field in this class or a superclass. 1129*795d594fSAndroid Build Coastguard Worker ArtField* FindInstanceField(std::string_view name, std::string_view type) 1130*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1131*795d594fSAndroid Build Coastguard Worker 1132*795d594fSAndroid Build Coastguard Worker // Finds the given instance field in this class or a superclass, only searches classes that 1133*795d594fSAndroid Build Coastguard Worker // have the same dex cache. 1134*795d594fSAndroid Build Coastguard Worker ArtField* FindInstanceField(ObjPtr<DexCache> dex_cache, uint32_t dex_field_idx) 1135*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1136*795d594fSAndroid Build Coastguard Worker 1137*795d594fSAndroid Build Coastguard Worker ArtField* FindDeclaredInstanceField(std::string_view name, std::string_view type) 1138*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1139*795d594fSAndroid Build Coastguard Worker 1140*795d594fSAndroid Build Coastguard Worker ArtField* FindDeclaredInstanceField(ObjPtr<DexCache> dex_cache, uint32_t dex_field_idx) 1141*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1142*795d594fSAndroid Build Coastguard Worker 1143*795d594fSAndroid Build Coastguard Worker // Finds the given static field in this class or a superclass. 1144*795d594fSAndroid Build Coastguard Worker ArtField* FindStaticField(std::string_view name, std::string_view type) 1145*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1146*795d594fSAndroid Build Coastguard Worker 1147*795d594fSAndroid Build Coastguard Worker // Finds the given static field in this class or superclass, only searches classes that 1148*795d594fSAndroid Build Coastguard Worker // have the same dex cache. 1149*795d594fSAndroid Build Coastguard Worker ArtField* FindStaticField(ObjPtr<DexCache> dex_cache, uint32_t dex_field_idx) 1150*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1151*795d594fSAndroid Build Coastguard Worker 1152*795d594fSAndroid Build Coastguard Worker ArtField* FindDeclaredStaticField(std::string_view name, std::string_view type) 1153*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1154*795d594fSAndroid Build Coastguard Worker 1155*795d594fSAndroid Build Coastguard Worker ArtField* FindDeclaredStaticField(ObjPtr<DexCache> dex_cache, uint32_t dex_field_idx) 1156*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1157*795d594fSAndroid Build Coastguard Worker 1158*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::ObjectArray<mirror::Field>> GetDeclaredFields(Thread* self, 1159*795d594fSAndroid Build Coastguard Worker bool public_only, 1160*795d594fSAndroid Build Coastguard Worker bool force_resolve) 1161*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1162*795d594fSAndroid Build Coastguard Worker 1163*795d594fSAndroid Build Coastguard Worker GetClinitThreadId()1164*795d594fSAndroid Build Coastguard Worker pid_t GetClinitThreadId() REQUIRES_SHARED(Locks::mutator_lock_) { 1165*795d594fSAndroid Build Coastguard Worker DCHECK(IsIdxLoaded() || IsErroneous()) << PrettyClass(); 1166*795d594fSAndroid Build Coastguard Worker return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, clinit_thread_id_)); 1167*795d594fSAndroid Build Coastguard Worker } 1168*795d594fSAndroid Build Coastguard Worker 1169*795d594fSAndroid Build Coastguard Worker void SetClinitThreadId(pid_t new_clinit_thread_id) REQUIRES_SHARED(Locks::mutator_lock_); 1170*795d594fSAndroid Build Coastguard Worker 1171*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 1172*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 1173*795d594fSAndroid Build Coastguard Worker ObjPtr<ClassExt> GetExtData() REQUIRES_SHARED(Locks::mutator_lock_); 1174*795d594fSAndroid Build Coastguard Worker 1175*795d594fSAndroid Build Coastguard Worker // Returns the ExtData for this class, allocating one if necessary. This should be the only way 1176*795d594fSAndroid Build Coastguard Worker // to force ext_data_ to be set. No functions are available for changing an already set ext_data_ 1177*795d594fSAndroid Build Coastguard Worker // since doing so is not allowed. 1178*795d594fSAndroid Build Coastguard Worker static ObjPtr<ClassExt> EnsureExtDataPresent(Handle<Class> h_this, Thread* self) 1179*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); 1180*795d594fSAndroid Build Coastguard Worker GetDexClassDefIndex()1181*795d594fSAndroid Build Coastguard Worker uint16_t GetDexClassDefIndex() REQUIRES_SHARED(Locks::mutator_lock_) { 1182*795d594fSAndroid Build Coastguard Worker return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, dex_class_def_idx_)); 1183*795d594fSAndroid Build Coastguard Worker } 1184*795d594fSAndroid Build Coastguard Worker SetDexClassDefIndex(uint16_t class_def_idx)1185*795d594fSAndroid Build Coastguard Worker void SetDexClassDefIndex(uint16_t class_def_idx) REQUIRES_SHARED(Locks::mutator_lock_) { 1186*795d594fSAndroid Build Coastguard Worker SetField32</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>( 1187*795d594fSAndroid Build Coastguard Worker OFFSET_OF_OBJECT_MEMBER(Class, dex_class_def_idx_), class_def_idx); 1188*795d594fSAndroid Build Coastguard Worker } 1189*795d594fSAndroid Build Coastguard Worker GetDexTypeIndex()1190*795d594fSAndroid Build Coastguard Worker dex::TypeIndex GetDexTypeIndex() REQUIRES_SHARED(Locks::mutator_lock_) { 1191*795d594fSAndroid Build Coastguard Worker return dex::TypeIndex( 1192*795d594fSAndroid Build Coastguard Worker static_cast<uint16_t>(GetField32(OFFSET_OF_OBJECT_MEMBER(Class, dex_type_idx_)))); 1193*795d594fSAndroid Build Coastguard Worker } 1194*795d594fSAndroid Build Coastguard Worker SetDexTypeIndex(dex::TypeIndex type_idx)1195*795d594fSAndroid Build Coastguard Worker void SetDexTypeIndex(dex::TypeIndex type_idx) REQUIRES_SHARED(Locks::mutator_lock_) { 1196*795d594fSAndroid Build Coastguard Worker SetField32</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>( 1197*795d594fSAndroid Build Coastguard Worker OFFSET_OF_OBJECT_MEMBER(Class, dex_type_idx_), type_idx.index_); 1198*795d594fSAndroid Build Coastguard Worker } 1199*795d594fSAndroid Build Coastguard Worker 1200*795d594fSAndroid Build Coastguard Worker dex::TypeIndex FindTypeIndexInOtherDexFile(const DexFile& dex_file) 1201*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1202*795d594fSAndroid Build Coastguard Worker 1203*795d594fSAndroid Build Coastguard Worker // Visit native roots visits roots which are keyed off the native pointers such as ArtFields and 1204*795d594fSAndroid Build Coastguard Worker // ArtMethods. 1205*795d594fSAndroid Build Coastguard Worker template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier, 1206*795d594fSAndroid Build Coastguard Worker bool kVisitProxyMethod = true, 1207*795d594fSAndroid Build Coastguard Worker class Visitor> 1208*795d594fSAndroid Build Coastguard Worker void VisitNativeRoots(Visitor& visitor, PointerSize pointer_size) 1209*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1210*795d594fSAndroid Build Coastguard Worker 1211*795d594fSAndroid Build Coastguard Worker // Visit obsolete dex caches possibly stored in ext_data_ 1212*795d594fSAndroid Build Coastguard Worker template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 1213*795d594fSAndroid Build Coastguard Worker void VisitObsoleteDexCaches(DexCacheVisitor& visitor) REQUIRES_SHARED(Locks::mutator_lock_); 1214*795d594fSAndroid Build Coastguard Worker 1215*795d594fSAndroid Build Coastguard Worker template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier, class Visitor> 1216*795d594fSAndroid Build Coastguard Worker void VisitObsoleteClass(Visitor& visitor) REQUIRES_SHARED(Locks::mutator_lock_); 1217*795d594fSAndroid Build Coastguard Worker 1218*795d594fSAndroid Build Coastguard Worker // Visit ArtMethods directly owned by this class. 1219*795d594fSAndroid Build Coastguard Worker template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier, class Visitor> 1220*795d594fSAndroid Build Coastguard Worker void VisitMethods(Visitor visitor, PointerSize pointer_size) 1221*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1222*795d594fSAndroid Build Coastguard Worker 1223*795d594fSAndroid Build Coastguard Worker // Visit ArtFields directly owned by this class. 1224*795d594fSAndroid Build Coastguard Worker template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier, class Visitor> 1225*795d594fSAndroid Build Coastguard Worker void VisitFields(Visitor visitor) REQUIRES_SHARED(Locks::mutator_lock_); 1226*795d594fSAndroid Build Coastguard Worker 1227*795d594fSAndroid Build Coastguard Worker // Get one of the primitive classes. 1228*795d594fSAndroid Build Coastguard Worker static ObjPtr<mirror::Class> GetPrimitiveClass(ObjPtr<mirror::String> name) 1229*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1230*795d594fSAndroid Build Coastguard Worker 1231*795d594fSAndroid Build Coastguard Worker // Clear the kAccMustCountLocks flag on each method, for class redefinition. 1232*795d594fSAndroid Build Coastguard Worker void ClearMustCountLocksFlagOnAllMethods(PointerSize pointer_size) 1233*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1234*795d594fSAndroid Build Coastguard Worker // Clear the kAccCompileDontBother flag on each method, for class redefinition. 1235*795d594fSAndroid Build Coastguard Worker void ClearDontCompileFlagOnAllMethods(PointerSize pointer_size) 1236*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1237*795d594fSAndroid Build Coastguard Worker 1238*795d594fSAndroid Build Coastguard Worker // Clear the kAccSkipAccessChecks flag on each method, for class redefinition. 1239*795d594fSAndroid Build Coastguard Worker void ClearSkipAccessChecksFlagOnAllMethods(PointerSize pointer_size) 1240*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1241*795d594fSAndroid Build Coastguard Worker // When class is verified, set the kAccSkipAccessChecks flag on each method. 1242*795d594fSAndroid Build Coastguard Worker void SetSkipAccessChecksFlagOnAllMethods(PointerSize pointer_size) 1243*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1244*795d594fSAndroid Build Coastguard Worker 1245*795d594fSAndroid Build Coastguard Worker // Get the descriptor of the class as `std::string_view`. The class must be directly 1246*795d594fSAndroid Build Coastguard Worker // backed by a `DexFile` - it must not be primitive, array or proxy class. 1247*795d594fSAndroid Build Coastguard Worker std::string_view GetDescriptorView() REQUIRES_SHARED(Locks::mutator_lock_); 1248*795d594fSAndroid Build Coastguard Worker 1249*795d594fSAndroid Build Coastguard Worker // Get the descriptor of the class. In a few cases a std::string is required, rather than 1250*795d594fSAndroid Build Coastguard Worker // always create one the storage argument is populated and its internal c_str() returned. We do 1251*795d594fSAndroid Build Coastguard Worker // this to avoid memory allocation in the common case. 1252*795d594fSAndroid Build Coastguard Worker const char* GetDescriptor(std::string* storage) REQUIRES_SHARED(Locks::mutator_lock_); 1253*795d594fSAndroid Build Coastguard Worker 1254*795d594fSAndroid Build Coastguard Worker bool DescriptorEquals(ObjPtr<mirror::Class> match) REQUIRES_SHARED(Locks::mutator_lock_); 1255*795d594fSAndroid Build Coastguard Worker bool DescriptorEquals(std::string_view match) REQUIRES_SHARED(Locks::mutator_lock_); 1256*795d594fSAndroid Build Coastguard Worker 1257*795d594fSAndroid Build Coastguard Worker uint32_t DescriptorHash() REQUIRES_SHARED(Locks::mutator_lock_); 1258*795d594fSAndroid Build Coastguard Worker 1259*795d594fSAndroid Build Coastguard Worker const dex::ClassDef* GetClassDef() REQUIRES_SHARED(Locks::mutator_lock_); 1260*795d594fSAndroid Build Coastguard Worker 1261*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t NumDirectInterfaces() REQUIRES_SHARED(Locks::mutator_lock_); 1262*795d594fSAndroid Build Coastguard Worker 1263*795d594fSAndroid Build Coastguard Worker dex::TypeIndex GetDirectInterfaceTypeIdx(uint32_t idx) REQUIRES_SHARED(Locks::mutator_lock_); 1264*795d594fSAndroid Build Coastguard Worker 1265*795d594fSAndroid Build Coastguard Worker // Get the direct interface at index `idx` if resolved, otherwise return null. 1266*795d594fSAndroid Build Coastguard Worker // If the caller expects the interface to be resolved, for example for a resolved `klass`, 1267*795d594fSAndroid Build Coastguard Worker // that assumption should be checked by `DCHECK(result != nullptr)`. 1268*795d594fSAndroid Build Coastguard Worker ObjPtr<Class> GetDirectInterface(uint32_t idx) REQUIRES_SHARED(Locks::mutator_lock_); 1269*795d594fSAndroid Build Coastguard Worker 1270*795d594fSAndroid Build Coastguard Worker // Resolve and get the direct interface of the `klass` at index `idx`. 1271*795d594fSAndroid Build Coastguard Worker // Returns null with a pending exception if the resolution fails. 1272*795d594fSAndroid Build Coastguard Worker static ObjPtr<Class> ResolveDirectInterface(Thread* self, Handle<Class> klass, uint32_t idx) 1273*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1274*795d594fSAndroid Build Coastguard Worker 1275*795d594fSAndroid Build Coastguard Worker const char* GetSourceFile() REQUIRES_SHARED(Locks::mutator_lock_); 1276*795d594fSAndroid Build Coastguard Worker 1277*795d594fSAndroid Build Coastguard Worker std::string GetLocation() REQUIRES_SHARED(Locks::mutator_lock_); 1278*795d594fSAndroid Build Coastguard Worker 1279*795d594fSAndroid Build Coastguard Worker const DexFile& GetDexFile() REQUIRES_SHARED(Locks::mutator_lock_); 1280*795d594fSAndroid Build Coastguard Worker 1281*795d594fSAndroid Build Coastguard Worker const dex::TypeList* GetInterfaceTypeList() REQUIRES_SHARED(Locks::mutator_lock_); 1282*795d594fSAndroid Build Coastguard Worker 1283*795d594fSAndroid Build Coastguard Worker // Asserts we are initialized or initializing in the given thread. 1284*795d594fSAndroid Build Coastguard Worker void AssertInitializedOrInitializingInThread(Thread* self) 1285*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1286*795d594fSAndroid Build Coastguard Worker 1287*795d594fSAndroid Build Coastguard Worker static ObjPtr<Class> CopyOf(Handle<Class> h_this, 1288*795d594fSAndroid Build Coastguard Worker Thread* self, 1289*795d594fSAndroid Build Coastguard Worker int32_t new_length, 1290*795d594fSAndroid Build Coastguard Worker ImTable* imt, 1291*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 1292*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); 1293*795d594fSAndroid Build Coastguard Worker 1294*795d594fSAndroid Build Coastguard Worker // For proxy class only. 1295*795d594fSAndroid Build Coastguard Worker ObjPtr<ObjectArray<Class>> GetProxyInterfaces() REQUIRES_SHARED(Locks::mutator_lock_); 1296*795d594fSAndroid Build Coastguard Worker 1297*795d594fSAndroid Build Coastguard Worker // For proxy class only. 1298*795d594fSAndroid Build Coastguard Worker ObjPtr<ObjectArray<ObjectArray<Class>>> GetProxyThrows() REQUIRES_SHARED(Locks::mutator_lock_); 1299*795d594fSAndroid Build Coastguard Worker 1300*795d594fSAndroid Build Coastguard Worker // May cause thread suspension due to EqualParameters. 1301*795d594fSAndroid Build Coastguard Worker ArtMethod* GetDeclaredConstructor(Thread* self, 1302*795d594fSAndroid Build Coastguard Worker Handle<ObjectArray<Class>> args, 1303*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 1304*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1305*795d594fSAndroid Build Coastguard Worker 1306*795d594fSAndroid Build Coastguard Worker static int32_t GetInnerClassFlags(Handle<Class> h_this, int32_t default_value) 1307*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1308*795d594fSAndroid Build Coastguard Worker 1309*795d594fSAndroid Build Coastguard Worker // Used to initialize a class in the allocation code path to ensure it is guarded by a StoreStore 1310*795d594fSAndroid Build Coastguard Worker // fence. 1311*795d594fSAndroid Build Coastguard Worker class InitializeClassVisitor { 1312*795d594fSAndroid Build Coastguard Worker public: InitializeClassVisitor(uint32_t class_size)1313*795d594fSAndroid Build Coastguard Worker explicit InitializeClassVisitor(uint32_t class_size) : class_size_(class_size) { 1314*795d594fSAndroid Build Coastguard Worker } 1315*795d594fSAndroid Build Coastguard Worker 1316*795d594fSAndroid Build Coastguard Worker void operator()(ObjPtr<Object> obj, size_t usable_size) const 1317*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1318*795d594fSAndroid Build Coastguard Worker 1319*795d594fSAndroid Build Coastguard Worker private: 1320*795d594fSAndroid Build Coastguard Worker const uint32_t class_size_; 1321*795d594fSAndroid Build Coastguard Worker 1322*795d594fSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(InitializeClassVisitor); 1323*795d594fSAndroid Build Coastguard Worker }; 1324*795d594fSAndroid Build Coastguard Worker 1325*795d594fSAndroid Build Coastguard Worker // Returns true if the class loader is null, ie the class loader is the boot strap class loader. 1326*795d594fSAndroid Build Coastguard Worker bool IsBootStrapClassLoaded() REQUIRES_SHARED(Locks::mutator_lock_); 1327*795d594fSAndroid Build Coastguard Worker ImTableEntrySize(PointerSize pointer_size)1328*795d594fSAndroid Build Coastguard Worker static size_t ImTableEntrySize(PointerSize pointer_size) { 1329*795d594fSAndroid Build Coastguard Worker return static_cast<size_t>(pointer_size); 1330*795d594fSAndroid Build Coastguard Worker } 1331*795d594fSAndroid Build Coastguard Worker VTableEntrySize(PointerSize pointer_size)1332*795d594fSAndroid Build Coastguard Worker static size_t VTableEntrySize(PointerSize pointer_size) { 1333*795d594fSAndroid Build Coastguard Worker return static_cast<size_t>(pointer_size); 1334*795d594fSAndroid Build Coastguard Worker } 1335*795d594fSAndroid Build Coastguard Worker 1336*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetDirectMethodsSliceUnchecked(PointerSize pointer_size) 1337*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1338*795d594fSAndroid Build Coastguard Worker 1339*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetVirtualMethodsSliceUnchecked(PointerSize pointer_size) 1340*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1341*795d594fSAndroid Build Coastguard Worker 1342*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetDeclaredMethodsSliceUnchecked(PointerSize pointer_size) 1343*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1344*795d594fSAndroid Build Coastguard Worker 1345*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetDeclaredVirtualMethodsSliceUnchecked( 1346*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 1347*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1348*795d594fSAndroid Build Coastguard Worker 1349*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE ArraySlice<ArtMethod> GetCopiedMethodsSliceUnchecked(PointerSize pointer_size) 1350*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1351*795d594fSAndroid Build Coastguard Worker 1352*795d594fSAndroid Build Coastguard Worker static std::string PrettyDescriptor(ObjPtr<mirror::Class> klass) 1353*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1354*795d594fSAndroid Build Coastguard Worker std::string PrettyDescriptor() 1355*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1356*795d594fSAndroid Build Coastguard Worker // Returns a human-readable form of the name of the given class. 1357*795d594fSAndroid Build Coastguard Worker // Given String.class, the output would be "java.lang.Class<java.lang.String>". 1358*795d594fSAndroid Build Coastguard Worker static std::string PrettyClass(ObjPtr<mirror::Class> c) 1359*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1360*795d594fSAndroid Build Coastguard Worker std::string PrettyClass() 1361*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1362*795d594fSAndroid Build Coastguard Worker // Returns a human-readable form of the name of the given class with its class loader. 1363*795d594fSAndroid Build Coastguard Worker static std::string PrettyClassAndClassLoader(ObjPtr<mirror::Class> c) 1364*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1365*795d594fSAndroid Build Coastguard Worker std::string PrettyClassAndClassLoader() 1366*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1367*795d594fSAndroid Build Coastguard Worker 1368*795d594fSAndroid Build Coastguard Worker // Fix up all of the native pointers in the class by running them through the visitor. Only sets 1369*795d594fSAndroid Build Coastguard Worker // the corresponding entry in dest if visitor(obj) != obj to prevent dirty memory. Dest should be 1370*795d594fSAndroid Build Coastguard Worker // initialized to a copy of *this to prevent issues. Does not visit the ArtMethod and ArtField 1371*795d594fSAndroid Build Coastguard Worker // roots. 1372*795d594fSAndroid Build Coastguard Worker template <VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, typename Visitor> 1373*795d594fSAndroid Build Coastguard Worker void FixupNativePointers(Class* dest, PointerSize pointer_size, const Visitor& visitor) 1374*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1375*795d594fSAndroid Build Coastguard Worker 1376*795d594fSAndroid Build Coastguard Worker // Get or create the various jni id arrays in a lock-less thread safe manner. 1377*795d594fSAndroid Build Coastguard Worker static bool EnsureMethodIds(Handle<Class> h_this) 1378*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1379*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> GetMethodIds() REQUIRES_SHARED(Locks::mutator_lock_); 1380*795d594fSAndroid Build Coastguard Worker static bool EnsureStaticFieldIds(Handle<Class> h_this) 1381*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1382*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> GetStaticFieldIds() REQUIRES_SHARED(Locks::mutator_lock_); 1383*795d594fSAndroid Build Coastguard Worker static bool EnsureInstanceFieldIds(Handle<Class> h_this) 1384*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1385*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> GetInstanceFieldIds() REQUIRES_SHARED(Locks::mutator_lock_); 1386*795d594fSAndroid Build Coastguard Worker 1387*795d594fSAndroid Build Coastguard Worker // Calculate the index in the ifields_, methods_ or sfields_ arrays a method is located at. This 1388*795d594fSAndroid Build Coastguard Worker // is to be used with the above Get{,OrCreate}...Ids functions. 1389*795d594fSAndroid Build Coastguard Worker size_t GetStaticFieldIdOffset(ArtField* field) 1390*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1391*795d594fSAndroid Build Coastguard Worker size_t GetInstanceFieldIdOffset(ArtField* field) 1392*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1393*795d594fSAndroid Build Coastguard Worker size_t GetMethodIdOffset(ArtMethod* method, PointerSize pointer_size) 1394*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1395*795d594fSAndroid Build Coastguard Worker 1396*795d594fSAndroid Build Coastguard Worker // Returns whether the class should be visible to an app. 1397*795d594fSAndroid Build Coastguard Worker // Notorious example is java.lang.ClassValue, which was added in Android U and proguarding tools 1398*795d594fSAndroid Build Coastguard Worker // used that as justification to remove computeValue method implementation. Such an app running 1399*795d594fSAndroid Build Coastguard Worker // on U+ will fail with AbstractMethodError as computeValue is not implemented. 1400*795d594fSAndroid Build Coastguard Worker // See b/259501764. 1401*795d594fSAndroid Build Coastguard Worker bool CheckIsVisibleWithTargetSdk(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_); 1402*795d594fSAndroid Build Coastguard Worker 1403*795d594fSAndroid Build Coastguard Worker private: 1404*795d594fSAndroid Build Coastguard Worker template <typename T, VerifyObjectFlags kVerifyFlags, typename Visitor> 1405*795d594fSAndroid Build Coastguard Worker void FixupNativePointer( 1406*795d594fSAndroid Build Coastguard Worker Class* dest, PointerSize pointer_size, const Visitor& visitor, MemberOffset member_offset) 1407*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1408*795d594fSAndroid Build Coastguard Worker 1409*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE static ArraySlice<ArtMethod> GetMethodsSliceRangeUnchecked( 1410*795d594fSAndroid Build Coastguard Worker LengthPrefixedArray<ArtMethod>* methods, 1411*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size, 1412*795d594fSAndroid Build Coastguard Worker uint32_t start_offset, 1413*795d594fSAndroid Build Coastguard Worker uint32_t end_offset) 1414*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1415*795d594fSAndroid Build Coastguard Worker 1416*795d594fSAndroid Build Coastguard Worker template <bool throw_on_failure> 1417*795d594fSAndroid Build Coastguard Worker bool ResolvedFieldAccessTest(ObjPtr<Class> access_to, 1418*795d594fSAndroid Build Coastguard Worker ArtField* field, 1419*795d594fSAndroid Build Coastguard Worker ObjPtr<DexCache> dex_cache, 1420*795d594fSAndroid Build Coastguard Worker uint32_t field_idx) 1421*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1422*795d594fSAndroid Build Coastguard Worker 1423*795d594fSAndroid Build Coastguard Worker bool IsArrayAssignableFromArray(ObjPtr<Class> klass) REQUIRES_SHARED(Locks::mutator_lock_); 1424*795d594fSAndroid Build Coastguard Worker bool IsAssignableFromArray(ObjPtr<Class> klass) REQUIRES_SHARED(Locks::mutator_lock_); 1425*795d594fSAndroid Build Coastguard Worker 1426*795d594fSAndroid Build Coastguard Worker void CheckObjectAlloc() REQUIRES_SHARED(Locks::mutator_lock_); 1427*795d594fSAndroid Build Coastguard Worker 1428*795d594fSAndroid Build Coastguard Worker // Unchecked editions is for root visiting. 1429*795d594fSAndroid Build Coastguard Worker LengthPrefixedArray<ArtField>* GetSFieldsPtrUnchecked() REQUIRES_SHARED(Locks::mutator_lock_); 1430*795d594fSAndroid Build Coastguard Worker IterationRange<StrideIterator<ArtField>> GetSFieldsUnchecked() 1431*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1432*795d594fSAndroid Build Coastguard Worker LengthPrefixedArray<ArtField>* GetIFieldsPtrUnchecked() REQUIRES_SHARED(Locks::mutator_lock_); 1433*795d594fSAndroid Build Coastguard Worker IterationRange<StrideIterator<ArtField>> GetIFieldsUnchecked() 1434*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1435*795d594fSAndroid Build Coastguard Worker 1436*795d594fSAndroid Build Coastguard Worker // The index in the methods_ array where the first declared virtual method is. 1437*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t GetVirtualMethodsStartOffset() REQUIRES_SHARED(Locks::mutator_lock_); 1438*795d594fSAndroid Build Coastguard Worker 1439*795d594fSAndroid Build Coastguard Worker // The index in the methods_ array where the first direct method is. 1440*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t GetDirectMethodsStartOffset() REQUIRES_SHARED(Locks::mutator_lock_); 1441*795d594fSAndroid Build Coastguard Worker 1442*795d594fSAndroid Build Coastguard Worker bool ProxyDescriptorEquals(ObjPtr<mirror::Class> match) REQUIRES_SHARED(Locks::mutator_lock_); 1443*795d594fSAndroid Build Coastguard Worker bool ProxyDescriptorEquals(std::string_view match) REQUIRES_SHARED(Locks::mutator_lock_); 1444*795d594fSAndroid Build Coastguard Worker static uint32_t UpdateHashForProxyClass(uint32_t hash, ObjPtr<mirror::Class> proxy_class) 1445*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1446*795d594fSAndroid Build Coastguard Worker 1447*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags> 1448*795d594fSAndroid Build Coastguard Worker void GetAccessFlagsDCheck() REQUIRES_SHARED(Locks::mutator_lock_); 1449*795d594fSAndroid Build Coastguard Worker 1450*795d594fSAndroid Build Coastguard Worker // Check that the pointer size matches the one in the class linker. 1451*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE static void CheckPointerSize(PointerSize pointer_size); 1452*795d594fSAndroid Build Coastguard Worker 1453*795d594fSAndroid Build Coastguard Worker template <VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, typename Visitor> 1454*795d594fSAndroid Build Coastguard Worker void VisitStaticFieldsReferences(const Visitor& visitor) HOT_ATTR; 1455*795d594fSAndroid Build Coastguard Worker 1456*795d594fSAndroid Build Coastguard Worker template <bool kVisitNativeRoots, 1457*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 1458*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier, 1459*795d594fSAndroid Build Coastguard Worker typename Visitor> 1460*795d594fSAndroid Build Coastguard Worker void VisitReferences(ObjPtr<Class> klass, const Visitor& visitor) 1461*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 1462*795d594fSAndroid Build Coastguard Worker 1463*795d594fSAndroid Build Coastguard Worker // Helper to set the status without any validity cheks. 1464*795d594fSAndroid Build Coastguard Worker void SetStatusInternal(ClassStatus new_status) 1465*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); 1466*795d594fSAndroid Build Coastguard Worker 1467*795d594fSAndroid Build Coastguard Worker // 'Class' Object Fields 1468*795d594fSAndroid Build Coastguard Worker // Order governed by java field ordering. See art::ClassLinker::LinkFieldsHelper::LinkFields. 1469*795d594fSAndroid Build Coastguard Worker 1470*795d594fSAndroid Build Coastguard Worker // Defining class loader, or null for the "bootstrap" system loader. 1471*795d594fSAndroid Build Coastguard Worker HeapReference<ClassLoader> class_loader_; 1472*795d594fSAndroid Build Coastguard Worker 1473*795d594fSAndroid Build Coastguard Worker // For array classes, the component class object for instanceof/checkcast 1474*795d594fSAndroid Build Coastguard Worker // (for String[][][], this will be String[][]). null for non-array classes. 1475*795d594fSAndroid Build Coastguard Worker HeapReference<Class> component_type_; 1476*795d594fSAndroid Build Coastguard Worker 1477*795d594fSAndroid Build Coastguard Worker // DexCache of resolved constant pool entries (will be null for classes generated by the 1478*795d594fSAndroid Build Coastguard Worker // runtime such as arrays and primitive classes). 1479*795d594fSAndroid Build Coastguard Worker HeapReference<DexCache> dex_cache_; 1480*795d594fSAndroid Build Coastguard Worker 1481*795d594fSAndroid Build Coastguard Worker // Extraneous class data that is not always needed. This field is allocated lazily and may 1482*795d594fSAndroid Build Coastguard Worker // only be set with 'this' locked. This is synchronized on 'this'. 1483*795d594fSAndroid Build Coastguard Worker // TODO(allight) We should probably synchronize it on something external or handle allocation in 1484*795d594fSAndroid Build Coastguard Worker // some other (safe) way to prevent possible deadlocks. 1485*795d594fSAndroid Build Coastguard Worker HeapReference<ClassExt> ext_data_; 1486*795d594fSAndroid Build Coastguard Worker 1487*795d594fSAndroid Build Coastguard Worker // The interface table (iftable_) contains pairs of a interface class and an array of the 1488*795d594fSAndroid Build Coastguard Worker // interface methods. There is one pair per interface supported by this class. That means one 1489*795d594fSAndroid Build Coastguard Worker // pair for each interface we support directly, indirectly via superclass, or indirectly via a 1490*795d594fSAndroid Build Coastguard Worker // superinterface. This will be null if neither we nor our superclass implement any interfaces. 1491*795d594fSAndroid Build Coastguard Worker // 1492*795d594fSAndroid Build Coastguard Worker // Why we need this: given "class Foo implements Face", declare "Face faceObj = new Foo()". 1493*795d594fSAndroid Build Coastguard Worker // Invoke faceObj.blah(), where "blah" is part of the Face interface. We can't easily use a 1494*795d594fSAndroid Build Coastguard Worker // single vtable. 1495*795d594fSAndroid Build Coastguard Worker // 1496*795d594fSAndroid Build Coastguard Worker // For every interface a concrete class implements, we create an array of the concrete vtable_ 1497*795d594fSAndroid Build Coastguard Worker // methods for the methods in the interface. 1498*795d594fSAndroid Build Coastguard Worker HeapReference<IfTable> iftable_; 1499*795d594fSAndroid Build Coastguard Worker 1500*795d594fSAndroid Build Coastguard Worker // Descriptor for the class such as "java.lang.Class" or "[C". Lazily initialized by ComputeName 1501*795d594fSAndroid Build Coastguard Worker HeapReference<String> name_; 1502*795d594fSAndroid Build Coastguard Worker 1503*795d594fSAndroid Build Coastguard Worker // The superclass, or null if this is java.lang.Object or a primitive type. 1504*795d594fSAndroid Build Coastguard Worker // 1505*795d594fSAndroid Build Coastguard Worker // Note that interfaces have java.lang.Object as their 1506*795d594fSAndroid Build Coastguard Worker // superclass. This doesn't match the expectations in JNI 1507*795d594fSAndroid Build Coastguard Worker // GetSuperClass or java.lang.Class.getSuperClass() which need to 1508*795d594fSAndroid Build Coastguard Worker // check for interfaces and return null. 1509*795d594fSAndroid Build Coastguard Worker HeapReference<Class> super_class_; 1510*795d594fSAndroid Build Coastguard Worker 1511*795d594fSAndroid Build Coastguard Worker // Virtual method table (vtable), for use by "invoke-virtual". The vtable from the superclass is 1512*795d594fSAndroid Build Coastguard Worker // copied in, and virtual methods from our class either replace those from the super or are 1513*795d594fSAndroid Build Coastguard Worker // appended. For abstract classes, methods may be created in the vtable that aren't in 1514*795d594fSAndroid Build Coastguard Worker // virtual_ methods_ for miranda methods. 1515*795d594fSAndroid Build Coastguard Worker HeapReference<PointerArray> vtable_; 1516*795d594fSAndroid Build Coastguard Worker 1517*795d594fSAndroid Build Coastguard Worker // instance fields 1518*795d594fSAndroid Build Coastguard Worker // 1519*795d594fSAndroid Build Coastguard Worker // These describe the layout of the contents of an Object. 1520*795d594fSAndroid Build Coastguard Worker // Note that only the fields directly declared by this class are 1521*795d594fSAndroid Build Coastguard Worker // listed in ifields; fields declared by a superclass are listed in 1522*795d594fSAndroid Build Coastguard Worker // the superclass's Class.ifields. 1523*795d594fSAndroid Build Coastguard Worker // 1524*795d594fSAndroid Build Coastguard Worker // ArtFields are allocated as a length prefixed ArtField array, and not an array of pointers to 1525*795d594fSAndroid Build Coastguard Worker // ArtFields. 1526*795d594fSAndroid Build Coastguard Worker uint64_t ifields_; 1527*795d594fSAndroid Build Coastguard Worker 1528*795d594fSAndroid Build Coastguard Worker // Pointer to an ArtMethod length-prefixed array. All the methods where this class is the place 1529*795d594fSAndroid Build Coastguard Worker // where they are logically defined. This includes all private, static, final and virtual methods 1530*795d594fSAndroid Build Coastguard Worker // as well as inherited default methods and miranda methods. 1531*795d594fSAndroid Build Coastguard Worker // 1532*795d594fSAndroid Build Coastguard Worker // The slice methods_ [0, virtual_methods_offset_) are the direct (static, private, init) methods 1533*795d594fSAndroid Build Coastguard Worker // declared by this class. 1534*795d594fSAndroid Build Coastguard Worker // 1535*795d594fSAndroid Build Coastguard Worker // The slice methods_ [virtual_methods_offset_, copied_methods_offset_) are the virtual methods 1536*795d594fSAndroid Build Coastguard Worker // declared by this class. 1537*795d594fSAndroid Build Coastguard Worker // 1538*795d594fSAndroid Build Coastguard Worker // The slice methods_ [copied_methods_offset_, |methods_|) are the methods that are copied from 1539*795d594fSAndroid Build Coastguard Worker // interfaces such as miranda or default methods. These are copied for resolution purposes as this 1540*795d594fSAndroid Build Coastguard Worker // class is where they are (logically) declared as far as the virtual dispatch is concerned. 1541*795d594fSAndroid Build Coastguard Worker // 1542*795d594fSAndroid Build Coastguard Worker // Note that this field is used by the native debugger as the unique identifier for the type. 1543*795d594fSAndroid Build Coastguard Worker uint64_t methods_; 1544*795d594fSAndroid Build Coastguard Worker 1545*795d594fSAndroid Build Coastguard Worker // Static fields length-prefixed array. 1546*795d594fSAndroid Build Coastguard Worker uint64_t sfields_; 1547*795d594fSAndroid Build Coastguard Worker 1548*795d594fSAndroid Build Coastguard Worker // Access flags; low 16 bits are defined by VM spec. 1549*795d594fSAndroid Build Coastguard Worker uint32_t access_flags_; 1550*795d594fSAndroid Build Coastguard Worker 1551*795d594fSAndroid Build Coastguard Worker // Class flags to help speed up visiting object references. 1552*795d594fSAndroid Build Coastguard Worker uint32_t class_flags_; 1553*795d594fSAndroid Build Coastguard Worker 1554*795d594fSAndroid Build Coastguard Worker // Total size of the Class instance; used when allocating storage on gc heap. 1555*795d594fSAndroid Build Coastguard Worker // See also object_size_. 1556*795d594fSAndroid Build Coastguard Worker uint32_t class_size_; 1557*795d594fSAndroid Build Coastguard Worker 1558*795d594fSAndroid Build Coastguard Worker // Tid used to check for recursive <clinit> invocation. 1559*795d594fSAndroid Build Coastguard Worker pid_t clinit_thread_id_; 1560*795d594fSAndroid Build Coastguard Worker static_assert(sizeof(pid_t) == sizeof(int32_t), "java.lang.Class.clinitThreadId size check"); 1561*795d594fSAndroid Build Coastguard Worker 1562*795d594fSAndroid Build Coastguard Worker // ClassDef index in dex file, -1 if no class definition such as an array. 1563*795d594fSAndroid Build Coastguard Worker // TODO: really 16bits 1564*795d594fSAndroid Build Coastguard Worker int32_t dex_class_def_idx_; 1565*795d594fSAndroid Build Coastguard Worker 1566*795d594fSAndroid Build Coastguard Worker // Type index in dex file. 1567*795d594fSAndroid Build Coastguard Worker // TODO: really 16bits 1568*795d594fSAndroid Build Coastguard Worker int32_t dex_type_idx_; 1569*795d594fSAndroid Build Coastguard Worker 1570*795d594fSAndroid Build Coastguard Worker // Number of instance fields that are object refs. Does not count object refs 1571*795d594fSAndroid Build Coastguard Worker // in any super classes. 1572*795d594fSAndroid Build Coastguard Worker uint32_t num_reference_instance_fields_; 1573*795d594fSAndroid Build Coastguard Worker 1574*795d594fSAndroid Build Coastguard Worker // Number of static fields that are object refs, 1575*795d594fSAndroid Build Coastguard Worker uint32_t num_reference_static_fields_; 1576*795d594fSAndroid Build Coastguard Worker 1577*795d594fSAndroid Build Coastguard Worker // Total object size; used when allocating storage on gc heap. 1578*795d594fSAndroid Build Coastguard Worker // (For interfaces and abstract classes this will be zero.) 1579*795d594fSAndroid Build Coastguard Worker // See also class_size_. 1580*795d594fSAndroid Build Coastguard Worker uint32_t object_size_; 1581*795d594fSAndroid Build Coastguard Worker 1582*795d594fSAndroid Build Coastguard Worker // Aligned object size for allocation fast path. The value is max uint32_t if the object is 1583*795d594fSAndroid Build Coastguard Worker // uninitialized or finalizable. Not currently used for variable sized objects. 1584*795d594fSAndroid Build Coastguard Worker uint32_t object_size_alloc_fast_path_; 1585*795d594fSAndroid Build Coastguard Worker 1586*795d594fSAndroid Build Coastguard Worker // The lower 16 bits contains a Primitive::Type value. The upper 16 1587*795d594fSAndroid Build Coastguard Worker // bits contains the size shift of the primitive type. 1588*795d594fSAndroid Build Coastguard Worker uint32_t primitive_type_; 1589*795d594fSAndroid Build Coastguard Worker 1590*795d594fSAndroid Build Coastguard Worker // Bitmap of offsets of ifields. 1591*795d594fSAndroid Build Coastguard Worker uint32_t reference_instance_offsets_; 1592*795d594fSAndroid Build Coastguard Worker 1593*795d594fSAndroid Build Coastguard Worker // See the real definition in subtype_check_bits_and_status.h 1594*795d594fSAndroid Build Coastguard Worker // typeof(status_) is actually SubtypeCheckBitsAndStatus. 1595*795d594fSAndroid Build Coastguard Worker uint32_t status_; 1596*795d594fSAndroid Build Coastguard Worker 1597*795d594fSAndroid Build Coastguard Worker // The offset of the first virtual method that is copied from an interface. This includes miranda, 1598*795d594fSAndroid Build Coastguard Worker // default, and default-conflict methods. Having a hard limit of ((2 << 16) - 1) for methods 1599*795d594fSAndroid Build Coastguard Worker // defined on a single class is well established in Java so we will use only uint16_t's here. 1600*795d594fSAndroid Build Coastguard Worker uint16_t copied_methods_offset_; 1601*795d594fSAndroid Build Coastguard Worker 1602*795d594fSAndroid Build Coastguard Worker // The offset of the first declared virtual methods in the methods_ array. 1603*795d594fSAndroid Build Coastguard Worker uint16_t virtual_methods_offset_; 1604*795d594fSAndroid Build Coastguard Worker 1605*795d594fSAndroid Build Coastguard Worker // The following data exist in real class objects. 1606*795d594fSAndroid Build Coastguard Worker // Embedded Vtable length, for class object that's instantiable, fixed size. 1607*795d594fSAndroid Build Coastguard Worker // uint32_t vtable_length_; 1608*795d594fSAndroid Build Coastguard Worker // Embedded Imtable pointer, for class object that's not an interface, fixed size. 1609*795d594fSAndroid Build Coastguard Worker // ImTableEntry embedded_imtable_; 1610*795d594fSAndroid Build Coastguard Worker // Embedded Vtable, for class object that's not an interface, variable size. 1611*795d594fSAndroid Build Coastguard Worker // VTableEntry embedded_vtable_[0]; 1612*795d594fSAndroid Build Coastguard Worker // Static fields, variable size. 1613*795d594fSAndroid Build Coastguard Worker // uint32_t fields_[0]; 1614*795d594fSAndroid Build Coastguard Worker // Embedded bitmap of offsets of ifields, for classes that need more than 31 1615*795d594fSAndroid Build Coastguard Worker // reference-offset bits. 'reference_instance_offsets_' stores the number of 1616*795d594fSAndroid Build Coastguard Worker // 32-bit entries that hold the entire bitmap. We compute the offset of first 1617*795d594fSAndroid Build Coastguard Worker // entry by subtracting this number from class_size_. 1618*795d594fSAndroid Build Coastguard Worker // uint32_t reference_bitmap_[0]; 1619*795d594fSAndroid Build Coastguard Worker 1620*795d594fSAndroid Build Coastguard Worker ART_FRIEND_TEST(DexCacheTest, TestResolvedFieldAccess); // For ResolvedFieldAccessTest 1621*795d594fSAndroid Build Coastguard Worker friend struct art::ClassOffsets; // for verifying offset information 1622*795d594fSAndroid Build Coastguard Worker friend class Object; // For VisitReferences 1623*795d594fSAndroid Build Coastguard Worker friend class linker::ImageWriter; // For SetStatusInternal 1624*795d594fSAndroid Build Coastguard Worker friend class art::RuntimeImageHelper; // For SetStatusInternal 1625*795d594fSAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(Class); 1626*795d594fSAndroid Build Coastguard Worker }; 1627*795d594fSAndroid Build Coastguard Worker 1628*795d594fSAndroid Build Coastguard Worker } // namespace mirror 1629*795d594fSAndroid Build Coastguard Worker } // namespace art 1630*795d594fSAndroid Build Coastguard Worker 1631*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_MIRROR_CLASS_H_ 1632