object-inl.h revision 4f6ad8ab428038129b2d0d6c40b7fd625cca15e1
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 172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#ifndef ART_SRC_MIRROR_OBJECT_INL_H_ 182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#define ART_SRC_MIRROR_OBJECT_INL_H_ 192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "object.h" 212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "abstract_method.h" 232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "atomic.h" 244f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "array-inl.h" 252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "field.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 742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::InstanceOf(const Class* klass) const { 752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(klass != NULL); 762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(GetClass() != NULL); 772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return klass->IsAssignableFrom(GetClass()); 782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsClass() const { 812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* java_lang_Class = GetClass()->GetClass(); 822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetClass() == java_lang_Class; 832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline Class* Object::AsClass() { 862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsClass()); 872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return down_cast<Class*>(this); 882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline const Class* Object::AsClass() const { 912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsClass()); 922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return down_cast<const Class*>(this); 932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsObjectArray() const { 962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return IsArrayInstance() && !GetClass()->GetComponentType()->IsPrimitive(); 972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogerstemplate<class T> 1002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline ObjectArray<T>* Object::AsObjectArray() { 1012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsObjectArray()); 1022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return down_cast<ObjectArray<T>*>(this); 1032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogerstemplate<class T> 1062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline const ObjectArray<T>* Object::AsObjectArray() const { 1072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsObjectArray()); 1082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return down_cast<const ObjectArray<T>*>(this); 1092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsArrayInstance() const { 1122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetClass()->IsArrayClass(); 1132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsField() const { 1162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetClass()->IsFieldClass(); 1172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline Field* Object::AsField() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 1202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsField()); 1212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return down_cast<Field*>(this); 1222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline const Field* Object::AsField() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 1252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsField()); 1262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return down_cast<const Field*>(this); 1272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsMethod() const { 1302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetClass()->IsMethodClass(); 1312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline AbstractMethod* Object::AsMethod() { 1342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsMethod()); 1352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return down_cast<AbstractMethod*>(this); 1362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline const AbstractMethod* Object::AsMethod() const { 1392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsMethod()); 1402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return down_cast<const AbstractMethod*>(this); 1412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsReferenceInstance() const { 1442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetClass()->IsReferenceClass(); 1452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 14705f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline Array* Object::AsArray() { 14805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(IsArrayInstance()); 14905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<Array*>(this); 15005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 15105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 15205f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline const Array* Object::AsArray() const { 15305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(IsArrayInstance()); 15405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<const Array*>(this); 15505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 15605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 15705f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline BooleanArray* Object::AsBooleanArray() { 15805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->IsArrayClass()); 15905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->GetComponentType()->IsPrimitiveBoolean()); 16005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<BooleanArray*>(this); 16105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 16205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 16305f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline ByteArray* Object::AsByteArray() { 16405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->IsArrayClass()); 16505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->GetComponentType()->IsPrimitiveByte()); 16605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<ByteArray*>(this); 16705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 16805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 16905f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline CharArray* Object::AsCharArray() { 17005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->IsArrayClass()); 17105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->GetComponentType()->IsPrimitiveChar()); 17205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<CharArray*>(this); 17305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 17405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 17505f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline ShortArray* Object::AsShortArray() { 17605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->IsArrayClass()); 17705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->GetComponentType()->IsPrimitiveShort()); 17805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<ShortArray*>(this); 17905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 18005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 18105f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline IntArray* Object::AsIntArray() { 18205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->IsArrayClass()); 18305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->GetComponentType()->IsPrimitiveInt() || 18405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers GetClass()->GetComponentType()->IsPrimitiveFloat()); 18505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<IntArray*>(this); 18605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 18705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 18805f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline LongArray* Object::AsLongArray() { 18905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->IsArrayClass()); 19005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->GetComponentType()->IsPrimitiveLong() || 19105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers GetClass()->GetComponentType()->IsPrimitiveDouble()); 19205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<LongArray*>(this); 19305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 19405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 19505f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline String* Object::AsString() { 19605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->IsStringClass()); 19705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<String*>(this); 19805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 19905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 20005f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline Throwable* Object::AsThrowable() { 20105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers DCHECK(GetClass()->IsThrowableClass()); 20205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<Throwable*>(this); 20305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 20405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 2052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsWeakReferenceInstance() const { 2062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetClass()->IsWeakReferenceClass(); 2072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsSoftReferenceInstance() const { 2102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetClass()->IsSoftReferenceClass(); 2112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsFinalizerReferenceInstance() const { 2142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetClass()->IsFinalizerReferenceClass(); 2152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline bool Object::IsPhantomReferenceInstance() const { 2182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetClass()->IsPhantomReferenceClass(); 2192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline size_t Object::SizeOf() const { 2222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t result; 2232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (IsArrayInstance()) { 2242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers result = AsArray()->SizeOf(); 2252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else if (IsClass()) { 2262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers result = AsClass()->SizeOf(); 2272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else { 2282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers result = GetClass()->GetObjectSize(); 2292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(!IsField() || result == sizeof(Field)); 2312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(!IsMethod() || result == sizeof(AbstractMethod)); 2322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return result; 2332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline uint64_t Object::GetField64(MemberOffset field_offset, bool is_volatile) const { 2362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers VerifyObject(this); 2372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers const byte* raw_addr = reinterpret_cast<const byte*>(this) + field_offset.Int32Value(); 2382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers const int64_t* addr = reinterpret_cast<const int64_t*>(raw_addr); 2392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (UNLIKELY(is_volatile)) { 2402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint64_t result = QuasiAtomic::Read64(addr); 2412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers ANDROID_MEMBAR_FULL(); 2422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return result; 2432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else { 2442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return *addr; 2452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline void Object::SetField64(MemberOffset field_offset, uint64_t new_value, bool is_volatile) { 2492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers VerifyObject(this); 2502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); 2512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers int64_t* addr = reinterpret_cast<int64_t*>(raw_addr); 2522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (UNLIKELY(is_volatile)) { 2532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers ANDROID_MEMBAR_STORE(); 2542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers QuasiAtomic::Write64(addr, new_value); 2552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Post-store barrier not required due to use of atomic op or mutex. 2562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else { 2572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers *addr = new_value; 2582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline void Object::WriteBarrierField(const Object* dst, MemberOffset field_offset, 2622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers const Object* new_value) { 2632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Runtime::Current()->GetHeap()->WriteBarrierField(dst, field_offset, new_value); 2642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 26604d7aa92bc5548bc4d272b9480614f06248194ccIan Rogersinline void Object::VerifyObject(const Object* obj) { 2674f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers if (kIsDebugBuild) { 2684f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers Runtime::Current()->GetHeap()->VerifyObject(obj); 2694f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers } 27004d7aa92bc5548bc4d272b9480614f06248194ccIan Rogers} 27104d7aa92bc5548bc4d272b9480614f06248194ccIan Rogers 2722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 2732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace art 2742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#endif // ART_SRC_MIRROR_OBJECT_INL_H_ 276