blob: 48ce5c1c4225bb7b5ded417584ebc2c60591d327 [file] [log] [blame]
Ian Rogers2dd0e2c2013-01-24 12:42:14 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Brian Carlstromfc0e3212013-07-17 14:40:12 -070017#ifndef ART_RUNTIME_MIRROR_OBJECT_H_
18#define ART_RUNTIME_MIRROR_OBJECT_H_
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080019
David Sehrc431b9d2018-03-02 12:01:51 -080020#include "base/atomic.h"
Vladimir Markodb8e62d2016-03-30 16:30:21 +010021#include "base/casts.h"
Andreas Gampe542451c2016-07-26 09:02:02 -070022#include "base/enums.h"
David Sehr1979c642018-04-26 14:41:18 -070023#include "base/globals.h"
Mathieu Chartiera59d9b22016-09-26 18:13:17 -070024#include "obj_ptr.h"
Ian Rogersef7d42f2014-01-06 12:55:46 -080025#include "object_reference.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080026#include "offsets.h"
Andreas Gampe217488a2017-09-18 08:34:42 -070027#include "read_barrier_config.h"
28#include "read_barrier_option.h"
Mathieu Chartier4e305412014-02-19 10:54:44 -080029#include "verify_object.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080030
31namespace art {
32
Mathieu Chartierc7853442015-03-27 14:35:38 -070033class ArtField;
Mathieu Chartiere401d142015-04-22 13:56:20 -070034class ArtMethod;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080035class ImageWriter;
Ian Rogersd9c4fc92013-10-01 19:45:43 -070036class LockWord;
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070037class Monitor;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080038struct ObjectOffsets;
39class Thread;
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070040class VoidFunctor;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080041
42namespace mirror {
43
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080044class Array;
45class Class;
Mathieu Chartiere4275c02015-08-06 15:34:15 -070046class ClassLoader;
Vladimir Marko05792b92015-08-03 11:56:49 +010047class DexCache;
Mathieu Chartier8fa2dad2014-03-13 12:22:56 -070048class FinalizerReference;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080049template<class T> class ObjectArray;
50template<class T> class PrimitiveArray;
51typedef PrimitiveArray<uint8_t> BooleanArray;
52typedef PrimitiveArray<int8_t> ByteArray;
53typedef PrimitiveArray<uint16_t> CharArray;
54typedef PrimitiveArray<double> DoubleArray;
55typedef PrimitiveArray<float> FloatArray;
56typedef PrimitiveArray<int32_t> IntArray;
57typedef PrimitiveArray<int64_t> LongArray;
58typedef PrimitiveArray<int16_t> ShortArray;
Mathieu Chartier8fa2dad2014-03-13 12:22:56 -070059class Reference;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080060class String;
61class Throwable;
62
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080063// Fields within mirror objects aren't accessed directly so that the appropriate amount of
64// handshaking is done with GC (for example, read and write barriers). This macro is used to
65// compute an offset for the Set/Get methods defined in Object that can safely access fields.
66#define OFFSET_OF_OBJECT_MEMBER(type, field) \
67 MemberOffset(OFFSETOF_MEMBER(type, field))
68
Mathieu Chartier4e305412014-02-19 10:54:44 -080069// Checks that we don't do field assignments which violate the typing system.
70static constexpr bool kCheckFieldAssignments = false;
Ian Rogers04d7aa92013-03-16 14:29:17 -070071
Ian Rogerscdc1aaf2014-10-09 13:21:38 -070072// Size of Object.
Hiroshi Yamauchi60f63f52015-04-23 16:12:40 -070073static constexpr uint32_t kObjectHeaderSize = kUseBrooksReadBarrier ? 16 : 8;
Ian Rogerscdc1aaf2014-10-09 13:21:38 -070074
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080075// C++ mirror of java.lang.Object
Ian Rogers719d1a32014-03-06 12:13:39 -080076class MANAGED LOCKABLE Object {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080077 public:
Mingyao Yang98d1cc82014-05-15 17:02:16 -070078 // The number of vtable entries in java.lang.Object.
79 static constexpr size_t kVTableLength = 11;
80
81 // The size of the java.lang.Class representing a java.lang.Object.
Andreas Gampe542451c2016-07-26 09:02:02 -070082 static uint32_t ClassSize(PointerSize pointer_size);
Mingyao Yang98d1cc82014-05-15 17:02:16 -070083
84 // Size of an instance of java.lang.Object.
85 static constexpr uint32_t InstanceSize() {
86 return sizeof(Object);
87 }
88
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080089 static MemberOffset ClassOffset() {
90 return OFFSET_OF_OBJECT_MEMBER(Object, klass_);
91 }
92
Hiroshi Yamauchi6e83c172014-05-01 21:25:41 -070093 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
94 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070095 ALWAYS_INLINE Class* GetClass() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080096
Mathieu Chartier4e305412014-02-19 10:54:44 -080097 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mathieu Chartiera058fdf2016-10-06 15:13:58 -070098 void SetClass(ObjPtr<Class> new_klass) REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080099
Hiroshi Yamauchi12b58b22016-11-01 11:55:29 -0700100 // Get the read barrier state with a fake address dependency.
101 // '*fake_address_dependency' will be set to 0.
102 ALWAYS_INLINE uint32_t GetReadBarrierState(uintptr_t* fake_address_dependency)
103 REQUIRES_SHARED(Locks::mutator_lock_);
104 // This version does not offer any special mechanism to prevent load-load reordering.
105 ALWAYS_INLINE uint32_t GetReadBarrierState() REQUIRES_SHARED(Locks::mutator_lock_);
106 // Get the read barrier state with a load-acquire.
107 ALWAYS_INLINE uint32_t GetReadBarrierStateAcquire() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc381c362016-08-23 13:27:53 -0700108
Hiroshi Yamauchi12b58b22016-11-01 11:55:29 -0700109 ALWAYS_INLINE void SetReadBarrierState(uint32_t rb_state) REQUIRES_SHARED(Locks::mutator_lock_);
Hiroshi Yamauchied70b4a2015-11-17 17:52:15 -0800110
Mathieu Chartier42c2e502018-06-19 12:30:56 -0700111 template<std::memory_order kMemoryOrder = std::memory_order_relaxed>
Hiroshi Yamauchi12b58b22016-11-01 11:55:29 -0700112 ALWAYS_INLINE bool AtomicSetReadBarrierState(uint32_t expected_rb_state, uint32_t rb_state)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700113 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier36a270a2016-07-28 18:08:51 -0700114
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700115 ALWAYS_INLINE uint32_t GetMarkBit() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier36a270a2016-07-28 18:08:51 -0700116
117 ALWAYS_INLINE bool AtomicSetMarkBit(uint32_t expected_mark_bit, uint32_t mark_bit)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700118 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier36a270a2016-07-28 18:08:51 -0700119
Roland Levillain14e5a292018-06-28 12:00:56 +0100120 // Assert that the read barrier state is in the default (white, i.e. non-gray) state.
Hiroshi Yamauchi12b58b22016-11-01 11:55:29 -0700121 ALWAYS_INLINE void AssertReadBarrierState() const REQUIRES_SHARED(Locks::mutator_lock_);
Hiroshi Yamauchi9d04a202014-01-31 13:35:49 -0800122
Jeff Haoa3faaf42013-09-03 19:07:00 -0700123 // The verifier treats all interfaces as java.lang.Object and relies on runtime checks in
124 // invoke-interface to detect incompatible interface types.
Mathieu Chartier4e305412014-02-19 10:54:44 -0800125 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mathieu Chartieref41db72016-10-25 15:08:01 -0700126 bool VerifierInstanceOf(ObjPtr<Class> klass) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800127 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mathieu Chartiera59d9b22016-09-26 18:13:17 -0700128 ALWAYS_INLINE bool InstanceOf(ObjPtr<Class> klass) REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800129
Mathieu Chartierd08f66f2017-04-13 11:47:53 -0700130 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700131 size_t SizeOf() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800132
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700133 Object* Clone(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartier4e2cb092015-07-22 16:17:51 -0700134 REQUIRES(!Roles::uninterruptible_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800135
Mathieu Chartier31e88222016-10-14 18:43:19 -0700136 int32_t IdentityHashCode()
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700137 REQUIRES_SHARED(Locks::mutator_lock_)
Mathieu Chartier31e88222016-10-14 18:43:19 -0700138 REQUIRES(!Locks::thread_list_lock_,
139 !Locks::thread_suspend_count_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800140
141 static MemberOffset MonitorOffset() {
142 return OFFSET_OF_OBJECT_MEMBER(Object, monitor_);
143 }
144
Hans Boehmd8434432014-07-11 09:56:07 -0700145 // As_volatile can be false if the mutators are suspended. This is an optimization since it
Mathieu Chartier4d7f61d2014-04-17 14:43:39 -0700146 // avoids the barriers.
Andreas Gampe3b45ef22015-05-26 21:34:09 -0700147 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700148 LockWord GetLockWord(bool as_volatile) REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampe3b45ef22015-05-26 21:34:09 -0700149 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700150 void SetLockWord(LockWord new_val, bool as_volatile) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier42c2e502018-06-19 12:30:56 -0700151 bool CasLockWord(LockWord old_val, LockWord new_val, CASMode mode, std::memory_order memory_order)
Mathieu Chartier8bb3c682018-06-18 12:53:10 -0700152 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersd9c4fc92013-10-01 19:45:43 -0700153 uint32_t GetLockOwnerThreadId();
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800154
Mathieu Chartiera704eda2016-07-13 09:53:35 -0700155 // Try to enter the monitor, returns non null if we succeeded.
156 mirror::Object* MonitorTryEnter(Thread* self)
157 EXCLUSIVE_LOCK_FUNCTION()
158 REQUIRES(!Roles::uninterruptible_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700159 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier2d096c92015-10-12 16:18:20 -0700160 mirror::Object* MonitorEnter(Thread* self)
161 EXCLUSIVE_LOCK_FUNCTION()
162 REQUIRES(!Roles::uninterruptible_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700163 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier2d096c92015-10-12 16:18:20 -0700164 bool MonitorExit(Thread* self)
165 REQUIRES(!Roles::uninterruptible_)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700166 REQUIRES_SHARED(Locks::mutator_lock_)
Ian Rogers719d1a32014-03-06 12:13:39 -0800167 UNLOCK_FUNCTION();
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700168 void Notify(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
169 void NotifyAll(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700170 void Wait(Thread* self, int64_t timeout, int32_t nanos) REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800171
Mathieu Chartierd7a7f2f2018-09-07 11:57:18 -0700172 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700173 bool IsClass() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierd7a7f2f2018-09-07 11:57:18 -0700174 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700175 Class* AsClass() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800176
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800177 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
178 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700179 bool IsObjectArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800180 template<class T,
181 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
182 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700183 ObjectArray<T>* AsObjectArray() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800184
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800185 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
186 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700187 bool IsClassLoader() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800188 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
189 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700190 ClassLoader* AsClassLoader() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere4275c02015-08-06 15:34:15 -0700191
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800192 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
193 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700194 bool IsDexCache() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800195 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
196 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700197 DexCache* AsDexCache() REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko05792b92015-08-03 11:56:49 +0100198
Hiroshi Yamauchi6e83c172014-05-01 21:25:41 -0700199 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
200 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700201 bool IsArrayInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Hiroshi Yamauchi6e83c172014-05-01 21:25:41 -0700202 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
203 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700204 Array* AsArray() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800205
Mathieu Chartier4e305412014-02-19 10:54:44 -0800206 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700207 BooleanArray* AsBooleanArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800208 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700209 ByteArray* AsByteArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800210 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700211 ByteArray* AsByteSizedArray() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800212
Mathieu Chartier4e305412014-02-19 10:54:44 -0800213 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700214 CharArray* AsCharArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800215 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700216 ShortArray* AsShortArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800217 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700218 ShortArray* AsShortSizedArray() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800219
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800220 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
221 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700222 bool IsIntArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800223 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
224 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700225 IntArray* AsIntArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700226
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800227 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
228 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700229 bool IsLongArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800230 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
231 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700232 LongArray* AsLongArray() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800233
Mathieu Chartier4e305412014-02-19 10:54:44 -0800234 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700235 bool IsFloatArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700236 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700237 FloatArray* AsFloatArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700238
239 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700240 bool IsDoubleArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800241 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700242 DoubleArray* AsDoubleArray() REQUIRES_SHARED(Locks::mutator_lock_);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100243
Jeff Hao848f70a2014-01-15 13:49:50 -0800244 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
245 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700246 bool IsString() REQUIRES_SHARED(Locks::mutator_lock_);
Jeff Hao848f70a2014-01-15 13:49:50 -0800247
248 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
249 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700250 String* AsString() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800251
Mathieu Chartier4e305412014-02-19 10:54:44 -0800252 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700253 Throwable* AsThrowable() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800254
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800255 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
256 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700257 bool IsReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800258 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
259 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700260 Reference* AsReference() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier8fa2dad2014-03-13 12:22:56 -0700261 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700262 bool IsWeakReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800263 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700264 bool IsSoftReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800265 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700266 bool IsFinalizerReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800267 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700268 FinalizerReference* AsFinalizerReference() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier8fa2dad2014-03-13 12:22:56 -0700269 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700270 bool IsPhantomReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800271
Ian Rogersef7d42f2014-01-06 12:55:46 -0800272 // Accessor for Java type fields.
Roland Levillaind32ead22018-05-30 17:38:21 +0100273 template<class T,
274 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
275 ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
276 bool kIsVolatile = false>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700277 ALWAYS_INLINE T* GetFieldObject(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700278 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700279
Roland Levillaind32ead22018-05-30 17:38:21 +0100280 template<class T,
281 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
282 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700283 ALWAYS_INLINE T* GetFieldObjectVolatile(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700284 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700285
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700286 template<bool kTransactionActive,
287 bool kCheckTransaction = true,
288 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
289 bool kIsVolatile = false>
290 ALWAYS_INLINE void SetFieldObjectWithoutWriteBarrier(MemberOffset field_offset,
291 ObjPtr<Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700292 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700293
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700294 template<bool kTransactionActive,
295 bool kCheckTransaction = true,
296 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
297 bool kIsVolatile = false>
298 ALWAYS_INLINE void SetFieldObject(MemberOffset field_offset, ObjPtr<Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700299 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700300
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700301 template<bool kTransactionActive,
302 bool kCheckTransaction = true,
303 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Roland Levillaind32ead22018-05-30 17:38:21 +0100304 ALWAYS_INLINE void SetFieldObjectVolatile(MemberOffset field_offset, ObjPtr<Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700305 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700306
Roland Levillaind32ead22018-05-30 17:38:21 +0100307 template<bool kCheckTransaction = true,
308 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
Chang Xing6d3e7682017-07-11 10:31:29 -0700309 bool kIsVolatile = false>
310 ALWAYS_INLINE void SetFieldObjectTransaction(MemberOffset field_offset, ObjPtr<Object> new_value)
311 REQUIRES_SHARED(Locks::mutator_lock_);
312
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700313 template<bool kTransactionActive,
314 bool kCheckTransaction = true,
315 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mathieu Chartiera9746b92018-06-22 10:25:40 -0700316 ALWAYS_INLINE bool CasFieldObject(MemberOffset field_offset,
317 ObjPtr<Object> old_value,
318 ObjPtr<Object> new_value,
319 CASMode mode,
320 std::memory_order memory_order)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700321 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700322 template<bool kTransactionActive,
323 bool kCheckTransaction = true,
324 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mathieu Chartiera9746b92018-06-22 10:25:40 -0700325 ALWAYS_INLINE bool CasFieldObjectWithoutWriteBarrier(MemberOffset field_offset,
326 ObjPtr<Object> old_value,
327 ObjPtr<Object> new_value,
328 CASMode mode,
329 std::memory_order memory_order)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700330 REQUIRES_SHARED(Locks::mutator_lock_);
Orion Hodson928033d2018-02-07 05:30:54 +0000331
332 template<bool kTransactionActive,
333 bool kCheckTransaction = true,
334 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
335 ObjPtr<Object> CompareAndExchangeFieldObject(MemberOffset field_offset,
336 ObjPtr<Object> old_value,
337 ObjPtr<Object> new_value)
338 REQUIRES_SHARED(Locks::mutator_lock_);
339
340 template<bool kTransactionActive,
341 bool kCheckTransaction = true,
342 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
343 ObjPtr<Object> ExchangeFieldObject(MemberOffset field_offset, ObjPtr<Object> new_value)
344 REQUIRES_SHARED(Locks::mutator_lock_);
345
Mathieu Chartier4e305412014-02-19 10:54:44 -0800346 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mathieu Chartier99111282018-06-19 12:30:56 -0700347 HeapReference<Object>* GetFieldObjectReferenceAddr(MemberOffset field_offset)
348 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier11409ae2013-09-23 11:49:36 -0700349
David Srbeckyce32c102018-08-31 07:21:07 +0100350 template<typename kType, bool kIsVolatile>
351 ALWAYS_INLINE void SetFieldPrimitive(MemberOffset field_offset, kType new_value)
352 REQUIRES_SHARED(Locks::mutator_lock_) {
353 uint8_t* raw_addr = reinterpret_cast<uint8_t*>(this) + field_offset.Int32Value();
354 kType* addr = reinterpret_cast<kType*>(raw_addr);
355 if (kIsVolatile) {
356 reinterpret_cast<Atomic<kType>*>(addr)->store(new_value, std::memory_order_seq_cst);
357 } else {
358 reinterpret_cast<Atomic<kType>*>(addr)->StoreJavaData(new_value);
359 }
360 }
361
362 template<typename kType, bool kIsVolatile>
363 ALWAYS_INLINE kType GetFieldPrimitive(MemberOffset field_offset)
364 REQUIRES_SHARED(Locks::mutator_lock_) {
365 const uint8_t* raw_addr = reinterpret_cast<const uint8_t*>(this) + field_offset.Int32Value();
366 const kType* addr = reinterpret_cast<const kType*>(raw_addr);
367 if (kIsVolatile) {
368 return reinterpret_cast<const Atomic<kType>*>(addr)->load(std::memory_order_seq_cst);
369 } else {
370 return reinterpret_cast<const Atomic<kType>*>(addr)->LoadJavaData();
371 }
372 }
373
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700374 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
Fred Shih37f05ef2014-07-16 18:38:08 -0700375 ALWAYS_INLINE uint8_t GetFieldBoolean(MemberOffset field_offset)
Andreas Gampe895f9222017-07-05 09:53:32 -0700376 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier99111282018-06-19 12:30:56 -0700377 Verify<kVerifyFlags>();
David Srbeckyce32c102018-08-31 07:21:07 +0100378 return GetFieldPrimitive<uint8_t, kIsVolatile>(field_offset);
Andreas Gampe895f9222017-07-05 09:53:32 -0700379 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700380
381 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
382 ALWAYS_INLINE int8_t GetFieldByte(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700383 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700384
385 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
386 ALWAYS_INLINE uint8_t GetFieldBooleanVolatile(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700387 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700388
389 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
390 ALWAYS_INLINE int8_t GetFieldByteVolatile(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700391 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700392
Roland Levillaind32ead22018-05-30 17:38:21 +0100393 template<bool kTransactionActive,
394 bool kCheckTransaction = true,
395 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
396 bool kIsVolatile = false>
Fred Shih37f05ef2014-07-16 18:38:08 -0700397 ALWAYS_INLINE void SetFieldBoolean(MemberOffset field_offset, uint8_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700398 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700399
Roland Levillaind32ead22018-05-30 17:38:21 +0100400 template<bool kTransactionActive,
401 bool kCheckTransaction = true,
402 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
403 bool kIsVolatile = false>
Fred Shih37f05ef2014-07-16 18:38:08 -0700404 ALWAYS_INLINE void SetFieldByte(MemberOffset field_offset, int8_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700405 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700406
Roland Levillaind32ead22018-05-30 17:38:21 +0100407 template<bool kTransactionActive,
408 bool kCheckTransaction = true,
409 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Fred Shih37f05ef2014-07-16 18:38:08 -0700410 ALWAYS_INLINE void SetFieldBooleanVolatile(MemberOffset field_offset, uint8_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700411 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700412
Roland Levillaind32ead22018-05-30 17:38:21 +0100413 template<bool kTransactionActive,
414 bool kCheckTransaction = true,
415 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Fred Shih37f05ef2014-07-16 18:38:08 -0700416 ALWAYS_INLINE void SetFieldByteVolatile(MemberOffset field_offset, int8_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700417 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700418
419 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
420 ALWAYS_INLINE uint16_t GetFieldChar(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700421 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700422
423 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
424 ALWAYS_INLINE int16_t GetFieldShort(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700425 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700426
427 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
428 ALWAYS_INLINE uint16_t GetFieldCharVolatile(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700429 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700430
431 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
432 ALWAYS_INLINE int16_t GetFieldShortVolatile(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700433 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700434
Roland Levillaind32ead22018-05-30 17:38:21 +0100435 template<bool kTransactionActive,
436 bool kCheckTransaction = true,
437 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
438 bool kIsVolatile = false>
Fred Shih37f05ef2014-07-16 18:38:08 -0700439 ALWAYS_INLINE void SetFieldChar(MemberOffset field_offset, uint16_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700440 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700441
Roland Levillaind32ead22018-05-30 17:38:21 +0100442 template<bool kTransactionActive,
443 bool kCheckTransaction = true,
444 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
445 bool kIsVolatile = false>
Fred Shih37f05ef2014-07-16 18:38:08 -0700446 ALWAYS_INLINE void SetFieldShort(MemberOffset field_offset, int16_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700447 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700448
Roland Levillaind32ead22018-05-30 17:38:21 +0100449 template<bool kTransactionActive,
450 bool kCheckTransaction = true,
451 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Fred Shih37f05ef2014-07-16 18:38:08 -0700452 ALWAYS_INLINE void SetFieldCharVolatile(MemberOffset field_offset, uint16_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700453 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700454
Roland Levillaind32ead22018-05-30 17:38:21 +0100455 template<bool kTransactionActive,
456 bool kCheckTransaction = true,
457 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Fred Shih37f05ef2014-07-16 18:38:08 -0700458 ALWAYS_INLINE void SetFieldShortVolatile(MemberOffset field_offset, int16_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700459 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700460
461 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700462 ALWAYS_INLINE int32_t GetField32(MemberOffset field_offset)
Andreas Gampe90b936d2017-01-31 08:58:55 -0800463 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier99111282018-06-19 12:30:56 -0700464 Verify<kVerifyFlags>();
David Srbeckyce32c102018-08-31 07:21:07 +0100465 return GetFieldPrimitive<int32_t, kIsVolatile>(field_offset);
Andreas Gampe90b936d2017-01-31 08:58:55 -0800466 }
Ian Rogersd9c4fc92013-10-01 19:45:43 -0700467
Mathieu Chartier4e305412014-02-19 10:54:44 -0800468 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700469 ALWAYS_INLINE int32_t GetField32Volatile(MemberOffset field_offset)
Andreas Gampe90b936d2017-01-31 08:58:55 -0800470 REQUIRES_SHARED(Locks::mutator_lock_) {
471 return GetField32<kVerifyFlags, true>(field_offset);
472 }
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700473
Roland Levillaind32ead22018-05-30 17:38:21 +0100474 template<bool kTransactionActive,
475 bool kCheckTransaction = true,
476 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
477 bool kIsVolatile = false>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700478 ALWAYS_INLINE void SetField32(MemberOffset field_offset, int32_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700479 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700480
Roland Levillaind32ead22018-05-30 17:38:21 +0100481 template<bool kTransactionActive,
482 bool kCheckTransaction = true,
483 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700484 ALWAYS_INLINE void SetField32Volatile(MemberOffset field_offset, int32_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700485 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700486
Chang Xing6d3e7682017-07-11 10:31:29 -0700487 template<bool kCheckTransaction = true,
488 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
489 bool kIsVolatile = false>
490 ALWAYS_INLINE void SetField32Transaction(MemberOffset field_offset, int32_t new_value)
491 REQUIRES_SHARED(Locks::mutator_lock_);
492
Roland Levillaind32ead22018-05-30 17:38:21 +0100493 template<bool kTransactionActive,
494 bool kCheckTransaction = true,
495 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mathieu Chartier42c2e502018-06-19 12:30:56 -0700496 ALWAYS_INLINE bool CasField32(MemberOffset field_offset,
497 int32_t old_value,
498 int32_t new_value,
499 CASMode mode,
500 std::memory_order memory_order)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700501 REQUIRES_SHARED(Locks::mutator_lock_);
Hans Boehmd8434432014-07-11 09:56:07 -0700502
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700503 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700504 ALWAYS_INLINE int64_t GetField64(MemberOffset field_offset)
Andreas Gampec6ea7d02017-02-01 16:46:28 -0800505 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier99111282018-06-19 12:30:56 -0700506 Verify<kVerifyFlags>();
David Srbeckyce32c102018-08-31 07:21:07 +0100507 return GetFieldPrimitive<int64_t, kIsVolatile>(field_offset);
Andreas Gampec6ea7d02017-02-01 16:46:28 -0800508 }
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700509
510 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700511 ALWAYS_INLINE int64_t GetField64Volatile(MemberOffset field_offset)
Andreas Gampec6ea7d02017-02-01 16:46:28 -0800512 REQUIRES_SHARED(Locks::mutator_lock_) {
513 return GetField64<kVerifyFlags, true>(field_offset);
514 }
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700515
Roland Levillaind32ead22018-05-30 17:38:21 +0100516 template<bool kTransactionActive,
517 bool kCheckTransaction = true,
518 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
519 bool kIsVolatile = false>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700520 ALWAYS_INLINE void SetField64(MemberOffset field_offset, int64_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700521 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700522
Roland Levillaind32ead22018-05-30 17:38:21 +0100523 template<bool kTransactionActive,
524 bool kCheckTransaction = true,
525 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700526 ALWAYS_INLINE void SetField64Volatile(MemberOffset field_offset, int64_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700527 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800528
Chang Xing6d3e7682017-07-11 10:31:29 -0700529 template<bool kCheckTransaction = true,
530 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
531 bool kIsVolatile = false>
532 ALWAYS_INLINE void SetField64Transaction(MemberOffset field_offset, int32_t new_value)
533 REQUIRES_SHARED(Locks::mutator_lock_);
534
Roland Levillaind32ead22018-05-30 17:38:21 +0100535 template<bool kTransactionActive,
536 bool kCheckTransaction = true,
537 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
538 bool CasFieldWeakSequentiallyConsistent64(MemberOffset field_offset,
539 int64_t old_value,
Ian Rogers228602f2014-07-10 02:07:54 -0700540 int64_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700541 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800542
Roland Levillaind32ead22018-05-30 17:38:21 +0100543 template<bool kTransactionActive,
544 bool kCheckTransaction = true,
545 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
546 bool CasFieldStrongSequentiallyConsistent64(MemberOffset field_offset,
547 int64_t old_value,
Hans Boehmd8434432014-07-11 09:56:07 -0700548 int64_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700549 REQUIRES_SHARED(Locks::mutator_lock_);
Hans Boehmd8434432014-07-11 09:56:07 -0700550
Roland Levillaind32ead22018-05-30 17:38:21 +0100551 template<bool kTransactionActive,
552 bool kCheckTransaction = true,
553 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
554 typename T>
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700555 void SetFieldPtr(MemberOffset field_offset, T new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700556 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier2d721012014-11-10 11:08:06 -0800557 SetFieldPtrWithSize<kTransactionActive, kCheckTransaction, kVerifyFlags>(
Andreas Gampe542451c2016-07-26 09:02:02 -0700558 field_offset, new_value, kRuntimePointerSize);
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800559 }
Roland Levillaind32ead22018-05-30 17:38:21 +0100560 template<bool kTransactionActive,
561 bool kCheckTransaction = true,
562 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
563 typename T>
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800564 void SetFieldPtr64(MemberOffset field_offset, T new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700565 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800566 SetFieldPtrWithSize<kTransactionActive, kCheckTransaction, kVerifyFlags>(
Vladimir Markoca8de0a2018-07-04 11:56:08 +0100567 field_offset, new_value, PointerSize::k64);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800568 }
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800569
Roland Levillaind32ead22018-05-30 17:38:21 +0100570 template<bool kTransactionActive,
571 bool kCheckTransaction = true,
572 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
573 typename T>
Andreas Gampe542451c2016-07-26 09:02:02 -0700574 ALWAYS_INLINE void SetFieldPtrWithSize(MemberOffset field_offset,
575 T new_value,
576 PointerSize pointer_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700577 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampe542451c2016-07-26 09:02:02 -0700578 if (pointer_size == PointerSize::k32) {
Mathieu Chartier2d721012014-11-10 11:08:06 -0800579 SetField32<kTransactionActive, kCheckTransaction, kVerifyFlags>(
Vladimir Markoca8de0a2018-07-04 11:56:08 +0100580 field_offset, reinterpret_cast32<int32_t>(new_value));
Mathieu Chartier2d721012014-11-10 11:08:06 -0800581 } else {
582 SetField64<kTransactionActive, kCheckTransaction, kVerifyFlags>(
Vladimir Markodb8e62d2016-03-30 16:30:21 +0100583 field_offset, reinterpret_cast64<int64_t>(new_value));
Mathieu Chartier2d721012014-11-10 11:08:06 -0800584 }
585 }
Orion Hodson928033d2018-02-07 05:30:54 +0000586
587 // Base class for accessors used to describe accesses performed by VarHandle methods.
588 template <typename T>
589 class Accessor {
590 public:
591 virtual ~Accessor() {
592 static_assert(std::is_arithmetic<T>::value, "unsupported type");
593 }
594 virtual void Access(T* field_address) = 0;
595 };
596
597 // Getter method that exposes the raw address of a primitive value-type field to an Accessor
598 // instance. This are used by VarHandle accessor methods to read fields with a wider range of
599 // memory orderings than usually required.
600 template<typename T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
601 void GetPrimitiveFieldViaAccessor(MemberOffset field_offset, Accessor<T>* accessor)
602 REQUIRES_SHARED(Locks::mutator_lock_);
603
604 // Update methods that expose the raw address of a primitive value-type to an Accessor instance
605 // that will attempt to update the field. These are used by VarHandle accessor methods to
606 // atomically update fields with a wider range of memory orderings than usually required.
Roland Levillaind32ead22018-05-30 17:38:21 +0100607 template<bool kTransactionActive,
608 bool kCheckTransaction = true,
609 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Orion Hodson928033d2018-02-07 05:30:54 +0000610 void UpdateFieldBooleanViaAccessor(MemberOffset field_offset, Accessor<uint8_t>* accessor)
611 REQUIRES_SHARED(Locks::mutator_lock_);
Roland Levillaind32ead22018-05-30 17:38:21 +0100612 template<bool kTransactionActive,
613 bool kCheckTransaction = true,
614 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Orion Hodson928033d2018-02-07 05:30:54 +0000615 void UpdateFieldByteViaAccessor(MemberOffset field_offset, Accessor<int8_t>* accessor)
616 REQUIRES_SHARED(Locks::mutator_lock_);
Roland Levillaind32ead22018-05-30 17:38:21 +0100617 template<bool kTransactionActive,
618 bool kCheckTransaction = true,
619 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Orion Hodson928033d2018-02-07 05:30:54 +0000620 void UpdateFieldCharViaAccessor(MemberOffset field_offset, Accessor<uint16_t>* accessor)
621 REQUIRES_SHARED(Locks::mutator_lock_);
Roland Levillaind32ead22018-05-30 17:38:21 +0100622 template<bool kTransactionActive,
623 bool kCheckTransaction = true,
624 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Orion Hodson928033d2018-02-07 05:30:54 +0000625 void UpdateFieldShortViaAccessor(MemberOffset field_offset, Accessor<int16_t>* accessor)
626 REQUIRES_SHARED(Locks::mutator_lock_);
Roland Levillaind32ead22018-05-30 17:38:21 +0100627 template<bool kTransactionActive,
628 bool kCheckTransaction = true,
629 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Orion Hodson928033d2018-02-07 05:30:54 +0000630 void UpdateField32ViaAccessor(MemberOffset field_offset, Accessor<int32_t>* accessor)
631 REQUIRES_SHARED(Locks::mutator_lock_);
Roland Levillaind32ead22018-05-30 17:38:21 +0100632 template<bool kTransactionActive,
633 bool kCheckTransaction = true,
634 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Orion Hodson928033d2018-02-07 05:30:54 +0000635 void UpdateField64ViaAccessor(MemberOffset field_offset, Accessor<int64_t>* accessor)
636 REQUIRES_SHARED(Locks::mutator_lock_);
637
Mathieu Chartier407f7022014-02-18 14:37:05 -0800638 // TODO fix thread safety analysis broken by the use of template. This should be
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700639 // REQUIRES_SHARED(Locks::mutator_lock_).
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800640 template <bool kVisitNativeRoots = true,
641 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
642 ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
Mathieu Chartier059ef3d2015-08-18 13:54:21 -0700643 typename Visitor,
644 typename JavaLangRefVisitor = VoidFunctor>
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700645 void VisitReferences(const Visitor& visitor, const JavaLangRefVisitor& ref_visitor)
Mathieu Chartier407f7022014-02-18 14:37:05 -0800646 NO_THREAD_SAFETY_ANALYSIS;
647
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700648 ArtField* FindFieldByOffset(MemberOffset offset) REQUIRES_SHARED(Locks::mutator_lock_);
Hiroshi Yamauchieb2baaf2015-05-13 21:14:22 -0700649
tony.ys_liu7380c312015-01-16 19:16:45 +0800650 // Used by object_test.
651 static void SetHashCodeSeed(uint32_t new_seed);
652 // Generate an identity hash code. Public for object test.
653 static uint32_t GenerateIdentityHashCode();
654
David Sehr709b0702016-10-13 09:12:37 -0700655 // Returns a human-readable form of the name of the *class* of the given object.
656 // So given an instance of java.lang.String, the output would
657 // be "java.lang.String". Given an array of int, the output would be "int[]".
658 // Given String.class, the output would be "java.lang.Class<java.lang.String>".
659 static std::string PrettyTypeOf(ObjPtr<mirror::Object> obj)
660 REQUIRES_SHARED(Locks::mutator_lock_);
661 std::string PrettyTypeOf()
662 REQUIRES_SHARED(Locks::mutator_lock_);
663
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800664 protected:
665 // Accessors for non-Java type fields
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700666 template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
667 T GetFieldPtr(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700668 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampe542451c2016-07-26 09:02:02 -0700669 return GetFieldPtrWithSize<T, kVerifyFlags, kIsVolatile>(field_offset, kRuntimePointerSize);
Mathieu Chartier2d721012014-11-10 11:08:06 -0800670 }
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800671 template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
672 T GetFieldPtr64(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700673 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier99111282018-06-19 12:30:56 -0700674 return GetFieldPtrWithSize<T, kVerifyFlags, kIsVolatile>(field_offset, PointerSize::k64);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800675 }
Mathieu Chartier2d721012014-11-10 11:08:06 -0800676
677 template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
Andreas Gampe542451c2016-07-26 09:02:02 -0700678 ALWAYS_INLINE T GetFieldPtrWithSize(MemberOffset field_offset, PointerSize pointer_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700679 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampe542451c2016-07-26 09:02:02 -0700680 if (pointer_size == PointerSize::k32) {
Vladimir Markoca8de0a2018-07-04 11:56:08 +0100681 int32_t v = GetField32<kVerifyFlags, kIsVolatile>(field_offset);
682 return reinterpret_cast32<T>(v);
Mathieu Chartier2d721012014-11-10 11:08:06 -0800683 } else {
684 int64_t v = GetField64<kVerifyFlags, kIsVolatile>(field_offset);
Vladimir Markodb8e62d2016-03-30 16:30:21 +0100685 return reinterpret_cast64<T>(v);
Mathieu Chartier2d721012014-11-10 11:08:06 -0800686 }
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800687 }
688
Mathieu Chartier407f7022014-02-18 14:37:05 -0800689 // TODO: Fixme when anotatalysis works with visitors.
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800690 template<bool kIsStatic,
691 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
692 ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
693 typename Visitor>
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700694 void VisitFieldsReferences(uint32_t ref_offsets, const Visitor& visitor) HOT_ATTR
Mathieu Chartier407f7022014-02-18 14:37:05 -0800695 NO_THREAD_SAFETY_ANALYSIS;
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800696 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
697 ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
698 typename Visitor>
Mathieu Chartier31e88222016-10-14 18:43:19 -0700699 void VisitInstanceFieldsReferences(ObjPtr<mirror::Class> klass, const Visitor& visitor) HOT_ATTR
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700700 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800701 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
702 ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
703 typename Visitor>
Mathieu Chartier31e88222016-10-14 18:43:19 -0700704 void VisitStaticFieldsReferences(ObjPtr<mirror::Class> klass, const Visitor& visitor) HOT_ATTR
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700705 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier407f7022014-02-18 14:37:05 -0800706
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800707 private:
Mathieu Chartierc381c362016-08-23 13:27:53 -0700708 // Get a field with acquire semantics.
709 template<typename kSize>
710 ALWAYS_INLINE kSize GetFieldAcquire(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700711 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700712
Ian Rogers04d7aa92013-03-16 14:29:17 -0700713 // Verify the type correctness of stores to fields.
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700714 // TODO: This can cause thread suspension and isn't moving GC safe.
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700715 void CheckFieldAssignmentImpl(MemberOffset field_offset, ObjPtr<Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700716 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700717 void CheckFieldAssignment(MemberOffset field_offset, ObjPtr<Object>new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700718 REQUIRES_SHARED(Locks::mutator_lock_) {
Ian Rogers04d7aa92013-03-16 14:29:17 -0700719 if (kCheckFieldAssignments) {
720 CheckFieldAssignmentImpl(field_offset, new_value);
721 }
722 }
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800723
Mathieu Chartier99111282018-06-19 12:30:56 -0700724 template<VerifyObjectFlags kVerifyFlags>
725 ALWAYS_INLINE void Verify() {
726 if (kVerifyFlags & kVerifyThis) {
727 VerifyObject(this);
728 }
729 }
730
731 // Not ObjPtr since the values may be unaligned for logic in verification.cc.
732 template<VerifyObjectFlags kVerifyFlags, typename Reference>
733 ALWAYS_INLINE static void VerifyRead(Reference value) {
734 if (kVerifyFlags & kVerifyReads) {
735 VerifyObject(value);
736 }
737 }
738
739 template<VerifyObjectFlags kVerifyFlags>
740 ALWAYS_INLINE static void VerifyWrite(ObjPtr<mirror::Object> value) {
741 if (kVerifyFlags & kVerifyWrites) {
742 VerifyObject(value);
743 }
744 }
745
746 template<VerifyObjectFlags kVerifyFlags>
747 ALWAYS_INLINE void VerifyCAS(ObjPtr<mirror::Object> new_value, ObjPtr<mirror::Object> old_value) {
748 Verify<kVerifyFlags>();
749 VerifyRead<kVerifyFlags>(old_value);
750 VerifyWrite<kVerifyFlags>(new_value);
751 }
752
753 // Verify transaction is active (if required).
754 template<bool kTransactionActive, bool kCheckTransaction>
755 ALWAYS_INLINE void VerifyTransaction();
756
Mathieu Chartier51eaa7f2016-10-12 16:08:35 -0700757 // A utility function that copies an object in a read barrier and write barrier-aware way.
758 // This is internally used by Clone() and Class::CopyOf(). If the object is finalizable,
759 // it is the callers job to call Heap::AddFinalizerReference.
760 static Object* CopyObject(ObjPtr<mirror::Object> dest,
Mathieu Chartier9d156d52016-10-06 17:44:26 -0700761 ObjPtr<mirror::Object> src,
Hiroshi Yamauchi0fbd6e62014-07-17 16:16:31 -0700762 size_t num_bytes)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700763 REQUIRES_SHARED(Locks::mutator_lock_);
Hiroshi Yamauchi0fbd6e62014-07-17 16:16:31 -0700764
tony.ys_liu7380c312015-01-16 19:16:45 +0800765 static Atomic<uint32_t> hash_code_seed;
766
Ian Rogersef7d42f2014-01-06 12:55:46 -0800767 // The Class representing the type of the object.
768 HeapReference<Class> klass_;
769 // Monitor and hash code information.
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800770 uint32_t monitor_;
771
Hiroshi Yamauchi60f63f52015-04-23 16:12:40 -0700772#ifdef USE_BROOKS_READ_BARRIER
Hiroshi Yamauchi624468c2014-03-31 15:14:47 -0700773 // Note names use a 'x' prefix and the x_rb_ptr_ is of type int
Hiroshi Yamauchi9d04a202014-01-31 13:35:49 -0800774 // instead of Object to go with the alphabetical/by-type field order
775 // on the Java side.
Hiroshi Yamauchi60f63f52015-04-23 16:12:40 -0700776 uint32_t x_rb_ptr_; // For the Brooks pointer.
Hiroshi Yamauchi624468c2014-03-31 15:14:47 -0700777 uint32_t x_xpadding_; // For 8-byte alignment. TODO: get rid of this.
Hiroshi Yamauchi9d04a202014-01-31 13:35:49 -0800778#endif
779
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800780 friend class art::ImageWriter;
Mathieu Chartierad2541a2013-10-25 10:05:23 -0700781 friend class art::Monitor;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800782 friend struct art::ObjectOffsets; // for verifying offset information
Hiroshi Yamauchi0fbd6e62014-07-17 16:16:31 -0700783 friend class CopyObjectVisitor; // for CopyObject().
784 friend class CopyClassVisitor; // for CopyObject().
Ian Rogerscf7f1912014-10-22 22:06:39 -0700785 DISALLOW_ALLOCATION();
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800786 DISALLOW_IMPLICIT_CONSTRUCTORS(Object);
787};
788
789} // namespace mirror
790} // namespace art
791
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700792#endif // ART_RUNTIME_MIRROR_OBJECT_H_