Add missing push/pop shadow frame to artInterpreterToCompiledCodeBridge.
EnsureInitialized can cause GC to occur. Since the shadow frame wasn't
being pushed it meant that the references inside wouldn't get updated
by the moving garbage collector.
Bug: 12022098
Change-Id: I1f3fda41d14a2cf51cf524874de54d7766c362e9
diff --git a/runtime/entrypoints/interpreter/interpreter_entrypoints.cc b/runtime/entrypoints/interpreter/interpreter_entrypoints.cc
index 05c02f2..df4ec3a 100644
--- a/runtime/entrypoints/interpreter/interpreter_entrypoints.cc
+++ b/runtime/entrypoints/interpreter/interpreter_entrypoints.cc
@@ -33,11 +33,14 @@
if (method->IsStatic()) {
mirror::Class* declaringClass = method->GetDeclaringClass();
if (UNLIKELY(!declaringClass->IsInitializing())) {
+ self->PushShadowFrame(shadow_frame);
if (UNLIKELY(!Runtime::Current()->GetClassLinker()->EnsureInitialized(declaringClass,
true, true))) {
- DCHECK(Thread::Current()->IsExceptionPending());
+ self->PopShadowFrame();
+ DCHECK(self->IsExceptionPending());
return;
}
+ self->PopShadowFrame();
CHECK(declaringClass->IsInitializing());
}
}