Explicitly pass Thread::Current to MutexLock and Alloc.

Change-Id: I8b75bc0617915465f102815b32306aa7760dcae4
diff --git a/src/object.cc b/src/object.cc
index 8582a21..e8381db 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -47,7 +47,7 @@
   return down_cast<String*>(this);
 }
 
-Object* Object::Clone() {
+Object* Object::Clone(Thread* self) {
   Class* c = GetClass();
   DCHECK(!c->IsClassClass());
 
@@ -55,7 +55,7 @@
   // Using c->AllocObject() here would be wrong.
   size_t num_bytes = SizeOf();
   Heap* heap = Runtime::Current()->GetHeap();
-  SirtRef<Object> copy(Thread::Current(), heap->AllocObject(c, num_bytes));
+  SirtRef<Object> copy(self, heap->AllocObject(self, c, num_bytes));
   if (copy.get() == NULL) {
     return NULL;
   }
@@ -727,13 +727,13 @@
   SetFieldObject(OFFSET_OF_OBJECT_MEMBER(Class, dex_cache_), new_dex_cache, false);
 }
 
-Object* Class::AllocObject() {
+Object* Class::AllocObject(Thread* self) {
   DCHECK(!IsArrayClass()) << PrettyClass(this);
   DCHECK(IsInstantiable()) << PrettyClass(this);
   // TODO: decide whether we want this check. It currently fails during bootstrap.
   // DCHECK(!Runtime::Current()->IsStarted() || IsInitializing()) << PrettyClass(this);
   DCHECK_GE(this->object_size_, sizeof(Object));
-  return Runtime::Current()->GetHeap()->AllocObject(this, this->object_size_);
+  return Runtime::Current()->GetHeap()->AllocObject(self, this, this->object_size_);
 }
 
 void Class::SetClassSize(size_t new_class_size) {
@@ -768,7 +768,7 @@
     default:
       LOG(FATAL) << "Unknown primitive type: " << PrintableChar(descriptor[0]);
     }
-    name = String::AllocFromModifiedUtf8(c_name);
+    name = String::AllocFromModifiedUtf8(Thread::Current(), c_name);
   } else {
     // Convert the UTF-8 name to a java.lang.String. The name must use '.' to separate package
     // components.
@@ -777,7 +777,7 @@
       descriptor.erase(descriptor.size() - 1);
     }
     std::replace(descriptor.begin(), descriptor.end(), '/', '.');
-    name = String::AllocFromModifiedUtf8(descriptor.c_str());
+    name = String::AllocFromModifiedUtf8(Thread::Current(), descriptor.c_str());
   }
   SetName(name);
   return name;
@@ -1288,7 +1288,8 @@
   return NULL;
 }
 
