Clean up Field::CreateFromArtField().

Remove code dealing with the DexCache. This was obsolete
since switching to hash-based DexCache arrays. This makes
the last remaining template parameter unused, so remove it
and move the implementation to the .cc file.

Test: m test-art-host-gtest
Test: testrunner.py --host --optmizing
Test: aost_taimen-userdebug boots.
Change-Id: Ib2077028f45792e4357d9c57280ece70a22e47a2
diff --git a/runtime/dex/dex_file_annotations.cc b/runtime/dex/dex_file_annotations.cc
index 366d41c..6261a93 100644
--- a/runtime/dex/dex_file_annotations.cc
+++ b/runtime/dex/dex_file_annotations.cc
@@ -553,10 +553,7 @@
           return false;
         }
         set_object = true;
-        PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
-        element_object = (pointer_size == PointerSize::k64)
-            ? mirror::Field::CreateFromArtField<PointerSize::k64>(self, field, true)
-            : mirror::Field::CreateFromArtField<PointerSize::k32>(self, field, true);
+        element_object = mirror::Field::CreateFromArtField(self, field, true);
         if (element_object == nullptr) {
           return false;
         }
diff --git a/runtime/interpreter/unstarted_runtime.cc b/runtime/interpreter/unstarted_runtime.cc
index 6b10b7f..99cd547 100644
--- a/runtime/interpreter/unstarted_runtime.cc
+++ b/runtime/interpreter/unstarted_runtime.cc
@@ -48,7 +48,7 @@
 #include "mirror/array-inl.h"
 #include "mirror/class-alloc-inl.h"
 #include "mirror/executable-inl.h"
-#include "mirror/field-inl.h"
+#include "mirror/field.h"
 #include "mirror/method.h"
 #include "mirror/object-inl.h"
 #include "mirror/object_array-alloc-inl.h"
@@ -360,10 +360,7 @@
                            klass->PrettyDescriptor().c_str());
     return;
   }
-  PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
-  ObjPtr<mirror::Field> field = (pointer_size == PointerSize::k64)
-      ? mirror::Field::CreateFromArtField<PointerSize::k64>(self, found, true)
-      : mirror::Field::CreateFromArtField<PointerSize::k32>(self, found, true);
+  ObjPtr<mirror::Field> field = mirror::Field::CreateFromArtField(self, found, true);
   result->SetL(field);
 }
 
diff --git a/runtime/jni/jni_internal.cc b/runtime/jni/jni_internal.cc
index c3694dc..c178c38 100644
--- a/runtime/jni/jni_internal.cc
+++ b/runtime/jni/jni_internal.cc
@@ -47,7 +47,7 @@
 #include "mirror/class-inl.h"
 #include "mirror/class_loader.h"
 #include "mirror/dex_cache-inl.h"
-#include "mirror/field-inl.h"
+#include "mirror/field.h"
 #include "mirror/method.h"
 #include "mirror/object-inl.h"
 #include "mirror/object_array-alloc-inl.h"
