blob: 2b406bdd91c20d347b44cd9439fe26eb2e944e37 [file] [log] [blame]
Ian Rogers2dd0e2c2013-01-24 12:42:14 -08001/*
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
Brian Carlstromea46f952013-07-30 01:26:50 -070017#ifndef ART_RUNTIME_MIRROR_ART_FIELD_INL_H_
18#define ART_RUNTIME_MIRROR_ART_FIELD_INL_H_
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080019
Brian Carlstromea46f952013-07-30 01:26:50 -070020#include "art_field.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080021
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080022#include "base/logging.h"
Ian Rogers08f1f502014-12-02 15:04:37 -080023#include "class_linker.h"
Ian Rogers22d5e732014-07-15 22:23:51 -070024#include "dex_cache.h"
Ian Rogers1d54e732013-05-02 21:10:01 -070025#include "gc/accounting/card_table-inl.h"
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080026#include "jvalue.h"
27#include "object-inl.h"
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080028#include "primitive.h"
Mathieu Chartier76433272014-09-26 14:32:37 -070029#include "thread-inl.h"
30#include "scoped_thread_state_change.h"
31#include "well_known_classes.h"
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080032
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033namespace art {
34namespace mirror {
35
Mingyao Yang98d1cc82014-05-15 17:02:16 -070036inline uint32_t ArtField::ClassSize() {
37 uint32_t vtable_entries = Object::kVTableLength + 6;
Fred Shih37f05ef2014-07-16 18:38:08 -070038 return Class::ComputeClassSize(true, vtable_entries, 0, 0, 0, 0, 0);
Mingyao Yang98d1cc82014-05-15 17:02:16 -070039}
40
Ian Rogersef7d42f2014-01-06 12:55:46 -080041inline Class* ArtField::GetDeclaringClass() {
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070042 Class* result = GetFieldObject<Class>(OFFSET_OF_OBJECT_MEMBER(ArtField, declaring_class_));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080043 DCHECK(result != NULL);
44 DCHECK(result->IsLoaded() || result->IsErroneous());
45 return result;
46}
47
Brian Carlstromea46f952013-07-30 01:26:50 -070048inline void ArtField::SetDeclaringClass(Class *new_declaring_class) {
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070049 SetFieldObject<false>(OFFSET_OF_OBJECT_MEMBER(ArtField, declaring_class_), new_declaring_class);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080050}
51
Ian Rogersef7d42f2014-01-06 12:55:46 -080052inline uint32_t ArtField::GetAccessFlags() {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080053 DCHECK(GetDeclaringClass()->IsLoaded() || GetDeclaringClass()->IsErroneous());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070054 return GetField32(OFFSET_OF_OBJECT_MEMBER(ArtField, access_flags_));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080055}
56
Ian Rogersef7d42f2014-01-06 12:55:46 -080057inline MemberOffset ArtField::GetOffset() {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080058 DCHECK(GetDeclaringClass()->IsResolved() || GetDeclaringClass()->IsErroneous());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070059 return MemberOffset(GetField32(OFFSET_OF_OBJECT_MEMBER(ArtField, offset_)));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080060}
61
Ian Rogersef7d42f2014-01-06 12:55:46 -080062inline MemberOffset ArtField::GetOffsetDuringLinking() {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080063 DCHECK(GetDeclaringClass()->IsLoaded() || GetDeclaringClass()->IsErroneous());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070064 return MemberOffset(GetField32(OFFSET_OF_OBJECT_MEMBER(ArtField, offset_)));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080065}
66
Ian Rogersef7d42f2014-01-06 12:55:46 -080067inline uint32_t ArtField::Get32(Object* object) {
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070068 DCHECK(object != nullptr) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080069 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070070 if (UNLIKELY(IsVolatile())) {
71 return object->GetField32Volatile(GetOffset());
72 }
73 return object->GetField32(GetOffset());
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080074}
75
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +010076template<bool kTransactionActive>
Ian Rogersef7d42f2014-01-06 12:55:46 -080077inline void ArtField::Set32(Object* object, uint32_t new_value) {
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070078 DCHECK(object != nullptr) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080079 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070080 if (UNLIKELY(IsVolatile())) {
81 object->SetField32Volatile<kTransactionActive>(GetOffset(), new_value);
82 } else {
83 object->SetField32<kTransactionActive>(GetOffset(), new_value);
84 }
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080085}
86
Ian Rogersef7d42f2014-01-06 12:55:46 -080087inline uint64_t ArtField::Get64(Object* object) {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080088 DCHECK(object != NULL) << PrettyField(this);
89 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070090 if (UNLIKELY(IsVolatile())) {
91 return object->GetField64Volatile(GetOffset());
92 }
93 return object->GetField64(GetOffset());
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080094}
95
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +010096template<bool kTransactionActive>
Ian Rogersef7d42f2014-01-06 12:55:46 -080097inline void ArtField::Set64(Object* object, uint64_t new_value) {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080098 DCHECK(object != NULL) << PrettyField(this);
99 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700100 if (UNLIKELY(IsVolatile())) {
101 object->SetField64Volatile<kTransactionActive>(GetOffset(), new_value);
102 } else {
103 object->SetField64<kTransactionActive>(GetOffset(), new_value);
104 }
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800105}
106
Ian Rogersef7d42f2014-01-06 12:55:46 -0800107inline Object* ArtField::GetObj(Object* object) {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800108 DCHECK(object != NULL) << PrettyField(this);
109 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700110 if (UNLIKELY(IsVolatile())) {
111 return object->GetFieldObjectVolatile<Object>(GetOffset());
112 }
113 return object->GetFieldObject<Object>(GetOffset());
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800114}
115
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100116template<bool kTransactionActive>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800117inline void ArtField::SetObj(Object* object, Object* new_value) {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800118 DCHECK(object != NULL) << PrettyField(this);
119 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700120 if (UNLIKELY(IsVolatile())) {
121 object->SetFieldObjectVolatile<kTransactionActive>(GetOffset(), new_value);
122 } else {
123 object->SetFieldObject<kTransactionActive>(GetOffset(), new_value);
124 }
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800125}
126
Fred Shih37f05ef2014-07-16 18:38:08 -0700127#define FIELD_GET(object, type) \
128 DCHECK_EQ(Primitive::kPrim ## type, GetTypeAsPrimitiveType()) << PrettyField(this); \
129 DCHECK(object != nullptr) << PrettyField(this); \
130 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted()); \
131 if (UNLIKELY(IsVolatile())) { \
132 return object->GetField ## type ## Volatile(GetOffset()); \
133 } \
134 return object->GetField ## type(GetOffset());
135
136#define FIELD_SET(object, type, value) \
137 DCHECK_EQ(Primitive::kPrim ## type, GetTypeAsPrimitiveType()) << PrettyField(this); \
138 DCHECK(object != nullptr) << PrettyField(this); \
139 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted()); \
140 if (UNLIKELY(IsVolatile())) { \
141 object->SetField ## type ## Volatile<kTransactionActive>(GetOffset(), value); \
142 } else { \
143 object->SetField ## type<kTransactionActive>(GetOffset(), value); \
144 }
145
146inline uint8_t ArtField::GetBoolean(Object* object) {
147 FIELD_GET(object, Boolean);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800148}
149
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100150template<bool kTransactionActive>
Fred Shih37f05ef2014-07-16 18:38:08 -0700151inline void ArtField::SetBoolean(Object* object, uint8_t z) {
152 FIELD_SET(object, Boolean, z);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800153}
154
Ian Rogersef7d42f2014-01-06 12:55:46 -0800155inline int8_t ArtField::GetByte(Object* object) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700156 FIELD_GET(object, Byte);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800157}
158
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100159template<bool kTransactionActive>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800160inline void ArtField::SetByte(Object* object, int8_t b) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700161 FIELD_SET(object, Byte, b);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800162}
163
Ian Rogersef7d42f2014-01-06 12:55:46 -0800164inline uint16_t ArtField::GetChar(Object* object) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700165 FIELD_GET(object, Char);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800166}
167
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100168template<bool kTransactionActive>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800169inline void ArtField::SetChar(Object* object, uint16_t c) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700170 FIELD_SET(object, Char, c);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800171}
172
Ian Rogersef7d42f2014-01-06 12:55:46 -0800173inline int16_t ArtField::GetShort(Object* object) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700174 FIELD_GET(object, Short);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800175}
176
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100177template<bool kTransactionActive>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800178inline void ArtField::SetShort(Object* object, int16_t s) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700179 FIELD_SET(object, Short, s);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800180}
181
Fred Shih37f05ef2014-07-16 18:38:08 -0700182#undef FIELD_GET
183#undef FIELD_SET
184
Ian Rogersef7d42f2014-01-06 12:55:46 -0800185inline int32_t ArtField::GetInt(Object* object) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100186 if (kIsDebugBuild) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700187 Primitive::Type type = GetTypeAsPrimitiveType();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100188 CHECK(type == Primitive::kPrimInt || type == Primitive::kPrimFloat) << PrettyField(this);
189 }
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800190 return Get32(object);
191}
192
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100193template<bool kTransactionActive>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800194inline void ArtField::SetInt(Object* object, int32_t i) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100195 if (kIsDebugBuild) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700196 Primitive::Type type = GetTypeAsPrimitiveType();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100197 CHECK(type == Primitive::kPrimInt || type == Primitive::kPrimFloat) << PrettyField(this);
198 }
199 Set32<kTransactionActive>(object, i);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800200}
201
Ian Rogersef7d42f2014-01-06 12:55:46 -0800202inline int64_t ArtField::GetLong(Object* object) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100203 if (kIsDebugBuild) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700204 Primitive::Type type = GetTypeAsPrimitiveType();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100205 CHECK(type == Primitive::kPrimLong || type == Primitive::kPrimDouble) << PrettyField(this);
206 }
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800207 return Get64(object);
208}
209
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100210template<bool kTransactionActive>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800211inline void ArtField::SetLong(Object* object, int64_t j) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100212 if (kIsDebugBuild) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700213 Primitive::Type type = GetTypeAsPrimitiveType();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100214 CHECK(type == Primitive::kPrimLong || type == Primitive::kPrimDouble) << PrettyField(this);
215 }
216 Set64<kTransactionActive>(object, j);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800217}
218
Ian Rogersef7d42f2014-01-06 12:55:46 -0800219inline float ArtField::GetFloat(Object* object) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700220 DCHECK_EQ(Primitive::kPrimFloat, GetTypeAsPrimitiveType()) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800221 JValue bits;
222 bits.SetI(Get32(object));
223 return bits.GetF();
224}
225
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100226template<bool kTransactionActive>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800227inline void ArtField::SetFloat(Object* object, float f) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700228 DCHECK_EQ(Primitive::kPrimFloat, GetTypeAsPrimitiveType()) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800229 JValue bits;
230 bits.SetF(f);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100231 Set32<kTransactionActive>(object, bits.GetI());
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800232}
233
Ian Rogersef7d42f2014-01-06 12:55:46 -0800234inline double ArtField::GetDouble(Object* object) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700235 DCHECK_EQ(Primitive::kPrimDouble, GetTypeAsPrimitiveType()) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800236 JValue bits;
237 bits.SetJ(Get64(object));
238 return bits.GetD();
239}
240
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100241template<bool kTransactionActive>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800242inline void ArtField::SetDouble(Object* object, double d) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700243 DCHECK_EQ(Primitive::kPrimDouble, GetTypeAsPrimitiveType()) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800244 JValue bits;
245 bits.SetD(d);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100246 Set64<kTransactionActive>(object, bits.GetJ());
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800247}
248
Ian Rogersef7d42f2014-01-06 12:55:46 -0800249inline Object* ArtField::GetObject(Object* object) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700250 DCHECK_EQ(Primitive::kPrimNot, GetTypeAsPrimitiveType()) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800251 return GetObj(object);
252}
253
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100254template<bool kTransactionActive>
Ian Rogersef7d42f2014-01-06 12:55:46 -0800255inline void ArtField::SetObject(Object* object, Object* l) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700256 DCHECK_EQ(Primitive::kPrimNot, GetTypeAsPrimitiveType()) << PrettyField(this);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100257 SetObj<kTransactionActive>(object, l);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800258}
259
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700260inline const char* ArtField::GetName() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
261 uint32_t field_index = GetDexFieldIndex();
262 if (UNLIKELY(GetDeclaringClass()->IsProxyClass())) {
263 DCHECK(IsStatic());
264 DCHECK_LT(field_index, 2U);
265 return field_index == 0 ? "interfaces" : "throws";
266 }
267 const DexFile* dex_file = GetDexFile();
268 return dex_file->GetFieldName(dex_file->GetFieldId(field_index));
269}
270
271inline const char* ArtField::GetTypeDescriptor() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
272 uint32_t field_index = GetDexFieldIndex();
273 if (UNLIKELY(GetDeclaringClass()->IsProxyClass())) {
274 DCHECK(IsStatic());
275 DCHECK_LT(field_index, 2U);
276 // 0 == Class[] interfaces; 1 == Class[][] throws;
277 return field_index == 0 ? "[Ljava/lang/Class;" : "[[Ljava/lang/Class;";
278 }
279 const DexFile* dex_file = GetDexFile();
280 const DexFile::FieldId& field_id = dex_file->GetFieldId(field_index);
281 return dex_file->GetFieldTypeDescriptor(field_id);
282}
283
284inline Primitive::Type ArtField::GetTypeAsPrimitiveType()
285 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
286 return Primitive::GetType(GetTypeDescriptor()[0]);
287}
288
289inline bool ArtField::IsPrimitiveType() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
290 return GetTypeAsPrimitiveType() != Primitive::kPrimNot;
291}
292
Ian Rogers08f1f502014-12-02 15:04:37 -0800293inline Class* ArtField::GetType(bool resolve) {
294 uint32_t field_index = GetDexFieldIndex();
295 if (UNLIKELY(GetDeclaringClass()->IsProxyClass())) {
296 return Runtime::Current()->GetClassLinker()->FindSystemClass(Thread::Current(),
297 GetTypeDescriptor());
298 }
299 const DexFile* dex_file = GetDexFile();
300 const DexFile::FieldId& field_id = dex_file->GetFieldId(field_index);
301 mirror::Class* type = GetDexCache()->GetResolvedType(field_id.type_idx_);
302 if (resolve && (type == nullptr)) {
303 type = Runtime::Current()->GetClassLinker()->ResolveType(field_id.type_idx_, this);
304 CHECK(type != nullptr || Thread::Current()->IsExceptionPending());
305 }
306 return type;
307}
308
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700309inline size_t ArtField::FieldSize() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700310 return Primitive::ComponentSize(GetTypeAsPrimitiveType());
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700311}
312
313inline mirror::DexCache* ArtField::GetDexCache() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
314 return GetDeclaringClass()->GetDexCache();
315}
316
317inline const DexFile* ArtField::GetDexFile() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
318 return GetDexCache()->GetDexFile();
319}
320
Mathieu Chartier76433272014-09-26 14:32:37 -0700321inline ArtField* ArtField::FromReflectedField(const ScopedObjectAccessAlreadyRunnable& soa,
322 jobject jlr_field) {
323 mirror::ArtField* f = soa.DecodeField(WellKnownClasses::java_lang_reflect_Field_artField);
324 mirror::ArtField* field = f->GetObject(soa.Decode<mirror::Object*>(jlr_field))->AsArtField();
325 DCHECK(field != nullptr);
326 return field;
327}
328
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800329} // namespace mirror
330} // namespace art
331
Brian Carlstromea46f952013-07-30 01:26:50 -0700332#endif // ART_RUNTIME_MIRROR_ART_FIELD_INL_H_