Merge "Fix HandleScope with wrong thread error"
diff --git a/runtime/handle_scope-inl.h b/runtime/handle_scope-inl.h
index 421a413..222083b 100644
--- a/runtime/handle_scope-inl.h
+++ b/runtime/handle_scope-inl.h
@@ -28,6 +28,7 @@
 template<size_t kNumReferences>
 inline StackHandleScope<kNumReferences>::StackHandleScope(Thread* self, mirror::Object* fill_value)
     : HandleScope(self->GetTopHandleScope(), kNumReferences), self_(self), pos_(0) {
+  DCHECK_EQ(self, Thread::Current());
   static_assert(kNumReferences >= 1, "StackHandleScope must contain at least 1 reference");
   // TODO: Figure out how to use a compile assert.
   CHECK_EQ(&storage_[0], GetReferences());
diff --git a/runtime/thread.cc b/runtime/thread.cc
index d2d5be7..527d758 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -982,8 +982,9 @@
 void Thread::DumpJavaStack(std::ostream& os) const {
   // Dumping the Java stack involves the verifier for locks. The verifier operates under the
   // assumption that there is no exception pending on entry. Thus, stash any pending exception.
-  // TODO: Find a way to avoid const_cast.
-  StackHandleScope<3> scope(const_cast<Thread*>(this));
+  // Thread::Current() instead of this in case a thread is dumping the stack of another suspended
+  // thread.
+  StackHandleScope<3> scope(Thread::Current());
   Handle<mirror::Throwable> exc;
   Handle<mirror::Object> throw_location_this_object;
   Handle<mirror::ArtMethod> throw_location_method;