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