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