blob: 58749765a1ce6d57c55aa712cfd4bf184ef68c1b [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
20#include "base/casts.h"
21#include "base/logging.h"
22#include "base/macros.h"
23#include "cutils/atomic-inline.h"
Ian Rogersef7d42f2014-01-06 12:55:46 -080024#include "object_reference.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080025#include "offsets.h"
26
27namespace art {
28
29class ImageWriter;
Ian Rogersd9c4fc92013-10-01 19:45:43 -070030class LockWord;
Mathieu Chartierad2541a2013-10-25 10:05:23 -070031class Monitor;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080032struct ObjectOffsets;
33class Thread;
Mathieu Chartier590fee92013-09-13 13:46:47 -070034template <typename T> class SirtRef;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080035
36namespace mirror {
37
Brian Carlstromea46f952013-07-30 01:26:50 -070038class ArtField;
39class ArtMethod;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080040class Array;
41class Class;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080042template<class T> class ObjectArray;
43template<class T> class PrimitiveArray;
44typedef PrimitiveArray<uint8_t> BooleanArray;
45typedef PrimitiveArray<int8_t> ByteArray;
46typedef PrimitiveArray<uint16_t> CharArray;
47typedef PrimitiveArray<double> DoubleArray;
48typedef PrimitiveArray<float> FloatArray;
49typedef PrimitiveArray<int32_t> IntArray;
50typedef PrimitiveArray<int64_t> LongArray;
51typedef PrimitiveArray<int16_t> ShortArray;
52class String;
53class Throwable;
54
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080055// Fields within mirror objects aren't accessed directly so that the appropriate amount of
56// handshaking is done with GC (for example, read and write barriers). This macro is used to
57// compute an offset for the Set/Get methods defined in Object that can safely access fields.
58#define OFFSET_OF_OBJECT_MEMBER(type, field) \
59 MemberOffset(OFFSETOF_MEMBER(type, field))
60
Ian Rogersef7d42f2014-01-06 12:55:46 -080061constexpr bool kCheckFieldAssignments = false;
Ian Rogers04d7aa92013-03-16 14:29:17 -070062
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080063// C++ mirror of java.lang.Object
64class MANAGED Object {
65 public:
66 static MemberOffset ClassOffset() {
67 return OFFSET_OF_OBJECT_MEMBER(Object, klass_);
68 }
69
Ian Rogersef7d42f2014-01-06 12:55:46 -080070 Class* GetClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080071
Ian Rogersef7d42f2014-01-06 12:55:46 -080072 void SetClass(Class* new_klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080073
Jeff Haoa3faaf42013-09-03 19:07:00 -070074 // The verifier treats all interfaces as java.lang.Object and relies on runtime checks in
75 // invoke-interface to detect incompatible interface types.
Ian Rogersef7d42f2014-01-06 12:55:46 -080076 bool VerifierInstanceOf(Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Jeff Haoa3faaf42013-09-03 19:07:00 -070077
Ian Rogersef7d42f2014-01-06 12:55:46 -080078 bool InstanceOf(Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080079
Ian Rogersef7d42f2014-01-06 12:55:46 -080080 size_t SizeOf() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080081
82 Object* Clone(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
83
Mathieu Chartierad2541a2013-10-25 10:05:23 -070084 int32_t IdentityHashCode() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080085
86 static MemberOffset MonitorOffset() {
87 return OFFSET_OF_OBJECT_MEMBER(Object, monitor_);
88 }
89
Ian Rogersef7d42f2014-01-06 12:55:46 -080090 LockWord GetLockWord();
Ian Rogersd9c4fc92013-10-01 19:45:43 -070091 void SetLockWord(LockWord new_val);
Ian Rogersef7d42f2014-01-06 12:55:46 -080092 bool CasLockWord(LockWord old_val, LockWord new_val) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersd9c4fc92013-10-01 19:45:43 -070093 uint32_t GetLockOwnerThreadId();
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080094
Mathieu Chartiere7e8a5f2014-02-14 16:59:41 -080095 mirror::Object* MonitorEnter(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080096 EXCLUSIVE_LOCK_FUNCTION(monitor_lock_);
97
Ian Rogers05f30572013-02-20 12:13:11 -080098 bool MonitorExit(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080099 UNLOCK_FUNCTION(monitor_lock_);
100
Ian Rogers05f30572013-02-20 12:13:11 -0800101 void Notify(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800102
Ian Rogers05f30572013-02-20 12:13:11 -0800103 void NotifyAll(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800104
Ian Rogers05f30572013-02-20 12:13:11 -0800105 void Wait(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800106
Ian Rogers05f30572013-02-20 12:13:11 -0800107 void Wait(Thread* self, int64_t timeout, int32_t nanos) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800108
Ian Rogersef7d42f2014-01-06 12:55:46 -0800109 bool IsClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800110
Ian Rogersef7d42f2014-01-06 12:55:46 -0800111 Class* AsClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800112
Ian Rogersef7d42f2014-01-06 12:55:46 -0800113 bool IsObjectArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800114
115 template<class T>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800116 ObjectArray<T>* AsObjectArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800117
Ian Rogersef7d42f2014-01-06 12:55:46 -0800118 bool IsArrayInstance() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800119
Ian Rogersef7d42f2014-01-06 12:55:46 -0800120 Array* AsArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800121
Ian Rogersef7d42f2014-01-06 12:55:46 -0800122 BooleanArray* AsBooleanArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
123 ByteArray* AsByteArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
124 ByteArray* AsByteSizedArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800125
Ian Rogersef7d42f2014-01-06 12:55:46 -0800126 CharArray* AsCharArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
127 ShortArray* AsShortArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
128 ShortArray* AsShortSizedArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800129
Ian Rogersef7d42f2014-01-06 12:55:46 -0800130 IntArray* AsIntArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
131 LongArray* AsLongArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800132
Ian Rogersef7d42f2014-01-06 12:55:46 -0800133 String* AsString() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800134
135 Throwable* AsThrowable() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
136
Ian Rogersef7d42f2014-01-06 12:55:46 -0800137 bool IsArtMethod() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800138
Ian Rogersef7d42f2014-01-06 12:55:46 -0800139 ArtMethod* AsArtMethod() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800140
Ian Rogersef7d42f2014-01-06 12:55:46 -0800141 bool IsArtField() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800142
Brian Carlstromea46f952013-07-30 01:26:50 -0700143 ArtField* AsArtField() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800144
Ian Rogersef7d42f2014-01-06 12:55:46 -0800145 bool IsReferenceInstance() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800146
Ian Rogersef7d42f2014-01-06 12:55:46 -0800147 bool IsWeakReferenceInstance() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800148
Ian Rogersef7d42f2014-01-06 12:55:46 -0800149 bool IsSoftReferenceInstance() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800150
Ian Rogersef7d42f2014-01-06 12:55:46 -0800151 bool IsFinalizerReferenceInstance() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800152
Ian Rogersef7d42f2014-01-06 12:55:46 -0800153 bool IsPhantomReferenceInstance() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800154
Ian Rogersef7d42f2014-01-06 12:55:46 -0800155 // Accessor for Java type fields.
156 template<class T> T* GetFieldObject(MemberOffset field_offset, bool is_volatile)
157 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
158 void SetFieldObjectWithoutWriteBarrier(MemberOffset field_offset, Object* new_value,
159 bool is_volatile, bool this_is_valid = true)
160 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
161 void SetFieldObject(MemberOffset field_offset, Object* new_value, bool is_volatile,
162 bool this_is_valid = true)
163 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
164 bool CasFieldObject(MemberOffset field_offset, Object* old_value, Object* new_value)
165 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800166
Ian Rogersef7d42f2014-01-06 12:55:46 -0800167 HeapReference<Object>* GetFieldObjectReferenceAddr(MemberOffset field_offset) ALWAYS_INLINE {
Mathieu Chartier11409ae2013-09-23 11:49:36 -0700168 VerifyObject(this);
Ian Rogersef7d42f2014-01-06 12:55:46 -0800169 return reinterpret_cast<HeapReference<Object>*>(reinterpret_cast<byte*>(this) +
170 field_offset.Int32Value());
Mathieu Chartier11409ae2013-09-23 11:49:36 -0700171 }
172
Ian Rogers29501cf2014-02-07 21:00:25 -0800173 int32_t GetField32(MemberOffset field_offset, bool is_volatile);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800174
Ian Rogers29501cf2014-02-07 21:00:25 -0800175 void SetField32(MemberOffset field_offset, int32_t new_value, bool is_volatile,
Ian Rogersb122a4b2013-11-19 18:00:50 -0800176 bool this_is_valid = true);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800177
Ian Rogers29501cf2014-02-07 21:00:25 -0800178 bool CasField32(MemberOffset field_offset, int32_t old_value, int32_t new_value)
Ian Rogersef7d42f2014-01-06 12:55:46 -0800179 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersd9c4fc92013-10-01 19:45:43 -0700180
Ian Rogers29501cf2014-02-07 21:00:25 -0800181 int64_t GetField64(MemberOffset field_offset, bool is_volatile);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800182
Ian Rogers29501cf2014-02-07 21:00:25 -0800183 void SetField64(MemberOffset field_offset, int64_t new_value, bool is_volatile,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800184 bool this_is_valid = true);
185
Ian Rogers29501cf2014-02-07 21:00:25 -0800186 bool CasField64(MemberOffset field_offset, int64_t old_value, int64_t new_value)
Ian Rogersef7d42f2014-01-06 12:55:46 -0800187 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800188
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800189 template<typename T>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800190 void SetFieldPtr(MemberOffset field_offset, T new_value, bool is_volatile,
191 bool this_is_valid = true) {
192#ifndef __LP64__
Ian Rogers29501cf2014-02-07 21:00:25 -0800193 SetField32(field_offset, reinterpret_cast<int32_t>(new_value), is_volatile, this_is_valid);
Ian Rogersef7d42f2014-01-06 12:55:46 -0800194#else
Ian Rogers29501cf2014-02-07 21:00:25 -0800195 SetField64(field_offset, reinterpret_cast<int64_t>(new_value), is_volatile, this_is_valid);
Ian Rogersef7d42f2014-01-06 12:55:46 -0800196#endif
Mathieu Chartierc528dba2013-11-26 12:00:11 -0800197 }
198
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800199 protected:
200 // Accessors for non-Java type fields
201 template<class T>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800202 T GetFieldPtr(MemberOffset field_offset, bool is_volatile) {
203#ifndef __LP64__
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800204 return reinterpret_cast<T>(GetField32(field_offset, is_volatile));
Ian Rogersef7d42f2014-01-06 12:55:46 -0800205#else
206 return reinterpret_cast<T>(GetField64(field_offset, is_volatile));
207#endif
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800208 }
209
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800210 private:
Ian Rogersef7d42f2014-01-06 12:55:46 -0800211 static void VerifyObject(Object* obj) ALWAYS_INLINE;
Ian Rogers04d7aa92013-03-16 14:29:17 -0700212 // Verify the type correctness of stores to fields.
Ian Rogersef7d42f2014-01-06 12:55:46 -0800213 void CheckFieldAssignmentImpl(MemberOffset field_offset, Object* new_value)
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800214 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogersef7d42f2014-01-06 12:55:46 -0800215 void CheckFieldAssignment(MemberOffset field_offset, Object* new_value)
Ian Rogers04d7aa92013-03-16 14:29:17 -0700216 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
217 if (kCheckFieldAssignments) {
218 CheckFieldAssignmentImpl(field_offset, new_value);
219 }
220 }
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800221
Mathieu Chartierad2541a2013-10-25 10:05:23 -0700222 // Generate an identity hash code.
Mathieu Chartier4e6a31e2013-10-31 10:35:05 -0700223 static int32_t GenerateIdentityHashCode();
Mathieu Chartierad2541a2013-10-25 10:05:23 -0700224
Ian Rogersef7d42f2014-01-06 12:55:46 -0800225 // The Class representing the type of the object.
226 HeapReference<Class> klass_;
227 // Monitor and hash code information.
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800228 uint32_t monitor_;
229
230 friend class art::ImageWriter;
Mathieu Chartierad2541a2013-10-25 10:05:23 -0700231 friend class art::Monitor;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800232 friend struct art::ObjectOffsets; // for verifying offset information
233 DISALLOW_IMPLICIT_CONSTRUCTORS(Object);
234};
235
236} // namespace mirror
237} // namespace art
238
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700239#endif // ART_RUNTIME_MIRROR_OBJECT_H_