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_OBJECT_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_MIRROR_OBJECT_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include "base/atomic.h" 21*795d594fSAndroid Build Coastguard Worker #include "base/casts.h" 22*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 23*795d594fSAndroid Build Coastguard Worker #include "base/pointer_size.h" 24*795d594fSAndroid Build Coastguard Worker #include "dex/primitive.h" 25*795d594fSAndroid Build Coastguard Worker #include "obj_ptr.h" 26*795d594fSAndroid Build Coastguard Worker #include "object_reference.h" 27*795d594fSAndroid Build Coastguard Worker #include "offsets.h" 28*795d594fSAndroid Build Coastguard Worker #include "read_barrier_config.h" 29*795d594fSAndroid Build Coastguard Worker #include "read_barrier_option.h" 30*795d594fSAndroid Build Coastguard Worker #include "runtime_globals.h" 31*795d594fSAndroid Build Coastguard Worker #include "verify_object.h" 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 34*795d594fSAndroid Build Coastguard Worker 35*795d594fSAndroid Build Coastguard Worker class ArtField; 36*795d594fSAndroid Build Coastguard Worker class ArtMethod; 37*795d594fSAndroid Build Coastguard Worker template <class T> class Handle; 38*795d594fSAndroid Build Coastguard Worker class LockWord; 39*795d594fSAndroid Build Coastguard Worker class Monitor; 40*795d594fSAndroid Build Coastguard Worker struct ObjectOffsets; 41*795d594fSAndroid Build Coastguard Worker class Thread; 42*795d594fSAndroid Build Coastguard Worker class VoidFunctor; 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker namespace mirror { 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker class Array; 47*795d594fSAndroid Build Coastguard Worker class Class; 48*795d594fSAndroid Build Coastguard Worker class ClassLoader; 49*795d594fSAndroid Build Coastguard Worker class DexCache; 50*795d594fSAndroid Build Coastguard Worker class FinalizerReference; 51*795d594fSAndroid Build Coastguard Worker template<class T> class ObjectArray; 52*795d594fSAndroid Build Coastguard Worker template<class T> class PrimitiveArray; 53*795d594fSAndroid Build Coastguard Worker using BooleanArray = PrimitiveArray<uint8_t>; 54*795d594fSAndroid Build Coastguard Worker using ByteArray = PrimitiveArray<int8_t>; 55*795d594fSAndroid Build Coastguard Worker using CharArray = PrimitiveArray<uint16_t>; 56*795d594fSAndroid Build Coastguard Worker using DoubleArray = PrimitiveArray<double>; 57*795d594fSAndroid Build Coastguard Worker using FloatArray = PrimitiveArray<float>; 58*795d594fSAndroid Build Coastguard Worker using IntArray = PrimitiveArray<int32_t>; 59*795d594fSAndroid Build Coastguard Worker using LongArray = PrimitiveArray<int64_t>; 60*795d594fSAndroid Build Coastguard Worker using ShortArray = PrimitiveArray<int16_t>; 61*795d594fSAndroid Build Coastguard Worker class Reference; 62*795d594fSAndroid Build Coastguard Worker class String; 63*795d594fSAndroid Build Coastguard Worker class Throwable; 64*795d594fSAndroid Build Coastguard Worker 65*795d594fSAndroid Build Coastguard Worker // Fields within mirror objects aren't accessed directly so that the appropriate amount of 66*795d594fSAndroid Build Coastguard Worker // handshaking is done with GC (for example, read and write barriers). This macro is used to 67*795d594fSAndroid Build Coastguard Worker // compute an offset for the Set/Get methods defined in Object that can safely access fields. 68*795d594fSAndroid Build Coastguard Worker #define OFFSET_OF_OBJECT_MEMBER(type, field) \ 69*795d594fSAndroid Build Coastguard Worker MemberOffset(OFFSETOF_MEMBER(type, field)) 70*795d594fSAndroid Build Coastguard Worker 71*795d594fSAndroid Build Coastguard Worker // Checks that we don't do field assignments which violate the typing system. 72*795d594fSAndroid Build Coastguard Worker static constexpr bool kCheckFieldAssignments = false; 73*795d594fSAndroid Build Coastguard Worker 74*795d594fSAndroid Build Coastguard Worker // Size of Object. 75*795d594fSAndroid Build Coastguard Worker static constexpr uint32_t kObjectHeaderSize = 8; 76*795d594fSAndroid Build Coastguard Worker 77*795d594fSAndroid Build Coastguard Worker // C++ mirror of java.lang.Object 78*795d594fSAndroid Build Coastguard Worker class EXPORT MANAGED LOCKABLE Object { 79*795d594fSAndroid Build Coastguard Worker public: 80*795d594fSAndroid Build Coastguard Worker MIRROR_CLASS("Ljava/lang/Object;"); 81*795d594fSAndroid Build Coastguard Worker 82*795d594fSAndroid Build Coastguard Worker // The number of vtable entries in java.lang.Object. 83*795d594fSAndroid Build Coastguard Worker static constexpr size_t kVTableLength = 11; 84*795d594fSAndroid Build Coastguard Worker 85*795d594fSAndroid Build Coastguard Worker // The size of the java.lang.Class representing a java.lang.Object. 86*795d594fSAndroid Build Coastguard Worker static uint32_t ClassSize(PointerSize pointer_size); 87*795d594fSAndroid Build Coastguard Worker 88*795d594fSAndroid Build Coastguard Worker // Size of an instance of java.lang.Object. InstanceSize()89*795d594fSAndroid Build Coastguard Worker static constexpr uint32_t InstanceSize() { 90*795d594fSAndroid Build Coastguard Worker return sizeof(Object); 91*795d594fSAndroid Build Coastguard Worker } 92*795d594fSAndroid Build Coastguard Worker ClassOffset()93*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset ClassOffset() { 94*795d594fSAndroid Build Coastguard Worker return OFFSET_OF_OBJECT_MEMBER(Object, klass_); 95*795d594fSAndroid Build Coastguard Worker } 96*795d594fSAndroid Build Coastguard Worker 97*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 98*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 99*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE Class* GetClass() REQUIRES_SHARED(Locks::mutator_lock_); 100*795d594fSAndroid Build Coastguard Worker 101*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 102*795d594fSAndroid Build Coastguard Worker void SetClass(ObjPtr<Class> new_klass) REQUIRES_SHARED(Locks::mutator_lock_); 103*795d594fSAndroid Build Coastguard Worker 104*795d594fSAndroid Build Coastguard Worker // Get the read barrier state with a fake address dependency. 105*795d594fSAndroid Build Coastguard Worker // '*fake_address_dependency' will be set to 0. 106*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t GetReadBarrierState(uintptr_t* fake_address_dependency) 107*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 108*795d594fSAndroid Build Coastguard Worker // This version does not offer any special mechanism to prevent load-load reordering. 109*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t GetReadBarrierState() REQUIRES_SHARED(Locks::mutator_lock_); 110*795d594fSAndroid Build Coastguard Worker // Get the read barrier state with a load-acquire. 111*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t GetReadBarrierStateAcquire() REQUIRES_SHARED(Locks::mutator_lock_); 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetReadBarrierState(uint32_t rb_state) REQUIRES_SHARED(Locks::mutator_lock_); 114*795d594fSAndroid Build Coastguard Worker 115*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool AtomicSetReadBarrierState(uint32_t expected_rb_state, 116*795d594fSAndroid Build Coastguard Worker uint32_t rb_state, 117*795d594fSAndroid Build Coastguard Worker std::memory_order order = std::memory_order_relaxed) 118*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 119*795d594fSAndroid Build Coastguard Worker 120*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint32_t GetMarkBit() REQUIRES_SHARED(Locks::mutator_lock_); 121*795d594fSAndroid Build Coastguard Worker 122*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool AtomicSetMarkBit(uint32_t expected_mark_bit, uint32_t mark_bit) 123*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker // Assert that the read barrier state is in the default (white, i.e. non-gray) state. 126*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void AssertReadBarrierState() const REQUIRES_SHARED(Locks::mutator_lock_); 127*795d594fSAndroid Build Coastguard Worker 128*795d594fSAndroid Build Coastguard Worker // The verifier treats all interfaces as java.lang.Object and relies on runtime checks in 129*795d594fSAndroid Build Coastguard Worker // invoke-interface to detect incompatible interface types. 130*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 131*795d594fSAndroid Build Coastguard Worker bool VerifierInstanceOf(ObjPtr<Class> klass) REQUIRES_SHARED(Locks::mutator_lock_); 132*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 133*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool InstanceOf(ObjPtr<Class> klass) REQUIRES_SHARED(Locks::mutator_lock_); 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 136*795d594fSAndroid Build Coastguard Worker size_t SizeOf() REQUIRES_SHARED(Locks::mutator_lock_); 137*795d594fSAndroid Build Coastguard Worker 138*795d594fSAndroid Build Coastguard Worker static ObjPtr<Object> Clone(Handle<Object> h_this, Thread* self) 139*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 140*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_); 141*795d594fSAndroid Build Coastguard Worker 142*795d594fSAndroid Build Coastguard Worker // Returns a nonzero value that fits into lockword slot. 143*795d594fSAndroid Build Coastguard Worker int32_t IdentityHashCode() 144*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 145*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::thread_list_lock_, 146*795d594fSAndroid Build Coastguard Worker !Locks::thread_suspend_count_lock_); 147*795d594fSAndroid Build Coastguard Worker 148*795d594fSAndroid Build Coastguard Worker // Identical to the above, but returns 0 if monitor inflation would otherwise be needed. 149*795d594fSAndroid Build Coastguard Worker int32_t IdentityHashCodeNoInflation() REQUIRES_SHARED(Locks::mutator_lock_) 150*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::thread_list_lock_, !Locks::thread_suspend_count_lock_); 151*795d594fSAndroid Build Coastguard Worker MonitorOffset()152*795d594fSAndroid Build Coastguard Worker static constexpr MemberOffset MonitorOffset() { 153*795d594fSAndroid Build Coastguard Worker return OFFSET_OF_OBJECT_MEMBER(Object, monitor_); 154*795d594fSAndroid Build Coastguard Worker } 155*795d594fSAndroid Build Coastguard Worker 156*795d594fSAndroid Build Coastguard Worker // As_volatile can be false if the mutators are suspended. This is an optimization since it 157*795d594fSAndroid Build Coastguard Worker // avoids the barriers. 158*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 159*795d594fSAndroid Build Coastguard Worker LockWord GetLockWord(bool as_volatile) REQUIRES_SHARED(Locks::mutator_lock_); 160*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 161*795d594fSAndroid Build Coastguard Worker void SetLockWord(LockWord new_val, bool as_volatile) REQUIRES_SHARED(Locks::mutator_lock_); 162*795d594fSAndroid Build Coastguard Worker bool CasLockWord(LockWord old_val, LockWord new_val, CASMode mode, std::memory_order memory_order) 163*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 164*795d594fSAndroid Build Coastguard Worker uint32_t GetLockOwnerThreadId() REQUIRES_SHARED(Locks::mutator_lock_); 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker // Try to enter the monitor, returns non null if we succeeded. 167*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> MonitorTryEnter(Thread* self) 168*795d594fSAndroid Build Coastguard Worker EXCLUSIVE_LOCK_FUNCTION() 169*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_) 170*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 171*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> MonitorEnter(Thread* self) 172*795d594fSAndroid Build Coastguard Worker EXCLUSIVE_LOCK_FUNCTION() 173*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_) 174*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 175*795d594fSAndroid Build Coastguard Worker bool MonitorExit(Thread* self) 176*795d594fSAndroid Build Coastguard Worker REQUIRES(!Roles::uninterruptible_) 177*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 178*795d594fSAndroid Build Coastguard Worker UNLOCK_FUNCTION(); 179*795d594fSAndroid Build Coastguard Worker void Notify(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_); 180*795d594fSAndroid Build Coastguard Worker void NotifyAll(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_); 181*795d594fSAndroid Build Coastguard Worker void Wait(Thread* self, int64_t timeout, int32_t nanos) REQUIRES_SHARED(Locks::mutator_lock_); 182*795d594fSAndroid Build Coastguard Worker 183*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 184*795d594fSAndroid Build Coastguard Worker bool IsClass() REQUIRES_SHARED(Locks::mutator_lock_); 185*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 186*795d594fSAndroid Build Coastguard Worker ObjPtr<Class> AsClass() REQUIRES_SHARED(Locks::mutator_lock_); 187*795d594fSAndroid Build Coastguard Worker 188*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 189*795d594fSAndroid Build Coastguard Worker bool IsObjectArray() REQUIRES_SHARED(Locks::mutator_lock_); 190*795d594fSAndroid Build Coastguard Worker template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 191*795d594fSAndroid Build Coastguard Worker ObjPtr<ObjectArray<T>> AsObjectArray() REQUIRES_SHARED(Locks::mutator_lock_); 192*795d594fSAndroid Build Coastguard Worker 193*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 194*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 195*795d594fSAndroid Build Coastguard Worker bool IsClassLoader() REQUIRES_SHARED(Locks::mutator_lock_); 196*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 197*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 198*795d594fSAndroid Build Coastguard Worker ObjPtr<ClassLoader> AsClassLoader() REQUIRES_SHARED(Locks::mutator_lock_); 199*795d594fSAndroid Build Coastguard Worker 200*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 201*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 202*795d594fSAndroid Build Coastguard Worker bool IsDexCache() REQUIRES_SHARED(Locks::mutator_lock_); 203*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 204*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 205*795d594fSAndroid Build Coastguard Worker ObjPtr<DexCache> AsDexCache() REQUIRES_SHARED(Locks::mutator_lock_); 206*795d594fSAndroid Build Coastguard Worker 207*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 208*795d594fSAndroid Build Coastguard Worker bool IsArrayInstance() REQUIRES_SHARED(Locks::mutator_lock_); 209*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 210*795d594fSAndroid Build Coastguard Worker ObjPtr<Array> AsArray() REQUIRES_SHARED(Locks::mutator_lock_); 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 213*795d594fSAndroid Build Coastguard Worker bool IsBooleanArray() REQUIRES_SHARED(Locks::mutator_lock_); 214*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 215*795d594fSAndroid Build Coastguard Worker ObjPtr<BooleanArray> AsBooleanArray() REQUIRES_SHARED(Locks::mutator_lock_); 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 218*795d594fSAndroid Build Coastguard Worker bool IsByteArray() REQUIRES_SHARED(Locks::mutator_lock_); 219*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 220*795d594fSAndroid Build Coastguard Worker ObjPtr<ByteArray> AsByteArray() REQUIRES_SHARED(Locks::mutator_lock_); 221*795d594fSAndroid Build Coastguard Worker 222*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 223*795d594fSAndroid Build Coastguard Worker bool IsCharArray() REQUIRES_SHARED(Locks::mutator_lock_); 224*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 225*795d594fSAndroid Build Coastguard Worker ObjPtr<CharArray> AsCharArray() REQUIRES_SHARED(Locks::mutator_lock_); 226*795d594fSAndroid Build Coastguard Worker 227*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 228*795d594fSAndroid Build Coastguard Worker bool IsShortArray() REQUIRES_SHARED(Locks::mutator_lock_); 229*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 230*795d594fSAndroid Build Coastguard Worker ObjPtr<ShortArray> AsShortArray() REQUIRES_SHARED(Locks::mutator_lock_); 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 233*795d594fSAndroid Build Coastguard Worker bool IsIntArray() REQUIRES_SHARED(Locks::mutator_lock_); 234*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 235*795d594fSAndroid Build Coastguard Worker ObjPtr<IntArray> AsIntArray() REQUIRES_SHARED(Locks::mutator_lock_); 236*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 237*795d594fSAndroid Build Coastguard Worker ObjPtr<IntArray> AsIntArrayUnchecked() REQUIRES_SHARED(Locks::mutator_lock_); 238*795d594fSAndroid Build Coastguard Worker 239*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 240*795d594fSAndroid Build Coastguard Worker bool IsLongArray() REQUIRES_SHARED(Locks::mutator_lock_); 241*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 242*795d594fSAndroid Build Coastguard Worker ObjPtr<LongArray> AsLongArray() REQUIRES_SHARED(Locks::mutator_lock_); 243*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 244*795d594fSAndroid Build Coastguard Worker ObjPtr<LongArray> AsLongArrayUnchecked() REQUIRES_SHARED(Locks::mutator_lock_); 245*795d594fSAndroid Build Coastguard Worker 246*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 247*795d594fSAndroid Build Coastguard Worker bool IsFloatArray() REQUIRES_SHARED(Locks::mutator_lock_); 248*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 249*795d594fSAndroid Build Coastguard Worker ObjPtr<FloatArray> AsFloatArray() REQUIRES_SHARED(Locks::mutator_lock_); 250*795d594fSAndroid Build Coastguard Worker 251*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 252*795d594fSAndroid Build Coastguard Worker bool IsDoubleArray() REQUIRES_SHARED(Locks::mutator_lock_); 253*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 254*795d594fSAndroid Build Coastguard Worker ObjPtr<DoubleArray> AsDoubleArray() REQUIRES_SHARED(Locks::mutator_lock_); 255*795d594fSAndroid Build Coastguard Worker 256*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 257*795d594fSAndroid Build Coastguard Worker bool IsString() REQUIRES_SHARED(Locks::mutator_lock_); 258*795d594fSAndroid Build Coastguard Worker 259*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 260*795d594fSAndroid Build Coastguard Worker ObjPtr<String> AsString() REQUIRES_SHARED(Locks::mutator_lock_); 261*795d594fSAndroid Build Coastguard Worker 262*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 263*795d594fSAndroid Build Coastguard Worker ObjPtr<Throwable> AsThrowable() REQUIRES_SHARED(Locks::mutator_lock_); 264*795d594fSAndroid Build Coastguard Worker 265*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 266*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 267*795d594fSAndroid Build Coastguard Worker bool IsReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_); 268*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 269*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 270*795d594fSAndroid Build Coastguard Worker ObjPtr<Reference> AsReference() REQUIRES_SHARED(Locks::mutator_lock_); 271*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 272*795d594fSAndroid Build Coastguard Worker bool IsWeakReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_); 273*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 274*795d594fSAndroid Build Coastguard Worker bool IsSoftReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_); 275*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 276*795d594fSAndroid Build Coastguard Worker bool IsFinalizerReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_); 277*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 278*795d594fSAndroid Build Coastguard Worker ObjPtr<FinalizerReference> AsFinalizerReference() REQUIRES_SHARED(Locks::mutator_lock_); 279*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 280*795d594fSAndroid Build Coastguard Worker bool IsPhantomReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_); 281*795d594fSAndroid Build Coastguard Worker 282*795d594fSAndroid Build Coastguard Worker // Accessor for Java type fields. 283*795d594fSAndroid Build Coastguard Worker template<class T, 284*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 285*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier, 286*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 287*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE T* GetFieldObject(MemberOffset field_offset) 288*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 289*795d594fSAndroid Build Coastguard Worker 290*795d594fSAndroid Build Coastguard Worker template<class T, 291*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 292*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 293*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE T* GetFieldObjectVolatile(MemberOffset field_offset) 294*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 295*795d594fSAndroid Build Coastguard Worker 296*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 297*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 298*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 299*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 300*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldObjectWithoutWriteBarrier(MemberOffset field_offset, 301*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> new_value) 302*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 303*795d594fSAndroid Build Coastguard Worker 304*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 305*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 306*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 307*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 308*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldObject(MemberOffset field_offset, ObjPtr<Object> new_value) 309*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 310*795d594fSAndroid Build Coastguard Worker 311*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 312*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 313*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 314*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldObjectVolatile(MemberOffset field_offset, ObjPtr<Object> new_value) 315*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 316*795d594fSAndroid Build Coastguard Worker 317*795d594fSAndroid Build Coastguard Worker template<bool kCheckTransaction = true, 318*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 319*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 320*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldObjectTransaction(MemberOffset field_offset, ObjPtr<Object> new_value) 321*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 322*795d594fSAndroid Build Coastguard Worker 323*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 324*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 325*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 326*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool CasFieldObject(MemberOffset field_offset, 327*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> old_value, 328*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> new_value, 329*795d594fSAndroid Build Coastguard Worker CASMode mode, 330*795d594fSAndroid Build Coastguard Worker std::memory_order memory_order) 331*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 332*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 333*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 334*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 335*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool CasFieldObjectWithoutWriteBarrier(MemberOffset field_offset, 336*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> old_value, 337*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> new_value, 338*795d594fSAndroid Build Coastguard Worker CASMode mode, 339*795d594fSAndroid Build Coastguard Worker std::memory_order memory_order) 340*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 341*795d594fSAndroid Build Coastguard Worker 342*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 343*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 344*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 345*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> CompareAndExchangeFieldObject(MemberOffset field_offset, 346*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> old_value, 347*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> new_value) 348*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 349*795d594fSAndroid Build Coastguard Worker 350*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 351*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 352*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 353*795d594fSAndroid Build Coastguard Worker ObjPtr<Object> ExchangeFieldObject(MemberOffset field_offset, ObjPtr<Object> new_value) 354*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 355*795d594fSAndroid Build Coastguard Worker 356*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 357*795d594fSAndroid Build Coastguard Worker HeapReference<Object>* GetFieldObjectReferenceAddr(MemberOffset field_offset) 358*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 359*795d594fSAndroid Build Coastguard Worker 360*795d594fSAndroid Build Coastguard Worker template<typename kType, bool kIsVolatile> SetFieldPrimitive(MemberOffset field_offset,kType new_value)361*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldPrimitive(MemberOffset field_offset, kType new_value) 362*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 363*795d594fSAndroid Build Coastguard Worker uint8_t* raw_addr = reinterpret_cast<uint8_t*>(this) + field_offset.Int32Value(); 364*795d594fSAndroid Build Coastguard Worker kType* addr = reinterpret_cast<kType*>(raw_addr); 365*795d594fSAndroid Build Coastguard Worker if (kIsVolatile) { 366*795d594fSAndroid Build Coastguard Worker reinterpret_cast<Atomic<kType>*>(addr)->store(new_value, std::memory_order_seq_cst); 367*795d594fSAndroid Build Coastguard Worker } else { 368*795d594fSAndroid Build Coastguard Worker reinterpret_cast<Atomic<kType>*>(addr)->StoreJavaData(new_value); 369*795d594fSAndroid Build Coastguard Worker } 370*795d594fSAndroid Build Coastguard Worker } 371*795d594fSAndroid Build Coastguard Worker 372*795d594fSAndroid Build Coastguard Worker template<typename kType, bool kIsVolatile> GetFieldPrimitive(MemberOffset field_offset)373*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE kType GetFieldPrimitive(MemberOffset field_offset) 374*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 375*795d594fSAndroid Build Coastguard Worker const uint8_t* raw_addr = reinterpret_cast<const uint8_t*>(this) + field_offset.Int32Value(); 376*795d594fSAndroid Build Coastguard Worker const kType* addr = reinterpret_cast<const kType*>(raw_addr); 377*795d594fSAndroid Build Coastguard Worker if (kIsVolatile) { 378*795d594fSAndroid Build Coastguard Worker return reinterpret_cast<const Atomic<kType>*>(addr)->load(std::memory_order_seq_cst); 379*795d594fSAndroid Build Coastguard Worker } else { 380*795d594fSAndroid Build Coastguard Worker return reinterpret_cast<const Atomic<kType>*>(addr)->LoadJavaData(); 381*795d594fSAndroid Build Coastguard Worker } 382*795d594fSAndroid Build Coastguard Worker } 383*795d594fSAndroid Build Coastguard Worker 384*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false> GetFieldBoolean(MemberOffset field_offset)385*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint8_t GetFieldBoolean(MemberOffset field_offset) 386*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 387*795d594fSAndroid Build Coastguard Worker Verify<kVerifyFlags>(); 388*795d594fSAndroid Build Coastguard Worker return GetFieldPrimitive<uint8_t, kIsVolatile>(field_offset); 389*795d594fSAndroid Build Coastguard Worker } 390*795d594fSAndroid Build Coastguard Worker 391*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false> 392*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE int8_t GetFieldByte(MemberOffset field_offset) 393*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 394*795d594fSAndroid Build Coastguard Worker 395*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 396*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint8_t GetFieldBooleanVolatile(MemberOffset field_offset) 397*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 398*795d594fSAndroid Build Coastguard Worker 399*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 400*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE int8_t GetFieldByteVolatile(MemberOffset field_offset) 401*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 402*795d594fSAndroid Build Coastguard Worker 403*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 404*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 405*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 406*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 407*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldBoolean(MemberOffset field_offset, uint8_t new_value) 408*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 409*795d594fSAndroid Build Coastguard Worker 410*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 411*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 412*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 413*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 414*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldByte(MemberOffset field_offset, int8_t new_value) 415*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 416*795d594fSAndroid Build Coastguard Worker 417*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 418*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 419*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 420*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldBooleanVolatile(MemberOffset field_offset, uint8_t new_value) 421*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 422*795d594fSAndroid Build Coastguard Worker 423*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 424*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 425*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 426*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldByteVolatile(MemberOffset field_offset, int8_t new_value) 427*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 428*795d594fSAndroid Build Coastguard Worker 429*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false> 430*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint16_t GetFieldChar(MemberOffset field_offset) 431*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 432*795d594fSAndroid Build Coastguard Worker 433*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false> 434*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE int16_t GetFieldShort(MemberOffset field_offset) 435*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 436*795d594fSAndroid Build Coastguard Worker 437*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 438*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE uint16_t GetFieldCharVolatile(MemberOffset field_offset) 439*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 440*795d594fSAndroid Build Coastguard Worker 441*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 442*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE int16_t GetFieldShortVolatile(MemberOffset field_offset) 443*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 444*795d594fSAndroid Build Coastguard Worker 445*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 446*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 447*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 448*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 449*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldChar(MemberOffset field_offset, uint16_t new_value) 450*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 451*795d594fSAndroid Build Coastguard Worker 452*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 453*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 454*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 455*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 456*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldShort(MemberOffset field_offset, int16_t new_value) 457*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 458*795d594fSAndroid Build Coastguard Worker 459*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 460*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 461*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 462*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldCharVolatile(MemberOffset field_offset, uint16_t new_value) 463*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 464*795d594fSAndroid Build Coastguard Worker 465*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 466*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 467*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 468*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldShortVolatile(MemberOffset field_offset, int16_t new_value) 469*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 470*795d594fSAndroid Build Coastguard Worker 471*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false> GetField32(MemberOffset field_offset)472*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE int32_t GetField32(MemberOffset field_offset) 473*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 474*795d594fSAndroid Build Coastguard Worker Verify<kVerifyFlags>(); 475*795d594fSAndroid Build Coastguard Worker return GetFieldPrimitive<int32_t, kIsVolatile>(field_offset); 476*795d594fSAndroid Build Coastguard Worker } 477*795d594fSAndroid Build Coastguard Worker 478*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> GetField32Volatile(MemberOffset field_offset)479*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE int32_t GetField32Volatile(MemberOffset field_offset) 480*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 481*795d594fSAndroid Build Coastguard Worker return GetField32<kVerifyFlags, true>(field_offset); 482*795d594fSAndroid Build Coastguard Worker } 483*795d594fSAndroid Build Coastguard Worker 484*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 485*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 486*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 487*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 488*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetField32(MemberOffset field_offset, int32_t new_value) 489*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 490*795d594fSAndroid Build Coastguard Worker 491*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 492*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 493*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 494*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetField32Volatile(MemberOffset field_offset, int32_t new_value) 495*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 496*795d594fSAndroid Build Coastguard Worker 497*795d594fSAndroid Build Coastguard Worker template<bool kCheckTransaction = true, 498*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 499*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 500*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetField32Transaction(MemberOffset field_offset, int32_t new_value) 501*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 502*795d594fSAndroid Build Coastguard Worker 503*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 504*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 505*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 506*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE bool CasField32(MemberOffset field_offset, 507*795d594fSAndroid Build Coastguard Worker int32_t old_value, 508*795d594fSAndroid Build Coastguard Worker int32_t new_value, 509*795d594fSAndroid Build Coastguard Worker CASMode mode, 510*795d594fSAndroid Build Coastguard Worker std::memory_order memory_order) 511*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 512*795d594fSAndroid Build Coastguard Worker 513*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false> GetField64(MemberOffset field_offset)514*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE int64_t GetField64(MemberOffset field_offset) 515*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 516*795d594fSAndroid Build Coastguard Worker Verify<kVerifyFlags>(); 517*795d594fSAndroid Build Coastguard Worker return GetFieldPrimitive<int64_t, kIsVolatile>(field_offset); 518*795d594fSAndroid Build Coastguard Worker } 519*795d594fSAndroid Build Coastguard Worker 520*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> GetField64Volatile(MemberOffset field_offset)521*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE int64_t GetField64Volatile(MemberOffset field_offset) 522*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 523*795d594fSAndroid Build Coastguard Worker return GetField64<kVerifyFlags, true>(field_offset); 524*795d594fSAndroid Build Coastguard Worker } 525*795d594fSAndroid Build Coastguard Worker 526*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 527*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 528*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 529*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 530*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetField64(MemberOffset field_offset, int64_t new_value) 531*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 532*795d594fSAndroid Build Coastguard Worker 533*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 534*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 535*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 536*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetField64Volatile(MemberOffset field_offset, int64_t new_value) 537*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 538*795d594fSAndroid Build Coastguard Worker 539*795d594fSAndroid Build Coastguard Worker template<bool kCheckTransaction = true, 540*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 541*795d594fSAndroid Build Coastguard Worker bool kIsVolatile = false> 542*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetField64Transaction(MemberOffset field_offset, int32_t new_value) 543*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 544*795d594fSAndroid Build Coastguard Worker 545*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 546*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 547*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 548*795d594fSAndroid Build Coastguard Worker bool CasFieldWeakSequentiallyConsistent64(MemberOffset field_offset, 549*795d594fSAndroid Build Coastguard Worker int64_t old_value, 550*795d594fSAndroid Build Coastguard Worker int64_t new_value) 551*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 552*795d594fSAndroid Build Coastguard Worker 553*795d594fSAndroid Build Coastguard Worker template <bool kTransactionActive, 554*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 555*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 556*795d594fSAndroid Build Coastguard Worker bool CasFieldStrongSequentiallyConsistent64(MemberOffset field_offset, 557*795d594fSAndroid Build Coastguard Worker int64_t old_value, 558*795d594fSAndroid Build Coastguard Worker int64_t new_value) 559*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 560*795d594fSAndroid Build Coastguard Worker 561*795d594fSAndroid Build Coastguard Worker template <bool kTransactionActive, 562*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 563*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 564*795d594fSAndroid Build Coastguard Worker int64_t CaeFieldStrongSequentiallyConsistent64(MemberOffset field_offset, 565*795d594fSAndroid Build Coastguard Worker int64_t old_value, 566*795d594fSAndroid Build Coastguard Worker int64_t new_value) 567*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 568*795d594fSAndroid Build Coastguard Worker 569*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 570*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 571*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 572*795d594fSAndroid Build Coastguard Worker typename T> SetFieldPtr(MemberOffset field_offset,T new_value)573*795d594fSAndroid Build Coastguard Worker void SetFieldPtr(MemberOffset field_offset, T new_value) 574*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 575*795d594fSAndroid Build Coastguard Worker SetFieldPtrWithSize<kTransactionActive, kCheckTransaction, kVerifyFlags>( 576*795d594fSAndroid Build Coastguard Worker field_offset, new_value, kRuntimePointerSize); 577*795d594fSAndroid Build Coastguard Worker } 578*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 579*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 580*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 581*795d594fSAndroid Build Coastguard Worker typename T> SetFieldPtr64(MemberOffset field_offset,T new_value)582*795d594fSAndroid Build Coastguard Worker void SetFieldPtr64(MemberOffset field_offset, T new_value) 583*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 584*795d594fSAndroid Build Coastguard Worker SetFieldPtrWithSize<kTransactionActive, kCheckTransaction, kVerifyFlags>( 585*795d594fSAndroid Build Coastguard Worker field_offset, new_value, PointerSize::k64); 586*795d594fSAndroid Build Coastguard Worker } 587*795d594fSAndroid Build Coastguard Worker 588*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 589*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 590*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 591*795d594fSAndroid Build Coastguard Worker typename T> SetFieldPtrWithSize(MemberOffset field_offset,T new_value,PointerSize pointer_size)592*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void SetFieldPtrWithSize(MemberOffset field_offset, 593*795d594fSAndroid Build Coastguard Worker T new_value, 594*795d594fSAndroid Build Coastguard Worker PointerSize pointer_size) 595*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 596*795d594fSAndroid Build Coastguard Worker if (pointer_size == PointerSize::k32) { 597*795d594fSAndroid Build Coastguard Worker SetField32<kTransactionActive, kCheckTransaction, kVerifyFlags>( 598*795d594fSAndroid Build Coastguard Worker field_offset, reinterpret_cast32<int32_t>(new_value)); 599*795d594fSAndroid Build Coastguard Worker } else { 600*795d594fSAndroid Build Coastguard Worker SetField64<kTransactionActive, kCheckTransaction, kVerifyFlags>( 601*795d594fSAndroid Build Coastguard Worker field_offset, reinterpret_cast64<int64_t>(new_value)); 602*795d594fSAndroid Build Coastguard Worker } 603*795d594fSAndroid Build Coastguard Worker } 604*795d594fSAndroid Build Coastguard Worker 605*795d594fSAndroid Build Coastguard Worker // Base class for accessors used to describe accesses performed by VarHandle methods. 606*795d594fSAndroid Build Coastguard Worker template <typename T> 607*795d594fSAndroid Build Coastguard Worker class Accessor { 608*795d594fSAndroid Build Coastguard Worker public: ~Accessor()609*795d594fSAndroid Build Coastguard Worker virtual ~Accessor() { 610*795d594fSAndroid Build Coastguard Worker static_assert(std::is_arithmetic<T>::value, "unsupported type"); 611*795d594fSAndroid Build Coastguard Worker } 612*795d594fSAndroid Build Coastguard Worker virtual void Access(T* field_address) = 0; 613*795d594fSAndroid Build Coastguard Worker }; 614*795d594fSAndroid Build Coastguard Worker 615*795d594fSAndroid Build Coastguard Worker // Getter method that exposes the raw address of a primitive value-type field to an Accessor 616*795d594fSAndroid Build Coastguard Worker // instance. This are used by VarHandle accessor methods to read fields with a wider range of 617*795d594fSAndroid Build Coastguard Worker // memory orderings than usually required. 618*795d594fSAndroid Build Coastguard Worker template<typename T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 619*795d594fSAndroid Build Coastguard Worker void GetPrimitiveFieldViaAccessor(MemberOffset field_offset, Accessor<T>* accessor) 620*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 621*795d594fSAndroid Build Coastguard Worker 622*795d594fSAndroid Build Coastguard Worker // Update methods that expose the raw address of a primitive value-type to an Accessor instance 623*795d594fSAndroid Build Coastguard Worker // that will attempt to update the field. These are used by VarHandle accessor methods to 624*795d594fSAndroid Build Coastguard Worker // atomically update fields with a wider range of memory orderings than usually required. 625*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 626*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 627*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 628*795d594fSAndroid Build Coastguard Worker void UpdateFieldBooleanViaAccessor(MemberOffset field_offset, Accessor<uint8_t>* accessor) 629*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 630*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 631*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 632*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 633*795d594fSAndroid Build Coastguard Worker void UpdateFieldByteViaAccessor(MemberOffset field_offset, Accessor<int8_t>* accessor) 634*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 635*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 636*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 637*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 638*795d594fSAndroid Build Coastguard Worker void UpdateFieldCharViaAccessor(MemberOffset field_offset, Accessor<uint16_t>* accessor) 639*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 640*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 641*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 642*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 643*795d594fSAndroid Build Coastguard Worker void UpdateFieldShortViaAccessor(MemberOffset field_offset, Accessor<int16_t>* accessor) 644*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 645*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 646*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 647*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 648*795d594fSAndroid Build Coastguard Worker void UpdateField32ViaAccessor(MemberOffset field_offset, Accessor<int32_t>* accessor) 649*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 650*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, 651*795d594fSAndroid Build Coastguard Worker bool kCheckTransaction = true, 652*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> 653*795d594fSAndroid Build Coastguard Worker void UpdateField64ViaAccessor(MemberOffset field_offset, Accessor<int64_t>* accessor) 654*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 655*795d594fSAndroid Build Coastguard Worker 656*795d594fSAndroid Build Coastguard Worker // TODO fix thread safety analysis broken by the use of template. This should be 657*795d594fSAndroid Build Coastguard Worker // REQUIRES_SHARED(Locks::mutator_lock_). 658*795d594fSAndroid Build Coastguard Worker template <bool kVisitNativeRoots = true, 659*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 660*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier, 661*795d594fSAndroid Build Coastguard Worker typename Visitor, 662*795d594fSAndroid Build Coastguard Worker typename JavaLangRefVisitor = VoidFunctor> 663*795d594fSAndroid Build Coastguard Worker void VisitReferences(const Visitor& visitor, const JavaLangRefVisitor& ref_visitor) 664*795d594fSAndroid Build Coastguard Worker NO_THREAD_SAFETY_ANALYSIS; 665*795d594fSAndroid Build Coastguard Worker // VisitReferences version for compaction. It is invoked with from-space 666*795d594fSAndroid Build Coastguard Worker // object so that portions of the object, like klass and length (for arrays), 667*795d594fSAndroid Build Coastguard Worker // can be accessed without causing cascading faults. 668*795d594fSAndroid Build Coastguard Worker template <bool kFetchObjSize = true, 669*795d594fSAndroid Build Coastguard Worker bool kVisitNativeRoots = false, 670*795d594fSAndroid Build Coastguard Worker VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 671*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithFromSpaceBarrier, 672*795d594fSAndroid Build Coastguard Worker typename Visitor> 673*795d594fSAndroid Build Coastguard Worker size_t VisitRefsForCompaction(const Visitor& visitor, 674*795d594fSAndroid Build Coastguard Worker MemberOffset begin, 675*795d594fSAndroid Build Coastguard Worker MemberOffset end) NO_THREAD_SAFETY_ANALYSIS; 676*795d594fSAndroid Build Coastguard Worker 677*795d594fSAndroid Build Coastguard Worker ArtField* FindFieldByOffset(MemberOffset offset) REQUIRES_SHARED(Locks::mutator_lock_); 678*795d594fSAndroid Build Coastguard Worker 679*795d594fSAndroid Build Coastguard Worker // Used by object_test. 680*795d594fSAndroid Build Coastguard Worker static void SetHashCodeSeed(uint32_t new_seed); 681*795d594fSAndroid Build Coastguard Worker // Generate an identity hash code. Public for object test. 682*795d594fSAndroid Build Coastguard Worker static uint32_t GenerateIdentityHashCode(); 683*795d594fSAndroid Build Coastguard Worker 684*795d594fSAndroid Build Coastguard Worker // Returns a human-readable form of the name of the *class* of the given object. 685*795d594fSAndroid Build Coastguard Worker // So given an instance of java.lang.String, the output would 686*795d594fSAndroid Build Coastguard Worker // be "java.lang.String". Given an array of int, the output would be "int[]". 687*795d594fSAndroid Build Coastguard Worker // Given String.class, the output would be "java.lang.Class<java.lang.String>". 688*795d594fSAndroid Build Coastguard Worker static std::string PrettyTypeOf(ObjPtr<mirror::Object> obj) 689*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 690*795d594fSAndroid Build Coastguard Worker std::string PrettyTypeOf() 691*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 692*795d594fSAndroid Build Coastguard Worker 693*795d594fSAndroid Build Coastguard Worker // A utility function that does a raw copy of `src`'s data into the buffer `dst_bytes`. 694*795d594fSAndroid Build Coastguard Worker // Skips the object header. 695*795d594fSAndroid Build Coastguard Worker static void CopyRawObjectData(uint8_t* dst_bytes, 696*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> src, 697*795d594fSAndroid Build Coastguard Worker size_t num_bytes) 698*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 699*795d594fSAndroid Build Coastguard Worker 700*795d594fSAndroid Build Coastguard Worker protected: 701*795d594fSAndroid Build Coastguard Worker // Accessors for non-Java type fields 702*795d594fSAndroid Build Coastguard Worker template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false> GetFieldPtr(MemberOffset field_offset)703*795d594fSAndroid Build Coastguard Worker T GetFieldPtr(MemberOffset field_offset) 704*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 705*795d594fSAndroid Build Coastguard Worker return GetFieldPtrWithSize<T, kVerifyFlags, kIsVolatile>(field_offset, kRuntimePointerSize); 706*795d594fSAndroid Build Coastguard Worker } 707*795d594fSAndroid Build Coastguard Worker template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false> GetFieldPtr64(MemberOffset field_offset)708*795d594fSAndroid Build Coastguard Worker T GetFieldPtr64(MemberOffset field_offset) 709*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 710*795d594fSAndroid Build Coastguard Worker return GetFieldPtrWithSize<T, kVerifyFlags, kIsVolatile>(field_offset, PointerSize::k64); 711*795d594fSAndroid Build Coastguard Worker } 712*795d594fSAndroid Build Coastguard Worker 713*795d594fSAndroid Build Coastguard Worker template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false> GetFieldPtrWithSize(MemberOffset field_offset,PointerSize pointer_size)714*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE T GetFieldPtrWithSize(MemberOffset field_offset, PointerSize pointer_size) 715*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 716*795d594fSAndroid Build Coastguard Worker if (pointer_size == PointerSize::k32) { 717*795d594fSAndroid Build Coastguard Worker int32_t v = GetField32<kVerifyFlags, kIsVolatile>(field_offset); 718*795d594fSAndroid Build Coastguard Worker return reinterpret_cast32<T>(v); 719*795d594fSAndroid Build Coastguard Worker } else { 720*795d594fSAndroid Build Coastguard Worker int64_t v = GetField64<kVerifyFlags, kIsVolatile>(field_offset); 721*795d594fSAndroid Build Coastguard Worker return reinterpret_cast64<T>(v); 722*795d594fSAndroid Build Coastguard Worker } 723*795d594fSAndroid Build Coastguard Worker } 724*795d594fSAndroid Build Coastguard Worker 725*795d594fSAndroid Build Coastguard Worker template <VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 726*795d594fSAndroid Build Coastguard Worker ReadBarrierOption kReadBarrierOption = kWithReadBarrier, 727*795d594fSAndroid Build Coastguard Worker typename Visitor> 728*795d594fSAndroid Build Coastguard Worker void VisitInstanceFieldsReferences(ObjPtr<mirror::Class> klass, const Visitor& visitor) HOT_ATTR 729*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 730*795d594fSAndroid Build Coastguard Worker 731*795d594fSAndroid Build Coastguard Worker private: 732*795d594fSAndroid Build Coastguard Worker template <bool kAllowInflation> 733*795d594fSAndroid Build Coastguard Worker int32_t IdentityHashCodeHelper() REQUIRES_SHARED(Locks::mutator_lock_) 734*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::thread_list_lock_, !Locks::thread_suspend_count_lock_); 735*795d594fSAndroid Build Coastguard Worker 736*795d594fSAndroid Build Coastguard Worker // Get a field with acquire semantics. 737*795d594fSAndroid Build Coastguard Worker template<typename kSize> 738*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE kSize GetFieldAcquire(MemberOffset field_offset) 739*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 740*795d594fSAndroid Build Coastguard Worker 741*795d594fSAndroid Build Coastguard Worker // Verify the type correctness of stores to fields. 742*795d594fSAndroid Build Coastguard Worker // TODO: This can cause thread suspension and isn't moving GC safe. 743*795d594fSAndroid Build Coastguard Worker void CheckFieldAssignmentImpl(MemberOffset field_offset, ObjPtr<Object> new_value) 744*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); CheckFieldAssignment(MemberOffset field_offset,ObjPtr<Object> new_value)745*795d594fSAndroid Build Coastguard Worker void CheckFieldAssignment(MemberOffset field_offset, ObjPtr<Object>new_value) 746*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 747*795d594fSAndroid Build Coastguard Worker if (kCheckFieldAssignments) { 748*795d594fSAndroid Build Coastguard Worker CheckFieldAssignmentImpl(field_offset, new_value); 749*795d594fSAndroid Build Coastguard Worker } 750*795d594fSAndroid Build Coastguard Worker } 751*795d594fSAndroid Build Coastguard Worker 752*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags> Verify()753*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void Verify() REQUIRES_SHARED(Locks::mutator_lock_) { 754*795d594fSAndroid Build Coastguard Worker if (kVerifyFlags & kVerifyThis) { 755*795d594fSAndroid Build Coastguard Worker VerifyObject(this); 756*795d594fSAndroid Build Coastguard Worker } 757*795d594fSAndroid Build Coastguard Worker } 758*795d594fSAndroid Build Coastguard Worker 759*795d594fSAndroid Build Coastguard Worker // Not ObjPtr since the values may be unaligned for logic in verification.cc. 760*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags, typename Reference> VerifyRead(Reference value)761*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE static void VerifyRead(Reference value) REQUIRES_SHARED(Locks::mutator_lock_) { 762*795d594fSAndroid Build Coastguard Worker if (kVerifyFlags & kVerifyReads) { 763*795d594fSAndroid Build Coastguard Worker VerifyObject(value); 764*795d594fSAndroid Build Coastguard Worker } 765*795d594fSAndroid Build Coastguard Worker } 766*795d594fSAndroid Build Coastguard Worker 767*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags> VerifyWrite(ObjPtr<mirror::Object> value)768*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE static void VerifyWrite(ObjPtr<mirror::Object> value) 769*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 770*795d594fSAndroid Build Coastguard Worker if (kVerifyFlags & kVerifyWrites) { 771*795d594fSAndroid Build Coastguard Worker VerifyObject(value); 772*795d594fSAndroid Build Coastguard Worker } 773*795d594fSAndroid Build Coastguard Worker } 774*795d594fSAndroid Build Coastguard Worker 775*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags> VerifyCAS(ObjPtr<mirror::Object> new_value,ObjPtr<mirror::Object> old_value)776*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void VerifyCAS(ObjPtr<mirror::Object> new_value, ObjPtr<mirror::Object> old_value) 777*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 778*795d594fSAndroid Build Coastguard Worker Verify<kVerifyFlags>(); 779*795d594fSAndroid Build Coastguard Worker VerifyRead<kVerifyFlags>(old_value); 780*795d594fSAndroid Build Coastguard Worker VerifyWrite<kVerifyFlags>(new_value); 781*795d594fSAndroid Build Coastguard Worker } 782*795d594fSAndroid Build Coastguard Worker 783*795d594fSAndroid Build Coastguard Worker // Verify transaction is active (if required). 784*795d594fSAndroid Build Coastguard Worker template<bool kTransactionActive, bool kCheckTransaction> 785*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void VerifyTransaction(); 786*795d594fSAndroid Build Coastguard Worker 787*795d594fSAndroid Build Coastguard Worker // A utility function that copies an object in a read barrier and write barrier-aware way. 788*795d594fSAndroid Build Coastguard Worker // This is internally used by Clone() and Class::CopyOf(). If the object is finalizable, 789*795d594fSAndroid Build Coastguard Worker // it is the callers job to call Heap::AddFinalizerReference. 790*795d594fSAndroid Build Coastguard Worker static ObjPtr<Object> CopyObject(ObjPtr<mirror::Object> dest, 791*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> src, 792*795d594fSAndroid Build Coastguard Worker size_t num_bytes) 793*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 794*795d594fSAndroid Build Coastguard Worker 795*795d594fSAndroid Build Coastguard Worker template<VerifyObjectFlags kVerifyFlags, Primitive::Type kType> 796*795d594fSAndroid Build Coastguard Worker bool IsSpecificPrimitiveArray() REQUIRES_SHARED(Locks::mutator_lock_); 797*795d594fSAndroid Build Coastguard Worker 798*795d594fSAndroid Build Coastguard Worker static Atomic<uint32_t> hash_code_seed; 799*795d594fSAndroid Build Coastguard Worker 800*795d594fSAndroid Build Coastguard Worker // The Class representing the type of the object. 801*795d594fSAndroid Build Coastguard Worker HeapReference<Class> klass_; 802*795d594fSAndroid Build Coastguard Worker // Monitor and hash code information. 803*795d594fSAndroid Build Coastguard Worker uint32_t monitor_; 804*795d594fSAndroid Build Coastguard Worker 805*795d594fSAndroid Build Coastguard Worker friend class art::Monitor; 806*795d594fSAndroid Build Coastguard Worker friend struct art::ObjectOffsets; // for verifying offset information 807*795d594fSAndroid Build Coastguard Worker friend class CopyObjectVisitor; // for CopyObject(). 808*795d594fSAndroid Build Coastguard Worker friend class CopyClassVisitor; // for CopyObject(). 809*795d594fSAndroid Build Coastguard Worker DISALLOW_ALLOCATION(); 810*795d594fSAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(Object); 811*795d594fSAndroid Build Coastguard Worker }; 812*795d594fSAndroid Build Coastguard Worker 813*795d594fSAndroid Build Coastguard Worker } // namespace mirror 814*795d594fSAndroid Build Coastguard Worker } // namespace art 815*795d594fSAndroid Build Coastguard Worker 816*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_MIRROR_OBJECT_H_ 817