blob: 99f2a1cd0764a732a36dfe4dbb257650aeb8b7a4 [file] [log] [blame]
Mathieu Chartierc7853442015-03-27 14:35:38 -07001/*
2 * Copyright (C) 2011 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_ART_FIELD_H_
18#define ART_RUNTIME_ART_FIELD_H_
19
20#include <jni.h>
21
David Sehr9e734c72018-01-04 17:56:19 -080022#include "dex/dex_file_types.h"
David Sehr8c0961f2018-01-23 16:11:38 -080023#include "dex/modifiers.h"
David Sehr67bf42e2018-02-26 16:43:04 -080024#include "dex/primitive.h"
Mathieu Chartierc7853442015-03-27 14:35:38 -070025#include "gc_root.h"
Mathieu Chartier3398c782016-09-30 10:27:43 -070026#include "obj_ptr.h"
Mathieu Chartierc7853442015-03-27 14:35:38 -070027#include "offsets.h"
Mathieu Chartierc7853442015-03-27 14:35:38 -070028#include "read_barrier_option.h"
29
30namespace art {
31
32class DexFile;
33class ScopedObjectAccessAlreadyRunnable;
34
35namespace mirror {
36class Class;
Andreas Gampe4835d212018-11-21 14:55:10 -080037class ClassLoader;
Mathieu Chartierc7853442015-03-27 14:35:38 -070038class DexCache;
39class Object;
40class String;
41} // namespace mirror
42
Roland Levillainbbc6e7e2018-08-24 16:58:47 +010043class ArtField final {
Mathieu Chartierc7853442015-03-27 14:35:38 -070044 public:
Hiroshi Yamauchi7a62e672016-06-10 17:22:48 -070045 template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Mathieu Chartier3398c782016-09-30 10:27:43 -070046 ObjPtr<mirror::Class> GetDeclaringClass() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070047
Andreas Gampe4835d212018-11-21 14:55:10 -080048 mirror::ClassLoader* GetClassLoader() REQUIRES_SHARED(Locks::mutator_lock_);
49
Mathieu Chartier3398c782016-09-30 10:27:43 -070050 void SetDeclaringClass(ObjPtr<mirror::Class> new_declaring_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070051 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070052
Mathieu Chartier8c19d242017-03-06 12:35:10 -080053 mirror::CompressedReference<mirror::Object>* GetDeclaringClassAddressWithoutBarrier() {
54 return declaring_class_.AddressWithoutBarrier();
55 }
56
Andreas Gampea1d2f952017-04-20 22:53:58 -070057 uint32_t GetAccessFlags() REQUIRES_SHARED(Locks::mutator_lock_) {
58 if (kIsDebugBuild) {
59 GetAccessFlagsDCheck();
60 }
61 return access_flags_;
62 }
Mathieu Chartierc7853442015-03-27 14:35:38 -070063
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070064 void SetAccessFlags(uint32_t new_access_flags) REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070065 // Not called within a transaction.
66 access_flags_ = new_access_flags;
67 }
68
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070069 bool IsPublic() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070070 return (GetAccessFlags() & kAccPublic) != 0;
71 }
72
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070073 bool IsStatic() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070074 return (GetAccessFlags() & kAccStatic) != 0;
75 }
76
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070077 bool IsFinal() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070078 return (GetAccessFlags() & kAccFinal) != 0;
79 }
80
81 uint32_t GetDexFieldIndex() {
82 return field_dex_idx_;
83 }
84
85 void SetDexFieldIndex(uint32_t new_idx) {
86 // Not called within a transaction.
87 field_dex_idx_ = new_idx;
88 }
89
90 // Offset to field within an Object.
Andreas Gampea1d2f952017-04-20 22:53:58 -070091 MemberOffset GetOffset() REQUIRES_SHARED(Locks::mutator_lock_) {
92 if (kIsDebugBuild) {
93 GetOffsetDCheck();
94 }
95 return MemberOffset(offset_);
96 }
Mathieu Chartierc7853442015-03-27 14:35:38 -070097
98 static MemberOffset OffsetOffset() {
99 return MemberOffset(OFFSETOF_MEMBER(ArtField, offset_));
100 }
101
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700102 MemberOffset GetOffsetDuringLinking() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700103
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700104 void SetOffset(MemberOffset num_bytes) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700105
106 // field access, null object for static fields
Mathieu Chartier3398c782016-09-30 10:27:43 -0700107 uint8_t GetBoolean(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700108
109 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700110 void SetBoolean(ObjPtr<mirror::Object> object, uint8_t z) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700111
Mathieu Chartier3398c782016-09-30 10:27:43 -0700112 int8_t GetByte(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700113
114 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700115 void SetByte(ObjPtr<mirror::Object> object, int8_t b) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700116
Mathieu Chartier3398c782016-09-30 10:27:43 -0700117 uint16_t GetChar(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700118
119 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700120 void SetChar(ObjPtr<mirror::Object> object, uint16_t c) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700121
Mathieu Chartier3398c782016-09-30 10:27:43 -0700122 int16_t GetShort(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700123
124 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700125 void SetShort(ObjPtr<mirror::Object> object, int16_t s) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700126
Mathieu Chartier3398c782016-09-30 10:27:43 -0700127 int32_t GetInt(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700128
129 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700130 void SetInt(ObjPtr<mirror::Object> object, int32_t i) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700131
Mathieu Chartier3398c782016-09-30 10:27:43 -0700132 int64_t GetLong(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700133
134 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700135 void SetLong(ObjPtr<mirror::Object> object, int64_t j) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700136
Mathieu Chartier3398c782016-09-30 10:27:43 -0700137 float GetFloat(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700138
139 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700140 void SetFloat(ObjPtr<mirror::Object> object, float f) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700141
Mathieu Chartier3398c782016-09-30 10:27:43 -0700142 double GetDouble(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700143
144 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700145 void SetDouble(ObjPtr<mirror::Object> object, double d) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700146
Mathieu Chartier3398c782016-09-30 10:27:43 -0700147 ObjPtr<mirror::Object> GetObject(ObjPtr<mirror::Object> object)
148 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700149
150 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700151 void SetObject(ObjPtr<mirror::Object> object, ObjPtr<mirror::Object> l)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700152 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700153
154 // Raw field accesses.
Mathieu Chartier3398c782016-09-30 10:27:43 -0700155 uint32_t Get32(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700156
157 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700158 void Set32(ObjPtr<mirror::Object> object, uint32_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700159 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700160
Mathieu Chartier3398c782016-09-30 10:27:43 -0700161 uint64_t Get64(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700162
163 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700164 void Set64(ObjPtr<mirror::Object> object, uint64_t new_value)
165 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700166
Mathieu Chartier3398c782016-09-30 10:27:43 -0700167 template<class MirrorType = mirror::Object>
168 ObjPtr<MirrorType> GetObj(ObjPtr<mirror::Object> object)
169 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700170
171 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700172 void SetObj(ObjPtr<mirror::Object> object, ObjPtr<mirror::Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700173 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700174
Mathieu Chartierda7c6502015-07-23 16:01:26 -0700175 // NO_THREAD_SAFETY_ANALYSIS since we don't know what the callback requires.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700176 template<typename RootVisitorType>
Andreas Gamped4901292017-05-30 18:41:34 -0700177 ALWAYS_INLINE inline void VisitRoots(RootVisitorType& visitor) NO_THREAD_SAFETY_ANALYSIS {
178 visitor.VisitRoot(declaring_class_.AddressWithoutBarrier());
179 }
Mathieu Chartierc7853442015-03-27 14:35:38 -0700180
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700181 bool IsVolatile() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -0700182 return (GetAccessFlags() & kAccVolatile) != 0;
183 }
184
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700185 // Returns an instance field with this offset in the given class or null if not found.
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700186 // If kExactOffset is true then we only find the matching offset, not the field containing the
187 // offset.
188 template <bool kExactOffset = true>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700189 static ArtField* FindInstanceFieldWithOffset(ObjPtr<mirror::Class> klass, uint32_t field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700190 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700191
Hiroshi Yamauchieb2baaf2015-05-13 21:14:22 -0700192 // Returns a static field with this offset in the given class or null if not found.
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700193 // If kExactOffset is true then we only find the matching offset, not the field containing the
194 // offset.
195 template <bool kExactOffset = true>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700196 static ArtField* FindStaticFieldWithOffset(ObjPtr<mirror::Class> klass, uint32_t field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700197 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700198
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700199 const char* GetName() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700200
201 // Resolves / returns the name from the dex cache.
Vladimir Marko18090d12018-06-01 16:53:12 +0100202 ObjPtr<mirror::String> ResolveNameString() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700203
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700204 const char* GetTypeDescriptor() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700205
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700206 Primitive::Type GetTypeAsPrimitiveType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700207
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700208 bool IsPrimitiveType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700209
Vladimir Marko208f6702017-12-08 12:00:50 +0000210 ObjPtr<mirror::Class> LookupResolvedType() REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko4098a7a2017-11-06 16:00:51 +0000211 ObjPtr<mirror::Class> ResolveType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700212
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700213 size_t FieldSize() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700214
Vladimir Marko09c5ca42018-05-31 15:15:31 +0100215 template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700216 ObjPtr<mirror::DexCache> GetDexCache() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700217
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700218 const DexFile* GetDexFile() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700219
220 GcRoot<mirror::Class>& DeclaringClassRoot() {
221 return declaring_class_;
222 }
223
David Sehr709b0702016-10-13 09:12:37 -0700224 // Returns a human-readable signature. Something like "a.b.C.f" or
225 // "int a.b.C.f" (depending on the value of 'with_type').
226 static std::string PrettyField(ArtField* f, bool with_type = true)
227 REQUIRES_SHARED(Locks::mutator_lock_);
228 std::string PrettyField(bool with_type = true)
229 REQUIRES_SHARED(Locks::mutator_lock_);
230
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800231 // Update the declaring class with the passed in visitor. Does not use read barrier.
232 template <typename Visitor>
233 ALWAYS_INLINE void UpdateObjects(const Visitor& visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700234 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800235
Mathieu Chartierc7853442015-03-27 14:35:38 -0700236 private:
Vladimir Marko09c5ca42018-05-31 15:15:31 +0100237 bool IsProxyField() REQUIRES_SHARED(Locks::mutator_lock_);
238
Mathieu Chartier3398c782016-09-30 10:27:43 -0700239 ObjPtr<mirror::Class> ProxyFindSystemClass(const char* descriptor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700240 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko3481ba22015-04-13 12:22:36 +0100241
Andreas Gampea1d2f952017-04-20 22:53:58 -0700242 void GetAccessFlagsDCheck() REQUIRES_SHARED(Locks::mutator_lock_);
243 void GetOffsetDCheck() REQUIRES_SHARED(Locks::mutator_lock_);
244
Mathieu Chartierc7853442015-03-27 14:35:38 -0700245 GcRoot<mirror::Class> declaring_class_;
246
Mathieu Chartier3398c782016-09-30 10:27:43 -0700247 uint32_t access_flags_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700248
249 // Dex cache index of field id
Mathieu Chartier3398c782016-09-30 10:27:43 -0700250 uint32_t field_dex_idx_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700251
252 // Offset of field within an instance or in the Class' static fields
Mathieu Chartier3398c782016-09-30 10:27:43 -0700253 uint32_t offset_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700254};
255
256} // namespace art
257
258#endif // ART_RUNTIME_ART_FIELD_H_