blob: 8fe9923974412944a3ff3316c6aa3e049f1ea173 [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
Vladimir Marko98db89c2018-09-07 11:45:46 +0100177 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700178 bool IsObjectArray() REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko98db89c2018-09-07 11:45:46 +0100179 template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700180 ObjectArray<T>* AsObjectArray() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800181
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800182 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
183 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700184 bool IsClassLoader() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800185 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
186 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700187 ClassLoader* AsClassLoader() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere4275c02015-08-06 15:34:15 -0700188
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800189 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
190 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700191 bool IsDexCache() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800192 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
193 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700194 DexCache* AsDexCache() REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko05792b92015-08-03 11:56:49 +0100195
Vladimir Marko98db89c2018-09-07 11:45:46 +0100196 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700197 bool IsArrayInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko98db89c2018-09-07 11:45:46 +0100198 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700199 Array* AsArray() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800200
Mathieu Chartier4e305412014-02-19 10:54:44 -0800201 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700202 BooleanArray* AsBooleanArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800203 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700204 ByteArray* AsByteArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800205 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700206 ByteArray* AsByteSizedArray() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800207
Mathieu Chartier4e305412014-02-19 10:54:44 -0800208 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700209 CharArray* AsCharArray() 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 ShortArray* AsShortArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800212 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700213 ShortArray* AsShortSizedArray() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800214
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800215 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
216 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700217 bool IsIntArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800218 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
219 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700220 IntArray* AsIntArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700221
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800222 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
223 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700224 bool IsLongArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800225 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
226 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700227 LongArray* AsLongArray() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800228
Mathieu Chartier4e305412014-02-19 10:54:44 -0800229 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700230 bool IsFloatArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700231 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700232 FloatArray* AsFloatArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiere401d142015-04-22 13:56:20 -0700233
234 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700235 bool IsDoubleArray() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800236 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700237 DoubleArray* AsDoubleArray() REQUIRES_SHARED(Locks::mutator_lock_);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100238
Jeff Hao848f70a2014-01-15 13:49:50 -0800239 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
240 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700241 bool IsString() REQUIRES_SHARED(Locks::mutator_lock_);
Jeff Hao848f70a2014-01-15 13:49:50 -0800242
243 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
244 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700245 String* AsString() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800246
Mathieu Chartier4e305412014-02-19 10:54:44 -0800247 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700248 Throwable* AsThrowable() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800249
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800250 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
251 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700252 bool IsReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierdfe02f62016-02-01 20:15:11 -0800253 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
254 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700255 Reference* AsReference() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier8fa2dad2014-03-13 12:22:56 -0700256 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700257 bool IsWeakReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800258 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700259 bool IsSoftReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800260 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700261 bool IsFinalizerReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier4e305412014-02-19 10:54:44 -0800262 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700263 FinalizerReference* AsFinalizerReference() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier8fa2dad2014-03-13 12:22:56 -0700264 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700265 bool IsPhantomReferenceInstance() REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800266
Ian Rogersef7d42f2014-01-06 12:55:46 -0800267 // Accessor for Java type fields.
Roland Levillaind32ead22018-05-30 17:38:21 +0100268 template<class T,
269 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
270 ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
271 bool kIsVolatile = false>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700272 ALWAYS_INLINE T* GetFieldObject(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700273 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700274
Roland Levillaind32ead22018-05-30 17:38:21 +0100275 template<class T,
276 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
277 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700278 ALWAYS_INLINE T* GetFieldObjectVolatile(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700279 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700280
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700281 template<bool kTransactionActive,
282 bool kCheckTransaction = true,
283 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
284 bool kIsVolatile = false>
285 ALWAYS_INLINE void SetFieldObjectWithoutWriteBarrier(MemberOffset field_offset,
286 ObjPtr<Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700287 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700288
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700289 template<bool kTransactionActive,
290 bool kCheckTransaction = true,
291 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
292 bool kIsVolatile = false>
293 ALWAYS_INLINE void SetFieldObject(MemberOffset field_offset, ObjPtr<Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700294 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700295
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700296 template<bool kTransactionActive,
297 bool kCheckTransaction = true,
298 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Roland Levillaind32ead22018-05-30 17:38:21 +0100299 ALWAYS_INLINE void SetFieldObjectVolatile(MemberOffset field_offset, ObjPtr<Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700300 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700301
Roland Levillaind32ead22018-05-30 17:38:21 +0100302 template<bool kCheckTransaction = true,
303 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
Chang Xing6d3e7682017-07-11 10:31:29 -0700304 bool kIsVolatile = false>
305 ALWAYS_INLINE void SetFieldObjectTransaction(MemberOffset field_offset, ObjPtr<Object> new_value)
306 REQUIRES_SHARED(Locks::mutator_lock_);
307
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700308 template<bool kTransactionActive,
309 bool kCheckTransaction = true,
310 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mathieu Chartiera9746b92018-06-22 10:25:40 -0700311 ALWAYS_INLINE bool CasFieldObject(MemberOffset field_offset,
312 ObjPtr<Object> old_value,
313 ObjPtr<Object> new_value,
314 CASMode mode,
315 std::memory_order memory_order)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700316 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700317 template<bool kTransactionActive,
318 bool kCheckTransaction = true,
319 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mathieu Chartiera9746b92018-06-22 10:25:40 -0700320 ALWAYS_INLINE bool CasFieldObjectWithoutWriteBarrier(MemberOffset field_offset,
321 ObjPtr<Object> old_value,
322 ObjPtr<Object> new_value,
323 CASMode mode,
324 std::memory_order memory_order)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700325 REQUIRES_SHARED(Locks::mutator_lock_);
Orion Hodson928033d2018-02-07 05:30:54 +0000326
327 template<bool kTransactionActive,
328 bool kCheckTransaction = true,
329 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
330 ObjPtr<Object> CompareAndExchangeFieldObject(MemberOffset field_offset,
331 ObjPtr<Object> old_value,
332 ObjPtr<Object> new_value)
333 REQUIRES_SHARED(Locks::mutator_lock_);
334
335 template<bool kTransactionActive,
336 bool kCheckTransaction = true,
337 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
338 ObjPtr<Object> ExchangeFieldObject(MemberOffset field_offset, ObjPtr<Object> new_value)
339 REQUIRES_SHARED(Locks::mutator_lock_);
340
Mathieu Chartier4e305412014-02-19 10:54:44 -0800341 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mathieu Chartier99111282018-06-19 12:30:56 -0700342 HeapReference<Object>* GetFieldObjectReferenceAddr(MemberOffset field_offset)
343 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier11409ae2013-09-23 11:49:36 -0700344
David Srbeckyce32c102018-08-31 07:21:07 +0100345 template<typename kType, bool kIsVolatile>
346 ALWAYS_INLINE void SetFieldPrimitive(MemberOffset field_offset, kType new_value)
347 REQUIRES_SHARED(Locks::mutator_lock_) {
348 uint8_t* raw_addr = reinterpret_cast<uint8_t*>(this) + field_offset.Int32Value();
349 kType* addr = reinterpret_cast<kType*>(raw_addr);
350 if (kIsVolatile) {
351 reinterpret_cast<Atomic<kType>*>(addr)->store(new_value, std::memory_order_seq_cst);
352 } else {
353 reinterpret_cast<Atomic<kType>*>(addr)->StoreJavaData(new_value);
354 }
355 }
356
357 template<typename kType, bool kIsVolatile>
358 ALWAYS_INLINE kType GetFieldPrimitive(MemberOffset field_offset)
359 REQUIRES_SHARED(Locks::mutator_lock_) {
360 const uint8_t* raw_addr = reinterpret_cast<const uint8_t*>(this) + field_offset.Int32Value();
361 const kType* addr = reinterpret_cast<const kType*>(raw_addr);
362 if (kIsVolatile) {
363 return reinterpret_cast<const Atomic<kType>*>(addr)->load(std::memory_order_seq_cst);
364 } else {
365 return reinterpret_cast<const Atomic<kType>*>(addr)->LoadJavaData();
366 }
367 }
368
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700369 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
Fred Shih37f05ef2014-07-16 18:38:08 -0700370 ALWAYS_INLINE uint8_t GetFieldBoolean(MemberOffset field_offset)
Andreas Gampe895f9222017-07-05 09:53:32 -0700371 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier99111282018-06-19 12:30:56 -0700372 Verify<kVerifyFlags>();
David Srbeckyce32c102018-08-31 07:21:07 +0100373 return GetFieldPrimitive<uint8_t, kIsVolatile>(field_offset);
Andreas Gampe895f9222017-07-05 09:53:32 -0700374 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700375
376 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
377 ALWAYS_INLINE int8_t GetFieldByte(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700378 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700379
380 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
381 ALWAYS_INLINE uint8_t GetFieldBooleanVolatile(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700382 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700383
384 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
385 ALWAYS_INLINE int8_t GetFieldByteVolatile(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700386 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700387
Roland Levillaind32ead22018-05-30 17:38:21 +0100388 template<bool kTransactionActive,
389 bool kCheckTransaction = true,
390 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
391 bool kIsVolatile = false>
Fred Shih37f05ef2014-07-16 18:38:08 -0700392 ALWAYS_INLINE void SetFieldBoolean(MemberOffset field_offset, uint8_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700393 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700394
Roland Levillaind32ead22018-05-30 17:38:21 +0100395 template<bool kTransactionActive,
396 bool kCheckTransaction = true,
397 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
398 bool kIsVolatile = false>
Fred Shih37f05ef2014-07-16 18:38:08 -0700399 ALWAYS_INLINE void SetFieldByte(MemberOffset field_offset, int8_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700400 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700401
Roland Levillaind32ead22018-05-30 17:38:21 +0100402 template<bool kTransactionActive,
403 bool kCheckTransaction = true,
404 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Fred Shih37f05ef2014-07-16 18:38:08 -0700405 ALWAYS_INLINE void SetFieldBooleanVolatile(MemberOffset field_offset, uint8_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700406 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700407
Roland Levillaind32ead22018-05-30 17:38:21 +0100408 template<bool kTransactionActive,
409 bool kCheckTransaction = true,
410 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Fred Shih37f05ef2014-07-16 18:38:08 -0700411 ALWAYS_INLINE void SetFieldByteVolatile(MemberOffset field_offset, int8_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700412 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700413
414 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
415 ALWAYS_INLINE uint16_t GetFieldChar(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700416 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700417
418 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
419 ALWAYS_INLINE int16_t GetFieldShort(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700420 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700421
422 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
423 ALWAYS_INLINE uint16_t GetFieldCharVolatile(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700424 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700425
426 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
427 ALWAYS_INLINE int16_t GetFieldShortVolatile(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700428 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700429
Roland Levillaind32ead22018-05-30 17:38:21 +0100430 template<bool kTransactionActive,
431 bool kCheckTransaction = true,
432 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
433 bool kIsVolatile = false>
Fred Shih37f05ef2014-07-16 18:38:08 -0700434 ALWAYS_INLINE void SetFieldChar(MemberOffset field_offset, uint16_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700435 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700436
Roland Levillaind32ead22018-05-30 17:38:21 +0100437 template<bool kTransactionActive,
438 bool kCheckTransaction = true,
439 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
440 bool kIsVolatile = false>
Fred Shih37f05ef2014-07-16 18:38:08 -0700441 ALWAYS_INLINE void SetFieldShort(MemberOffset field_offset, int16_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700442 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700443
Roland Levillaind32ead22018-05-30 17:38:21 +0100444 template<bool kTransactionActive,
445 bool kCheckTransaction = true,
446 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Fred Shih37f05ef2014-07-16 18:38:08 -0700447 ALWAYS_INLINE void SetFieldCharVolatile(MemberOffset field_offset, uint16_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700448 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700449
Roland Levillaind32ead22018-05-30 17:38:21 +0100450 template<bool kTransactionActive,
451 bool kCheckTransaction = true,
452 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Fred Shih37f05ef2014-07-16 18:38:08 -0700453 ALWAYS_INLINE void SetFieldShortVolatile(MemberOffset field_offset, int16_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700454 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700455
456 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700457 ALWAYS_INLINE int32_t GetField32(MemberOffset field_offset)
Andreas Gampe90b936d2017-01-31 08:58:55 -0800458 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier99111282018-06-19 12:30:56 -0700459 Verify<kVerifyFlags>();
David Srbeckyce32c102018-08-31 07:21:07 +0100460 return GetFieldPrimitive<int32_t, kIsVolatile>(field_offset);
Andreas Gampe90b936d2017-01-31 08:58:55 -0800461 }
Ian Rogersd9c4fc92013-10-01 19:45:43 -0700462
Mathieu Chartier4e305412014-02-19 10:54:44 -0800463 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700464 ALWAYS_INLINE int32_t GetField32Volatile(MemberOffset field_offset)
Andreas Gampe90b936d2017-01-31 08:58:55 -0800465 REQUIRES_SHARED(Locks::mutator_lock_) {
466 return GetField32<kVerifyFlags, true>(field_offset);
467 }
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700468
Roland Levillaind32ead22018-05-30 17:38:21 +0100469 template<bool kTransactionActive,
470 bool kCheckTransaction = true,
471 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
472 bool kIsVolatile = false>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700473 ALWAYS_INLINE void SetField32(MemberOffset field_offset, int32_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700474 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700475
Roland Levillaind32ead22018-05-30 17:38:21 +0100476 template<bool kTransactionActive,
477 bool kCheckTransaction = true,
478 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700479 ALWAYS_INLINE void SetField32Volatile(MemberOffset field_offset, int32_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700480 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700481
Chang Xing6d3e7682017-07-11 10:31:29 -0700482 template<bool kCheckTransaction = true,
483 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
484 bool kIsVolatile = false>
485 ALWAYS_INLINE void SetField32Transaction(MemberOffset field_offset, int32_t new_value)
486 REQUIRES_SHARED(Locks::mutator_lock_);
487
Roland Levillaind32ead22018-05-30 17:38:21 +0100488 template<bool kTransactionActive,
489 bool kCheckTransaction = true,
490 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mathieu Chartier42c2e502018-06-19 12:30:56 -0700491 ALWAYS_INLINE bool CasField32(MemberOffset field_offset,
492 int32_t old_value,
493 int32_t new_value,
494 CASMode mode,
495 std::memory_order memory_order)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700496 REQUIRES_SHARED(Locks::mutator_lock_);
Hans Boehmd8434432014-07-11 09:56:07 -0700497
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700498 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700499 ALWAYS_INLINE int64_t GetField64(MemberOffset field_offset)
Andreas Gampec6ea7d02017-02-01 16:46:28 -0800500 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier99111282018-06-19 12:30:56 -0700501 Verify<kVerifyFlags>();
David Srbeckyce32c102018-08-31 07:21:07 +0100502 return GetFieldPrimitive<int64_t, kIsVolatile>(field_offset);
Andreas Gampec6ea7d02017-02-01 16:46:28 -0800503 }
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700504
505 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700506 ALWAYS_INLINE int64_t GetField64Volatile(MemberOffset field_offset)
Andreas Gampec6ea7d02017-02-01 16:46:28 -0800507 REQUIRES_SHARED(Locks::mutator_lock_) {
508 return GetField64<kVerifyFlags, true>(field_offset);
509 }
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700510
Roland Levillaind32ead22018-05-30 17:38:21 +0100511 template<bool kTransactionActive,
512 bool kCheckTransaction = true,
513 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
514 bool kIsVolatile = false>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700515 ALWAYS_INLINE void SetField64(MemberOffset field_offset, int64_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700516 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700517
Roland Levillaind32ead22018-05-30 17:38:21 +0100518 template<bool kTransactionActive,
519 bool kCheckTransaction = true,
520 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Mingyao Yang98d1cc82014-05-15 17:02:16 -0700521 ALWAYS_INLINE void SetField64Volatile(MemberOffset field_offset, int64_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700522 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800523
Chang Xing6d3e7682017-07-11 10:31:29 -0700524 template<bool kCheckTransaction = true,
525 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
526 bool kIsVolatile = false>
527 ALWAYS_INLINE void SetField64Transaction(MemberOffset field_offset, int32_t new_value)
528 REQUIRES_SHARED(Locks::mutator_lock_);
529
Roland Levillaind32ead22018-05-30 17:38:21 +0100530 template<bool kTransactionActive,
531 bool kCheckTransaction = true,
532 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
533 bool CasFieldWeakSequentiallyConsistent64(MemberOffset field_offset,
534 int64_t old_value,
Ian Rogers228602f2014-07-10 02:07:54 -0700535 int64_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700536 REQUIRES_SHARED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800537
Roland Levillaind32ead22018-05-30 17:38:21 +0100538 template<bool kTransactionActive,
539 bool kCheckTransaction = true,
540 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
541 bool CasFieldStrongSequentiallyConsistent64(MemberOffset field_offset,
542 int64_t old_value,
Hans Boehmd8434432014-07-11 09:56:07 -0700543 int64_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700544 REQUIRES_SHARED(Locks::mutator_lock_);
Hans Boehmd8434432014-07-11 09:56:07 -0700545
Roland Levillaind32ead22018-05-30 17:38:21 +0100546 template<bool kTransactionActive,
547 bool kCheckTransaction = true,
548 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
549 typename T>
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700550 void SetFieldPtr(MemberOffset field_offset, T new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700551 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier2d721012014-11-10 11:08:06 -0800552 SetFieldPtrWithSize<kTransactionActive, kCheckTransaction, kVerifyFlags>(
Andreas Gampe542451c2016-07-26 09:02:02 -0700553 field_offset, new_value, kRuntimePointerSize);
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800554 }
Roland Levillaind32ead22018-05-30 17:38:21 +0100555 template<bool kTransactionActive,
556 bool kCheckTransaction = true,
557 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
558 typename T>
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800559 void SetFieldPtr64(MemberOffset field_offset, T new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700560 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800561 SetFieldPtrWithSize<kTransactionActive, kCheckTransaction, kVerifyFlags>(
Vladimir Markoca8de0a2018-07-04 11:56:08 +0100562 field_offset, new_value, PointerSize::k64);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800563 }
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800564
Roland Levillaind32ead22018-05-30 17:38:21 +0100565 template<bool kTransactionActive,
566 bool kCheckTransaction = true,
567 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
568 typename T>
Andreas Gampe542451c2016-07-26 09:02:02 -0700569 ALWAYS_INLINE void SetFieldPtrWithSize(MemberOffset field_offset,
570 T new_value,
571 PointerSize pointer_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700572 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampe542451c2016-07-26 09:02:02 -0700573 if (pointer_size == PointerSize::k32) {
Mathieu Chartier2d721012014-11-10 11:08:06 -0800574 SetField32<kTransactionActive, kCheckTransaction, kVerifyFlags>(
Vladimir Markoca8de0a2018-07-04 11:56:08 +0100575 field_offset, reinterpret_cast32<int32_t>(new_value));
Mathieu Chartier2d721012014-11-10 11:08:06 -0800576 } else {
577 SetField64<kTransactionActive, kCheckTransaction, kVerifyFlags>(
Vladimir Markodb8e62d2016-03-30 16:30:21 +0100578 field_offset, reinterpret_cast64<int64_t>(new_value));
Mathieu Chartier2d721012014-11-10 11:08:06 -0800579 }
580 }
Orion Hodson928033d2018-02-07 05:30:54 +0000581
582 // Base class for accessors used to describe accesses performed by VarHandle methods.
583 template <typename T>
584 class Accessor {
585 public:
586 virtual ~Accessor() {
587 static_assert(std::is_arithmetic<T>::value, "unsupported type");
588 }
589 virtual void Access(T* field_address) = 0;
590 };
591
592 // Getter method that exposes the raw address of a primitive value-type field to an Accessor
593 // instance. This are used by VarHandle accessor methods to read fields with a wider range of
594 // memory orderings than usually required.
595 template<typename T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
596 void GetPrimitiveFieldViaAccessor(MemberOffset field_offset, Accessor<T>* accessor)
597 REQUIRES_SHARED(Locks::mutator_lock_);
598
599 // Update methods that expose the raw address of a primitive value-type to an Accessor instance
600 // that will attempt to update the field. These are used by VarHandle accessor methods to
601 // atomically update fields with a wider range of memory orderings than usually required.
Roland Levillaind32ead22018-05-30 17:38:21 +0100602 template<bool kTransactionActive,
603 bool kCheckTransaction = true,
604 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags>
Orion Hodson928033d2018-02-07 05:30:54 +0000605 void UpdateFieldBooleanViaAccessor(MemberOffset field_offset, Accessor<uint8_t>* accessor)
606 REQUIRES_SHARED(Locks::mutator_lock_);
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 UpdateFieldByteViaAccessor(MemberOffset field_offset, Accessor<int8_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 UpdateFieldCharViaAccessor(MemberOffset field_offset, Accessor<uint16_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 UpdateFieldShortViaAccessor(MemberOffset field_offset, Accessor<int16_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 UpdateField32ViaAccessor(MemberOffset field_offset, Accessor<int32_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 UpdateField64ViaAccessor(MemberOffset field_offset, Accessor<int64_t>* accessor)
631 REQUIRES_SHARED(Locks::mutator_lock_);
632
Mathieu Chartier407f7022014-02-18 14:37:05 -0800633 // TODO fix thread safety analysis broken by the use of template. This should be
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700634 // REQUIRES_SHARED(Locks::mutator_lock_).
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800635 template <bool kVisitNativeRoots = true,
636 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
637 ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
Mathieu Chartier059ef3d2015-08-18 13:54:21 -0700638 typename Visitor,
639 typename JavaLangRefVisitor = VoidFunctor>
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700640 void VisitReferences(const Visitor& visitor, const JavaLangRefVisitor& ref_visitor)
Mathieu Chartier407f7022014-02-18 14:37:05 -0800641 NO_THREAD_SAFETY_ANALYSIS;
642
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700643 ArtField* FindFieldByOffset(MemberOffset offset) REQUIRES_SHARED(Locks::mutator_lock_);
Hiroshi Yamauchieb2baaf2015-05-13 21:14:22 -0700644
tony.ys_liu7380c312015-01-16 19:16:45 +0800645 // Used by object_test.
646 static void SetHashCodeSeed(uint32_t new_seed);
647 // Generate an identity hash code. Public for object test.
648 static uint32_t GenerateIdentityHashCode();
649
David Sehr709b0702016-10-13 09:12:37 -0700650 // Returns a human-readable form of the name of the *class* of the given object.
651 // So given an instance of java.lang.String, the output would
652 // be "java.lang.String". Given an array of int, the output would be "int[]".
653 // Given String.class, the output would be "java.lang.Class<java.lang.String>".
654 static std::string PrettyTypeOf(ObjPtr<mirror::Object> obj)
655 REQUIRES_SHARED(Locks::mutator_lock_);
656 std::string PrettyTypeOf()
657 REQUIRES_SHARED(Locks::mutator_lock_);
658
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800659 protected:
660 // Accessors for non-Java type fields
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700661 template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
662 T GetFieldPtr(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700663 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampe542451c2016-07-26 09:02:02 -0700664 return GetFieldPtrWithSize<T, kVerifyFlags, kIsVolatile>(field_offset, kRuntimePointerSize);
Mathieu Chartier2d721012014-11-10 11:08:06 -0800665 }
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800666 template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
667 T GetFieldPtr64(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700668 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier99111282018-06-19 12:30:56 -0700669 return GetFieldPtrWithSize<T, kVerifyFlags, kIsVolatile>(field_offset, PointerSize::k64);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800670 }
Mathieu Chartier2d721012014-11-10 11:08:06 -0800671
672 template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kIsVolatile = false>
Andreas Gampe542451c2016-07-26 09:02:02 -0700673 ALWAYS_INLINE T GetFieldPtrWithSize(MemberOffset field_offset, PointerSize pointer_size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700674 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampe542451c2016-07-26 09:02:02 -0700675 if (pointer_size == PointerSize::k32) {
Vladimir Markoca8de0a2018-07-04 11:56:08 +0100676 int32_t v = GetField32<kVerifyFlags, kIsVolatile>(field_offset);
677 return reinterpret_cast32<T>(v);
Mathieu Chartier2d721012014-11-10 11:08:06 -0800678 } else {
679 int64_t v = GetField64<kVerifyFlags, kIsVolatile>(field_offset);
Vladimir Markodb8e62d2016-03-30 16:30:21 +0100680 return reinterpret_cast64<T>(v);
Mathieu Chartier2d721012014-11-10 11:08:06 -0800681 }
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800682 }
683
Mathieu Chartier407f7022014-02-18 14:37:05 -0800684 // TODO: Fixme when anotatalysis works with visitors.
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800685 template<bool kIsStatic,
686 VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
687 ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
688 typename Visitor>
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700689 void VisitFieldsReferences(uint32_t ref_offsets, const Visitor& visitor) HOT_ATTR
Mathieu Chartier407f7022014-02-18 14:37:05 -0800690 NO_THREAD_SAFETY_ANALYSIS;
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800691 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
692 ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
693 typename Visitor>
Mathieu Chartier31e88222016-10-14 18:43:19 -0700694 void VisitInstanceFieldsReferences(ObjPtr<mirror::Class> klass, const Visitor& visitor) HOT_ATTR
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700695 REQUIRES_SHARED(Locks::mutator_lock_);
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 VisitStaticFieldsReferences(ObjPtr<mirror::Class> klass, const Visitor& visitor) HOT_ATTR
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700700 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier407f7022014-02-18 14:37:05 -0800701
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800702 private:
Mathieu Chartierc381c362016-08-23 13:27:53 -0700703 // Get a field with acquire semantics.
704 template<typename kSize>
705 ALWAYS_INLINE kSize GetFieldAcquire(MemberOffset field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700706 REQUIRES_SHARED(Locks::mutator_lock_);
Fred Shih37f05ef2014-07-16 18:38:08 -0700707
Ian Rogers04d7aa92013-03-16 14:29:17 -0700708 // Verify the type correctness of stores to fields.
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700709 // TODO: This can cause thread suspension and isn't moving GC safe.
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700710 void CheckFieldAssignmentImpl(MemberOffset field_offset, ObjPtr<Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700711 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiera058fdf2016-10-06 15:13:58 -0700712 void CheckFieldAssignment(MemberOffset field_offset, ObjPtr<Object>new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700713 REQUIRES_SHARED(Locks::mutator_lock_) {
Ian Rogers04d7aa92013-03-16 14:29:17 -0700714 if (kCheckFieldAssignments) {
715 CheckFieldAssignmentImpl(field_offset, new_value);
716 }
717 }
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800718
Mathieu Chartier99111282018-06-19 12:30:56 -0700719 template<VerifyObjectFlags kVerifyFlags>
720 ALWAYS_INLINE void Verify() {
721 if (kVerifyFlags & kVerifyThis) {
722 VerifyObject(this);
723 }
724 }
725
726 // Not ObjPtr since the values may be unaligned for logic in verification.cc.
727 template<VerifyObjectFlags kVerifyFlags, typename Reference>
728 ALWAYS_INLINE static void VerifyRead(Reference value) {
729 if (kVerifyFlags & kVerifyReads) {
730 VerifyObject(value);
731 }
732 }
733
734 template<VerifyObjectFlags kVerifyFlags>
735 ALWAYS_INLINE static void VerifyWrite(ObjPtr<mirror::Object> value) {
736 if (kVerifyFlags & kVerifyWrites) {
737 VerifyObject(value);
738 }
739 }
740
741 template<VerifyObjectFlags kVerifyFlags>
742 ALWAYS_INLINE void VerifyCAS(ObjPtr<mirror::Object> new_value, ObjPtr<mirror::Object> old_value) {
743 Verify<kVerifyFlags>();
744 VerifyRead<kVerifyFlags>(old_value);
745 VerifyWrite<kVerifyFlags>(new_value);
746 }
747
748 // Verify transaction is active (if required).
749 template<bool kTransactionActive, bool kCheckTransaction>
750 ALWAYS_INLINE void VerifyTransaction();
751
Mathieu Chartier51eaa7f2016-10-12 16:08:35 -0700752 // A utility function that copies an object in a read barrier and write barrier-aware way.
753 // This is internally used by Clone() and Class::CopyOf(). If the object is finalizable,
754 // it is the callers job to call Heap::AddFinalizerReference.
755 static Object* CopyObject(ObjPtr<mirror::Object> dest,
Mathieu Chartier9d156d52016-10-06 17:44:26 -0700756 ObjPtr<mirror::Object> src,
Hiroshi Yamauchi0fbd6e62014-07-17 16:16:31 -0700757 size_t num_bytes)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700758 REQUIRES_SHARED(Locks::mutator_lock_);
Hiroshi Yamauchi0fbd6e62014-07-17 16:16:31 -0700759
tony.ys_liu7380c312015-01-16 19:16:45 +0800760 static Atomic<uint32_t> hash_code_seed;
761
Ian Rogersef7d42f2014-01-06 12:55:46 -0800762 // The Class representing the type of the object.
763 HeapReference<Class> klass_;
764 // Monitor and hash code information.
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800765 uint32_t monitor_;
766
Hiroshi Yamauchi60f63f52015-04-23 16:12:40 -0700767#ifdef USE_BROOKS_READ_BARRIER
Hiroshi Yamauchi624468c2014-03-31 15:14:47 -0700768 // Note names use a 'x' prefix and the x_rb_ptr_ is of type int
Hiroshi Yamauchi9d04a202014-01-31 13:35:49 -0800769 // instead of Object to go with the alphabetical/by-type field order
770 // on the Java side.
Hiroshi Yamauchi60f63f52015-04-23 16:12:40 -0700771 uint32_t x_rb_ptr_; // For the Brooks pointer.
Hiroshi Yamauchi624468c2014-03-31 15:14:47 -0700772 uint32_t x_xpadding_; // For 8-byte alignment. TODO: get rid of this.
Hiroshi Yamauchi9d04a202014-01-31 13:35:49 -0800773#endif
774
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800775 friend class art::ImageWriter;
Mathieu Chartierad2541a2013-10-25 10:05:23 -0700776 friend class art::Monitor;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800777 friend struct art::ObjectOffsets; // for verifying offset information
Hiroshi Yamauchi0fbd6e62014-07-17 16:16:31 -0700778 friend class CopyObjectVisitor; // for CopyObject().
779 friend class CopyClassVisitor; // for CopyObject().
Ian Rogerscf7f1912014-10-22 22:06:39 -0700780 DISALLOW_ALLOCATION();
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800781 DISALLOW_IMPLICIT_CONSTRUCTORS(Object);
782};
783
784} // namespace mirror
785} // namespace art
786
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700787#endif // ART_RUNTIME_MIRROR_OBJECT_H_