@@ -544,7 +544,7 @@
     ScopedObjectAccess soa(env);
     ArtField* f = jni::DecodeArtField(fid);
     return soa.AddLocalReference<jobject>(
-        mirror::Field::CreateFromArtField<kRuntimePointerSize>(soa.Self(), f, true));
+        mirror::Field::CreateFromArtField(soa.Self(), f, true));
   }
 
   static jclass GetObjectClass(JNIEnv* env, jobject java_object) {
diff --git a/runtime/mirror/field-inl.h b/runtime/mirror/field-inl.h
index 9fe5eac..f1f8b25 100644
--- a/runtime/mirror/field-inl.h
+++ b/runtime/mirror/field-inl.h
@@ -22,7 +22,6 @@
 #include "art_field-inl.h"
 #include "class-alloc-inl.h"
 #include "class_root-inl.h"
-#include "dex_cache-inl.h"
 #include "object-inl.h"
 
 namespace art {
@@ -41,70 +40,6 @@
   return GetFieldObject<mirror::Class>(OFFSET_OF_OBJECT_MEMBER(Field, type_));
 }
 
-template <PointerSize kPointerSize>
-inline ObjPtr<mirror::Field> Field::CreateFromArtField(Thread* self,
-                                                       ArtField* field,
-                                                       bool force_resolve) {
-  StackHandleScope<2> hs(self);
-  // Try to resolve type before allocating since this is a thread suspension point.
-  Handle<mirror::Class> type = hs.NewHandle(field->ResolveType());
-
-  if (type == nullptr) {
-    if (force_resolve) {
-      if (kIsDebugBuild) {
-        self->AssertPendingException();
-      }
-      return nullptr;
-    } else {
-      // Can't resolve, clear the exception if it isn't OOME and continue with a null type.
-      mirror::Throwable* exception = self->GetException();
-      if (exception->GetClass()->DescriptorEquals("Ljava/lang/OutOfMemoryError;")) {
-        return nullptr;
-      }
-      self->ClearException();
-    }
-  }
-  auto ret = hs.NewHandle(ObjPtr<Field>::DownCast(GetClassRoot<Field>()->AllocObject(self)));
-  if (UNLIKELY(ret == nullptr)) {
-    self->AssertPendingOOMException();
-    return nullptr;
-  }
-  auto dex_field_index = field->GetDexFieldIndex();
-  auto* resolved_field = field->GetDexCache()->GetResolvedField(dex_field_index, kPointerSize);
-  if (field->GetDeclaringClass()->IsProxyClass()) {
-    DCHECK(field->IsStatic());
-    DCHECK_LT(dex_field_index, 2U);
-    // The two static fields (interfaces, throws) of all proxy classes
-    // share the same dex file indices 0 and 1. So, we can't resolve
-    // them in the dex cache.
-  } else {
-    if (resolved_field != nullptr) {
-      DCHECK_EQ(resolved_field, field);
-    } else {
-      // We rely on the field being resolved so that we can back to the ArtField
-      // (i.e. FromReflectedMethod).
-      field->GetDexCache()->SetResolvedField(dex_field_index, field, kPointerSize);
-    }
-  }
-  // We're initializing a newly allocated object, so we do not need to record that under
-  // a transaction. If the transaction is aborted, the whole object shall be unreachable.
-  ret->SetType</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>(type.Get());
-  ret->SetDeclaringClass</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>(
-      field->GetDeclaringClass());
-  ret->SetAccessFlags</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>(
-      field->GetAccessFlags());
-  auto iter_range = field->IsStatic() ? field->GetDeclaringClass()->GetSFields()
-                                      : field->GetDeclaringClass()->GetIFields();
-  auto position = std::find_if(
-      iter_range.begin(), iter_range.end(), [&](const auto& f) { return &f == field; });
-  DCHECK(position != iter_range.end());
-  ret->SetArtFieldIndex</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>(
-      std::distance(iter_range.begin(), position));
-  ret->SetOffset</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>(
-      field->GetOffset().Int32Value());
-  return ret.Get();
-}
-
 template<bool kTransactionActive, bool kCheckTransaction>
 inline void Field::SetDeclaringClass(ObjPtr<Class> c) {
   SetFieldObject<kTransactionActive, kCheckTransaction>(DeclaringClassOffset(), c);
diff --git a/runtime/mirror/field.cc b/runtime/mirror/field.cc
index e9669b8..7faa55c 100644
--- a/runtime/mirror/field.cc
+++ b/runtime/mirror/field.cc
@@ -45,14 +45,58 @@
 
 ArtField* Field::GetArtField() {
   ObjPtr<mirror::Class> declaring_class = GetDeclaringClass();
-  DCHECK_LT(GetArtFieldIndex(),
-            IsStatic() ? declaring_class->NumStaticFields() : declaring_class->NumInstanceFields());
   if (IsStatic()) {
+    DCHECK_LT(GetArtFieldIndex(), declaring_class->NumStaticFields());
     return declaring_class->GetStaticField(GetArtFieldIndex());
   } else {
+    DCHECK_LT(GetArtFieldIndex(), declaring_class->NumInstanceFields());
     return declaring_class->GetInstanceField(GetArtFieldIndex());
   }
 }
 
+ObjPtr<mirror::Field> Field::CreateFromArtField(Thread* self,
+                                                ArtField* field,
+                                                bool force_resolve) {
+  StackHandleScope<2> hs(self);
+  // Try to resolve type before allocating since this is a thread suspension point.
+  Handle<mirror::Class> type = hs.NewHandle(field->ResolveType());
+
+  if (type == nullptr) {
+    DCHECK(self->IsExceptionPending());
+    if (force_resolve) {
+      return nullptr;
+    } else {
+      // Can't resolve, clear the exception if it isn't OOME and continue with a null type.
+      mirror::Throwable* exception = self->GetException();
+      if (exception->GetClass()->DescriptorEquals("Ljava/lang/OutOfMemoryError;")) {
+        return nullptr;
+      }
+      self->ClearException();
+    }
+  }
+  auto ret = hs.NewHandle(ObjPtr<Field>::DownCast(GetClassRoot<Field>()->AllocObject(self)));
+  if (UNLIKELY(ret == nullptr)) {
+    self->AssertPendingOOMException();
+    return nullptr;
+  }
+  // We're initializing a newly allocated object, so we do not need to record that under
+  // a transaction. If the transaction is aborted, the whole object shall be unreachable.
+  ret->SetType</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>(type.Get());
+  ret->SetDeclaringClass</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>(
+      field->GetDeclaringClass());
+  ret->SetAccessFlags</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>(
+      field->GetAccessFlags());
+  auto iter_range = field->IsStatic() ? field->GetDeclaringClass()->GetSFields()
+                                      : field->GetDeclaringClass()->GetIFields();
+  auto position = std::find_if(
+      iter_range.begin(), iter_range.end(), [&](const auto& f) { return &f == field; });
+  DCHECK(position != iter_range.end());
+  ret->SetArtFieldIndex</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>(
+      std::distance(iter_range.begin(), position));
+  ret->SetOffset</*kTransactionActive=*/ false, /*kCheckTransaction=*/ false>(
+      field->GetOffset().Int32Value());
+  return ret.Get();
+}
+
 }  // namespace mirror
 }  // namespace art
