blob: aeb127358c0786f404176170b10654721c89fb35 [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
Mathieu Chartierc7853442015-03-27 14:35:38 -070017#ifndef ART_RUNTIME_ART_FIELD_INL_H_
18#define ART_RUNTIME_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 Rogers1d54e732013-05-02 21:10:01 -070024#include "gc/accounting/card_table-inl.h"
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080025#include "jvalue.h"
Mathieu Chartierc7853442015-03-27 14:35:38 -070026#include "mirror/dex_cache.h"
27#include "mirror/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 {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080034
Mathieu Chartierc7853442015-03-27 14:35:38 -070035inline mirror::Class* ArtField::GetDeclaringClass() {
36 mirror::Class* result = declaring_class_.Read();
37 DCHECK(result != nullptr);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080038 DCHECK(result->IsLoaded() || result->IsErroneous());
39 return result;
40}
41
Mathieu Chartierc7853442015-03-27 14:35:38 -070042inline void ArtField::SetDeclaringClass(mirror::Class* new_declaring_class) {
43 declaring_class_ = GcRoot<mirror::Class>(new_declaring_class);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080044}
45
Ian Rogersef7d42f2014-01-06 12:55:46 -080046inline uint32_t ArtField::GetAccessFlags() {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080047 DCHECK(GetDeclaringClass()->IsLoaded() || GetDeclaringClass()->IsErroneous());
Mathieu Chartierc7853442015-03-27 14:35:38 -070048 return access_flags_;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080049}
50
Ian Rogersef7d42f2014-01-06 12:55:46 -080051inline MemberOffset ArtField::GetOffset() {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080052 DCHECK(GetDeclaringClass()->IsResolved() || GetDeclaringClass()->IsErroneous());
Mathieu Chartierc7853442015-03-27 14:35:38 -070053 return MemberOffset(offset_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080054}
55
Ian Rogersef7d42f2014-01-06 12:55:46 -080056inline MemberOffset ArtField::GetOffsetDuringLinking() {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080057 DCHECK(GetDeclaringClass()->IsLoaded() || GetDeclaringClass()->IsErroneous());
Mathieu Chartierc7853442015-03-27 14:35:38 -070058 return MemberOffset(offset_);
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080059}
60
Mathieu Chartierc7853442015-03-27 14:35:38 -070061inline uint32_t ArtField::Get32(mirror::Object* object) {
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070062 DCHECK(object != nullptr) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080063 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070064 if (UNLIKELY(IsVolatile())) {
65 return object->GetField32Volatile(GetOffset());
66 }
67 return object->GetField32(GetOffset());
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080068}
69
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +010070template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -070071inline void ArtField::Set32(mirror::Object* object, uint32_t new_value) {
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070072 DCHECK(object != nullptr) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080073 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070074 if (UNLIKELY(IsVolatile())) {
75 object->SetField32Volatile<kTransactionActive>(GetOffset(), new_value);
76 } else {
77 object->SetField32<kTransactionActive>(GetOffset(), new_value);
78 }
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080079}
80
Mathieu Chartierc7853442015-03-27 14:35:38 -070081inline uint64_t ArtField::Get64(mirror::Object* object) {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080082 DCHECK(object != NULL) << PrettyField(this);
83 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070084 if (UNLIKELY(IsVolatile())) {
85 return object->GetField64Volatile(GetOffset());
86 }
87 return object->GetField64(GetOffset());
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080088}
89
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +010090template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -070091inline void ArtField::Set64(mirror::Object* object, uint64_t new_value) {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080092 DCHECK(object != NULL) << PrettyField(this);
93 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070094 if (UNLIKELY(IsVolatile())) {
95 object->SetField64Volatile<kTransactionActive>(GetOffset(), new_value);
96 } else {
97 object->SetField64<kTransactionActive>(GetOffset(), new_value);
98 }
Ian Rogersc0fa3ad2013-02-05 00:11:55 -080099}
100
Mathieu Chartierc7853442015-03-27 14:35:38 -0700101inline mirror::Object* ArtField::GetObj(mirror::Object* object) {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800102 DCHECK(object != NULL) << PrettyField(this);
103 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700104 if (UNLIKELY(IsVolatile())) {
Mathieu Chartierc7853442015-03-27 14:35:38 -0700105 return object->GetFieldObjectVolatile<mirror::Object>(GetOffset());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700106 }
Mathieu Chartierc7853442015-03-27 14:35:38 -0700107 return object->GetFieldObject<mirror::Object>(GetOffset());
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800108}
109
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100110template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -0700111inline void ArtField::SetObj(mirror::Object* object, mirror::Object* new_value) {
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800112 DCHECK(object != NULL) << PrettyField(this);
113 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted());
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700114 if (UNLIKELY(IsVolatile())) {
115 object->SetFieldObjectVolatile<kTransactionActive>(GetOffset(), new_value);
116 } else {
117 object->SetFieldObject<kTransactionActive>(GetOffset(), new_value);
118 }
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800119}
120
Fred Shih37f05ef2014-07-16 18:38:08 -0700121#define FIELD_GET(object, type) \
122 DCHECK_EQ(Primitive::kPrim ## type, GetTypeAsPrimitiveType()) << PrettyField(this); \
123 DCHECK(object != nullptr) << PrettyField(this); \
124 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted()); \
125 if (UNLIKELY(IsVolatile())) { \
126 return object->GetField ## type ## Volatile(GetOffset()); \
127 } \
128 return object->GetField ## type(GetOffset());
129
130#define FIELD_SET(object, type, value) \
131 DCHECK_EQ(Primitive::kPrim ## type, GetTypeAsPrimitiveType()) << PrettyField(this); \
132 DCHECK(object != nullptr) << PrettyField(this); \
133 DCHECK(!IsStatic() || (object == GetDeclaringClass()) || !Runtime::Current()->IsStarted()); \
134 if (UNLIKELY(IsVolatile())) { \
135 object->SetField ## type ## Volatile<kTransactionActive>(GetOffset(), value); \
136 } else { \
137 object->SetField ## type<kTransactionActive>(GetOffset(), value); \
138 }
139
Mathieu Chartierc7853442015-03-27 14:35:38 -0700140inline uint8_t ArtField::GetBoolean(mirror::Object* object) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700141 FIELD_GET(object, Boolean);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800142}
143
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100144template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -0700145inline void ArtField::SetBoolean(mirror::Object* object, uint8_t z) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700146 FIELD_SET(object, Boolean, z);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800147}
148
Mathieu Chartierc7853442015-03-27 14:35:38 -0700149inline int8_t ArtField::GetByte(mirror::Object* object) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700150 FIELD_GET(object, Byte);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800151}
152
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100153template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -0700154inline void ArtField::SetByte(mirror::Object* object, int8_t b) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700155 FIELD_SET(object, Byte, b);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800156}
157
Mathieu Chartierc7853442015-03-27 14:35:38 -0700158inline uint16_t ArtField::GetChar(mirror::Object* object) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700159 FIELD_GET(object, Char);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800160}
161
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100162template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -0700163inline void ArtField::SetChar(mirror::Object* object, uint16_t c) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700164 FIELD_SET(object, Char, c);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800165}
166
Mathieu Chartierc7853442015-03-27 14:35:38 -0700167inline int16_t ArtField::GetShort(mirror::Object* object) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700168 FIELD_GET(object, Short);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800169}
170
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100171template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -0700172inline void ArtField::SetShort(mirror::Object* object, int16_t s) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700173 FIELD_SET(object, Short, s);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800174}
175
Fred Shih37f05ef2014-07-16 18:38:08 -0700176#undef FIELD_GET
177#undef FIELD_SET
178
Mathieu Chartierc7853442015-03-27 14:35:38 -0700179inline int32_t ArtField::GetInt(mirror::Object* object) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100180 if (kIsDebugBuild) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700181 Primitive::Type type = GetTypeAsPrimitiveType();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100182 CHECK(type == Primitive::kPrimInt || type == Primitive::kPrimFloat) << PrettyField(this);
183 }
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800184 return Get32(object);
185}
186
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100187template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -0700188inline void ArtField::SetInt(mirror::Object* object, int32_t i) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100189 if (kIsDebugBuild) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700190 Primitive::Type type = GetTypeAsPrimitiveType();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100191 CHECK(type == Primitive::kPrimInt || type == Primitive::kPrimFloat) << PrettyField(this);
192 }
193 Set32<kTransactionActive>(object, i);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800194}
195
Mathieu Chartierc7853442015-03-27 14:35:38 -0700196inline int64_t ArtField::GetLong(mirror::Object* object) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100197 if (kIsDebugBuild) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700198 Primitive::Type type = GetTypeAsPrimitiveType();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100199 CHECK(type == Primitive::kPrimLong || type == Primitive::kPrimDouble) << PrettyField(this);
200 }
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800201 return Get64(object);
202}
203
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100204template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -0700205inline void ArtField::SetLong(mirror::Object* object, int64_t j) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100206 if (kIsDebugBuild) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700207 Primitive::Type type = GetTypeAsPrimitiveType();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100208 CHECK(type == Primitive::kPrimLong || type == Primitive::kPrimDouble) << PrettyField(this);
209 }
210 Set64<kTransactionActive>(object, j);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800211}
212
Mathieu Chartierc7853442015-03-27 14:35:38 -0700213inline float ArtField::GetFloat(mirror::Object* object) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700214 DCHECK_EQ(Primitive::kPrimFloat, GetTypeAsPrimitiveType()) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800215 JValue bits;
216 bits.SetI(Get32(object));
217 return bits.GetF();
218}
219
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100220template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -0700221inline void ArtField::SetFloat(mirror::Object* object, float f) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700222 DCHECK_EQ(Primitive::kPrimFloat, GetTypeAsPrimitiveType()) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800223 JValue bits;
224 bits.SetF(f);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100225 Set32<kTransactionActive>(object, bits.GetI());
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800226}
227
Mathieu Chartierc7853442015-03-27 14:35:38 -0700228inline double ArtField::GetDouble(mirror::Object* object) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700229 DCHECK_EQ(Primitive::kPrimDouble, GetTypeAsPrimitiveType()) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800230 JValue bits;
231 bits.SetJ(Get64(object));
232 return bits.GetD();
233}
234
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100235template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -0700236inline void ArtField::SetDouble(mirror::Object* object, double d) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700237 DCHECK_EQ(Primitive::kPrimDouble, GetTypeAsPrimitiveType()) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800238 JValue bits;
239 bits.SetD(d);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100240 Set64<kTransactionActive>(object, bits.GetJ());
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800241}
242
Mathieu Chartierc7853442015-03-27 14:35:38 -0700243inline mirror::Object* ArtField::GetObject(mirror::Object* object) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700244 DCHECK_EQ(Primitive::kPrimNot, GetTypeAsPrimitiveType()) << PrettyField(this);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800245 return GetObj(object);
246}
247
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100248template<bool kTransactionActive>
Mathieu Chartierc7853442015-03-27 14:35:38 -0700249inline void ArtField::SetObject(mirror::Object* object, mirror::Object* l) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700250 DCHECK_EQ(Primitive::kPrimNot, GetTypeAsPrimitiveType()) << PrettyField(this);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100251 SetObj<kTransactionActive>(object, l);
Ian Rogersc0fa3ad2013-02-05 00:11:55 -0800252}
253
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700254inline const char* ArtField::GetName() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
255 uint32_t field_index = GetDexFieldIndex();
256 if (UNLIKELY(GetDeclaringClass()->IsProxyClass())) {
257 DCHECK(IsStatic());
258 DCHECK_LT(field_index, 2U);
259 return field_index == 0 ? "interfaces" : "throws";
260 }
261 const DexFile* dex_file = GetDexFile();
262 return dex_file->GetFieldName(dex_file->GetFieldId(field_index));
263}
264
265inline const char* ArtField::GetTypeDescriptor() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
266 uint32_t field_index = GetDexFieldIndex();
267 if (UNLIKELY(GetDeclaringClass()->IsProxyClass())) {
268 DCHECK(IsStatic());
269 DCHECK_LT(field_index, 2U);
270 // 0 == Class[] interfaces; 1 == Class[][] throws;
271 return field_index == 0 ? "[Ljava/lang/Class;" : "[[Ljava/lang/Class;";
272 }
273 const DexFile* dex_file = GetDexFile();
274 const DexFile::FieldId& field_id = dex_file->GetFieldId(field_index);
275 return dex_file->GetFieldTypeDescriptor(field_id);
276}
277
278inline Primitive::Type ArtField::GetTypeAsPrimitiveType()
279 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
280 return Primitive::GetType(GetTypeDescriptor()[0]);
281}
282
283inline bool ArtField::IsPrimitiveType() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
284 return GetTypeAsPrimitiveType() != Primitive::kPrimNot;
285}
286
Mathieu Chartierdaaf3262015-03-24 13:30:28 -0700287template <bool kResolve>
Mathieu Chartierc7853442015-03-27 14:35:38 -0700288inline mirror::Class* ArtField::GetType() {
Mathieu Chartierdaaf3262015-03-24 13:30:28 -0700289 const uint32_t field_index = GetDexFieldIndex();
290 auto* declaring_class = GetDeclaringClass();
291 if (UNLIKELY(declaring_class->IsProxyClass())) {
Ian Rogers08f1f502014-12-02 15:04:37 -0800292 return Runtime::Current()->GetClassLinker()->FindSystemClass(Thread::Current(),
293 GetTypeDescriptor());
294 }
Mathieu Chartierdaaf3262015-03-24 13:30:28 -0700295 auto* dex_cache = declaring_class->GetDexCache();
296 const DexFile* const dex_file = dex_cache->GetDexFile();
Ian Rogers08f1f502014-12-02 15:04:37 -0800297 const DexFile::FieldId& field_id = dex_file->GetFieldId(field_index);
Mathieu Chartierdaaf3262015-03-24 13:30:28 -0700298 mirror::Class* type = dex_cache->GetResolvedType(field_id.type_idx_);
299 if (kResolve && UNLIKELY(type == nullptr)) {
Ian Rogers08f1f502014-12-02 15:04:37 -0800300 type = Runtime::Current()->GetClassLinker()->ResolveType(field_id.type_idx_, this);
301 CHECK(type != nullptr || Thread::Current()->IsExceptionPending());
302 }
303 return type;
304}
305
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700306inline size_t ArtField::FieldSize() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700307 return Primitive::ComponentSize(GetTypeAsPrimitiveType());
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700308}
309
310inline mirror::DexCache* ArtField::GetDexCache() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
311 return GetDeclaringClass()->GetDexCache();
312}
313
314inline const DexFile* ArtField::GetDexFile() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
315 return GetDexCache()->GetDexFile();
316}
317
Mathieu Chartierc7853442015-03-27 14:35:38 -0700318inline mirror::String* ArtField::GetStringName(Thread* self, bool resolve) {
Mathieu Chartierdaaf3262015-03-24 13:30:28 -0700319 auto dex_field_index = GetDexFieldIndex();
320 CHECK_NE(dex_field_index, DexFile::kDexNoIndex);
321 auto* dex_cache = GetDexCache();
322 const auto* dex_file = dex_cache->GetDexFile();
323 const auto& field_id = dex_file->GetFieldId(dex_field_index);
324 auto* name = dex_cache->GetResolvedString(field_id.name_idx_);
325 if (resolve && name == nullptr) {
326 StackHandleScope<1> hs(self);
327 name = Runtime::Current()->GetClassLinker()->ResolveString(
328 *dex_file, field_id.name_idx_, hs.NewHandle(dex_cache));
329 }
330 return name;
Mathieu Chartier76433272014-09-26 14:32:37 -0700331}
332
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800333} // namespace art
334
Mathieu Chartierc7853442015-03-27 14:35:38 -0700335#endif // ART_RUNTIME_ART_FIELD_INL_H_