object-inl.h revision a3faaf4bece7f42529c013fe87bd41de59798656
12dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers/*
22dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Copyright (C) 2011 The Android Open Source Project
32dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers *
42dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Licensed under the Apache License, Version 2.0 (the "License");
52dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * you may not use this file except in compliance with the License.
62dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * You may obtain a copy of the License at
72dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers *
82dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers *      http://www.apache.org/licenses/LICENSE-2.0
92dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers *
102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Unless required by applicable law or agreed to in writing, software
112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * distributed under the License is distributed on an "AS IS" BASIS,
122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * See the License for the specific language governing permissions and
142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * limitations under the License.
152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers */
162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_MIRROR_OBJECT_INL_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_MIRROR_OBJECT_INL_H_
192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "object.h"
212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
22ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom#include "art_field.h"
23ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom#include "art_method.h"
242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "atomic.h"
254f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "array-inl.h"
262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "class.h"
2705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers#include "monitor.h"
282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "runtime.h"
2905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers#include "throwable.h"
302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace art {
322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror {
332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline Class* Object::GetClass() const {
352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return GetFieldObject<Class*>(OFFSET_OF_OBJECT_MEMBER(Object, klass_), false);
362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline void Object::SetClass(Class* new_klass) {
392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  // new_klass may be NULL prior to class linker initialization
402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  // We don't mark the card since the class is guaranteed to be referenced from another location.
412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  // Proxy classes are held live by the class loader, and other classes are roots of the class
422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  // linker.
432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  SetFieldPtr(OFFSET_OF_OBJECT_MEMBER(Object, klass_), new_klass, false, false);
442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
4605f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline uint32_t Object::GetThinLockId() {
4705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return Monitor::GetThinLockId(monitor_);
4805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
4905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
5005f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline void Object::MonitorEnter(Thread* self) {
5105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  Monitor::MonitorEnter(self, this);
5205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
5305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
5405f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline bool Object::MonitorExit(Thread* self) {
5505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return Monitor::MonitorExit(self, this);
5605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
5705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
5805f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline void Object::Notify(Thread* self) {
5905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  Monitor::Notify(self, this);
6005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
6105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
6205f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline void Object::NotifyAll(Thread* self) {
6305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  Monitor::NotifyAll(self, this);
6405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
6505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
6605f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline void Object::Wait(Thread* self) {
6705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  Monitor::Wait(self, this, 0, 0, true, kWaiting);
6805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
6905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
7005f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline void Object::Wait(Thread* self, int64_t ms, int32_t ns) {
7105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  Monitor::Wait(self, this, ms, ns, true, kTimedWaiting);
7205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
7305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
74a3faaf4bece7f42529c013fe87bd41de59798656Jeff Haoinline bool Object::VerifierInstanceOf(const Class* klass) const {
75a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao  DCHECK(klass != NULL);
76a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao  DCHECK(GetClass() != NULL);
77a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao  return klass->IsInterface() || InstanceOf(klass);
78a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao}
79a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao
802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::InstanceOf(const Class* klass) const {
812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  DCHECK(klass != NULL);
822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  DCHECK(GetClass() != NULL);
832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return klass->IsAssignableFrom(GetClass());
842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsClass() const {
872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  Class* java_lang_Class = GetClass()->GetClass();
882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return GetClass() == java_lang_Class;
892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline Class* Object::AsClass() {
922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  DCHECK(IsClass());
932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return down_cast<Class*>(this);
942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline const Class* Object::AsClass() const {
972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  DCHECK(IsClass());
982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return down_cast<const Class*>(this);
992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
1012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsObjectArray() const {
1022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return IsArrayInstance() && !GetClass()->GetComponentType()->IsPrimitive();
1032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
1052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogerstemplate<class T>
1062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline ObjectArray<T>* Object::AsObjectArray() {
1072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  DCHECK(IsObjectArray());
1082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return down_cast<ObjectArray<T>*>(this);
1092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
1112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogerstemplate<class T>
1122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline const ObjectArray<T>* Object::AsObjectArray() const {
1132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  DCHECK(IsObjectArray());
1142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return down_cast<const ObjectArray<T>*>(this);
1152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
1172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsArrayInstance() const {
1182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return GetClass()->IsArrayClass();
1192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
121ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrominline bool Object::IsArtField() const {
122ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  return GetClass()->IsArtFieldClass();
1232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
125ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrominline ArtField* Object::AsArtField() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
126ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  DCHECK(IsArtField());
127ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  return down_cast<ArtField*>(this);
1282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
130ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrominline const ArtField* Object::AsArtField() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
131ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  DCHECK(IsArtField());
132ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  return down_cast<const ArtField*>(this);
1332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
135ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrominline bool Object::IsArtMethod() const {
136ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  return GetClass()->IsArtMethodClass();
1372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
139ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrominline ArtMethod* Object::AsArtMethod() {
140ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  DCHECK(IsArtMethod());
141ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  return down_cast<ArtMethod*>(this);
1422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
144ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrominline const ArtMethod* Object::AsArtMethod() const {
145ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  DCHECK(IsArtMethod());
146ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  return down_cast<const ArtMethod*>(this);
1472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
1492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsReferenceInstance() const {
1502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return GetClass()->IsReferenceClass();
1512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
15305f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline Array* Object::AsArray() {
15405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(IsArrayInstance());
15505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return down_cast<Array*>(this);
15605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
15705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
15805f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline const Array* Object::AsArray() const {
15905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(IsArrayInstance());
16005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return down_cast<const Array*>(this);
16105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
16205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
16305f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline BooleanArray* Object::AsBooleanArray() {
16405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->IsArrayClass());
16505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->GetComponentType()->IsPrimitiveBoolean());
16605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return down_cast<BooleanArray*>(this);
16705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
16805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
16905f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline ByteArray* Object::AsByteArray() {
17005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->IsArrayClass());
17105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->GetComponentType()->IsPrimitiveByte());
17205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return down_cast<ByteArray*>(this);
17305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
17405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
17505f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline CharArray* Object::AsCharArray() {
17605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->IsArrayClass());
17705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->GetComponentType()->IsPrimitiveChar());
17805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return down_cast<CharArray*>(this);
17905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
18005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
18105f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline ShortArray* Object::AsShortArray() {
18205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->IsArrayClass());
18305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->GetComponentType()->IsPrimitiveShort());
18405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return down_cast<ShortArray*>(this);
18505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
18605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
18705f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline IntArray* Object::AsIntArray() {
18805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->IsArrayClass());
18905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->GetComponentType()->IsPrimitiveInt() ||
19005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers         GetClass()->GetComponentType()->IsPrimitiveFloat());
19105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return down_cast<IntArray*>(this);
19205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
19305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
19405f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline LongArray* Object::AsLongArray() {
19505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->IsArrayClass());
19605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->GetComponentType()->IsPrimitiveLong() ||
19705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers         GetClass()->GetComponentType()->IsPrimitiveDouble());
19805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return down_cast<LongArray*>(this);
19905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
20005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
20105f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline String* Object::AsString() {
20205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->IsStringClass());
20305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return down_cast<String*>(this);
20405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
20505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
20605f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline Throwable* Object::AsThrowable() {
20705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  DCHECK(GetClass()->IsThrowableClass());
20805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers  return down_cast<Throwable*>(this);
20905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers}
21005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers
2112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsWeakReferenceInstance() const {
2122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return GetClass()->IsWeakReferenceClass();
2132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
2142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
2152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsSoftReferenceInstance() const {
2162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return GetClass()->IsSoftReferenceClass();
2172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
2182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
2192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsFinalizerReferenceInstance() const {
2202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return GetClass()->IsFinalizerReferenceClass();
2212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
2222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
2232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsPhantomReferenceInstance() const {
2242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return GetClass()->IsPhantomReferenceClass();
2252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
2262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
2272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline size_t Object::SizeOf() const {
2282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  size_t result;
2292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  if (IsArrayInstance()) {
2302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    result = AsArray()->SizeOf();
2312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  } else if (IsClass()) {
2322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    result = AsClass()->SizeOf();
2332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  } else {
2342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    result = GetClass()->GetObjectSize();
2352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  }
236ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  DCHECK(!IsArtField()  || result == sizeof(ArtField));
237ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  DCHECK(!IsArtMethod() || result == sizeof(ArtMethod));
2382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return result;
2392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
2402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
2412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline uint64_t Object::GetField64(MemberOffset field_offset, bool is_volatile) const {
2422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  VerifyObject(this);
2432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  const byte* raw_addr = reinterpret_cast<const byte*>(this) + field_offset.Int32Value();
2442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  const int64_t* addr = reinterpret_cast<const int64_t*>(raw_addr);
2452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  if (UNLIKELY(is_volatile)) {
2462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    uint64_t result = QuasiAtomic::Read64(addr);
2472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    ANDROID_MEMBAR_FULL();
2482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    return result;
2492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  } else {
2502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    return *addr;
2512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  }
2522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
2532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
2542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline void Object::SetField64(MemberOffset field_offset, uint64_t new_value, bool is_volatile) {
2552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  VerifyObject(this);
2562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value();
2572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  int64_t* addr = reinterpret_cast<int64_t*>(raw_addr);
2582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  if (UNLIKELY(is_volatile)) {
2592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    ANDROID_MEMBAR_STORE();
2602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    QuasiAtomic::Write64(addr, new_value);
2612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    // Post-store barrier not required due to use of atomic op or mutex.
2622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  } else {
2632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    *addr = new_value;
2642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  }
2652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
2662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
2672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline void Object::WriteBarrierField(const Object* dst, MemberOffset field_offset,
2682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                      const Object* new_value) {
2692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  Runtime::Current()->GetHeap()->WriteBarrierField(dst, field_offset, new_value);
2702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
2712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
27204d7aa92bc5548bc4d272b9480614f06248194ccIan Rogersinline void Object::VerifyObject(const Object* obj) {
2734f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers  if (kIsDebugBuild) {
2744f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers    Runtime::Current()->GetHeap()->VerifyObject(obj);
2754f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers  }
27604d7aa92bc5548bc4d272b9480614f06248194ccIan Rogers}
27704d7aa92bc5548bc4d272b9480614f06248194ccIan Rogers
2782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}  // namespace mirror
2792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}  // namespace art
2802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
281fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_MIRROR_OBJECT_INL_H_
282