diff --git a/runtime/mirror/field.h b/runtime/mirror/field.h
index f841908..63aac15 100644
--- a/runtime/mirror/field.h
+++ b/runtime/mirror/field.h
@@ -71,7 +71,6 @@
 
   ArtField* GetArtField() REQUIRES_SHARED(Locks::mutator_lock_);
 
-  template <PointerSize kPointerSize>
   static ObjPtr<mirror::Field> CreateFromArtField(Thread* self,
                                                   ArtField* field,
                                                   bool force_resolve)
diff --git a/runtime/native/java_lang_Class.cc b/runtime/native/java_lang_Class.cc
index c47d5e4..7ea0746 100644
--- a/runtime/native/java_lang_Class.cc
+++ b/runtime/native/java_lang_Class.cc
@@ -33,7 +33,7 @@
 #include "mirror/class-alloc-inl.h"
 #include "mirror/class-inl.h"
 #include "mirror/class_loader.h"
-#include "mirror/field-inl.h"
+#include "mirror/field.h"
 #include "mirror/method.h"
 #include "mirror/method_handles_lookup.h"
 #include "mirror/object-inl.h"
@@ -312,7 +312,7 @@
   for (ArtField& field : ifields) {
     if (IsDiscoverable(public_only, hiddenapi_context, &field)) {
       ObjPtr<mirror::Field> reflect_field =
-          mirror::Field::CreateFromArtField<kRuntimePointerSize>(self, &field, force_resolve);
+          mirror::Field::CreateFromArtField(self, &field, force_resolve);
       if (reflect_field == nullptr) {
         if (kIsDebugBuild) {
           self->AssertPendingException();
@@ -326,7 +326,7 @@
   for (ArtField& field : sfields) {
     if (IsDiscoverable(public_only, hiddenapi_context, &field)) {
       ObjPtr<mirror::Field> reflect_field =
-          mirror::Field::CreateFromArtField<kRuntimePointerSize>(self, &field, force_resolve);
+          mirror::Field::CreateFromArtField(self, &field, force_resolve);
       if (reflect_field == nullptr) {
         if (kIsDebugBuild) {
           self->AssertPendingException();
@@ -417,11 +417,11 @@
   }
   ArtField* art_field = FindFieldByName(name, c->GetIFieldsPtr());
   if (art_field != nullptr) {
-    return mirror::Field::CreateFromArtField<kRuntimePointerSize>(self, art_field, true);
+    return mirror::Field::CreateFromArtField(self, art_field, true);
   }
   art_field = FindFieldByName(name, c->GetSFieldsPtr());
   if (art_field != nullptr) {
-    return mirror::Field::CreateFromArtField<kRuntimePointerSize>(self, art_field, true);
+    return mirror::Field::CreateFromArtField(self, art_field, true);
   }
   return nullptr;
 }
diff --git a/runtime/native/java_lang_invoke_MethodHandleImpl.cc b/runtime/native/java_lang_invoke_MethodHandleImpl.cc
index c1060fe..45d9a8a 100644
--- a/runtime/native/java_lang_invoke_MethodHandleImpl.cc
+++ b/runtime/native/java_lang_invoke_MethodHandleImpl.cc
@@ -43,8 +43,8 @@
   MutableHandle<mirror::Object> h_object(hs.NewHandle<mirror::Object>(nullptr));
   if (handle_kind >= mirror::MethodHandle::kFirstAccessorKind) {
     ArtField* const field = handle->GetTargetField();
-    h_object.Assign(mirror::Field::CreateFromArtField<kRuntimePointerSize>(
-        soa.Self(), field, /* force_resolve= */ false));
+    h_object.Assign(
+        mirror::Field::CreateFromArtField(soa.Self(), field, /* force_resolve= */ false));
   } else {
     ArtMethod* const method = handle->GetTargetMethod();
     if (method->IsConstructor()) {
diff --git a/runtime/proxy_test.cc b/runtime/proxy_test.cc
index 76e036a..d8e170b 100644
--- a/runtime/proxy_test.cc
+++ b/runtime/proxy_test.cc
@@ -20,7 +20,7 @@
 #include "art_field-inl.h"
 #include "base/enums.h"
 #include "common_runtime_test.h"
-#include "mirror/field-inl.h"
+#include "mirror/field.h"
 #include "proxy_test.h"
 #include "scoped_thread_state_change-inl.h"
 #include "well_known_classes.h"
@@ -173,17 +173,13 @@
   ASSERT_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
   ASSERT_FALSE(Runtime::Current()->IsActiveTransaction());
   Handle<mirror::Field> field00 =
-      hs.NewHandle(mirror::Field::CreateFromArtField<kRuntimePointerSize>(
-          soa.Self(), &static_fields0->At(0), true));
+      hs.NewHandle(mirror::Field::CreateFromArtField(soa.Self(), &static_fields0->At(0), true));
   Handle<mirror::Field> field01 =
-      hs.NewHandle(mirror::Field::CreateFromArtField<kRuntimePointerSize>(
-          soa.Self(), &static_fields0->At(1), true));
+      hs.NewHandle(mirror::Field::CreateFromArtField(soa.Self(), &static_fields0->At(1), true));
   Handle<mirror::Field> field10 =
-      hs.NewHandle(mirror::Field::CreateFromArtField<kRuntimePointerSize>(
-          soa.Self(), &static_fields1->At(0), true));
+      hs.NewHandle(mirror::Field::CreateFromArtField(soa.Self(), &static_fields1->At(0), true));
   Handle<mirror::Field> field11 =
-      hs.NewHandle(mirror::Field::CreateFromArtField<kRuntimePointerSize>(
-          soa.Self(), &static_fields1->At(1), true));
+      hs.NewHandle(mirror::Field::CreateFromArtField(soa.Self(), &static_fields1->At(1), true));
   EXPECT_EQ(field00->GetArtField(), &static_fields0->At(0));
   EXPECT_EQ(field01->GetArtField(), &static_fields0->At(1));
   EXPECT_EQ(field10->GetArtField(), &static_fields1->At(0));