Revert "Disable opaque JNI Ids for now."
We were incorrectly using a potentially out-of-date pointer to access
class object fields. This could cause segvs if the class object moves
during certain allocations relating to JNI id allocation.
This reverts commit 1be9c72dd49e7620dd76a8b9cef23d7cde0a6b01.
Reason for revert: Fixed issue with gcstress
Test: ./test.py --host --debuggable --gcstress
Bug: 134162467
Change-Id: I6ee7fc4485bbae6f0f1d4f4af0e8c2bc88bf4075
diff --git a/runtime/mirror/class.cc b/runtime/mirror/class.cc
index c0a950d..23df946 100644
--- a/runtime/mirror/class.cc
+++ b/runtime/mirror/class.cc
@@ -1558,17 +1558,15 @@
return ext->GetJMethodIDs();
}
}
-ObjPtr<PointerArray> Class::GetOrCreateMethodIds() {
+ObjPtr<PointerArray> Class::GetOrCreateMethodIds(Handle<Class> h_this) {
DCHECK(Runtime::Current()->JniIdsAreIndices()) << "JNI Ids are pointers!";
Thread* self = Thread::Current();
- StackHandleScope<1> hs(self);
- Handle<Class> h_this(hs.NewHandle(this));
ObjPtr<ClassExt> ext(EnsureExtDataPresent(h_this, self));
if (ext.IsNull()) {
self->AssertPendingOOMException();
return nullptr;
}
- return ext->EnsureJMethodIDsArrayPresent(NumMethods());
+ return ext->EnsureJMethodIDsArrayPresent(h_this->NumMethods());
}
ObjPtr<PointerArray> Class::GetStaticFieldIds() {
@@ -1579,17 +1577,15 @@
return ext->GetStaticJFieldIDs();
}
}
-ObjPtr<PointerArray> Class::GetOrCreateStaticFieldIds() {
+ObjPtr<PointerArray> Class::GetOrCreateStaticFieldIds(Handle<Class> h_this) {
DCHECK(Runtime::Current()->JniIdsAreIndices()) << "JNI Ids are pointers!";
Thread* self = Thread::Current();
- StackHandleScope<1> hs(self);
- Handle<Class> h_this(hs.NewHandle(this));
ObjPtr<ClassExt> ext(EnsureExtDataPresent(h_this, self));
if (ext.IsNull()) {
self->AssertPendingOOMException();
return nullptr;
}
- return ext->EnsureStaticJFieldIDsArrayPresent(NumStaticFields());
+ return ext->EnsureStaticJFieldIDsArrayPresent(h_this->NumStaticFields());
}
ObjPtr<PointerArray> Class::GetInstanceFieldIds() {
ObjPtr<ClassExt> ext(GetExtData());
@@ -1599,17 +1595,15 @@
return ext->GetInstanceJFieldIDs();
}
}
-ObjPtr<PointerArray> Class::GetOrCreateInstanceFieldIds() {
+ObjPtr<PointerArray> Class::GetOrCreateInstanceFieldIds(Handle<Class> h_this) {
DCHECK(Runtime::Current()->JniIdsAreIndices()) << "JNI Ids are pointers!";
Thread* self = Thread::Current();
- StackHandleScope<1> hs(self);
- Handle<Class> h_this(hs.NewHandle(this));
ObjPtr<ClassExt> ext(EnsureExtDataPresent(h_this, self));
if (ext.IsNull()) {
self->AssertPendingOOMException();
return nullptr;
}
- return ext->EnsureInstanceJFieldIDsArrayPresent(NumInstanceFields());
+ return ext->EnsureInstanceJFieldIDsArrayPresent(h_this->NumInstanceFields());
}
size_t Class::GetStaticFieldIdOffset(ArtField* field) {