-Array* Array::Alloc(Class* array_class, int32_t component_count, size_t component_size) {
+Array* Array::Alloc(Thread* self, Class* array_class, int32_t component_count,
+                    size_t component_size) {
   DCHECK(array_class != NULL);
   DCHECK_GE(component_count, 0);
   DCHECK(array_class->IsArrayClass());
@@ -1300,14 +1301,14 @@
   // Check for overflow and throw OutOfMemoryError if this was an unreasonable request.
   size_t component_shift = sizeof(size_t) * 8 - 1 - CLZ(component_size);
   if (data_size >> component_shift != size_t(component_count) || size < data_size) {
-    Thread::Current()->ThrowNewExceptionF("Ljava/lang/OutOfMemoryError;",
+    self->ThrowNewExceptionF("Ljava/lang/OutOfMemoryError;",
         "%s of length %d would overflow",
         PrettyDescriptor(array_class).c_str(), component_count);
     return NULL;
   }
 
   Heap* heap = Runtime::Current()->GetHeap();
-  Array* array = down_cast<Array*>(heap->AllocObject(array_class, size));
+  Array* array = down_cast<Array*>(heap->AllocObject(self, array_class, size));
   if (array != NULL) {
     DCHECK(array->IsArrayInstance());
     array->SetLength(component_count);
@@ -1315,9 +1316,9 @@
   return array;
 }
 
-Array* Array::Alloc(Class* array_class, int32_t component_count) {
+Array* Array::Alloc(Thread* self, Class* array_class, int32_t component_count) {
   DCHECK(array_class->IsArrayClass());
-  return Alloc(array_class, component_count, array_class->GetComponentSize());
+  return Alloc(self, array_class, component_count, array_class->GetComponentSize());
 }
 
 bool Array::ThrowArrayIndexOutOfBoundsException(int32_t index) const {
@@ -1334,9 +1335,9 @@
 }
 
 template<typename T>
-PrimitiveArray<T>* PrimitiveArray<T>::Alloc(size_t length) {
+PrimitiveArray<T>* PrimitiveArray<T>::Alloc(Thread* self, size_t length) {
   DCHECK(array_class_ != NULL);
-  Array* raw_array = Array::Alloc(array_class_, length, sizeof(T));
+  Array* raw_array = Array::Alloc(self, array_class_, length, sizeof(T));
   return down_cast<PrimitiveArray<T>*>(raw_array);
 }
 
@@ -1402,11 +1403,12 @@
   return GetCharArray()->Get(index + GetOffset());
 }
 
-String* String::AllocFromUtf16(int32_t utf16_length,
+String* String::AllocFromUtf16(Thread* self,
+                               int32_t utf16_length,
                                const uint16_t* utf16_data_in,
                                int32_t hash_code) {
   CHECK(utf16_data_in != NULL || utf16_length == 0);
-  String* string = Alloc(GetJavaLangString(), utf16_length);
+  String* string = Alloc(self, GetJavaLangString(), utf16_length);
   if (string == NULL) {
     return NULL;
   }
@@ -1426,17 +1428,17 @@
   return string;
 }
 
-String* String::AllocFromModifiedUtf8(const char* utf) {
+  String* String::AllocFromModifiedUtf8(Thread* self, const char* utf) {
   if (utf == NULL) {
     return NULL;
   }
   size_t char_count = CountModifiedUtf8Chars(utf);
-  return AllocFromModifiedUtf8(char_count, utf);
+  return AllocFromModifiedUtf8(self, char_count, utf);
 }
 
-String* String::AllocFromModifiedUtf8(int32_t utf16_length,
+String* String::AllocFromModifiedUtf8(Thread* self, int32_t utf16_length,
                                       const char* utf8_data_in) {
-  String* string = Alloc(GetJavaLangString(), utf16_length);
+  String* string = Alloc(self, GetJavaLangString(), utf16_length);
   if (string == NULL) {
     return NULL;
   }
@@ -1447,18 +1449,18 @@
   return string;
 }
 
-String* String::Alloc(Class* java_lang_String, int32_t utf16_length) {
-  SirtRef<CharArray> array(Thread::Current(), CharArray::Alloc(utf16_length));
+String* String::Alloc(Thread* self, Class* java_lang_String, int32_t utf16_length) {
+  SirtRef<CharArray> array(self, CharArray::Alloc(self, utf16_length));
   if (array.get() == NULL) {
     return NULL;
   }
-  return Alloc(java_lang_String, array.get());
+  return Alloc(self, java_lang_String, array.get());
 }
 
-String* String::Alloc(Class* java_lang_String, CharArray* array) {
+String* String::Alloc(Thread* self, Class* java_lang_String, CharArray* array) {
   // Hold reference in case AllocObject causes GC.
-  SirtRef<CharArray> array_ref(Thread::Current(), array);
-  String* string = down_cast<String*>(java_lang_String->AllocObject());
+  SirtRef<CharArray> array_ref(self, array);
+  String* string = down_cast<String*>(java_lang_String->AllocObject(self));
   if (string == NULL) {
     return NULL;
   }
@@ -1610,12 +1612,13 @@
   java_lang_StackTraceElement_ = NULL;
 }
 
-StackTraceElement* StackTraceElement::Alloc(String* declaring_class,
+StackTraceElement* StackTraceElement::Alloc(Thread* self,
+                                            String* declaring_class,
                                             String* method_name,
                                             String* file_name,
                                             int32_t line_number) {
   StackTraceElement* trace =
-      down_cast<StackTraceElement*>(GetStackTraceElement()->AllocObject());
+      down_cast<StackTraceElement*>(GetStackTraceElement()->AllocObject(self));
   trace->SetFieldObject(OFFSET_OF_OBJECT_MEMBER(StackTraceElement, declaring_class_),
                         const_cast<String*>(declaring_class), false);
   trace->SetFieldObject(OFFSET_OF_OBJECT_MEMBER(StackTraceElement, method_name_),