12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 161f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_MIRROR_CLASS_LOADER_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_MIRROR_CLASS_LOADER_H_ 191f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom 207e70b002c4552347ed1af8c002a0e13f08864f20Ian Rogers#include "object.h" 211f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom 221f87008b165d26541d832ff805250afdc89c253dBrian Carlstromnamespace art { 231f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom 242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersstruct ClassLoaderOffsets; 256b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartierclass ClassTable; 262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 29e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartierclass Class; 30e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier 310cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers// C++ mirror of java.lang.ClassLoader 32aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstromclass MANAGED ClassLoader : public Object { 3398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang public: 3498d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang // Size of an instance of java.lang.ClassLoader. 3598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang static constexpr uint32_t InstanceSize() { 3698d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang return sizeof(ClassLoader); 3798d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang } 38951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier 3990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier ClassLoader* GetParent() SHARED_REQUIRES(Locks::mutator_lock_) { 406bcae8fa93684af581d16400f360541d39e5b5e6Mathieu Chartier return GetFieldObject<ClassLoader>(OFFSET_OF_OBJECT_MEMBER(ClassLoader, parent_)); 416bcae8fa93684af581d16400f360541d39e5b5e6Mathieu Chartier } 42951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier 436b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartier ClassTable* GetClassTable() SHARED_REQUIRES(Locks::mutator_lock_) { 446b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartier return reinterpret_cast<ClassTable*>( 456b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartier GetField64(OFFSET_OF_OBJECT_MEMBER(ClassLoader, class_table_))); 466b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartier } 47951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier 486b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartier void SetClassTable(ClassTable* class_table) SHARED_REQUIRES(Locks::mutator_lock_) { 496b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartier SetField64<false>(OFFSET_OF_OBJECT_MEMBER(ClassLoader, class_table_), 506b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartier reinterpret_cast<uint64_t>(class_table)); 516b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartier } 52059ef3ddb2088f926ac452889e0953fdcd646a5eMathieu Chartier 53951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier LinearAlloc* GetAllocator() SHARED_REQUIRES(Locks::mutator_lock_) { 54951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier return reinterpret_cast<LinearAlloc*>( 55951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier GetField64(OFFSET_OF_OBJECT_MEMBER(ClassLoader, allocator_))); 56951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier } 57951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier 58951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier void SetAllocator(LinearAlloc* allocator) SHARED_REQUIRES(Locks::mutator_lock_) { 59951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier SetField64<false>(OFFSET_OF_OBJECT_MEMBER(ClassLoader, allocator_), 60951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier reinterpret_cast<uint64_t>(allocator)); 61951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier } 62951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier 63059ef3ddb2088f926ac452889e0953fdcd646a5eMathieu Chartier private: 64e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier // Visit instance fields of the class loader as well as its associated classes. 65e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier // Null class loader is handled by ClassLinker::VisitClassRoots. 66fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier template <bool kVisitClasses, 67fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, 68fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier ReadBarrierOption kReadBarrierOption = kWithReadBarrier, 69fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier typename Visitor> 70e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier void VisitReferences(mirror::Class* klass, const Visitor& visitor) 71e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) 72e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier REQUIRES(!Locks::classlinker_classes_lock_); 7398d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 741f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom // Field order required by test "ValidateFieldOrderOfJavaCppUnionClasses". 75ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers HeapReference<Object> packages_; 76ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers HeapReference<ClassLoader> parent_; 77ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers HeapReference<Object> proxyCache_; 786b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartier // Native pointer to class table, need to zero this out when image writing. 796b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartier uint32_t padding_ ATTRIBUTE_UNUSED; 80951ec2c93c79c5539cbcc669566f0808d4460338Mathieu Chartier uint64_t allocator_; 816b06953817bdf613b52389c457e2f4ed6cf46f5cMathieu Chartier uint64_t class_table_; 821f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom 832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers friend struct art::ClassLoaderOffsets; // for verifying offset information 84059ef3ddb2088f926ac452889e0953fdcd646a5eMathieu Chartier friend class Object; // For VisitReferences 851f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom DISALLOW_IMPLICIT_CONSTRUCTORS(ClassLoader); 861f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom}; 871f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom 882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 891f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom} // namespace art 901f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom 91fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_MIRROR_CLASS_LOADER_H_ 92