object-inl.h revision faff0f05fef90577c9744505555675185832aacd
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" 27d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers#include "lock_word-inl.h" 2805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers#include "monitor.h" 2952e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier#include "object_array-inl.h" 30800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi#include "read_barrier-inl.h" 312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "runtime.h" 328fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartier#include "reference.h" 3305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers#include "throwable.h" 342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace art { 362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yanginline uint32_t Object::ClassSize() { 3998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang uint32_t vtable_entries = kVTableLength; 4037f05ef45e0393de812d51261dc293240c17294dFred Shih return Class::ComputeClassSize(true, vtable_entries, 0, 0, 0, 0, 0); 4198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang} 4298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 436e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchitemplate<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> 44ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline Class* Object::GetClass() { 456e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi return GetFieldObject<Class, kVerifyFlags, kReadBarrierOption>( 46b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers OFFSET_OF_OBJECT_MEMBER(Object, klass_)); 472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 494e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline void Object::SetClass(Class* new_klass) { 51ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers // new_klass may be NULL prior to class linker initialization. 52ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers // We don't mark the card as this occurs as part of object allocation. Not all objects have 53ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers // backing cards, such as large objects. 54d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // We use non transactional version since we can't undo this write. We also disable checking as 55d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // we may run in transaction mode here. 564e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier SetFieldObjectWithoutWriteBarrier<false, false, 574e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis)>( 58b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers OFFSET_OF_OBJECT_MEMBER(Object, klass_), new_klass); 592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 61bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartierinline LockWord Object::GetLockWord(bool as_volatile) { 62b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (as_volatile) { 63b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers return LockWord(GetField32Volatile(OFFSET_OF_OBJECT_MEMBER(Object, monitor_))); 64b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers } 65b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers return LockWord(GetField32(OFFSET_OF_OBJECT_MEMBER(Object, monitor_))); 66d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers} 67d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 68bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartierinline void Object::SetLockWord(LockWord new_val, bool as_volatile) { 69d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Force use of non-transactional mode and do not check. 70b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (as_volatile) { 71b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers SetField32Volatile<false, false>(OFFSET_OF_OBJECT_MEMBER(Object, monitor_), new_val.GetValue()); 72b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers } else { 73b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers SetField32<false, false>(OFFSET_OF_OBJECT_MEMBER(Object, monitor_), new_val.GetValue()); 74b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers } 75d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers} 76d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 77228602f562f1d130d06e60a98752d99c2d467d6aIan Rogersinline bool Object::CasLockWordWeakSequentiallyConsistent(LockWord old_val, LockWord new_val) { 78d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Force use of non-transactional mode and do not check. 79228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers return CasFieldWeakSequentiallyConsistent32<false, false>( 80228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers OFFSET_OF_OBJECT_MEMBER(Object, monitor_), old_val.GetValue(), new_val.GetValue()); 81d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers} 82d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 83d8434439dc64add41cdfa69ddf96b960af9050deHans Boehminline bool Object::CasLockWordWeakRelaxed(LockWord old_val, LockWord new_val) { 84d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm // Force use of non-transactional mode and do not check. 85d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm return CasFieldWeakRelaxed32<false, false>( 86d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm OFFSET_OF_OBJECT_MEMBER(Object, monitor_), old_val.GetValue(), new_val.GetValue()); 87d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm} 88d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm 89d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogersinline uint32_t Object::GetLockOwnerThreadId() { 90d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers return Monitor::GetLockOwnerThreadId(this); 9105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 9205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 93e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartierinline mirror::Object* Object::MonitorEnter(Thread* self) { 94e7e8a5fea2d852cccc840fa046151a16627f26cdMathieu Chartier return Monitor::MonitorEnter(self, this); 9505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 9605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 9705f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline bool Object::MonitorExit(Thread* self) { 9805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return Monitor::MonitorExit(self, this); 9905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 10005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 10105f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline void Object::Notify(Thread* self) { 10205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers Monitor::Notify(self, this); 10305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 10405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 10505f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline void Object::NotifyAll(Thread* self) { 10605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers Monitor::NotifyAll(self, this); 10705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 10805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 10905f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline void Object::Wait(Thread* self) { 11005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers Monitor::Wait(self, this, 0, 0, true, kWaiting); 11105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 11205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 11305f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline void Object::Wait(Thread* self, int64_t ms, int32_t ns) { 11405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers Monitor::Wait(self, this, ms, ns, true, kTimedWaiting); 11505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 11605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 117624468cd401cc1ac0dd70c746301e0788a597759Hiroshi Yamauchiinline Object* Object::GetReadBarrierPointer() { 118624468cd401cc1ac0dd70c746301e0788a597759Hiroshi Yamauchi#ifdef USE_BAKER_OR_BROOKS_READ_BARRIER 119624468cd401cc1ac0dd70c746301e0788a597759Hiroshi Yamauchi DCHECK(kUseBakerOrBrooksReadBarrier); 1206a154a419022e2caed4edfd1f311edf733278f35Hiroshi Yamauchi return GetFieldObject<Object, kVerifyNone, kWithoutReadBarrier>( 1216a154a419022e2caed4edfd1f311edf733278f35Hiroshi Yamauchi OFFSET_OF_OBJECT_MEMBER(Object, x_rb_ptr_)); 1229d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi#else 1239d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi LOG(FATAL) << "Unreachable"; 1249d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi return nullptr; 1259d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi#endif 1269d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi} 1279d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi 1289103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchiinline void Object::SetReadBarrierPointer(Object* rb_ptr) { 129624468cd401cc1ac0dd70c746301e0788a597759Hiroshi Yamauchi#ifdef USE_BAKER_OR_BROOKS_READ_BARRIER 130624468cd401cc1ac0dd70c746301e0788a597759Hiroshi Yamauchi DCHECK(kUseBakerOrBrooksReadBarrier); 1319d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi // We don't mark the card as this occurs as part of object allocation. Not all objects have 1329d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi // backing cards, such as large objects. 1339d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi SetFieldObjectWithoutWriteBarrier<false, false, kVerifyNone>( 1346a154a419022e2caed4edfd1f311edf733278f35Hiroshi Yamauchi OFFSET_OF_OBJECT_MEMBER(Object, x_rb_ptr_), rb_ptr); 1359103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi#else 1369103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi LOG(FATAL) << "Unreachable"; 1379103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi#endif 1389103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi} 1399103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi 1409103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchiinline bool Object::AtomicSetReadBarrierPointer(Object* expected_rb_ptr, Object* rb_ptr) { 1419103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi#ifdef USE_BAKER_OR_BROOKS_READ_BARRIER 1429103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi DCHECK(kUseBakerOrBrooksReadBarrier); 1439103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi MemberOffset offset = OFFSET_OF_OBJECT_MEMBER(Object, x_rb_ptr_); 1449103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi byte* raw_addr = reinterpret_cast<byte*>(this) + offset.SizeValue(); 145228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers Atomic<uint32_t>* atomic_rb_ptr = reinterpret_cast<Atomic<uint32_t>*>(raw_addr); 1469103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi HeapReference<Object> expected_ref(HeapReference<Object>::FromMirrorPtr(expected_rb_ptr)); 1479103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi HeapReference<Object> new_ref(HeapReference<Object>::FromMirrorPtr(rb_ptr)); 1489103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi do { 149228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers if (UNLIKELY(atomic_rb_ptr->LoadRelaxed() != expected_ref.reference_)) { 1509103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi // Lost the race. 1519103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi return false; 1529103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi } 153228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers } while (!atomic_rb_ptr->CompareExchangeWeakSequentiallyConsistent(expected_ref.reference_, 154228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers new_ref.reference_)); 155228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers DCHECK_EQ(new_ref.reference_, atomic_rb_ptr->LoadRelaxed()); 1569103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi return true; 1579d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi#else 1589d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi LOG(FATAL) << "Unreachable"; 1599103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi return false; 1609d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi#endif 1619d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi} 1629d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi 163624468cd401cc1ac0dd70c746301e0788a597759Hiroshi Yamauchiinline void Object::AssertReadBarrierPointer() const { 164800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi if (kUseBakerReadBarrier) { 165800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi Object* obj = const_cast<Object*>(this); 166800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi DCHECK(obj->GetReadBarrierPointer() == nullptr) 167800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi << "Bad Baker pointer: obj=" << reinterpret_cast<void*>(obj) 168800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi << " ptr=" << reinterpret_cast<void*>(obj->GetReadBarrierPointer()); 169800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi } else if (kUseBrooksReadBarrier) { 170800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi Object* obj = const_cast<Object*>(this); 171800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi DCHECK_EQ(obj, obj->GetReadBarrierPointer()) 172800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi << "Bad Brooks pointer: obj=" << reinterpret_cast<void*>(obj) 173800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi << " ptr=" << reinterpret_cast<void*>(obj->GetReadBarrierPointer()); 174800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi } else { 175800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi LOG(FATAL) << "Unreachable"; 176800ac2defde5d12b2f1f313c6b6162560cfa6fc7Hiroshi Yamauchi } 1779d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi} 1789d04a20bde1b1855cefc64aebc1a44e253b1a13bHiroshi Yamauchi 1794e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 180ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::VerifierInstanceOf(Class* klass) { 181a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao DCHECK(klass != NULL); 1824e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>() != NULL); 183a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao return klass->IsInterface() || InstanceOf(klass); 184a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao} 185a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao 1864e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 187ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::InstanceOf(Class* klass) { 1882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(klass != NULL); 1894e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyNone>() != NULL); 1904e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier return klass->IsAssignableFrom(GetClass<kVerifyFlags>()); 1912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 1922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1936e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchitemplate<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> 194ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::IsClass() { 1956e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi Class* java_lang_Class = GetClass<kVerifyFlags, kReadBarrierOption>()-> 1966e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi template GetClass<kVerifyFlags, kReadBarrierOption>(); 1976e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi return GetClass<static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis), 1986e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi kReadBarrierOption>() == java_lang_Class; 1992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2016e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchitemplate<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> 2022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline Class* Object::AsClass() { 2036e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi DCHECK((IsClass<kVerifyFlags, kReadBarrierOption>())); 2042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return down_cast<Class*>(this); 2052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2074e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 208ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::IsObjectArray() { 2094e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier constexpr auto kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 2104e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier return IsArrayInstance<kVerifyFlags>() && 2114e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier !GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitive(); 2122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2144e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<class T, VerifyObjectFlags kVerifyFlags> 2152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersinline ObjectArray<T>* Object::AsObjectArray() { 2164e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(IsObjectArray<kVerifyFlags>()); 2172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return down_cast<ObjectArray<T>*>(this); 2182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2206e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchitemplate<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> 221ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::IsArrayInstance() { 2226e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi return GetClass<kVerifyFlags, kReadBarrierOption>()-> 2236e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi template IsArrayClass<kVerifyFlags, kReadBarrierOption>(); 2242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2266e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchitemplate<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> 227ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::IsArtField() { 2284f1ebc2b86c8467d1ecb3ec655316e6d7ee8b8b5Hiroshi Yamauchi return GetClass<kVerifyFlags, kReadBarrierOption>()-> 2294f1ebc2b86c8467d1ecb3ec655316e6d7ee8b8b5Hiroshi Yamauchi template IsArtFieldClass<kReadBarrierOption>(); 2302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2324e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 2334e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartierinline ArtField* Object::AsArtField() { 2344e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(IsArtField<kVerifyFlags>()); 235ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom return down_cast<ArtField*>(this); 2362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2386e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchitemplate<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> 239ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::IsArtMethod() { 2404f1ebc2b86c8467d1ecb3ec655316e6d7ee8b8b5Hiroshi Yamauchi return GetClass<kVerifyFlags, kReadBarrierOption>()-> 2414f1ebc2b86c8467d1ecb3ec655316e6d7ee8b8b5Hiroshi Yamauchi template IsArtMethodClass<kReadBarrierOption>(); 2422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2444e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 245ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrominline ArtMethod* Object::AsArtMethod() { 2464e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(IsArtMethod<kVerifyFlags>()); 247ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom return down_cast<ArtMethod*>(this); 2482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2504e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 251ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::IsReferenceInstance() { 2524ee7a665e7f9cd2c5ace2d6304e33f64067b209fFred Shih return GetClass<kVerifyFlags>()->IsTypeOfReferenceClass(); 2532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 2542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2554e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 2568fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartierinline Reference* Object::AsReference() { 2578fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartier DCHECK(IsReferenceInstance<kVerifyFlags>()); 2588fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartier return down_cast<Reference*>(this); 2598fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartier} 2608fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartier 2616e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchitemplate<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> 26205f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline Array* Object::AsArray() { 2636e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi DCHECK((IsArrayInstance<kVerifyFlags, kReadBarrierOption>())); 26405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<Array*>(this); 26505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 26605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 2674e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 26805f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline BooleanArray* Object::AsBooleanArray() { 2694e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier constexpr auto kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 2704e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsArrayClass()); 2714e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kNewFlags>()->GetComponentType()->IsPrimitiveBoolean()); 27205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<BooleanArray*>(this); 27305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 27405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 2754e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 27605f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline ByteArray* Object::AsByteArray() { 2774e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier static const VerifyObjectFlags kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 2784e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsArrayClass()); 2794e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveByte()); 28005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<ByteArray*>(this); 28105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 28205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 2834e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 284ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline ByteArray* Object::AsByteSizedArray() { 2854e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier constexpr VerifyObjectFlags kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 2864e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsArrayClass()); 2874e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveByte() || 2884e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveBoolean()); 289ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return down_cast<ByteArray*>(this); 290ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} 291ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 2924e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 29305f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline CharArray* Object::AsCharArray() { 2944e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier constexpr auto kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 2954e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsArrayClass()); 2964e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveChar()); 29705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<CharArray*>(this); 29805f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 29905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 3004e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 30105f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline ShortArray* Object::AsShortArray() { 3024e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier constexpr auto kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 3034e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsArrayClass()); 3044e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveShort()); 30505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<ShortArray*>(this); 30605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 30705f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 3084e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 309ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline ShortArray* Object::AsShortSizedArray() { 3104e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier constexpr auto kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 3114e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsArrayClass()); 3124e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveShort() || 3134e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveChar()); 314ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return down_cast<ShortArray*>(this); 315ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} 316ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 3174e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 31805f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline IntArray* Object::AsIntArray() { 3194e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier constexpr auto kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 3204e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsArrayClass()); 3214e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveInt() || 3224e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveFloat()); 32305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<IntArray*>(this); 32405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 32505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 3264e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 32705f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline LongArray* Object::AsLongArray() { 3284e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier constexpr auto kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 3294e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsArrayClass()); 3304e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveLong() || 3314e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveDouble()); 33205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<LongArray*>(this); 33305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 33405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 3354e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 336d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertzinline FloatArray* Object::AsFloatArray() { 3374e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier constexpr auto kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 3384e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsArrayClass()); 3394e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveFloat()); 340d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz return down_cast<FloatArray*>(this); 341d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz} 342d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz 3434e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 344d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertzinline DoubleArray* Object::AsDoubleArray() { 3454e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier constexpr auto kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 3464e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsArrayClass()); 3474e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kNewFlags>()->template GetComponentType<kNewFlags>()->IsPrimitiveDouble()); 348d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz return down_cast<DoubleArray*>(this); 349d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz} 350d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz 3514e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 35205f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline String* Object::AsString() { 3534e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsStringClass()); 35405f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<String*>(this); 35505f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 35605f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 3574e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 35805f3057d6a4d23d712092ccd36a531590bff323bIan Rogersinline Throwable* Object::AsThrowable() { 3594e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier DCHECK(GetClass<kVerifyFlags>()->IsThrowableClass()); 36005f3057d6a4d23d712092ccd36a531590bff323bIan Rogers return down_cast<Throwable*>(this); 36105f3057d6a4d23d712092ccd36a531590bff323bIan Rogers} 36205f3057d6a4d23d712092ccd36a531590bff323bIan Rogers 3634e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 364ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::IsWeakReferenceInstance() { 3654e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier return GetClass<kVerifyFlags>()->IsWeakReferenceClass(); 3662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3684e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 369ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::IsSoftReferenceInstance() { 3704e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier return GetClass<kVerifyFlags>()->IsSoftReferenceClass(); 3712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3734e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 374ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::IsFinalizerReferenceInstance() { 3754e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier return GetClass<kVerifyFlags>()->IsFinalizerReferenceClass(); 3762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3784e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 3798fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartierinline FinalizerReference* Object::AsFinalizerReference() { 3808fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartier DCHECK(IsFinalizerReferenceInstance<kVerifyFlags>()); 3818fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartier return down_cast<FinalizerReference*>(this); 3828fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartier} 3838fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartier 3848fa2dad7fe7909c8335101d6c8904ae997cdf29fMathieu Chartiertemplate<VerifyObjectFlags kVerifyFlags> 385ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline bool Object::IsPhantomReferenceInstance() { 3864e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier return GetClass<kVerifyFlags>()->IsPhantomReferenceClass(); 3872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 3882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3896e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchitemplate<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> 390ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersinline size_t Object::SizeOf() { 3912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t result; 3924e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier constexpr auto kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); 3936e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi if (IsArrayInstance<kVerifyFlags, kReadBarrierOption>()) { 3946e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi result = AsArray<kNewFlags, kReadBarrierOption>()-> 3956e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi template SizeOf<kNewFlags, kReadBarrierOption>(); 3966e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi } else if (IsClass<kNewFlags, kReadBarrierOption>()) { 3976e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi result = AsClass<kNewFlags, kReadBarrierOption>()-> 3986e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi template SizeOf<kNewFlags, kReadBarrierOption>(); 3992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else { 40025023c744c4388a6459b21cc3babf8c602b024a2Hiroshi Yamauchi result = GetClass<kNewFlags, kReadBarrierOption>()-> 40125023c744c4388a6459b21cc3babf8c602b024a2Hiroshi Yamauchi template GetObjectSize<kNewFlags, kReadBarrierOption>(); 4022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4039103c86a98524e9ddfd14f8cee56e919f68eee9bHiroshi Yamauchi DCHECK_GE(result, sizeof(Object)) 4046e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi << " class=" << PrettyTypeOf(GetClass<kNewFlags, kReadBarrierOption>()); 4056e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi DCHECK(!(IsArtField<kNewFlags, kReadBarrierOption>()) || result == sizeof(ArtField)); 4066e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi DCHECK(!(IsArtMethod<kNewFlags, kReadBarrierOption>()) || result == sizeof(ArtMethod)); 4072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return result; 4082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 4092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 410b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogerstemplate<VerifyObjectFlags kVerifyFlags, bool kIsVolatile> 41137f05ef45e0393de812d51261dc293240c17294dFred Shihinline uint8_t Object::GetFieldBoolean(MemberOffset field_offset) { 4124e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyThis) { 4134e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier VerifyObject(this); 4144e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 41537f05ef45e0393de812d51261dc293240c17294dFred Shih return GetField<uint8_t, kIsVolatile>(field_offset); 41637f05ef45e0393de812d51261dc293240c17294dFred Shih} 41737f05ef45e0393de812d51261dc293240c17294dFred Shih 41837f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<VerifyObjectFlags kVerifyFlags, bool kIsVolatile> 41937f05ef45e0393de812d51261dc293240c17294dFred Shihinline int8_t Object::GetFieldByte(MemberOffset field_offset) { 42037f05ef45e0393de812d51261dc293240c17294dFred Shih if (kVerifyFlags & kVerifyThis) { 42137f05ef45e0393de812d51261dc293240c17294dFred Shih VerifyObject(this); 42237f05ef45e0393de812d51261dc293240c17294dFred Shih } 42337f05ef45e0393de812d51261dc293240c17294dFred Shih return GetField<int8_t, kIsVolatile>(field_offset); 42437f05ef45e0393de812d51261dc293240c17294dFred Shih} 42537f05ef45e0393de812d51261dc293240c17294dFred Shih 42637f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<VerifyObjectFlags kVerifyFlags> 42737f05ef45e0393de812d51261dc293240c17294dFred Shihinline uint8_t Object::GetFieldBooleanVolatile(MemberOffset field_offset) { 42837f05ef45e0393de812d51261dc293240c17294dFred Shih return GetFieldBoolean<kVerifyFlags, true>(field_offset); 42937f05ef45e0393de812d51261dc293240c17294dFred Shih} 43037f05ef45e0393de812d51261dc293240c17294dFred Shih 43137f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<VerifyObjectFlags kVerifyFlags> 43237f05ef45e0393de812d51261dc293240c17294dFred Shihinline int8_t Object::GetFieldByteVolatile(MemberOffset field_offset) { 43337f05ef45e0393de812d51261dc293240c17294dFred Shih return GetFieldByte<kVerifyFlags, true>(field_offset); 43437f05ef45e0393de812d51261dc293240c17294dFred Shih} 43537f05ef45e0393de812d51261dc293240c17294dFred Shih 43637f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags, 43737f05ef45e0393de812d51261dc293240c17294dFred Shih bool kIsVolatile> 43837f05ef45e0393de812d51261dc293240c17294dFred Shihinline void Object::SetFieldBoolean(MemberOffset field_offset, uint8_t new_value) 43937f05ef45e0393de812d51261dc293240c17294dFred Shih SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 44037f05ef45e0393de812d51261dc293240c17294dFred Shih if (kCheckTransaction) { 44137f05ef45e0393de812d51261dc293240c17294dFred Shih DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 44237f05ef45e0393de812d51261dc293240c17294dFred Shih } 44337f05ef45e0393de812d51261dc293240c17294dFred Shih if (kTransactionActive) { 44437f05ef45e0393de812d51261dc293240c17294dFred Shih Runtime::Current()->RecordWriteFieldBoolean(this, field_offset, 44537f05ef45e0393de812d51261dc293240c17294dFred Shih GetFieldBoolean<kVerifyFlags, kIsVolatile>(field_offset), 44637f05ef45e0393de812d51261dc293240c17294dFred Shih kIsVolatile); 44737f05ef45e0393de812d51261dc293240c17294dFred Shih } 44837f05ef45e0393de812d51261dc293240c17294dFred Shih if (kVerifyFlags & kVerifyThis) { 44937f05ef45e0393de812d51261dc293240c17294dFred Shih VerifyObject(this); 45037f05ef45e0393de812d51261dc293240c17294dFred Shih } 45137f05ef45e0393de812d51261dc293240c17294dFred Shih SetField<uint8_t, kIsVolatile>(field_offset, new_value); 45237f05ef45e0393de812d51261dc293240c17294dFred Shih} 45337f05ef45e0393de812d51261dc293240c17294dFred Shih 45437f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags, 45537f05ef45e0393de812d51261dc293240c17294dFred Shih bool kIsVolatile> 45637f05ef45e0393de812d51261dc293240c17294dFred Shihinline void Object::SetFieldByte(MemberOffset field_offset, int8_t new_value) 45737f05ef45e0393de812d51261dc293240c17294dFred Shih SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 45837f05ef45e0393de812d51261dc293240c17294dFred Shih if (kCheckTransaction) { 45937f05ef45e0393de812d51261dc293240c17294dFred Shih DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 46037f05ef45e0393de812d51261dc293240c17294dFred Shih } 46137f05ef45e0393de812d51261dc293240c17294dFred Shih if (kTransactionActive) { 46237f05ef45e0393de812d51261dc293240c17294dFred Shih Runtime::Current()->RecordWriteFieldByte(this, field_offset, 46337f05ef45e0393de812d51261dc293240c17294dFred Shih GetFieldByte<kVerifyFlags, kIsVolatile>(field_offset), 46437f05ef45e0393de812d51261dc293240c17294dFred Shih kIsVolatile); 46537f05ef45e0393de812d51261dc293240c17294dFred Shih } 46637f05ef45e0393de812d51261dc293240c17294dFred Shih if (kVerifyFlags & kVerifyThis) { 46737f05ef45e0393de812d51261dc293240c17294dFred Shih VerifyObject(this); 46837f05ef45e0393de812d51261dc293240c17294dFred Shih } 46937f05ef45e0393de812d51261dc293240c17294dFred Shih SetField<int8_t, kIsVolatile>(field_offset, new_value); 47037f05ef45e0393de812d51261dc293240c17294dFred Shih} 47137f05ef45e0393de812d51261dc293240c17294dFred Shih 47237f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 47337f05ef45e0393de812d51261dc293240c17294dFred Shihinline void Object::SetFieldBooleanVolatile(MemberOffset field_offset, uint8_t new_value) { 47437f05ef45e0393de812d51261dc293240c17294dFred Shih return SetFieldBoolean<kTransactionActive, kCheckTransaction, kVerifyFlags, true>( 47537f05ef45e0393de812d51261dc293240c17294dFred Shih field_offset, new_value); 47637f05ef45e0393de812d51261dc293240c17294dFred Shih} 47737f05ef45e0393de812d51261dc293240c17294dFred Shih 47837f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 47937f05ef45e0393de812d51261dc293240c17294dFred Shihinline void Object::SetFieldByteVolatile(MemberOffset field_offset, int8_t new_value) { 48037f05ef45e0393de812d51261dc293240c17294dFred Shih return SetFieldByte<kTransactionActive, kCheckTransaction, kVerifyFlags, true>( 48137f05ef45e0393de812d51261dc293240c17294dFred Shih field_offset, new_value); 48237f05ef45e0393de812d51261dc293240c17294dFred Shih} 48337f05ef45e0393de812d51261dc293240c17294dFred Shih 48437f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<VerifyObjectFlags kVerifyFlags, bool kIsVolatile> 48537f05ef45e0393de812d51261dc293240c17294dFred Shihinline uint16_t Object::GetFieldChar(MemberOffset field_offset) { 48637f05ef45e0393de812d51261dc293240c17294dFred Shih if (kVerifyFlags & kVerifyThis) { 48737f05ef45e0393de812d51261dc293240c17294dFred Shih VerifyObject(this); 48837f05ef45e0393de812d51261dc293240c17294dFred Shih } 48937f05ef45e0393de812d51261dc293240c17294dFred Shih return GetField<uint16_t, kIsVolatile>(field_offset); 49037f05ef45e0393de812d51261dc293240c17294dFred Shih} 49137f05ef45e0393de812d51261dc293240c17294dFred Shih 49237f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<VerifyObjectFlags kVerifyFlags, bool kIsVolatile> 49337f05ef45e0393de812d51261dc293240c17294dFred Shihinline int16_t Object::GetFieldShort(MemberOffset field_offset) { 49437f05ef45e0393de812d51261dc293240c17294dFred Shih if (kVerifyFlags & kVerifyThis) { 49537f05ef45e0393de812d51261dc293240c17294dFred Shih VerifyObject(this); 496b122a4bbed34ab22b4c1541ee25e5cf22f12a926Ian Rogers } 49737f05ef45e0393de812d51261dc293240c17294dFred Shih return GetField<int16_t, kIsVolatile>(field_offset); 49837f05ef45e0393de812d51261dc293240c17294dFred Shih} 49937f05ef45e0393de812d51261dc293240c17294dFred Shih 50037f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<VerifyObjectFlags kVerifyFlags> 50137f05ef45e0393de812d51261dc293240c17294dFred Shihinline uint16_t Object::GetFieldCharVolatile(MemberOffset field_offset) { 50237f05ef45e0393de812d51261dc293240c17294dFred Shih return GetFieldChar<kVerifyFlags, true>(field_offset); 50337f05ef45e0393de812d51261dc293240c17294dFred Shih} 50437f05ef45e0393de812d51261dc293240c17294dFred Shih 50537f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<VerifyObjectFlags kVerifyFlags> 50637f05ef45e0393de812d51261dc293240c17294dFred Shihinline int16_t Object::GetFieldShortVolatile(MemberOffset field_offset) { 50737f05ef45e0393de812d51261dc293240c17294dFred Shih return GetFieldShort<kVerifyFlags, true>(field_offset); 50837f05ef45e0393de812d51261dc293240c17294dFred Shih} 50937f05ef45e0393de812d51261dc293240c17294dFred Shih 51037f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags, 51137f05ef45e0393de812d51261dc293240c17294dFred Shih bool kIsVolatile> 51237f05ef45e0393de812d51261dc293240c17294dFred Shihinline void Object::SetFieldChar(MemberOffset field_offset, uint16_t new_value) { 51337f05ef45e0393de812d51261dc293240c17294dFred Shih if (kCheckTransaction) { 51437f05ef45e0393de812d51261dc293240c17294dFred Shih DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 51537f05ef45e0393de812d51261dc293240c17294dFred Shih } 51637f05ef45e0393de812d51261dc293240c17294dFred Shih if (kTransactionActive) { 51737f05ef45e0393de812d51261dc293240c17294dFred Shih Runtime::Current()->RecordWriteFieldChar(this, field_offset, 51837f05ef45e0393de812d51261dc293240c17294dFred Shih GetFieldChar<kVerifyFlags, kIsVolatile>(field_offset), 51937f05ef45e0393de812d51261dc293240c17294dFred Shih kIsVolatile); 52037f05ef45e0393de812d51261dc293240c17294dFred Shih } 52137f05ef45e0393de812d51261dc293240c17294dFred Shih if (kVerifyFlags & kVerifyThis) { 52237f05ef45e0393de812d51261dc293240c17294dFred Shih VerifyObject(this); 52337f05ef45e0393de812d51261dc293240c17294dFred Shih } 52437f05ef45e0393de812d51261dc293240c17294dFred Shih SetField<uint16_t, kIsVolatile>(field_offset, new_value); 52537f05ef45e0393de812d51261dc293240c17294dFred Shih} 52637f05ef45e0393de812d51261dc293240c17294dFred Shih 52737f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags, 52837f05ef45e0393de812d51261dc293240c17294dFred Shih bool kIsVolatile> 52937f05ef45e0393de812d51261dc293240c17294dFred Shihinline void Object::SetFieldShort(MemberOffset field_offset, int16_t new_value) { 53037f05ef45e0393de812d51261dc293240c17294dFred Shih if (kCheckTransaction) { 53137f05ef45e0393de812d51261dc293240c17294dFred Shih DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 53237f05ef45e0393de812d51261dc293240c17294dFred Shih } 53337f05ef45e0393de812d51261dc293240c17294dFred Shih if (kTransactionActive) { 53437f05ef45e0393de812d51261dc293240c17294dFred Shih Runtime::Current()->RecordWriteFieldChar(this, field_offset, 53537f05ef45e0393de812d51261dc293240c17294dFred Shih GetFieldShort<kVerifyFlags, kIsVolatile>(field_offset), 53637f05ef45e0393de812d51261dc293240c17294dFred Shih kIsVolatile); 53737f05ef45e0393de812d51261dc293240c17294dFred Shih } 53837f05ef45e0393de812d51261dc293240c17294dFred Shih if (kVerifyFlags & kVerifyThis) { 53937f05ef45e0393de812d51261dc293240c17294dFred Shih VerifyObject(this); 54037f05ef45e0393de812d51261dc293240c17294dFred Shih } 54137f05ef45e0393de812d51261dc293240c17294dFred Shih SetField<int16_t, kIsVolatile>(field_offset, new_value); 54237f05ef45e0393de812d51261dc293240c17294dFred Shih} 54337f05ef45e0393de812d51261dc293240c17294dFred Shih 54437f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 54537f05ef45e0393de812d51261dc293240c17294dFred Shihinline void Object::SetFieldCharVolatile(MemberOffset field_offset, uint16_t new_value) { 54637f05ef45e0393de812d51261dc293240c17294dFred Shih return SetFieldChar<kTransactionActive, kCheckTransaction, kVerifyFlags, true>( 54737f05ef45e0393de812d51261dc293240c17294dFred Shih field_offset, new_value); 54837f05ef45e0393de812d51261dc293240c17294dFred Shih} 54937f05ef45e0393de812d51261dc293240c17294dFred Shih 55037f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 55137f05ef45e0393de812d51261dc293240c17294dFred Shihinline void Object::SetFieldShortVolatile(MemberOffset field_offset, int16_t new_value) { 55237f05ef45e0393de812d51261dc293240c17294dFred Shih return SetFieldShort<kTransactionActive, kCheckTransaction, kVerifyFlags, true>( 55337f05ef45e0393de812d51261dc293240c17294dFred Shih field_offset, new_value); 55437f05ef45e0393de812d51261dc293240c17294dFred Shih} 55537f05ef45e0393de812d51261dc293240c17294dFred Shih 55637f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<VerifyObjectFlags kVerifyFlags, bool kIsVolatile> 55737f05ef45e0393de812d51261dc293240c17294dFred Shihinline int32_t Object::GetField32(MemberOffset field_offset) { 55837f05ef45e0393de812d51261dc293240c17294dFred Shih if (kVerifyFlags & kVerifyThis) { 55937f05ef45e0393de812d51261dc293240c17294dFred Shih VerifyObject(this); 56037f05ef45e0393de812d51261dc293240c17294dFred Shih } 56137f05ef45e0393de812d51261dc293240c17294dFred Shih return GetField<int32_t, kIsVolatile>(field_offset); 562b122a4bbed34ab22b4c1541ee25e5cf22f12a926Ian Rogers} 563b122a4bbed34ab22b4c1541ee25e5cf22f12a926Ian Rogers 564b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogerstemplate<VerifyObjectFlags kVerifyFlags> 565b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline int32_t Object::GetField32Volatile(MemberOffset field_offset) { 566b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers return GetField32<kVerifyFlags, true>(field_offset); 567b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers} 568b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers 569b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogerstemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags, 570b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers bool kIsVolatile> 571b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline void Object::SetField32(MemberOffset field_offset, int32_t new_value) { 572d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kCheckTransaction) { 573d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 574d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 575d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kTransactionActive) { 576b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers Runtime::Current()->RecordWriteField32(this, field_offset, 577b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers GetField32<kVerifyFlags, kIsVolatile>(field_offset), 578b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers kIsVolatile); 579d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 5804e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyThis) { 581b122a4bbed34ab22b4c1541ee25e5cf22f12a926Ian Rogers VerifyObject(this); 582b122a4bbed34ab22b4c1541ee25e5cf22f12a926Ian Rogers } 58337f05ef45e0393de812d51261dc293240c17294dFred Shih SetField<int32_t, kIsVolatile>(field_offset, new_value); 584b122a4bbed34ab22b4c1541ee25e5cf22f12a926Ian Rogers} 585b122a4bbed34ab22b4c1541ee25e5cf22f12a926Ian Rogers 5864e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 587b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline void Object::SetField32Volatile(MemberOffset field_offset, int32_t new_value) { 588b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers SetField32<kTransactionActive, kCheckTransaction, kVerifyFlags, true>(field_offset, new_value); 589b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers} 590b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers 591d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm// TODO: Pass memory_order_ and strong/weak as arguments to avoid code duplication? 592d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm 593b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogerstemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 594228602f562f1d130d06e60a98752d99c2d467d6aIan Rogersinline bool Object::CasFieldWeakSequentiallyConsistent32(MemberOffset field_offset, 595228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers int32_t old_value, int32_t new_value) { 596d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kCheckTransaction) { 597d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 598d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 599d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kTransactionActive) { 600d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz Runtime::Current()->RecordWriteField32(this, field_offset, old_value, true); 601d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 6024e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyThis) { 6034e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier VerifyObject(this); 6044e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 605d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); 606228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers AtomicInteger* atomic_addr = reinterpret_cast<AtomicInteger*>(raw_addr); 6073035961cb41865b80b927546be0c708b6389cec6Hans Boehm 608228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers return atomic_addr->CompareExchangeWeakSequentiallyConsistent(old_value, new_value); 609d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers} 610d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers 611d8434439dc64add41cdfa69ddf96b960af9050deHans Boehmtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 612d8434439dc64add41cdfa69ddf96b960af9050deHans Boehminline bool Object::CasFieldWeakRelaxed32(MemberOffset field_offset, 613d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm int32_t old_value, int32_t new_value) { 614d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kCheckTransaction) { 615d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 616d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 617d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kTransactionActive) { 618d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm Runtime::Current()->RecordWriteField32(this, field_offset, old_value, true); 619d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 620d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kVerifyFlags & kVerifyThis) { 621d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm VerifyObject(this); 622d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 623d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); 624d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm AtomicInteger* atomic_addr = reinterpret_cast<AtomicInteger*>(raw_addr); 625d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm 626d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm return atomic_addr->CompareExchangeWeakRelaxed(old_value, new_value); 627d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm} 628d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm 629d8434439dc64add41cdfa69ddf96b960af9050deHans Boehmtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 630d8434439dc64add41cdfa69ddf96b960af9050deHans Boehminline bool Object::CasFieldStrongSequentiallyConsistent32(MemberOffset field_offset, 631d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm int32_t old_value, int32_t new_value) { 632d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kCheckTransaction) { 633d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 634d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 635d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kTransactionActive) { 636d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm Runtime::Current()->RecordWriteField32(this, field_offset, old_value, true); 637d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 638d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kVerifyFlags & kVerifyThis) { 639d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm VerifyObject(this); 640d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 641d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); 642d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm AtomicInteger* atomic_addr = reinterpret_cast<AtomicInteger*>(raw_addr); 643d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm 644d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm return atomic_addr->CompareExchangeStrongSequentiallyConsistent(old_value, new_value); 645d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm} 646d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm 647b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogerstemplate<VerifyObjectFlags kVerifyFlags, bool kIsVolatile> 648b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline int64_t Object::GetField64(MemberOffset field_offset) { 6494e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyThis) { 6504e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier VerifyObject(this); 6514e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 65237f05ef45e0393de812d51261dc293240c17294dFred Shih return GetField<int64_t, kIsVolatile>(field_offset); 6532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 6542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 655b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogerstemplate<VerifyObjectFlags kVerifyFlags> 656b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline int64_t Object::GetField64Volatile(MemberOffset field_offset) { 657b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers return GetField64<kVerifyFlags, true>(field_offset); 658b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers} 659b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers 660b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogerstemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags, 661b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers bool kIsVolatile> 662b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline void Object::SetField64(MemberOffset field_offset, int64_t new_value) { 663d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kCheckTransaction) { 664d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 665d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 666d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kTransactionActive) { 667b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers Runtime::Current()->RecordWriteField64(this, field_offset, 668b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers GetField64<kVerifyFlags, kIsVolatile>(field_offset), 669b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers kIsVolatile); 670d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 6714e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyThis) { 672ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers VerifyObject(this); 673ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 67437f05ef45e0393de812d51261dc293240c17294dFred Shih SetField<int64_t, kIsVolatile>(field_offset, new_value); 6752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 6762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6774e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 678b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline void Object::SetField64Volatile(MemberOffset field_offset, int64_t new_value) { 679b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers return SetField64<kTransactionActive, kCheckTransaction, kVerifyFlags, true>(field_offset, 680b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers new_value); 681b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers} 682b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers 68337f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<typename kSize, bool kIsVolatile> 68437f05ef45e0393de812d51261dc293240c17294dFred Shihinline void Object::SetField(MemberOffset field_offset, kSize new_value) { 68537f05ef45e0393de812d51261dc293240c17294dFred Shih byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); 68637f05ef45e0393de812d51261dc293240c17294dFred Shih kSize* addr = reinterpret_cast<kSize*>(raw_addr); 68737f05ef45e0393de812d51261dc293240c17294dFred Shih if (kIsVolatile) { 68837f05ef45e0393de812d51261dc293240c17294dFred Shih reinterpret_cast<Atomic<kSize>*>(addr)->StoreSequentiallyConsistent(new_value); 68937f05ef45e0393de812d51261dc293240c17294dFred Shih } else { 69037f05ef45e0393de812d51261dc293240c17294dFred Shih reinterpret_cast<Atomic<kSize>*>(addr)->StoreJavaData(new_value); 69137f05ef45e0393de812d51261dc293240c17294dFred Shih } 69237f05ef45e0393de812d51261dc293240c17294dFred Shih} 69337f05ef45e0393de812d51261dc293240c17294dFred Shih 69437f05ef45e0393de812d51261dc293240c17294dFred Shihtemplate<typename kSize, bool kIsVolatile> 69537f05ef45e0393de812d51261dc293240c17294dFred Shihinline kSize Object::GetField(MemberOffset field_offset) { 69637f05ef45e0393de812d51261dc293240c17294dFred Shih const byte* raw_addr = reinterpret_cast<const byte*>(this) + field_offset.Int32Value(); 69737f05ef45e0393de812d51261dc293240c17294dFred Shih const kSize* addr = reinterpret_cast<const kSize*>(raw_addr); 69837f05ef45e0393de812d51261dc293240c17294dFred Shih if (kIsVolatile) { 69937f05ef45e0393de812d51261dc293240c17294dFred Shih return reinterpret_cast<const Atomic<kSize>*>(addr)->LoadSequentiallyConsistent(); 70037f05ef45e0393de812d51261dc293240c17294dFred Shih } else { 70137f05ef45e0393de812d51261dc293240c17294dFred Shih return reinterpret_cast<const Atomic<kSize>*>(addr)->LoadJavaData(); 70237f05ef45e0393de812d51261dc293240c17294dFred Shih } 70337f05ef45e0393de812d51261dc293240c17294dFred Shih} 70437f05ef45e0393de812d51261dc293240c17294dFred Shih 705b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogerstemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 706228602f562f1d130d06e60a98752d99c2d467d6aIan Rogersinline bool Object::CasFieldWeakSequentiallyConsistent64(MemberOffset field_offset, 707228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers int64_t old_value, int64_t new_value) { 708d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kCheckTransaction) { 709d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 710d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 711d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kTransactionActive) { 712d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz Runtime::Current()->RecordWriteField64(this, field_offset, old_value, true); 713d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 7144e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyThis) { 7154e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier VerifyObject(this); 7164e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 717ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); 718228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers Atomic<int64_t>* atomic_addr = reinterpret_cast<Atomic<int64_t>*>(raw_addr); 719228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers return atomic_addr->CompareExchangeWeakSequentiallyConsistent(old_value, new_value); 720ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} 721ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 722d8434439dc64add41cdfa69ddf96b960af9050deHans Boehmtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 723d8434439dc64add41cdfa69ddf96b960af9050deHans Boehminline bool Object::CasFieldStrongSequentiallyConsistent64(MemberOffset field_offset, 724d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm int64_t old_value, int64_t new_value) { 725d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kCheckTransaction) { 726d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 727d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 728d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kTransactionActive) { 729d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm Runtime::Current()->RecordWriteField64(this, field_offset, old_value, true); 730d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 731d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kVerifyFlags & kVerifyThis) { 732d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm VerifyObject(this); 733d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 734d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); 735d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm Atomic<int64_t>* atomic_addr = reinterpret_cast<Atomic<int64_t>*>(raw_addr); 736d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm return atomic_addr->CompareExchangeStrongSequentiallyConsistent(old_value, new_value); 737d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm} 738d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm 7396e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchitemplate<class T, VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption, 7406e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi bool kIsVolatile> 741b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline T* Object::GetFieldObject(MemberOffset field_offset) { 7424e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyThis) { 7434e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier VerifyObject(this); 7444e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 745ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); 746ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers HeapReference<T>* objref_addr = reinterpret_cast<HeapReference<T>*>(raw_addr); 7476e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi T* result = ReadBarrier::Barrier<T, kReadBarrierOption>(this, field_offset, objref_addr); 748b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (kIsVolatile) { 7493035961cb41865b80b927546be0c708b6389cec6Hans Boehm // TODO: Refactor to use a SequentiallyConsistent load instead. 7503035961cb41865b80b927546be0c708b6389cec6Hans Boehm QuasiAtomic::ThreadFenceAcquire(); // Ensure visibility of operations preceding store. 751ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 7524e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyReads) { 7534e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier VerifyObject(result); 7544e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 755ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return result; 756ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} 757ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 7586e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchitemplate<class T, VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> 759b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline T* Object::GetFieldObjectVolatile(MemberOffset field_offset) { 7606e83c172f385cb45dd13bbcf41d2df8e410828c6Hiroshi Yamauchi return GetFieldObject<T, kVerifyFlags, kReadBarrierOption, true>(field_offset); 761b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers} 762b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers 763b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogerstemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags, 764b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers bool kIsVolatile> 765b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline void Object::SetFieldObjectWithoutWriteBarrier(MemberOffset field_offset, 766b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers Object* new_value) { 767d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kCheckTransaction) { 768d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 769d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 770d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kTransactionActive) { 771b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers mirror::Object* obj; 772b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (kIsVolatile) { 773b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers obj = GetFieldObjectVolatile<Object>(field_offset); 774b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers } else { 775b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers obj = GetFieldObject<Object>(field_offset); 776b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers } 777b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers Runtime::Current()->RecordWriteFieldReference(this, field_offset, obj, true); 778d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 7794e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyThis) { 780ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers VerifyObject(this); 781ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 7824e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyWrites) { 7834e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier VerifyObject(new_value); 7844e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 785ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); 786ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers HeapReference<Object>* objref_addr = reinterpret_cast<HeapReference<Object>*>(raw_addr); 787b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (kIsVolatile) { 7883035961cb41865b80b927546be0c708b6389cec6Hans Boehm // TODO: Refactor to use a SequentiallyConsistent store instead. 7893035961cb41865b80b927546be0c708b6389cec6Hans Boehm QuasiAtomic::ThreadFenceRelease(); // Ensure that prior accesses are visible before store. 790ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers objref_addr->Assign(new_value); 7913035961cb41865b80b927546be0c708b6389cec6Hans Boehm QuasiAtomic::ThreadFenceSequentiallyConsistent(); 7923035961cb41865b80b927546be0c708b6389cec6Hans Boehm // Ensure this store occurs before any volatile loads. 793ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } else { 794ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers objref_addr->Assign(new_value); 795ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 796ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} 797ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 798b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogerstemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags, 799b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers bool kIsVolatile> 800b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline void Object::SetFieldObject(MemberOffset field_offset, Object* new_value) { 801b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers SetFieldObjectWithoutWriteBarrier<kTransactionActive, kCheckTransaction, kVerifyFlags, 802b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers kIsVolatile>(field_offset, new_value); 803ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers if (new_value != nullptr) { 804ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers Runtime::Current()->GetHeap()->WriteBarrierField(this, field_offset, new_value); 80561c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier // TODO: Check field assignment could theoretically cause thread suspension, TODO: fix this. 80661c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier CheckFieldAssignment(field_offset, new_value); 807ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 808ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} 809ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 810b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogerstemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 811b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogersinline void Object::SetFieldObjectVolatile(MemberOffset field_offset, Object* new_value) { 812b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers SetFieldObject<kTransactionActive, kCheckTransaction, kVerifyFlags, true>(field_offset, 813b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers new_value); 814b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers} 815b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers 8164e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate <VerifyObjectFlags kVerifyFlags> 8174e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartierinline HeapReference<Object>* Object::GetFieldObjectReferenceAddr(MemberOffset field_offset) { 8184e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyThis) { 8194e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier VerifyObject(this); 8204e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 8214e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier return reinterpret_cast<HeapReference<Object>*>(reinterpret_cast<byte*>(this) + 8224e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier field_offset.Int32Value()); 8234e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier} 8244e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier 8254e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiertemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 826228602f562f1d130d06e60a98752d99c2d467d6aIan Rogersinline bool Object::CasFieldWeakSequentiallyConsistentObject(MemberOffset field_offset, 827228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers Object* old_value, Object* new_value) { 828d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kCheckTransaction) { 829d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 830d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 8314e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyThis) { 8324e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier VerifyObject(this); 8334e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 8344e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyWrites) { 8354e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier VerifyObject(new_value); 8364e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 8374e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyFlags & kVerifyReads) { 8384e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier VerifyObject(old_value); 8394e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 840d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kTransactionActive) { 841d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz Runtime::Current()->RecordWriteFieldReference(this, field_offset, old_value, true); 842d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 843ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers HeapReference<Object> old_ref(HeapReference<Object>::FromMirrorPtr(old_value)); 844ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers HeapReference<Object> new_ref(HeapReference<Object>::FromMirrorPtr(new_value)); 845228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); 846228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers Atomic<uint32_t>* atomic_addr = reinterpret_cast<Atomic<uint32_t>*>(raw_addr); 847228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers 848228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers bool success = atomic_addr->CompareExchangeWeakSequentiallyConsistent(old_ref.reference_, 849228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers new_ref.reference_); 850228602f562f1d130d06e60a98752d99c2d467d6aIan Rogers 851ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers if (success) { 852ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers Runtime::Current()->GetHeap()->WriteBarrierField(this, field_offset, new_value); 853ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 854ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return success; 8552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 8562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 857d8434439dc64add41cdfa69ddf96b960af9050deHans Boehmtemplate<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags> 858d8434439dc64add41cdfa69ddf96b960af9050deHans Boehminline bool Object::CasFieldStrongSequentiallyConsistentObject(MemberOffset field_offset, 859d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm Object* old_value, Object* new_value) { 860d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kCheckTransaction) { 861d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 862d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 863d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kVerifyFlags & kVerifyThis) { 864d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm VerifyObject(this); 865d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 866d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kVerifyFlags & kVerifyWrites) { 867d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm VerifyObject(new_value); 868d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 869d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kVerifyFlags & kVerifyReads) { 870d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm VerifyObject(old_value); 871d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 872d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (kTransactionActive) { 873d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm Runtime::Current()->RecordWriteFieldReference(this, field_offset, old_value, true); 874d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 875d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm HeapReference<Object> old_ref(HeapReference<Object>::FromMirrorPtr(old_value)); 876d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm HeapReference<Object> new_ref(HeapReference<Object>::FromMirrorPtr(new_value)); 877d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); 878d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm Atomic<uint32_t>* atomic_addr = reinterpret_cast<Atomic<uint32_t>*>(raw_addr); 879d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm 880d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm bool success = atomic_addr->CompareExchangeStrongSequentiallyConsistent(old_ref.reference_, 881d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm new_ref.reference_); 882d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm 883d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm if (success) { 884d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm Runtime::Current()->GetHeap()->WriteBarrierField(this, field_offset, new_value); 885d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm } 886d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm return success; 887d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm} 888d8434439dc64add41cdfa69ddf96b960af9050deHans Boehm 889407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartiertemplate<bool kVisitClass, bool kIsStatic, typename Visitor> 890407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartierinline void Object::VisitFieldsReferences(uint32_t ref_offsets, const Visitor& visitor) { 891faff0f05fef90577c9744505555675185832aacdMingyao Yang if (!kIsStatic && LIKELY(ref_offsets != CLASS_WALK_SUPER)) { 892407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier if (!kVisitClass) { 893faff0f05fef90577c9744505555675185832aacdMingyao Yang // Mask out the class from the reference offsets. 894407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier ref_offsets ^= kWordHighBitMask; 895407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier } 896407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier DCHECK_EQ(ClassOffset().Uint32Value(), 0U); 897407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier // Found a reference offset bitmap. Visit the specified offsets. 898407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier while (ref_offsets != 0) { 899407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier size_t right_shift = CLZ(ref_offsets); 900407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier MemberOffset field_offset = CLASS_OFFSET_FROM_CLZ(right_shift); 901407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier visitor(this, field_offset, kIsStatic); 902407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier ref_offsets &= ~(CLASS_HIGH_BIT >> right_shift); 903407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier } 904407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier } else { 905faff0f05fef90577c9744505555675185832aacdMingyao Yang // There is no reference offset bitmap. In the non-static case, walk up the class 906407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier // inheritance hierarchy and find reference offsets the hard way. In the static case, just 907407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier // consider this class. 908407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier for (mirror::Class* klass = kIsStatic ? AsClass() : GetClass(); klass != nullptr; 909407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier klass = kIsStatic ? nullptr : klass->GetSuperClass()) { 910407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier size_t num_reference_fields = 911407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier kIsStatic ? klass->NumReferenceStaticFields() : klass->NumReferenceInstanceFields(); 912407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier for (size_t i = 0; i < num_reference_fields; ++i) { 913b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers mirror::ArtField* field = kIsStatic ? klass->GetStaticField(i) : klass->GetInstanceField(i); 914407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier MemberOffset field_offset = field->GetOffset(); 915407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier // TODO: Do a simpler check? 91652e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier if (kVisitClass || field_offset.Uint32Value() != ClassOffset().Uint32Value()) { 91752e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier visitor(this, field_offset, kIsStatic); 918407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier } 919407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier } 920407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier } 921407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier } 922407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier} 923407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier 924407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartiertemplate<bool kVisitClass, typename Visitor> 925407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartierinline void Object::VisitInstanceFieldsReferences(mirror::Class* klass, const Visitor& visitor) { 926407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier VisitFieldsReferences<kVisitClass, false>( 927407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier klass->GetReferenceInstanceOffsets<kVerifyNone>(), visitor); 928407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier} 929407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier 930407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartiertemplate<bool kVisitClass, typename Visitor> 931407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartierinline void Object::VisitStaticFieldsReferences(mirror::Class* klass, const Visitor& visitor) { 93298d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang DCHECK(!klass->IsTemp()); 933faff0f05fef90577c9744505555675185832aacdMingyao Yang klass->VisitFieldsReferences<kVisitClass, true>(0, visitor); 934407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier} 935407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier 936407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartiertemplate <const bool kVisitClass, VerifyObjectFlags kVerifyFlags, typename Visitor, 937407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier typename JavaLangRefVisitor> 938407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartierinline void Object::VisitReferences(const Visitor& visitor, 939407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier const JavaLangRefVisitor& ref_visitor) { 940407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier mirror::Class* klass = GetClass<kVerifyFlags>(); 94152e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier if (klass == Class::GetJavaLangClass()) { 94252e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier AsClass<kVerifyNone>()->VisitReferences<kVisitClass>(klass, visitor); 94352e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier } else if (klass->IsArrayClass()) { 94452e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier if (klass->IsObjectArrayClass<kVerifyNone>()) { 94552e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier AsObjectArray<mirror::Object, kVerifyNone>()->VisitReferences<kVisitClass>(visitor); 94652e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier } else if (kVisitClass) { 94752e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier visitor(this, ClassOffset(), false); 948407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier } 949407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier } else { 95052e4b43d62896b56f8c2bd041e528472bb4a0d8dMathieu Chartier DCHECK(!klass->IsVariableSize()); 951580a8dfda74e7999f6b3e28e239ae8461a39dfcbMathieu Chartier VisitInstanceFieldsReferences<kVisitClass>(klass, visitor); 9524ee7a665e7f9cd2c5ace2d6304e33f64067b209fFred Shih if (UNLIKELY(klass->IsTypeOfReferenceClass<kVerifyNone>())) { 953407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier ref_visitor(klass, AsReference()); 954407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier } 955407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier } 956407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier} 957407f702da4f867c074fc3c8c688b8f8c32279effMathieu Chartier 9582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 9592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace art 9602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 961fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_MIRROR_OBJECT_INL_H_ 962