blob: fa0694b8ca1fef1eec8a8d1ae8819d21d46b5feb [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"
24#include "object_callbacks.h"
25#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:
43 ArtField();
44
Mathieu Chartier90443472015-07-16 20:32:27 -070045 mirror::Class* GetDeclaringClass() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070046
47 void SetDeclaringClass(mirror::Class *new_declaring_class)
Mathieu Chartier90443472015-07-16 20:32:27 -070048 SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070049
Mathieu Chartier90443472015-07-16 20:32:27 -070050 uint32_t GetAccessFlags() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070051
Mathieu Chartier90443472015-07-16 20:32:27 -070052 void SetAccessFlags(uint32_t new_access_flags) SHARED_REQUIRES(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070053 // Not called within a transaction.
54 access_flags_ = new_access_flags;
55 }
56
Mathieu Chartier90443472015-07-16 20:32:27 -070057 bool IsPublic() SHARED_REQUIRES(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070058 return (GetAccessFlags() & kAccPublic) != 0;
59 }
60
Mathieu Chartier90443472015-07-16 20:32:27 -070061 bool IsStatic() SHARED_REQUIRES(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -070062 return (GetAccessFlags() & kAccStatic) != 0;
63 }
64
Mathieu Chartier90443472015-07-16 20:32:27 -070065 bool IsFinal() SHARED_REQUIRES(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.
Mathieu Chartier90443472015-07-16 20:32:27 -070079 MemberOffset GetOffset() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070080
81 static MemberOffset OffsetOffset() {
82 return MemberOffset(OFFSETOF_MEMBER(ArtField, offset_));
83 }
84
Mathieu Chartier90443472015-07-16 20:32:27 -070085 MemberOffset GetOffsetDuringLinking() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070086
Mathieu Chartier90443472015-07-16 20:32:27 -070087 void SetOffset(MemberOffset num_bytes) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070088
89 // field access, null object for static fields
Mathieu Chartier90443472015-07-16 20:32:27 -070090 uint8_t GetBoolean(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070091
92 template<bool kTransactionActive>
Mathieu Chartier90443472015-07-16 20:32:27 -070093 void SetBoolean(mirror::Object* object, uint8_t z) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070094
Mathieu Chartier90443472015-07-16 20:32:27 -070095 int8_t GetByte(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070096
97 template<bool kTransactionActive>
Mathieu Chartier90443472015-07-16 20:32:27 -070098 void SetByte(mirror::Object* object, int8_t b) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -070099
Mathieu Chartier90443472015-07-16 20:32:27 -0700100 uint16_t GetChar(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700101
102 template<bool kTransactionActive>
Mathieu Chartier90443472015-07-16 20:32:27 -0700103 void SetChar(mirror::Object* object, uint16_t c) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700104
Mathieu Chartier90443472015-07-16 20:32:27 -0700105 int16_t GetShort(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700106
107 template<bool kTransactionActive>
Mathieu Chartier90443472015-07-16 20:32:27 -0700108 void SetShort(mirror::Object* object, int16_t s) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700109
Mathieu Chartier90443472015-07-16 20:32:27 -0700110 int32_t GetInt(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700111
112 template<bool kTransactionActive>
Mathieu Chartier90443472015-07-16 20:32:27 -0700113 void SetInt(mirror::Object* object, int32_t i) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700114
Mathieu Chartier90443472015-07-16 20:32:27 -0700115 int64_t GetLong(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700116
117 template<bool kTransactionActive>
Mathieu Chartier90443472015-07-16 20:32:27 -0700118 void SetLong(mirror::Object* object, int64_t j) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700119
Mathieu Chartier90443472015-07-16 20:32:27 -0700120 float GetFloat(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700121
122 template<bool kTransactionActive>
Mathieu Chartier90443472015-07-16 20:32:27 -0700123 void SetFloat(mirror::Object* object, float f) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700124
Mathieu Chartier90443472015-07-16 20:32:27 -0700125 double GetDouble(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700126
127 template<bool kTransactionActive>
Mathieu Chartier90443472015-07-16 20:32:27 -0700128 void SetDouble(mirror::Object* object, double d) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700129
Mathieu Chartier90443472015-07-16 20:32:27 -0700130 mirror::Object* GetObject(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700131
132 template<bool kTransactionActive>
133 void SetObject(mirror::Object* object, mirror::Object* l)
Mathieu Chartier90443472015-07-16 20:32:27 -0700134 SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700135
136 // Raw field accesses.
Mathieu Chartier90443472015-07-16 20:32:27 -0700137 uint32_t Get32(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700138
139 template<bool kTransactionActive>
140 void Set32(mirror::Object* object, uint32_t new_value)
Mathieu Chartier90443472015-07-16 20:32:27 -0700141 SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700142
Mathieu Chartier90443472015-07-16 20:32:27 -0700143 uint64_t Get64(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700144
145 template<bool kTransactionActive>
Mathieu Chartier90443472015-07-16 20:32:27 -0700146 void Set64(mirror::Object* object, uint64_t new_value) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700147
Mathieu Chartier90443472015-07-16 20:32:27 -0700148 mirror::Object* GetObj(mirror::Object* object) SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700149
150 template<bool kTransactionActive>
151 void SetObj(mirror::Object* object, mirror::Object* new_value)
Mathieu Chartier90443472015-07-16 20:32:27 -0700152 SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700153
Mathieu Chartierda7c6502015-07-23 16:01:26 -0700154 // NO_THREAD_SAFETY_ANALYSIS since we don't know what the callback requires.
Mathieu Chartiere401d142015-04-22 13:56:20 -0700155 template<typename RootVisitorType>
Mathieu Chartierda7c6502015-07-23 16:01:26 -0700156 void VisitRoots(RootVisitorType& visitor) NO_THREAD_SAFETY_ANALYSIS;
Mathieu Chartierc7853442015-03-27 14:35:38 -0700157
Mathieu Chartier90443472015-07-16 20:32:27 -0700158 bool IsVolatile() SHARED_REQUIRES(Locks::mutator_lock_) {
Mathieu Chartierc7853442015-03-27 14:35:38 -0700159 return (GetAccessFlags() & kAccVolatile) != 0;
160 }
161
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700162 // Returns an instance field with this offset in the given class or null if not found.
Mathieu Chartierc7853442015-03-27 14:35:38 -0700163 static ArtField* FindInstanceFieldWithOffset(mirror::Class* klass, uint32_t field_offset)
Mathieu Chartier90443472015-07-16 20:32:27 -0700164 SHARED_REQUIRES(Locks::mutator_lock_);
Hiroshi Yamauchieb2baaf2015-05-13 21:14:22 -0700165 // Returns a static field with this offset in the given class or null if not found.
166 static ArtField* FindStaticFieldWithOffset(mirror::Class* klass, uint32_t field_offset)
Mathieu Chartier90443472015-07-16 20:32:27 -0700167 SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700168
Mathieu Chartier90443472015-07-16 20:32:27 -0700169 const char* GetName() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700170
171 // Resolves / returns the name from the dex cache.
172 mirror::String* GetStringName(Thread* self, bool resolve)
Mathieu Chartier90443472015-07-16 20:32:27 -0700173 SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700174
Mathieu Chartier90443472015-07-16 20:32:27 -0700175 const char* GetTypeDescriptor() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700176
Mathieu Chartier90443472015-07-16 20:32:27 -0700177 Primitive::Type GetTypeAsPrimitiveType() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700178
Mathieu Chartier90443472015-07-16 20:32:27 -0700179 bool IsPrimitiveType() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700180
181 template <bool kResolve>
Mathieu Chartier90443472015-07-16 20:32:27 -0700182 mirror::Class* GetType() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700183
Mathieu Chartier90443472015-07-16 20:32:27 -0700184 size_t FieldSize() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700185
Mathieu Chartier90443472015-07-16 20:32:27 -0700186 mirror::DexCache* GetDexCache() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700187
Mathieu Chartier90443472015-07-16 20:32:27 -0700188 const DexFile* GetDexFile() SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700189
190 GcRoot<mirror::Class>& DeclaringClassRoot() {
191 return declaring_class_;
192 }
193
194 private:
Vladimir Marko3481ba22015-04-13 12:22:36 +0100195 mirror::Class* ProxyFindSystemClass(const char* descriptor)
Mathieu Chartier90443472015-07-16 20:32:27 -0700196 SHARED_REQUIRES(Locks::mutator_lock_);
197 mirror::Class* ResolveGetType(uint32_t type_idx) SHARED_REQUIRES(Locks::mutator_lock_);
Vladimir Marko3481ba22015-04-13 12:22:36 +0100198 mirror::String* ResolveGetStringName(Thread* self, const DexFile& dex_file, uint32_t string_idx,
199 mirror::DexCache* dex_cache)
Mathieu Chartier90443472015-07-16 20:32:27 -0700200 SHARED_REQUIRES(Locks::mutator_lock_);
Vladimir Marko3481ba22015-04-13 12:22:36 +0100201
Mathieu Chartierc7853442015-03-27 14:35:38 -0700202 GcRoot<mirror::Class> declaring_class_;
203
204 uint32_t access_flags_;
205
206 // Dex cache index of field id
207 uint32_t field_dex_idx_;
208
209 // Offset of field within an instance or in the Class' static fields
210 uint32_t offset_;
211};
212
213} // namespace art
214
215#endif // ART_RUNTIME_ART_FIELD_H_