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