blob: 7c2f490706549b31d4a41604db1c65728d58cdae [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
22#include "gc_root.h"
23#include "modifiers.h"
Mathieu Chartier3398c782016-09-30 10:27:43 -070024#include "obj_ptr.h"
Mathieu Chartierc7853442015-03-27 14:35:38 -070025#include "offsets.h"
26#include "primitive.h"
27#include "read_barrier_option.h"
28
29namespace art {
30
31class DexFile;
32class ScopedObjectAccessAlreadyRunnable;
33
34namespace mirror {
35class Class;
36class DexCache;
37class Object;
38class String;
39} // namespace mirror
40
Mathieu Chartiere401d142015-04-22 13:56:20 -070041class ArtField FINAL {
Mathieu Chartierc7853442015-03-27 14:35:38 -070042 public:
Hiroshi Yamauchi7a62e672016-06-10 17:22:48 -070043 template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Mathieu Chartier3398c782016-09-30 10:27:43 -070044 ObjPtr<mirror::Class> GetDeclaringClass() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070045
Mathieu Chartier3398c782016-09-30 10:27:43 -070046 void SetDeclaringClass(ObjPtr<mirror::Class> new_declaring_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070047 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070048
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070049 uint32_t GetAccessFlags() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070050
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070051 void SetAccessFlags(uint32_t new_access_flags) REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070052 // Not called within a transaction.
53 access_flags_ = new_access_flags;
54 }
55
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070056 bool IsPublic() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070057 return (GetAccessFlags() & kAccPublic) != 0;
58 }
59
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070060 bool IsStatic() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070061 return (GetAccessFlags() & kAccStatic) != 0;
62 }
63
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070064 bool IsFinal() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070065 return (GetAccessFlags() & kAccFinal) != 0;
66 }
67
68 uint32_t GetDexFieldIndex() {
69 return field_dex_idx_;
70 }
71
72 void SetDexFieldIndex(uint32_t new_idx) {
73 // Not called within a transaction.
74 field_dex_idx_ = new_idx;
75 }
76
77 // Offset to field within an Object.
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070078 MemberOffset GetOffset() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070079
80 static MemberOffset OffsetOffset() {
81 return MemberOffset(OFFSETOF_MEMBER(ArtField, offset_));
82 }
83
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070084 MemberOffset GetOffsetDuringLinking() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070085
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070086 void SetOffset(MemberOffset num_bytes) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070087
88 // field access, null object for static fields
Mathieu Chartier3398c782016-09-30 10:27:43 -070089 uint8_t GetBoolean(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070090
91 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -070092 void SetBoolean(ObjPtr<mirror::Object> object, uint8_t z) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070093
Mathieu Chartier3398c782016-09-30 10:27:43 -070094 int8_t GetByte(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070095
96 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -070097 void SetByte(ObjPtr<mirror::Object> object, int8_t b) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070098
Mathieu Chartier3398c782016-09-30 10:27:43 -070099 uint16_t GetChar(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700100
101 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700102 void SetChar(ObjPtr<mirror::Object> object, uint16_t c) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700103
Mathieu Chartier3398c782016-09-30 10:27:43 -0700104 int16_t GetShort(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700105
106 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700107 void SetShort(ObjPtr<mirror::Object> object, int16_t s) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700108
Mathieu Chartier3398c782016-09-30 10:27:43 -0700109 int32_t GetInt(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700110
111 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700112 void SetInt(ObjPtr<mirror::Object> object, int32_t i) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700113
Mathieu Chartier3398c782016-09-30 10:27:43 -0700114 int64_t GetLong(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700115
116 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700117 void SetLong(ObjPtr<mirror::Object> object, int64_t j) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700118
Mathieu Chartier3398c782016-09-30 10:27:43 -0700119 float GetFloat(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700120
121 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700122 void SetFloat(ObjPtr<mirror::Object> object, float f) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700123
Mathieu Chartier3398c782016-09-30 10:27:43 -0700124 double GetDouble(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700125
126 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700127 void SetDouble(ObjPtr<mirror::Object> object, double d) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700128
Mathieu Chartier3398c782016-09-30 10:27:43 -0700129 ObjPtr<mirror::Object> GetObject(ObjPtr<mirror::Object> object)
130 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 SetObject(ObjPtr<mirror::Object> object, ObjPtr<mirror::Object> l)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700134 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700135
136 // Raw field accesses.
Mathieu Chartier3398c782016-09-30 10:27:43 -0700137 uint32_t Get32(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 Set32(ObjPtr<mirror::Object> object, uint32_t new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700141 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700142
Mathieu Chartier3398c782016-09-30 10:27:43 -0700143 uint64_t Get64(ObjPtr<mirror::Object> object) REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700144
145 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700146 void Set64(ObjPtr<mirror::Object> object, uint64_t new_value)
147 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700148
Mathieu Chartier3398c782016-09-30 10:27:43 -0700149 template<class MirrorType = mirror::Object>
150 ObjPtr<MirrorType> GetObj(ObjPtr<mirror::Object> object)
151 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700152
153 template<bool kTransactionActive>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700154 void SetObj(ObjPtr<mirror::Object> object, ObjPtr<mirror::Object> new_value)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700155 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700156
Mathieu Chartierda7c6502015-07-23 16:01:26 -0700157 // NO_THREAD_SAFETY_ANALYSIS since we don't know what the callback requires.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700158 template<typename RootVisitorType>
Mathieu Chartierda7c6502015-07-23 16:01:26 -0700159 void VisitRoots(RootVisitorType& visitor) NO_THREAD_SAFETY_ANALYSIS;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700160
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700161 bool IsVolatile() REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -0700162 return (GetAccessFlags() & kAccVolatile) != 0;
163 }
164
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700165 // Returns an instance field with this offset in the given class or null if not found.
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700166 // If kExactOffset is true then we only find the matching offset, not the field containing the
167 // offset.
168 template <bool kExactOffset = true>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700169 static ArtField* FindInstanceFieldWithOffset(ObjPtr<mirror::Class> klass, uint32_t field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700170 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700171
Hiroshi Yamauchieb2baaf2015-05-13 21:14:22 -0700172 // Returns a static field with this offset in the given class or null if not found.
Mathieu Chartiercb044bc2016-04-01 13:56:41 -0700173 // If kExactOffset is true then we only find the matching offset, not the field containing the
174 // offset.
175 template <bool kExactOffset = true>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700176 static ArtField* FindStaticFieldWithOffset(ObjPtr<mirror::Class> klass, uint32_t field_offset)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700177 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700178
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700179 const char* GetName() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700180
181 // Resolves / returns the name from the dex cache.
Mathieu Chartier3398c782016-09-30 10:27:43 -0700182 ObjPtr<mirror::String> GetStringName(Thread* self, bool resolve)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700183 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700184
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700185 const char* GetTypeDescriptor() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700186
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700187 Primitive::Type GetTypeAsPrimitiveType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700188
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700189 bool IsPrimitiveType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700190
191 template <bool kResolve>
Mathieu Chartier3398c782016-09-30 10:27:43 -0700192 ObjPtr<mirror::Class> GetType() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700193
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700194 size_t FieldSize() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700195
Mathieu Chartier3398c782016-09-30 10:27:43 -0700196 ObjPtr<mirror::DexCache> GetDexCache() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700197
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700198 const DexFile* GetDexFile() REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700199
200 GcRoot<mirror::Class>& DeclaringClassRoot() {
201 return declaring_class_;
202 }
203
David Sehr709b0702016-10-13 09:12:37 -0700204 // Returns a human-readable signature. Something like "a.b.C.f" or
205 // "int a.b.C.f" (depending on the value of 'with_type').
206 static std::string PrettyField(ArtField* f, bool with_type = true)
207 REQUIRES_SHARED(Locks::mutator_lock_);
208 std::string PrettyField(bool with_type = true)
209 REQUIRES_SHARED(Locks::mutator_lock_);
210
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800211 // Update the declaring class with the passed in visitor. Does not use read barrier.
212 template <typename Visitor>
213 ALWAYS_INLINE void UpdateObjects(const Visitor& visitor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700214 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartierfbc31082016-01-24 11:59:56 -0800215
Mathieu Chartierc7853442015-03-27 14:35:38 -0700216 private:
Mathieu Chartier3398c782016-09-30 10:27:43 -0700217 ObjPtr<mirror::Class> ProxyFindSystemClass(const char* descriptor)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700218 REQUIRES_SHARED(Locks::mutator_lock_);
Mathieu Chartier3398c782016-09-30 10:27:43 -0700219 ObjPtr<mirror::Class> ResolveGetType(uint32_t type_idx) REQUIRES_SHARED(Locks::mutator_lock_);
220 ObjPtr<mirror::String> ResolveGetStringName(Thread* self,
221 const DexFile& dex_file,
222 uint32_t string_idx,
223 ObjPtr<mirror::DexCache> dex_cache)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700224 REQUIRES_SHARED(Locks::mutator_lock_);
Vladimir Marko3481ba22015-04-13 12:22:36 +0100225
Mathieu Chartierc7853442015-03-27 14:35:38 -0700226 GcRoot<mirror::Class> declaring_class_;
227
Mathieu Chartier3398c782016-09-30 10:27:43 -0700228 uint32_t access_flags_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700229
230 // Dex cache index of field id
Mathieu Chartier3398c782016-09-30 10:27:43 -0700231 uint32_t field_dex_idx_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700232
233 // Offset of field within an instance or in the Class' static fields
Mathieu Chartier3398c782016-09-30 10:27:43 -0700234 uint32_t offset_ = 0;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700235};
236
237} // namespace art
238
239#endif // ART_RUNTIME_ART_FIELD_H_