Clean up initialization checks for entrypoints.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing --jit
Test: aosp_taimen-userdebug boots.
Test: run-gtests.sh
Test: testrunner.py --target --optimizing --jit
Bug: 18161648
Change-Id: Ia3c2fdb616a5bb289e5afeccd4e6fe3eaf7ed697
diff --git a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
index 4a127eb..34a165f 100644
--- a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
+++ b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
@@ -774,7 +774,7 @@
self->PushShadowFrame(shadow_frame);
self->EndAssertNoThreadSuspension(old_cause);
- if (method->IsStatic()) {
+ if (NeedsClinitCheckBeforeCall(method)) {
ObjPtr<mirror::Class> declaring_class = method->GetDeclaringClass();
if (UNLIKELY(!declaring_class->IsVisiblyInitialized())) {
// Ensure static method's class is initialized.
@@ -1456,10 +1456,13 @@
<< invoke_type << " " << orig_called->GetVtableIndex();
}
- // Ensure that the called method's class is initialized.
- StackHandleScope<1> hs(soa.Self());
- Handle<mirror::Class> called_class(hs.NewHandle(called->GetDeclaringClass()));
- linker->EnsureInitialized(soa.Self(), called_class, true, true);
+ ObjPtr<mirror::Class> called_class = called->GetDeclaringClass();
+ if (NeedsClinitCheckBeforeCall(called) && !called_class->IsVisiblyInitialized()) {
+ // Ensure that the called method's class is initialized.
+ StackHandleScope<1> hs(soa.Self());
+ HandleWrapperObjPtr<mirror::Class> h_called_class(hs.NewHandleWrapper(&called_class));
+ linker->EnsureInitialized(soa.Self(), h_called_class, true, true);
+ }
bool force_interpreter = self->IsForceInterpreter() && !called->IsNative();
if (called_class->IsInitialized() || called_class->IsInitializing()) {
if (UNLIKELY(force_interpreter ||
@@ -2379,15 +2382,18 @@
// We can set the entrypoint of a native method to generic JNI even when the
// class hasn't been initialized, so we need to do the initialization check
// before invoking the native code.
- if (called->NeedsInitializationCheck()) {
- // Ensure static method's class is initialized.
- StackHandleScope<1> hs(self);
- Handle<mirror::Class> h_class(hs.NewHandle(called->GetDeclaringClass()));
- if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(self, h_class, true, true)) {
- DCHECK(Thread::Current()->IsExceptionPending()) << called->PrettyMethod();
- self->PopHandleScope();
- // A negative value denotes an error.
- return GetTwoWordFailureValue();
+ if (NeedsClinitCheckBeforeCall(called)) {
+ ObjPtr<mirror::Class> declaring_class = called->GetDeclaringClass();
+ if (UNLIKELY(!declaring_class->IsVisiblyInitialized())) {
+ // Ensure static method's class is initialized.
+ StackHandleScope<1> hs(self);
+ Handle<mirror::Class> h_class(hs.NewHandle(declaring_class));
+ if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(self, h_class, true, true)) {
+ DCHECK(Thread::Current()->IsExceptionPending()) << called->PrettyMethod();
+ self->PopHandleScope();
+ // A negative value denotes an error.
+ return GetTwoWordFailureValue();
+ }
}
}