xref: /aosp_15_r20/art/runtime/mirror/class_ext.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_MIRROR_CLASS_EXT_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_MIRROR_CLASS_EXT_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include "array.h"
21*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
22*795d594fSAndroid Build Coastguard Worker #include "class.h"
23*795d594fSAndroid Build Coastguard Worker #include "dex_cache.h"
24*795d594fSAndroid Build Coastguard Worker #include "object.h"
25*795d594fSAndroid Build Coastguard Worker #include "object_array.h"
26*795d594fSAndroid Build Coastguard Worker #include "string.h"
27*795d594fSAndroid Build Coastguard Worker 
28*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
29*795d594fSAndroid Build Coastguard Worker 
30*795d594fSAndroid Build Coastguard Worker struct ClassExtOffsets;
31*795d594fSAndroid Build Coastguard Worker class DexCacheVisitor;
32*795d594fSAndroid Build Coastguard Worker 
33*795d594fSAndroid Build Coastguard Worker namespace mirror {
34*795d594fSAndroid Build Coastguard Worker 
35*795d594fSAndroid Build Coastguard Worker // C++ mirror of dalvik.system.ClassExt
36*795d594fSAndroid Build Coastguard Worker class MANAGED ClassExt : public Object {
37*795d594fSAndroid Build Coastguard Worker  public:
38*795d594fSAndroid Build Coastguard Worker   MIRROR_CLASS("Ldalvik/system/ClassExt;");
39*795d594fSAndroid Build Coastguard Worker 
40*795d594fSAndroid Build Coastguard Worker   static uint32_t ClassSize(PointerSize pointer_size);
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker   // Size of an instance of dalvik.system.ClassExt.
InstanceSize()43*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t InstanceSize() {
44*795d594fSAndroid Build Coastguard Worker     return sizeof(ClassExt);
45*795d594fSAndroid Build Coastguard Worker   }
46*795d594fSAndroid Build Coastguard Worker 
47*795d594fSAndroid Build Coastguard Worker   void SetErroneousStateError(ObjPtr<Throwable> obj) REQUIRES_SHARED(Locks::mutator_lock_);
48*795d594fSAndroid Build Coastguard Worker 
49*795d594fSAndroid Build Coastguard Worker   ObjPtr<Throwable> GetErroneousStateError() REQUIRES_SHARED(Locks::mutator_lock_);
50*795d594fSAndroid Build Coastguard Worker 
51*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
52*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
53*795d594fSAndroid Build Coastguard Worker   ObjPtr<ObjectArray<DexCache>> GetObsoleteDexCaches() REQUIRES_SHARED(Locks::mutator_lock_);
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
56*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
57*795d594fSAndroid Build Coastguard Worker   bool EnsureInstanceJFieldIDsArrayPresent(size_t count)
58*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
59*795d594fSAndroid Build Coastguard Worker 
60*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
61*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
62*795d594fSAndroid Build Coastguard Worker   ObjPtr<PointerArray> GetInstanceJFieldIDsPointerArray() REQUIRES_SHARED(Locks::mutator_lock_);
63*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
64*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
65*795d594fSAndroid Build Coastguard Worker   ObjPtr<Object> GetInstanceJFieldIDs() REQUIRES_SHARED(Locks::mutator_lock_);
66*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
67*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
68*795d594fSAndroid Build Coastguard Worker   bool HasInstanceFieldPointerIdMarker() REQUIRES_SHARED(Locks::mutator_lock_);
69*795d594fSAndroid Build Coastguard Worker 
70*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
71*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
72*795d594fSAndroid Build Coastguard Worker   bool EnsureStaticJFieldIDsArrayPresent(size_t count)
73*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
74*795d594fSAndroid Build Coastguard Worker 
75*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
76*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
77*795d594fSAndroid Build Coastguard Worker   ObjPtr<PointerArray> GetStaticJFieldIDsPointerArray() REQUIRES_SHARED(Locks::mutator_lock_);
78*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
79*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
80*795d594fSAndroid Build Coastguard Worker   ObjPtr<Object> GetStaticJFieldIDs() REQUIRES_SHARED(Locks::mutator_lock_);
81*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
82*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
83*795d594fSAndroid Build Coastguard Worker   bool HasStaticFieldPointerIdMarker() REQUIRES_SHARED(Locks::mutator_lock_);
84*795d594fSAndroid Build Coastguard Worker 
85*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
86*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
87*795d594fSAndroid Build Coastguard Worker   bool EnsureJMethodIDsArrayPresent(size_t count)
88*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
91*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
92*795d594fSAndroid Build Coastguard Worker   ObjPtr<Object> GetJMethodIDs() REQUIRES_SHARED(Locks::mutator_lock_);
93*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
94*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
95*795d594fSAndroid Build Coastguard Worker   ObjPtr<PointerArray> GetJMethodIDsPointerArray() REQUIRES_SHARED(Locks::mutator_lock_);
96*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
97*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
98*795d594fSAndroid Build Coastguard Worker   bool HasMethodPointerIdMarker() REQUIRES_SHARED(Locks::mutator_lock_);
99*795d594fSAndroid Build Coastguard Worker 
100*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
101*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
102*795d594fSAndroid Build Coastguard Worker   ObjPtr<PointerArray> GetObsoleteMethods() REQUIRES_SHARED(Locks::mutator_lock_);
103*795d594fSAndroid Build Coastguard Worker 
104*795d594fSAndroid Build Coastguard Worker   ObjPtr<Object> GetOriginalDexFile() REQUIRES_SHARED(Locks::mutator_lock_);
105*795d594fSAndroid Build Coastguard Worker 
106*795d594fSAndroid Build Coastguard Worker   // Used to manually initialize the ext-ids arrays for the ClassExt associated
107*795d594fSAndroid Build Coastguard Worker   // with the Class<ClassExt>. This simplifies the id allocation path.
108*795d594fSAndroid Build Coastguard Worker   EXPORT void SetIdsArraysForClassExtExtData(ObjPtr<Object> marker)
109*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
110*795d594fSAndroid Build Coastguard Worker 
111*795d594fSAndroid Build Coastguard Worker   EXPORT void SetOriginalDexFile(ObjPtr<Object> bytes) REQUIRES_SHARED(Locks::mutator_lock_);
112*795d594fSAndroid Build Coastguard Worker 
GetPreRedefineClassDefIndex()113*795d594fSAndroid Build Coastguard Worker   uint16_t GetPreRedefineClassDefIndex() REQUIRES_SHARED(Locks::mutator_lock_) {
114*795d594fSAndroid Build Coastguard Worker     return static_cast<uint16_t>(
115*795d594fSAndroid Build Coastguard Worker         GetField32(OFFSET_OF_OBJECT_MEMBER(ClassExt, pre_redefine_class_def_index_)));
116*795d594fSAndroid Build Coastguard Worker   }
117*795d594fSAndroid Build Coastguard Worker 
118*795d594fSAndroid Build Coastguard Worker   EXPORT void SetPreRedefineClassDefIndex(uint16_t index) REQUIRES_SHARED(Locks::mutator_lock_);
119*795d594fSAndroid Build Coastguard Worker 
GetPreRedefineDexFile()120*795d594fSAndroid Build Coastguard Worker   const DexFile* GetPreRedefineDexFile() REQUIRES_SHARED(Locks::mutator_lock_) {
121*795d594fSAndroid Build Coastguard Worker     return reinterpret_cast<const DexFile*>(static_cast<uintptr_t>(
122*795d594fSAndroid Build Coastguard Worker         GetField64(OFFSET_OF_OBJECT_MEMBER(ClassExt, pre_redefine_dex_file_ptr_))));
123*795d594fSAndroid Build Coastguard Worker   }
124*795d594fSAndroid Build Coastguard Worker 
125*795d594fSAndroid Build Coastguard Worker   EXPORT void SetPreRedefineDexFile(const DexFile* dex_file) REQUIRES_SHARED(Locks::mutator_lock_);
126*795d594fSAndroid Build Coastguard Worker 
127*795d594fSAndroid Build Coastguard Worker   EXPORT void SetObsoleteArrays(ObjPtr<PointerArray> methods,
128*795d594fSAndroid Build Coastguard Worker                                 ObjPtr<ObjectArray<DexCache>> dex_caches)
129*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
130*795d594fSAndroid Build Coastguard Worker 
131*795d594fSAndroid Build Coastguard Worker   // Extend the obsolete arrays by the given amount.
132*795d594fSAndroid Build Coastguard Worker   EXPORT static bool ExtendObsoleteArrays(Handle<ClassExt> h_this, Thread* self, uint32_t increase)
133*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
134*795d594fSAndroid Build Coastguard Worker 
135*795d594fSAndroid Build Coastguard Worker   template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
136*795d594fSAndroid Build Coastguard Worker            bool kVisitProxyMethod = true,
137*795d594fSAndroid Build Coastguard Worker            class Visitor>
138*795d594fSAndroid Build Coastguard Worker   inline void VisitNativeRoots(Visitor& visitor, PointerSize pointer_size)
139*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
140*795d594fSAndroid Build Coastguard Worker 
141*795d594fSAndroid Build Coastguard Worker   // NO_THREAD_SAFETY_ANALYSIS for dex_lock and heap_bitmap_lock_ as both are at
142*795d594fSAndroid Build Coastguard Worker   // higher lock-level than class-table's lock, which is already acquired and
143*795d594fSAndroid Build Coastguard Worker   // is at lower (kClassLoaderClassesLock) level.
144*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
145*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
146*795d594fSAndroid Build Coastguard Worker   inline void VisitDexCaches(DexCacheVisitor& visitor)
147*795d594fSAndroid Build Coastguard Worker       NO_THREAD_SAFETY_ANALYSIS
148*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
149*795d594fSAndroid Build Coastguard Worker 
150*795d594fSAndroid Build Coastguard Worker   template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier, class Visitor>
151*795d594fSAndroid Build Coastguard Worker   inline void VisitMethods(Visitor visitor, PointerSize pointer_size)
152*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
153*795d594fSAndroid Build Coastguard Worker 
154*795d594fSAndroid Build Coastguard Worker   static ObjPtr<ClassExt> Alloc(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
155*795d594fSAndroid Build Coastguard Worker 
156*795d594fSAndroid Build Coastguard Worker   // TODO Save the obsolete class, if we have one.
157*795d594fSAndroid Build Coastguard Worker   // TODO We need this so jit-cleanup can work. the obsolete class might get cleaned up early
158*795d594fSAndroid Build Coastguard Worker   // otherwise. We should remove the need for this.
159*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
160*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
161*795d594fSAndroid Build Coastguard Worker   ObjPtr<Class> GetObsoleteClass() REQUIRES_SHARED(Locks::mutator_lock_);
162*795d594fSAndroid Build Coastguard Worker   EXPORT void SetObsoleteClass(ObjPtr<Class> classes) REQUIRES_SHARED(Locks::mutator_lock_);
163*795d594fSAndroid Build Coastguard Worker 
164*795d594fSAndroid Build Coastguard Worker   template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier, typename Visitor>
165*795d594fSAndroid Build Coastguard Worker   inline void VisitJFieldIDs(Visitor v) REQUIRES_SHARED(Locks::mutator_lock_);
166*795d594fSAndroid Build Coastguard Worker 
167*795d594fSAndroid Build Coastguard Worker   template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier, typename Visitor>
168*795d594fSAndroid Build Coastguard Worker   inline void VisitJMethodIDs(Visitor v) REQUIRES_SHARED(Locks::mutator_lock_);
169*795d594fSAndroid Build Coastguard Worker 
170*795d594fSAndroid Build Coastguard Worker  private:
171*795d594fSAndroid Build Coastguard Worker   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
172*795d594fSAndroid Build Coastguard Worker            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
173*795d594fSAndroid Build Coastguard Worker   bool EnsureJniIdsArrayPresent(MemberOffset off, size_t count)
174*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
175*795d594fSAndroid Build Coastguard Worker 
176*795d594fSAndroid Build Coastguard Worker   // Backing store of user-defined values pertaining to a class.
177*795d594fSAndroid Build Coastguard Worker   // Maintained by the ClassValue class.
178*795d594fSAndroid Build Coastguard Worker   HeapReference<Object> class_value_map_;
179*795d594fSAndroid Build Coastguard Worker 
180*795d594fSAndroid Build Coastguard Worker   // The saved error for this class being erroneous.
181*795d594fSAndroid Build Coastguard Worker   HeapReference<Throwable> erroneous_state_error_;
182*795d594fSAndroid Build Coastguard Worker 
183*795d594fSAndroid Build Coastguard Worker   // Field order required by test "ValidateFieldOrderOfJavaCppUnionClasses".
184*795d594fSAndroid Build Coastguard Worker   // An array containing the jfieldIDs assigned to each field in the corresponding position in the
185*795d594fSAndroid Build Coastguard Worker   // classes ifields_ array or '0' if no id has been assigned to that field yet.
186*795d594fSAndroid Build Coastguard Worker   HeapReference<PointerArray> instance_jfield_ids_;
187*795d594fSAndroid Build Coastguard Worker 
188*795d594fSAndroid Build Coastguard Worker   // An array containing the jmethodIDs assigned to each method in the corresponding position in
189*795d594fSAndroid Build Coastguard Worker   // the classes methods_ array or '0' if no id has been assigned to that method yet.
190*795d594fSAndroid Build Coastguard Worker   HeapReference<PointerArray> jmethod_ids_;
191*795d594fSAndroid Build Coastguard Worker 
192*795d594fSAndroid Build Coastguard Worker   // If set this is the Class object that was being used before a structural redefinition occurred.
193*795d594fSAndroid Build Coastguard Worker   HeapReference<Class> obsolete_class_;
194*795d594fSAndroid Build Coastguard Worker 
195*795d594fSAndroid Build Coastguard Worker   HeapReference<ObjectArray<DexCache>> obsolete_dex_caches_;
196*795d594fSAndroid Build Coastguard Worker 
197*795d594fSAndroid Build Coastguard Worker   HeapReference<PointerArray> obsolete_methods_;
198*795d594fSAndroid Build Coastguard Worker 
199*795d594fSAndroid Build Coastguard Worker   HeapReference<Object> original_dex_file_;
200*795d594fSAndroid Build Coastguard Worker 
201*795d594fSAndroid Build Coastguard Worker   // An array containing the jfieldIDs assigned to each field in the corresponding position in the
202*795d594fSAndroid Build Coastguard Worker   // classes sfields_ array or '0' if no id has been assigned to that field yet.
203*795d594fSAndroid Build Coastguard Worker   HeapReference<PointerArray> static_jfield_ids_;
204*795d594fSAndroid Build Coastguard Worker 
205*795d594fSAndroid Build Coastguard Worker   int32_t pre_redefine_class_def_index_;
206*795d594fSAndroid Build Coastguard Worker 
207*795d594fSAndroid Build Coastguard Worker   // Native pointer to DexFile and ClassDef index of this class before it was JVMTI-redefined.
208*795d594fSAndroid Build Coastguard Worker   int64_t pre_redefine_dex_file_ptr_;
209*795d594fSAndroid Build Coastguard Worker 
210*795d594fSAndroid Build Coastguard Worker   friend struct art::ClassExtOffsets;  // for verifying offset information
211*795d594fSAndroid Build Coastguard Worker   DISALLOW_IMPLICIT_CONSTRUCTORS(ClassExt);
212*795d594fSAndroid Build Coastguard Worker };
213*795d594fSAndroid Build Coastguard Worker 
214*795d594fSAndroid Build Coastguard Worker }  // namespace mirror
215*795d594fSAndroid Build Coastguard Worker }  // namespace art
216*795d594fSAndroid Build Coastguard Worker 
217*795d594fSAndroid Build Coastguard Worker #endif  // ART_RUNTIME_MIRROR_CLASS_EXT_H_
218