blob: 427e1037491bdd0e11d08a7acf405a9b77238102 [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
Andreas Gampea5b09a62016-11-17 15:21:22 -080022#include "dex_file_types.h"
Mathieu Chartierc7853442015-03-27 14:35:38 -070023#include "gc_root.h"
24#include "modifiers.h"
Mathieu Chartier3398c782016-09-30 10:27:43 -070025#include "obj_ptr.h"
Mathieu Chartierc7853442015-03-27 14:35:38 -070026#include "offsets.h"
27#include "primitive.h"
28#include "read_barrier_option.h"
29
30namespace art {
31
32class DexFile;
33class ScopedObjectAccessAlreadyRunnable;
34
35namespace mirror {
36class Class;
37class DexCache;
38class Object;
39class String;
40} // namespace mirror
41
Mathieu Chartiere401d142015-04-22 13:56:20 -070042class ArtField FINAL {
Mathieu Chartierc7853442015-03-27 14:35:38 -070043 public:
Hiroshi Yamauchi7a62e672016-06-10 17:22:48 -070044 template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Mathieu Chartier3398c782016-09-30 10:27:43 -070045 ObjPtr<mirror::Class> GetDeclaringClass() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070046
Mathieu Chartier3398c782016-09-30 10:27:43 -070047 void SetDeclaringClass(ObjPtr<mirror::Class> new_declaring_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070048 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070049
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070050 uint32_t GetAccessFlags() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070051
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070052 void SetAccessFlags(uint32_t new_access_flags) REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070053 // Not called within a transaction.
54 access_flags_ = new_access_flags;
55 }
56
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070057 bool IsPublic() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070058 return (GetAccessFlags() & kAccPublic) != 0;
59 }
60
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070061 bool IsStatic() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070062 return (GetAccessFlags() & kAccStatic) != 0;
63 }
64
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070065 bool IsFinal() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070066 return (GetAccessFlags() & kAccFinal) != 0;
67 }
68
69 uint32_t GetDexFieldIndex() {
70 return field_dex_idx_;
71 }
72
73 void SetDexFieldIndex(uint32_t new_idx) {
74 // Not called within a transaction.
75 field_dex_idx_ = new_idx;
76 }
77
78 // Offset to field within an Object.
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070079 MemberOffset GetOffset() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070080
81 static MemberOffset OffsetOffset() {
82 return MemberOffset(OFFSETOF_MEMBER(ArtField, offset_));
83 }
84
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070085 MemberOffset GetOffsetDuringLinking() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070086
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070087 void SetOffset(MemberOffset num_bytes) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070088
89 // field access, null object for static fields
Mathieu Chartier3398c782016-09-30 10:27:43 -070090 uint8_t GetBoolean(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070091
92 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -070093 void SetBoolean(ObjPtr<mirror::Object> object, uint8_t z) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070094
Mathieu Chartier3398c782016-09-30 10:27:43 -070095 int8_t GetByte(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070096
97 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -070098 void SetByte(ObjPtr<mirror::Object> object, int8_t b) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070099
Mathieu Chartier3398c782016-09-30 10:27:43 -0700100 uint16_t GetChar(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700101
102 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700103 void SetChar(ObjPtr<mirror::Object> object, uint16_t c) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700104
Mathieu Chartier3398c782016-09-30 10:27:43 -0700105 int16_t GetShort(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 SetShort(ObjPtr<mirror::Object> object, int16_t s) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700109
Mathieu Chartier3398c782016-09-30 10:27:43 -0700110 int32_t GetInt(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 SetInt(ObjPtr<mirror::Object> object, int32_t i) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700114
Mathieu Chartier3398c782016-09-30 10:27:43 -0700115 int64_t GetLong(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 SetLong(ObjPtr<mirror::Object> object, int64_t j) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700119
Mathieu Chartier3398c782016-09-30 10:27:43 -0700120 float GetFloat(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 SetFloat(ObjPtr<mirror::Object> object, float f) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700124
Mathieu Chartier3398c782016-09-30 10:27:43 -0700125 double GetDouble(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 SetDouble(ObjPtr<mirror::Object> object, double d) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700129
Mathieu Chartier3398c782016-09-30 10:27:43 -0700130 ObjPtr<mirror::Object> GetObject(ObjPtr<mirror::Object> object)
131 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700132
133 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700134 void SetObject(ObjPtr<mirror::Object> object, ObjPtr<mirror::Object> l)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700135 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700136
137 // Raw field accesses.
Mathieu Chartier3398c782016-09-30 10:27:43 -0700138 uint32_t Get32(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700139
140 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700141 void Set32(ObjPtr<mirror::Object> object, uint32_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700142 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700143
Mathieu Chartier3398c782016-09-30 10:27:43 -0700144 uint64_t Get64(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700145
146 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700147 void Set64(ObjPtr<mirror::Object> object, uint64_t new_value)
148 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700149
Mathieu Chartier3398c782016-09-30 10:27:43 -0700150 template<class MirrorType = mirror::Object>
151 ObjPtr<MirrorType> GetObj(ObjPtr<mirror::Object> object)
152 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700153
154 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700155 void SetObj(ObjPtr<mirror::Object> object, ObjPtr<mirror::Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700156 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700157
Mathieu Chartierda7c6502015-07-23 16:01:26 -0700158 // NO_THREAD_SAFETY_ANALYSIS since we don't know what the callback requires.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700159 template<typename RootVisitorType>
Mathieu Chartierda7c6502015-07-23 16:01:26 -0700160 void VisitRoots(RootVisitorType& visitor) NO_THREAD_SAFETY_ANALYSIS;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700161
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700162 bool IsVolatile() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -0700163 return (GetAccessFlags() & kAccVolatile) != 0;
164 }
165
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700166 // Returns an instance field with this offset in the given class or null if not found.
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700167 // If kExactOffset is true then we only find the matching offset, not the field containing the
168 // offset.
169 template <bool kExactOffset = true>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700170 static ArtField* FindInstanceFieldWithOffset(ObjPtr<mirror::Class> klass, uint32_t field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700171 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700172
Hiroshi Yamauchieb2baaf2015-05-13 21:14:22 -0700173 // Returns a static field with this offset in the given class or null if not found.
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700174 // If kExactOffset is true then we only find the matching offset, not the field containing the
175 // offset.
176 template <bool kExactOffset = true>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700177 static ArtField* FindStaticFieldWithOffset(ObjPtr<mirror::Class> klass, uint32_t field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700178 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700179
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700180 const char* GetName() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700181
182 // Resolves / returns the name from the dex cache.
Mathieu Chartier3398c782016-09-30 10:27:43 -0700183 ObjPtr<mirror::String> GetStringName(Thread* self, bool resolve)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700184 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700185
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700186 const char* GetTypeDescriptor() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700187
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700188 Primitive::Type GetTypeAsPrimitiveType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700189
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700190 bool IsPrimitiveType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700191
192 template <bool kResolve>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700193 ObjPtr<mirror::Class> GetType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700194
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700195 size_t FieldSize() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700196
Mathieu Chartier3398c782016-09-30 10:27:43 -0700197 ObjPtr<mirror::DexCache> GetDexCache() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700198
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700199 const DexFile* GetDexFile() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700200
201 GcRoot<mirror::Class>& DeclaringClassRoot() {
202 return declaring_class_;
203 }
204
David Sehr709b0702016-10-13 09:12:37 -0700205 // Returns a human-readable signature. Something like "a.b.C.f" or
206 // "int a.b.C.f" (depending on the value of 'with_type').
207 static std::string PrettyField(ArtField* f, bool with_type = true)
208 REQUIRES_SHARED(Locks::mutator_lock_);
209 std::string PrettyField(bool with_type = true)
210 REQUIRES_SHARED(Locks::mutator_lock_);
211
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800212 // Update the declaring class with the passed in visitor. Does not use read barrier.
213 template <typename Visitor>
214 ALWAYS_INLINE void UpdateObjects(const Visitor& visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700215 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800216
Mathieu Chartierc7853442015-03-27 14:35:38 -0700217 private:
Mathieu Chartier3398c782016-09-30 10:27:43 -0700218 ObjPtr<mirror::Class> ProxyFindSystemClass(const char* descriptor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700219 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier5812e202017-02-13 18:32:04 -0800220 ObjPtr<mirror::Class> ResolveGetType(dex::TypeIndex type_idx)
221 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier3398c782016-09-30 10:27:43 -0700222 ObjPtr<mirror::String> ResolveGetStringName(Thread* self,
223 const DexFile& dex_file,
Andreas Gampe8a0128a2016-11-28 07:38:35 -0800224 dex::StringIndex string_idx,
Mathieu Chartier3398c782016-09-30 10:27:43 -0700225 ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700226 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko3481ba22015-04-13 12:22:36 +0100227
Mathieu Chartierc7853442015-03-27 14:35:38 -0700228 GcRoot<mirror::Class> declaring_class_;
229
Mathieu Chartier3398c782016-09-30 10:27:43 -0700230 uint32_t access_flags_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700231
232 // Dex cache index of field id
Mathieu Chartier3398c782016-09-30 10:27:43 -0700233 uint32_t field_dex_idx_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700234
235 // Offset of field within an instance or in the Class' static fields
Mathieu Chartier3398c782016-09-30 10:27:43 -0700236 uint32_t offset_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700237};
238
239} // namespace art
240
241#endif // ART_RUNTIME_ART_FIELD_H_