xref: /aosp_15_r20/art/runtime/mirror/object.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_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