diff options
author | 2014-05-15 12:39:19 -0700 | |
---|---|---|
committer | 2014-05-22 10:47:44 -0700 | |
commit | e09ae0920be57760fb390b6944bce420fa0b5582 (patch) | |
tree | acc40266093df4289ffb6728c979cafd6b5114d2 /runtime/interpreter/interpreter.cc | |
parent | b8033db2a8dc6f7c7e29b1552177542964f56e44 (diff) |
Fix an outstanding compaction bug in interpreter.
Fixed a bug in DoFieldPut where the FieldHelper GetType could cause
thread suspension which would result in a stale obj.
Added more handles in the class linker to facilitate moving fiels
and methods in the future.
Removed un-necessarly passing handle references since these are value
types and don't need to be passed by reference.
Added a special NullHandle type which allows null handles without a
handle scope.
Change-Id: I1b51723920a2e4f4f8b2907066f578a3e879fd5b
Diffstat (limited to 'runtime/interpreter/interpreter.cc')
-rw-r--r-- | runtime/interpreter/interpreter.cc | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/runtime/interpreter/interpreter.cc b/runtime/interpreter/interpreter.cc index 478c74cd25..f77a0f6d35 100644 --- a/runtime/interpreter/interpreter.cc +++ b/runtime/interpreter/interpreter.cc @@ -524,16 +524,17 @@ extern "C" void artInterpreterToInterpreterBridge(Thread* self, MethodHelper& mh ArtMethod* method = shadow_frame->GetMethod(); // Ensure static methods are initialized. if (method->IsStatic()) { - StackHandleScope<1> hs(self); - Handle<Class> declaringClass(hs.NewHandle(method->GetDeclaringClass())); - if (UNLIKELY(!declaringClass->IsInitializing())) { - if (UNLIKELY(!Runtime::Current()->GetClassLinker()->EnsureInitialized(declaringClass, true, - true))) { - DCHECK(Thread::Current()->IsExceptionPending()); + mirror::Class* declaring_class = method->GetDeclaringClass(); + if (UNLIKELY(!declaring_class->IsInitializing())) { + StackHandleScope<1> hs(self); + HandleWrapper<Class> h_declaring_class(hs.NewHandleWrapper(&declaring_class)); + if (UNLIKELY(!Runtime::Current()->GetClassLinker()->EnsureInitialized( + h_declaring_class, true, true))) { + DCHECK(self->IsExceptionPending()); self->PopShadowFrame(); return; } - CHECK(declaringClass->IsInitializing()); + CHECK(h_declaring_class->IsInitializing()); } } |