array.h revision d2fe10a3a34af171bf1631219cd2d6ff6b7778b5
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_ARRAY_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_MIRROR_ARRAY_H_ 192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "object.h" 2183c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier#include "object_callbacks.h" 22cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier#include "gc/heap.h" 23d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include "runtime.h" 24abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz#include "thread.h" 252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace art { 272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass MANAGED Array : public Object { 302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers public: 31590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // A convenience for code that doesn't know the component size, and doesn't want to have to work 32590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // it out itself. 33cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier template <bool kIsInstrumented> 34cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier static Array* Alloc(Thread* self, Class* array_class, int32_t component_count, 35cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier gc::AllocatorType allocator_type) 36cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 37cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier 38cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier template <bool kIsInstrumented> 39cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier static Array* Alloc(Thread* self, Class* array_class, int32_t component_count, 40cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier size_t component_size, gc::AllocatorType allocator_type) 41cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 42cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier 43cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier template <bool kIsInstrumented> 442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static Array* Alloc(Thread* self, Class* array_class, int32_t component_count) 452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 47cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier template <bool kIsInstrumented> 482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static Array* Alloc(Thread* self, Class* array_class, int32_t component_count, 49cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier size_t component_size) 50cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 525bb99037bef70784ae4630c2e4b81688d2a18621Mathieu Chartier static Array* CreateMultiArray(Thread* self, const SirtRef<Class>& element_class, 535bb99037bef70784ae4630c2e4b81688d2a18621Mathieu Chartier const SirtRef<IntArray>& dimensions) 542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 56ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers size_t SizeOf() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 58ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers int32_t GetLength() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Array, length_), false); 602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 62ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers void SetLength(int32_t length) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK_GE(length, 0); 64d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // We use non transactional version since we can't undo this write. We also disable checking 65d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // since it would fail during a transaction. 66d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz SetField32<false, false>(OFFSET_OF_OBJECT_MEMBER(Array, length_), length, false, false); 672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static MemberOffset LengthOffset() { 702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return OFFSET_OF_OBJECT_MEMBER(Array, length_); 712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static MemberOffset DataOffset(size_t component_size) { 742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (component_size != sizeof(int64_t)) { 752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return OFFSET_OF_OBJECT_MEMBER(Array, first_element_); 762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else { 772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Align longs and doubles. 782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return MemberOffset(OFFSETOF_MEMBER(Array, first_element_) + 4); 792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 82ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers void* GetRawData(size_t component_size, int32_t index) 83ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 84ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers intptr_t data = reinterpret_cast<intptr_t>(this) + DataOffset(component_size).Int32Value() + 85ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers + (index * component_size); 862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return reinterpret_cast<void*>(data); 872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 89ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const void* GetRawData(size_t component_size, int32_t index) const { 90ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers intptr_t data = reinterpret_cast<intptr_t>(this) + DataOffset(component_size).Int32Value() + 91ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers + (index * component_size); 92ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return reinterpret_cast<void*>(data); 932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 95abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz // Returns true if the index is valid. If not, throws an ArrayIndexOutOfBoundsException and 96abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz // returns false. 97ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers bool CheckIsValidIndex(int32_t index) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 9866d1aeefed5b7af9e0682b2f298390b86b18e657Sebastien Hertz if (UNLIKELY(static_cast<uint32_t>(index) >= static_cast<uint32_t>(GetLength()))) { 999897be996580db9de86f880f9ad9d36c66057a52Sebastien Hertz ThrowArrayIndexOutOfBoundsException(index); 1009897be996580db9de86f880f9ad9d36c66057a52Sebastien Hertz return false; 1012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return true; 1032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers protected: 106ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers void ThrowArrayStoreException(Object* object) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers private: 109ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers void ThrowArrayIndexOutOfBoundsException(int32_t index) 110abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 111abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz 1122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // The number of array elements. 1132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers int32_t length_; 1142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Marker for the data (used by generated code) 1152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t first_element_[0]; 1162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DISALLOW_IMPLICIT_CONSTRUCTORS(Array); 1182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}; 1192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogerstemplate<class T> 1212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass MANAGED PrimitiveArray : public Array { 1222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers public: 1232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers typedef T ElementType; 1242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static PrimitiveArray<T>* Alloc(Thread* self, size_t length) 1262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 128ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers const T* GetData() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 129ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return reinterpret_cast<const T*>(GetRawData(sizeof(T), 0)); 1302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 132ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers T* GetData() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 133ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return reinterpret_cast<T*>(GetRawData(sizeof(T), 0)); 1342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 136ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers T Get(int32_t i) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 137abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz if (UNLIKELY(!CheckIsValidIndex(i))) { 138abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz DCHECK(Thread::Current()->IsExceptionPending()); 1392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return T(0); 1402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 141abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz return GetWithoutChecks(i); 142abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz } 143abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz 144ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers T GetWithoutChecks(int32_t i) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 145abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz DCHECK(CheckIsValidIndex(i)); 1462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetData()[i]; 1472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void Set(int32_t i, T value) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 150d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (Runtime::Current()->IsActiveTransaction()) { 151d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz Set<true>(i, value); 152d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } else { 153d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz Set<false>(i, value); 154d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 155d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 156d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz 157d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // TODO fix thread safety analysis broken by the use of template. This should be 158d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // SHARED_LOCKS_REQUIRED(Locks::mutator_lock_). 159d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz template<bool kTransactionActive, bool kCheckTransaction = true> 160d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz void Set(int32_t i, T value) NO_THREAD_SAFETY_ANALYSIS { 161abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz if (LIKELY(CheckIsValidIndex(i))) { 162d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz SetWithoutChecks<kTransactionActive, kCheckTransaction>(i, value); 163abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz } else { 164abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz DCHECK(Thread::Current()->IsExceptionPending()); 1652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 168d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // TODO fix thread safety analysis broken by the use of template. This should be 169d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // SHARED_LOCKS_REQUIRED(Locks::mutator_lock_). 170d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz template<bool kTransactionActive, bool kCheckTransaction = true> 171d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz void SetWithoutChecks(int32_t i, T value) NO_THREAD_SAFETY_ANALYSIS { 172d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kCheckTransaction) { 173d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DCHECK_EQ(kTransactionActive, Runtime::Current()->IsActiveTransaction()); 174d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 175d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (kTransactionActive) { 176d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz Runtime::Current()->RecordWriteArray(this, i, GetWithoutChecks(i)); 177d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 178abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz DCHECK(CheckIsValidIndex(i)); 179abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz GetData()[i] = value; 180abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz } 181abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz 182ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers /* 183ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Works like memmove(), except we guarantee not to allow tearing of array values (ie using 184ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * smaller than element size copies). Arguments are assumed to be within the bounds of the array 185ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * and the arrays non-null. 186ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers */ 187ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers void Memmove(int32_t dst_pos, PrimitiveArray<T>* src, int32_t src_pos, int32_t count) 188ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 189ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 190ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers /* 191ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Works like memcpy(), except we guarantee not to allow tearing of array values (ie using 192ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * smaller than element size copies). Arguments are assumed to be within the bounds of the array 193ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * and the arrays non-null. 194ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers */ 195ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers void Memcpy(int32_t dst_pos, PrimitiveArray<T>* src, int32_t src_pos, int32_t count) 196ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 197ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 1982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static void SetArrayClass(Class* array_class) { 1992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK(array_class_ == NULL); 2002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK(array_class != NULL); 2012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers array_class_ = array_class; 2022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static void ResetArrayClass() { 2052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK(array_class_ != NULL); 2062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers array_class_ = NULL; 2072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 20983c8ee000d525017ead8753fce6bc1020249b96aMathieu Chartier static void VisitRoots(RootCallback* callback, void* arg) 210c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 211c528dba35b5faece51ca658fc008b688f8b690adMathieu Chartier 2122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers private: 2132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static Class* array_class_; 2142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DISALLOW_IMPLICIT_CONSTRUCTORS(PrimitiveArray); 2162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}; 2172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 2192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace art 2202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 221fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_MIRROR_ARRAY_H_ 222