Revert^2 "Support using opaque JNI ids"

We weren't handing the fact that encoding jmethodIDs could cause OOM
exceptions in some places in reflection.cc. This could lead to
attempting to use a null jmethodID as if it were a real id. This issue
is fixed by the parent CL.

This reverts commit b476a29a2c.
This reverts commit 3b2905366c.
This Unreverts commit d5d645ffec.
This Unreverts commit 21d5994583.

Reason for revert: Fixed issue causing 004 debuggable flakes
Test: ./test.py --host --jit --debuggable
Bug: 134162467

Change-Id: Iece08ab299cd8a20f8382be7be6c3796858e70eb
diff --git a/runtime/mirror/class_ext-inl.h b/runtime/mirror/class_ext-inl.h
index bf51654..ead02ee 100644
--- a/runtime/mirror/class_ext-inl.h
+++ b/runtime/mirror/class_ext-inl.h
@@ -19,12 +19,81 @@
 
 #include "class_ext.h"
 
+#include "array-inl.h"
 #include "art_method-inl.h"
+#include "handle_scope.h"
 #include "object-inl.h"
 
 namespace art {
 namespace mirror {
 
+template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption>
+inline ObjPtr<PointerArray> ClassExt::EnsureJniIdsArrayPresent(MemberOffset off, size_t count) {
+  ObjPtr<PointerArray> existing(
+      GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>(off));
+  if (!existing.IsNull()) {
+    return existing;
+  }
+  Thread* self = Thread::Current();
+  StackHandleScope<2> hs(self);
+  Handle<ClassExt> h_this(hs.NewHandle(this));
+  Handle<PointerArray> new_arr(
+      hs.NewHandle(Runtime::Current()->GetClassLinker()->AllocPointerArray(self, count)));
+  if (new_arr.IsNull()) {
+    // Fail.
+    self->AssertPendingOOMException();
+    return nullptr;
+  }
+  bool set;
+  // Set the ext_data_ field using CAS semantics.
+  if (Runtime::Current()->IsActiveTransaction()) {
+    set = h_this->CasFieldObject<true>(
+        off, nullptr, new_arr.Get(), CASMode::kStrong, std::memory_order_seq_cst);
+  } else {
+    set = h_this->CasFieldObject<false>(
+        off, nullptr, new_arr.Get(), CASMode::kStrong, std::memory_order_seq_cst);
+  }
+  ObjPtr<PointerArray> ret(
+      set ? new_arr.Get()
+          : h_this->GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>(off));
+  CHECK(!ret.IsNull());
+  return ret;
+}
+
+template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption>
+inline ObjPtr<PointerArray> ClassExt::EnsureJMethodIDsArrayPresent(size_t count) {
+  return EnsureJniIdsArrayPresent<kVerifyFlags, kReadBarrierOption>(
+      MemberOffset(OFFSET_OF_OBJECT_MEMBER(ClassExt, jmethod_ids_)), count);
+}
+template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption>
+inline ObjPtr<PointerArray> ClassExt::EnsureStaticJFieldIDsArrayPresent(size_t count) {
+  return EnsureJniIdsArrayPresent<kVerifyFlags, kReadBarrierOption>(
+      MemberOffset(OFFSET_OF_OBJECT_MEMBER(ClassExt, static_jfield_ids_)), count);
+}
+template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption>
+inline ObjPtr<PointerArray> ClassExt::EnsureInstanceJFieldIDsArrayPresent(size_t count) {
+  return EnsureJniIdsArrayPresent<kVerifyFlags, kReadBarrierOption>(
+      MemberOffset(OFFSET_OF_OBJECT_MEMBER(ClassExt, instance_jfield_ids_)), count);
+}
+
+template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption>
+inline ObjPtr<PointerArray> ClassExt::GetInstanceJFieldIDs() {
+  return GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>(
+      OFFSET_OF_OBJECT_MEMBER(ClassExt, instance_jfield_ids_));
+}
+
+template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption>
+inline ObjPtr<PointerArray> ClassExt::GetStaticJFieldIDs() {
+  return GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>(
+      OFFSET_OF_OBJECT_MEMBER(ClassExt, static_jfield_ids_));
+}
+
+template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption>
+inline ObjPtr<PointerArray> ClassExt::GetJMethodIDs() {
+  return GetFieldObject<PointerArray, kVerifyFlags, kReadBarrierOption>(
+      OFFSET_OF_OBJECT_MEMBER(ClassExt, jmethod_ids_));
+}
+
 inline ObjPtr<Object> ClassExt::GetVerifyError() {
   return GetFieldObject<ClassExt>(OFFSET_OF_OBJECT_MEMBER(ClassExt, verify_error_));
 }