diff options
Diffstat (limited to 'runtime/mirror/field.cc')
-rw-r--r-- | runtime/mirror/field.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/runtime/mirror/field.cc b/runtime/mirror/field.cc index f6b64897fa..54034c2bbf 100644 --- a/runtime/mirror/field.cc +++ b/runtime/mirror/field.cc @@ -68,8 +68,16 @@ ArtField* Field::GetArtField() { } } mirror::DexCache* const dex_cache = declaring_class->GetDexCache(); - ArtField* const art_field = dex_cache->GetResolvedField(GetDexFieldIndex(), kRuntimePointerSize); - CHECK(art_field != nullptr); + ArtField* art_field = dex_cache->GetResolvedField(GetDexFieldIndex(), kRuntimePointerSize); + if (UNLIKELY(art_field == nullptr)) { + if (IsStatic()) { + art_field = declaring_class->FindDeclaredStaticField(dex_cache, GetDexFieldIndex()); + } else { + art_field = declaring_class->FindInstanceField(dex_cache, GetDexFieldIndex()); + } + CHECK(art_field != nullptr); + dex_cache->SetResolvedField(GetDexFieldIndex(), art_field, kRuntimePointerSize); + } CHECK_EQ(declaring_class, art_field->GetDeclaringClass()); return art_field; } |