blob: f39af3900c806a3118087a1b454707ae36a58655 [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 Brazdil14c212a2018-04-23 13:50:38 +010023#include "dex/hidden_api_access_flags.h"
David Sehr8c0961f2018-01-23 16:11:38 -080024#include "dex/modifiers.h"
David Sehr67bf42e2018-02-26 16:43:04 -080025#include "dex/primitive.h"
Mathieu Chartierc7853442015-03-27 14:35:38 -070026#include "gc_root.h"
Mathieu Chartier3398c782016-09-30 10:27:43 -070027#include "obj_ptr.h"
Mathieu Chartierc7853442015-03-27 14:35:38 -070028#include "offsets.h"
Mathieu Chartierc7853442015-03-27 14:35:38 -070029#include "read_barrier_option.h"
30
31namespace art {
32
33class DexFile;
34class ScopedObjectAccessAlreadyRunnable;
35
36namespace mirror {
37class Class;
38class DexCache;
39class Object;
40class String;
41} // namespace mirror
42
Mathieu Chartiere401d142015-04-22 13:56:20 -070043class 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
Mathieu Chartier3398c782016-09-30 10:27:43 -070048 void SetDeclaringClass(ObjPtr<mirror::Class> new_declaring_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070049 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070050
Mathieu Chartier8c19d242017-03-06 12:35:10 -080051 mirror::CompressedReference<mirror::Object>* GetDeclaringClassAddressWithoutBarrier() {
52 return declaring_class_.AddressWithoutBarrier();
53 }
54
Andreas Gampea1d2f952017-04-20 22:53:58 -070055 uint32_t GetAccessFlags() REQUIRES_SHARED(Locks::mutator_lock_) {
56 if (kIsDebugBuild) {
57 GetAccessFlagsDCheck();
58 }
59 return access_flags_;
60 }
Mathieu Chartierc7853442015-03-27 14:35:38 -070061
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070062 void SetAccessFlags(uint32_t new_access_flags) REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070063 // Not called within a transaction.
64 access_flags_ = new_access_flags;
65 }
66
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070067 bool IsPublic() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070068 return (GetAccessFlags() & kAccPublic) != 0;
69 }
70
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070071 bool IsStatic() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070072 return (GetAccessFlags() & kAccStatic) != 0;
73 }
74
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070075 bool IsFinal() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070076 return (GetAccessFlags() & kAccFinal) != 0;
77 }
78
79 uint32_t GetDexFieldIndex() {
80 return field_dex_idx_;
81 }
82
83 void SetDexFieldIndex(uint32_t new_idx) {
84 // Not called within a transaction.
85 field_dex_idx_ = new_idx;
86 }
87
88 // Offset to field within an Object.
Andreas Gampea1d2f952017-04-20 22:53:58 -070089 MemberOffset GetOffset() REQUIRES_SHARED(Locks::mutator_lock_) {
90 if (kIsDebugBuild) {
91 GetOffsetDCheck();
92 }
93 return MemberOffset(offset_);
94 }
Mathieu Chartierc7853442015-03-27 14:35:38 -070095
96 static MemberOffset OffsetOffset() {
97 return MemberOffset(OFFSETOF_MEMBER(ArtField, offset_));
98 }
99
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700100 MemberOffset GetOffsetDuringLinking() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700101
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700102 void SetOffset(MemberOffset num_bytes) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700103
104 // field access, null object for static fields
Mathieu Chartier3398c782016-09-30 10:27:43 -0700105 uint8_t GetBoolean(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700106
107 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700108 void SetBoolean(ObjPtr<mirror::Object> object, uint8_t z) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700109
Mathieu Chartier3398c782016-09-30 10:27:43 -0700110 int8_t GetByte(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700111
112 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700113 void SetByte(ObjPtr<mirror::Object> object, int8_t b) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700114
Mathieu Chartier3398c782016-09-30 10:27:43 -0700115 uint16_t GetChar(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700116
117 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700118 void SetChar(ObjPtr<mirror::Object> object, uint16_t c) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700119
Mathieu Chartier3398c782016-09-30 10:27:43 -0700120 int16_t GetShort(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700121
122 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700123 void SetShort(ObjPtr<mirror::Object> object, int16_t s) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700124
Mathieu Chartier3398c782016-09-30 10:27:43 -0700125 int32_t GetInt(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700126
127 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700128 void SetInt(ObjPtr<mirror::Object> object, int32_t i) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700129
Mathieu Chartier3398c782016-09-30 10:27:43 -0700130 int64_t GetLong(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700131
132 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700133 void SetLong(ObjPtr<mirror::Object> object, int64_t j) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700134
Mathieu Chartier3398c782016-09-30 10:27:43 -0700135 float GetFloat(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700136
137 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700138 void SetFloat(ObjPtr<mirror::Object> object, float f) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700139
Mathieu Chartier3398c782016-09-30 10:27:43 -0700140 double GetDouble(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700141
142 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700143 void SetDouble(ObjPtr<mirror::Object> object, double d) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700144
Mathieu Chartier3398c782016-09-30 10:27:43 -0700145 ObjPtr<mirror::Object> GetObject(ObjPtr<mirror::Object> object)
146 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700147
148 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700149 void SetObject(ObjPtr<mirror::Object> object, ObjPtr<mirror::Object> l)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700150 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700151
152 // Raw field accesses.
Mathieu Chartier3398c782016-09-30 10:27:43 -0700153 uint32_t Get32(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700154
155 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700156 void Set32(ObjPtr<mirror::Object> object, uint32_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700157 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700158
Mathieu Chartier3398c782016-09-30 10:27:43 -0700159 uint64_t Get64(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700160
161 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700162 void Set64(ObjPtr<mirror::Object> object, uint64_t new_value)
163 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700164
Mathieu Chartier3398c782016-09-30 10:27:43 -0700165 template<class MirrorType = mirror::Object>
166 ObjPtr<MirrorType> GetObj(ObjPtr<mirror::Object> object)
167 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700168
169 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700170 void SetObj(ObjPtr<mirror::Object> object, ObjPtr<mirror::Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700171 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700172
Mathieu Chartierda7c6502015-07-23 16:01:26 -0700173 // NO_THREAD_SAFETY_ANALYSIS since we don't know what the callback requires.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700174 template<typename RootVisitorType>
Andreas Gamped4901292017-05-30 18:41:34 -0700175 ALWAYS_INLINE inline void VisitRoots(RootVisitorType& visitor) NO_THREAD_SAFETY_ANALYSIS {
176 visitor.VisitRoot(declaring_class_.AddressWithoutBarrier());
177 }
Mathieu Chartierc7853442015-03-27 14:35:38 -0700178
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700179 bool IsVolatile() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -0700180 return (GetAccessFlags() & kAccVolatile) != 0;
181 }
182
David Brazdil14c212a2018-04-23 13:50:38 +0100183 HiddenApiAccessFlags::ApiList GetHiddenApiAccessFlags() REQUIRES_SHARED(Locks::mutator_lock_) {
184 return HiddenApiAccessFlags::DecodeFromRuntime(GetAccessFlags());
185 }
186
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700187 // Returns an instance field with this offset in the given class or null if not found.
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700188 // If kExactOffset is true then we only find the matching offset, not the field containing the
189 // offset.
190 template <bool kExactOffset = true>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700191 static ArtField* FindInstanceFieldWithOffset(ObjPtr<mirror::Class> klass, uint32_t field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700192 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700193
Hiroshi Yamauchieb2baaf2015-05-13 21:14:22 -0700194 // Returns a static field with this offset in the given class or null if not found.
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700195 // If kExactOffset is true then we only find the matching offset, not the field containing the
196 // offset.
197 template <bool kExactOffset = true>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700198 static ArtField* FindStaticFieldWithOffset(ObjPtr<mirror::Class> klass, uint32_t field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700199 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700200
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700201 const char* GetName() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700202
203 // Resolves / returns the name from the dex cache.
Mathieu Chartier3398c782016-09-30 10:27:43 -0700204 ObjPtr<mirror::String> GetStringName(Thread* self, bool resolve)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700205 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700206
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700207 const char* GetTypeDescriptor() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700208
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700209 Primitive::Type GetTypeAsPrimitiveType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700210
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700211 bool IsPrimitiveType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700212
Vladimir Marko208f6702017-12-08 12:00:50 +0000213 ObjPtr<mirror::Class> LookupResolvedType() REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko4098a7a2017-11-06 16:00:51 +0000214 ObjPtr<mirror::Class> ResolveType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700215
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700216 size_t FieldSize() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700217
Mathieu Chartier3398c782016-09-30 10:27:43 -0700218 ObjPtr<mirror::DexCache> GetDexCache() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700219
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700220 const DexFile* GetDexFile() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700221
222 GcRoot<mirror::Class>& DeclaringClassRoot() {
223 return declaring_class_;
224 }
225
David Sehr709b0702016-10-13 09:12:37 -0700226 // Returns a human-readable signature. Something like "a.b.C.f" or
227 // "int a.b.C.f" (depending on the value of 'with_type').
228 static std::string PrettyField(ArtField* f, bool with_type = true)
229 REQUIRES_SHARED(Locks::mutator_lock_);
230 std::string PrettyField(bool with_type = true)
231 REQUIRES_SHARED(Locks::mutator_lock_);
232
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800233 // Update the declaring class with the passed in visitor. Does not use read barrier.
234 template <typename Visitor>
235 ALWAYS_INLINE void UpdateObjects(const Visitor& visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700236 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800237
Mathieu Chartierc7853442015-03-27 14:35:38 -0700238 private:
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_);
Mathieu Chartier3398c782016-09-30 10:27:43 -0700241 ObjPtr<mirror::String> ResolveGetStringName(Thread* self,
Andreas Gampe8a0128a2016-11-28 07:38:35 -0800242 dex::StringIndex string_idx,
Mathieu Chartier3398c782016-09-30 10:27:43 -0700243 ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700244 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko3481ba22015-04-13 12:22:36 +0100245
Andreas Gampea1d2f952017-04-20 22:53:58 -0700246 void GetAccessFlagsDCheck() REQUIRES_SHARED(Locks::mutator_lock_);
247 void GetOffsetDCheck() REQUIRES_SHARED(Locks::mutator_lock_);
248
Mathieu Chartierc7853442015-03-27 14:35:38 -0700249 GcRoot<mirror::Class> declaring_class_;
250
Mathieu Chartier3398c782016-09-30 10:27:43 -0700251 uint32_t access_flags_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700252
253 // Dex cache index of field id
Mathieu Chartier3398c782016-09-30 10:27:43 -0700254 uint32_t field_dex_idx_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700255
256 // Offset of field within an instance or in the Class' static fields
Mathieu Chartier3398c782016-09-30 10:27:43 -0700257 uint32_t offset_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700258};
259
260} // namespace art
261
262#endif // ART_RUNTIME_ART_FIELD_H_