blob: 4ce3b100c0a3b68c1ac616c6f4f498ed877fd87d [file] [log] [blame]
Alex Lightd6251582016-10-31 11:12:30 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_RUNTIME_MIRROR_CLASS_EXT_H_
18#define ART_RUNTIME_MIRROR_CLASS_EXT_H_
19
Alex Lighta01de592016-11-15 10:43:06 -080020#include "array.h"
Alex Light4f2e9572017-03-16 13:13:31 -070021#include "class.h"
Alex Lighta01de592016-11-15 10:43:06 -080022#include "dex_cache.h"
Alex Lightd6251582016-10-31 11:12:30 -070023#include "object.h"
Alex Lighta01de592016-11-15 10:43:06 -080024#include "object_array.h"
Alex Lightd6251582016-10-31 11:12:30 -070025#include "string.h"
26
27namespace art {
28
29struct ClassExtOffsets;
30
31namespace mirror {
32
33// C++ mirror of dalvik.system.ClassExt
34class MANAGED ClassExt : public Object {
35 public:
Alex Light8f187c32021-04-20 14:29:00 -070036 MIRROR_CLASS("Ldalvik/system/ClassExt;");
37
Alex Light4f2e9572017-03-16 13:13:31 -070038 static uint32_t ClassSize(PointerSize pointer_size);
Alex Lightd6251582016-10-31 11:12:30 -070039
40 // Size of an instance of dalvik.system.ClassExt.
41 static constexpr uint32_t InstanceSize() {
42 return sizeof(ClassExt);
43 }
44
Nicolas Geoffray4dc65892021-07-05 17:43:35 +010045 void SetErroneousStateError(ObjPtr<Throwable> obj) REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightd6251582016-10-31 11:12:30 -070046
Nicolas Geoffray4dc65892021-07-05 17:43:35 +010047 ObjPtr<Throwable> GetErroneousStateError() REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightd6251582016-10-31 11:12:30 -070048
Vladimir Markobb206de2019-03-28 10:30:32 +000049 ObjPtr<ObjectArray<DexCache>> GetObsoleteDexCaches() REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighta01de592016-11-15 10:43:06 -080050
Alex Light4f2e9572017-03-16 13:13:31 -070051 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
52 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Alex Lightbc19b752019-12-02 18:54:13 +000053 bool EnsureInstanceJFieldIDsArrayPresent(size_t count)
Alex Light79d6c802019-06-27 15:50:11 +000054 REQUIRES_SHARED(Locks::mutator_lock_);
55
56 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
57 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Alex Lightbc19b752019-12-02 18:54:13 +000058 ObjPtr<PointerArray> GetInstanceJFieldIDsPointerArray() REQUIRES_SHARED(Locks::mutator_lock_);
59 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
60 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
61 ObjPtr<Object> GetInstanceJFieldIDs() REQUIRES_SHARED(Locks::mutator_lock_);
62 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
63 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
64 bool HasInstanceFieldPointerIdMarker() REQUIRES_SHARED(Locks::mutator_lock_);
Alex Light79d6c802019-06-27 15:50:11 +000065
66 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
67 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Alex Lightbc19b752019-12-02 18:54:13 +000068 bool EnsureStaticJFieldIDsArrayPresent(size_t count)
Alex Light79d6c802019-06-27 15:50:11 +000069 REQUIRES_SHARED(Locks::mutator_lock_);
70
71 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
72 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Alex Lightbc19b752019-12-02 18:54:13 +000073 ObjPtr<PointerArray> GetStaticJFieldIDsPointerArray() REQUIRES_SHARED(Locks::mutator_lock_);
74 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
75 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
76 ObjPtr<Object> GetStaticJFieldIDs() REQUIRES_SHARED(Locks::mutator_lock_);
77 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
78 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
79 bool HasStaticFieldPointerIdMarker() REQUIRES_SHARED(Locks::mutator_lock_);
Alex Light79d6c802019-06-27 15:50:11 +000080
81 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
82 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Alex Lightbc19b752019-12-02 18:54:13 +000083 bool EnsureJMethodIDsArrayPresent(size_t count)
Alex Light79d6c802019-06-27 15:50:11 +000084 REQUIRES_SHARED(Locks::mutator_lock_);
85
86 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
87 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Alex Lightbc19b752019-12-02 18:54:13 +000088 ObjPtr<Object> GetJMethodIDs() REQUIRES_SHARED(Locks::mutator_lock_);
89 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
90 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
91 ObjPtr<PointerArray> GetJMethodIDsPointerArray() REQUIRES_SHARED(Locks::mutator_lock_);
92 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
93 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
94 bool HasMethodPointerIdMarker() REQUIRES_SHARED(Locks::mutator_lock_);
Alex Light79d6c802019-06-27 15:50:11 +000095
96 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
97 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Vladimir Markobb206de2019-03-28 10:30:32 +000098 ObjPtr<PointerArray> GetObsoleteMethods() REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighta01de592016-11-15 10:43:06 -080099
Vladimir Markobb206de2019-03-28 10:30:32 +0000100 ObjPtr<Object> GetOriginalDexFile() REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighta7e38d82017-01-19 14:57:28 -0800101
Alex Lightbc19b752019-12-02 18:54:13 +0000102 // Used to manually initialize the ext-ids arrays for the ClassExt associated
103 // with the Class<ClassExt>. This simplifies the id allocation path.
104 void SetIdsArraysForClassExtExtData(ObjPtr<Object> marker) REQUIRES_SHARED(Locks::mutator_lock_);
105
Alex Light2f814aa2017-03-24 15:21:34 +0000106 void SetOriginalDexFile(ObjPtr<Object> bytes) REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lighta7e38d82017-01-19 14:57:28 -0800107
David Brazdil1a658632018-12-01 17:54:26 +0000108 uint16_t GetPreRedefineClassDefIndex() REQUIRES_SHARED(Locks::mutator_lock_) {
109 return static_cast<uint16_t>(
110 GetField32(OFFSET_OF_OBJECT_MEMBER(ClassExt, pre_redefine_class_def_index_)));
111 }
112
113 void SetPreRedefineClassDefIndex(uint16_t index) REQUIRES_SHARED(Locks::mutator_lock_);
114
115 const DexFile* GetPreRedefineDexFile() REQUIRES_SHARED(Locks::mutator_lock_) {
116 return reinterpret_cast<const DexFile*>(static_cast<uintptr_t>(
117 GetField64(OFFSET_OF_OBJECT_MEMBER(ClassExt, pre_redefine_dex_file_ptr_))));
118 }
119
120 void SetPreRedefineDexFile(const DexFile* dex_file) REQUIRES_SHARED(Locks::mutator_lock_);
121
Alex Lighta01de592016-11-15 10:43:06 -0800122 void SetObsoleteArrays(ObjPtr<PointerArray> methods, ObjPtr<ObjectArray<DexCache>> dex_caches)
123 REQUIRES_SHARED(Locks::mutator_lock_);
124
125 // Extend the obsolete arrays by the given amount.
Vladimir Marko3068d582019-05-28 16:39:29 +0100126 static bool ExtendObsoleteArrays(Handle<ClassExt> h_this, Thread* self, uint32_t increase)
Alex Lighta01de592016-11-15 10:43:06 -0800127 REQUIRES_SHARED(Locks::mutator_lock_);
128
Alex Light4f2e9572017-03-16 13:13:31 -0700129 template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier, class Visitor>
130 inline void VisitNativeRoots(Visitor& visitor, PointerSize pointer_size)
131 REQUIRES_SHARED(Locks::mutator_lock_);
132
Nicolas Geoffray4ac0e152019-09-18 06:14:50 +0000133 template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier, class Visitor>
134 inline void VisitMethods(Visitor visitor, PointerSize pointer_size)
135 REQUIRES_SHARED(Locks::mutator_lock_);
136
Vladimir Markobb206de2019-03-28 10:30:32 +0000137 static ObjPtr<ClassExt> Alloc(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
Alex Lightd6251582016-10-31 11:12:30 -0700138
Nicolas Geoffray4ac0e152019-09-18 06:14:50 +0000139 // TODO Save the obsolete class, if we have one.
140 // TODO We need this so jit-cleanup can work. the obsolete class might get cleaned up early
141 // otherwise. We should remove the need for this.
142 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
143 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
144 ObjPtr<Class> GetObsoleteClass() REQUIRES_SHARED(Locks::mutator_lock_);
145 void SetObsoleteClass(ObjPtr<Class> classes) REQUIRES_SHARED(Locks::mutator_lock_);
146
147 template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier, typename Visitor>
148 inline void VisitJFieldIDs(Visitor v) REQUIRES_SHARED(Locks::mutator_lock_);
149
150 template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier, typename Visitor>
151 inline void VisitJMethodIDs(Visitor v) REQUIRES_SHARED(Locks::mutator_lock_);
152
Alex Lightd6251582016-10-31 11:12:30 -0700153 private:
Alex Light79d6c802019-06-27 15:50:11 +0000154 template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
155 ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Alex Lightbc19b752019-12-02 18:54:13 +0000156 bool EnsureJniIdsArrayPresent(MemberOffset off, size_t count)
Alex Light79d6c802019-06-27 15:50:11 +0000157 REQUIRES_SHARED(Locks::mutator_lock_);
158
Nicolas Geoffray4dc65892021-07-05 17:43:35 +0100159 // The saved error for this class being erroneous.
160 HeapReference<Throwable> erroneous_state_error_;
161
Alex Lightd6251582016-10-31 11:12:30 -0700162 // Field order required by test "ValidateFieldOrderOfJavaCppUnionClasses".
Alex Light79d6c802019-06-27 15:50:11 +0000163 // An array containing the jfieldIDs assigned to each field in the corresponding position in the
164 // classes ifields_ array or '0' if no id has been assigned to that field yet.
165 HeapReference<PointerArray> instance_jfield_ids_;
166
167 // An array containing the jmethodIDs assigned to each method in the corresponding position in
168 // the classes methods_ array or '0' if no id has been assigned to that method yet.
169 HeapReference<PointerArray> jmethod_ids_;
170
Nicolas Geoffray4ac0e152019-09-18 06:14:50 +0000171 // If set this is the Class object that was being used before a structural redefinition occurred.
172 HeapReference<Class> obsolete_class_;
173
Alex Lighta01de592016-11-15 10:43:06 -0800174 HeapReference<ObjectArray<DexCache>> obsolete_dex_caches_;
175
176 HeapReference<PointerArray> obsolete_methods_;
177
Alex Light2f814aa2017-03-24 15:21:34 +0000178 HeapReference<Object> original_dex_file_;
Alex Lighta01de592016-11-15 10:43:06 -0800179
Alex Light79d6c802019-06-27 15:50:11 +0000180 // An array containing the jfieldIDs assigned to each field in the corresponding position in the
181 // classes sfields_ array or '0' if no id has been assigned to that field yet.
182 HeapReference<PointerArray> static_jfield_ids_;
183
David Brazdil1a658632018-12-01 17:54:26 +0000184 // Native pointer to DexFile and ClassDef index of this class before it was JVMTI-redefined.
Nicolas Geoffray5a2301d2019-09-18 06:11:22 +0000185 int64_t pre_redefine_dex_file_ptr_;
Nicolas Geoffray4ac0e152019-09-18 06:14:50 +0000186 int32_t pre_redefine_class_def_index_;
David Brazdil1a658632018-12-01 17:54:26 +0000187
Alex Lightd6251582016-10-31 11:12:30 -0700188 friend struct art::ClassExtOffsets; // for verifying offset information
189 DISALLOW_IMPLICIT_CONSTRUCTORS(ClassExt);
190};
191
192} // namespace mirror
193} // namespace art
194
195#endif // ART_RUNTIME_MIRROR_CLASS_EXT_H_