diff options
| author | 2013-12-10 14:37:16 -0800 | |
|---|---|---|
| committer | 2013-12-10 14:52:12 -0800 | |
| commit | f043de4fbcf8eaa72b55597ccc6b2ea5b26a24d2 (patch) | |
| tree | 4072447aba9429f9c87d1b6a0d68f2297be5d4e4 | |
| parent | fa365d2fa097810f31d6cb1b1ef415636bc63af8 (diff) | |
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
| -rw-r--r-- | runtime/entrypoints/interpreter/interpreter_entrypoints.cc | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/runtime/entrypoints/interpreter/interpreter_entrypoints.cc b/runtime/entrypoints/interpreter/interpreter_entrypoints.cc index 05c02f22fa..df4ec3a6ce 100644 --- a/runtime/entrypoints/interpreter/interpreter_entrypoints.cc +++ b/runtime/entrypoints/interpreter/interpreter_entrypoints.cc @@ -33,11 +33,14 @@ extern "C" void artInterpreterToCompiledCodeBridge(Thread* self, MethodHelper& m 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()); } } |