Simplify ClassLinker::LoadClass

Starting out by removing the ClassLinker::LoadClass to not take a
DexFile. Then started pulling threads so that ClassLinker::LoadClass
could take a StringPiece instead of const char*. Finally went through
and removed all uses of StringPiece::data() to make sure things are
clean.

Change-Id: I47cfa0e8e0e35a31e0ebbd0f7d6a105be83ebe88
diff --git a/src/class_linker.cc b/src/class_linker.cc
index 19f2f93..332900b 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -83,9 +83,8 @@
   return reinterpret_cast<Method*>(Heap::AllocRaw(sizeof(Method), java_lang_ref_Method_));
 }
 
-Class* ClassLinker::FindClass(const char* descriptor,
-                              Object* class_loader,
-                              DexFile* dex_file) {
+Class* ClassLinker::FindClass(const StringPiece& descriptor,
+                              Object* class_loader) {
   Thread* self = Thread::Current();
   CHECK(!self->IsExceptionPending());
   // Find the class in the loaded classes table.
@@ -93,51 +92,40 @@
   if (klass == NULL) {
     // Class is not yet loaded.
     const RawDexFile::ClassDef* class_def;
-    if (dex_file == NULL) {
-      // No .dex file specified, search the class path.
-      ClassPathEntry pair = FindInClassPath(descriptor);
-      if (pair.first == NULL) {
-        LG << "Class " << descriptor << " really not found";
-        return NULL;
-      }
-      dex_file = pair.first;
-      class_def = pair.second;
-    } else {
-      class_def = dex_file->GetRaw()->FindClassDef(descriptor);
+    // No .dex file specified, search the class path.
+    ClassPathEntry pair = FindInClassPath(descriptor);
+    if (pair.first == NULL) {
+      LG << "Class " << descriptor << " really not found";
+      return NULL;
     }
+    DexFile* dex_file = pair.first;
+    class_def = pair.second;
     // Load the class from the dex file.
-    if (!strcmp(descriptor, "Ljava/lang/Object;")) {
+    if (descriptor == "Ljava/lang/Object;") {
       klass = java_lang_Object_;
       klass->dex_file_ = dex_file;
       klass->object_size_ = sizeof(Object);
-      if (class_def != NULL) {
-        char_array_class_->super_class_idx_ = class_def->class_idx_;
-      }
-    } else if (!strcmp(descriptor, "Ljava/lang/Class;")) {
+      char_array_class_->super_class_idx_ = class_def->class_idx_;
+    } else if (descriptor == "Ljava/lang/Class;") {
       klass = java_lang_Class_;
       klass->dex_file_ = dex_file;
       klass->object_size_ = sizeof(Class);
-    } else if (!strcmp(descriptor, "Ljava/lang/ref/Field;")) {
+    } else if (descriptor == "Ljava/lang/ref/Field;") {
       klass = java_lang_ref_Field_;
       klass->dex_file_ = dex_file;
       klass->object_size_ = sizeof(Field);
-    } else if (!strcmp(descriptor, "Ljava/lang/ref/Method;")) {
+    } else if (descriptor == "Ljava/lang/ref/Method;") {
       klass = java_lang_ref_Method_;
       klass->dex_file_ = dex_file;
       klass->object_size_ = sizeof(Method);
-    } else if (!strcmp(descriptor, "Ljava/lang/String;")) {
+    } else if (descriptor == "Ljava/lang/String;") {
       klass = java_lang_String_;
       klass->dex_file_ = dex_file;
       klass->object_size_ = sizeof(String);
     } else {
       klass = AllocClass(dex_file);
     }
-    bool is_loaded;
-    if (class_def == NULL) {
-      is_loaded = false;
-    } else {
-      is_loaded = LoadClass(*class_def, klass);
-    }
+    bool is_loaded = LoadClass(*class_def, klass);
     if (!is_loaded) {
       // TODO: this occurs only when a dex file is provided.
       LG << "Class not found";  // TODO: NoClassDefFoundError
@@ -192,7 +180,7 @@
   return klass;
 }
 
-bool ClassLinker::LoadClass(const char* descriptor, Class* klass) {
+bool ClassLinker::LoadClass(const StringPiece& descriptor, Class* klass) {
   const RawDexFile* raw = klass->GetDexFile()->GetRaw();
   const RawDexFile::ClassDef* class_def = raw->FindClassDef(descriptor);
   if (class_def == NULL) {
@@ -346,7 +334,7 @@
   }
 }
 
-ClassLinker::ClassPathEntry ClassLinker::FindInClassPath(const char* descriptor) {
+ClassLinker::ClassPathEntry ClassLinker::FindInClassPath(const StringPiece& descriptor) {
   for (size_t i = 0; i != class_path_.size(); ++i) {
     DexFile* dex_file = class_path_[i];
     const RawDexFile::ClassDef* class_def = dex_file->GetRaw()->FindClassDef(descriptor);
@@ -408,13 +396,13 @@
 
 bool ClassLinker::InsertClass(Class* klass) {
   // TODO: acquire classes_lock_
-  const char* key = klass->GetDescriptor().data();
+  const StringPiece& key = klass->GetDescriptor();
   bool success = classes_.insert(std::make_pair(key, klass)).second;
   // TODO: release classes_lock_
   return success;
 }
 
-Class* ClassLinker::LookupClass(const char* descriptor, Object* class_loader) {
+Class* ClassLinker::LookupClass(const StringPiece& descriptor, Object* class_loader) {
   // TODO: acquire classes_lock_
   Table::iterator it = classes_.find(descriptor);
   // TODO: release classes_lock_
@@ -662,7 +650,7 @@
   if (dex_file == NULL) {
     return;
   }
-  const char* descriptor = klass->GetDescriptor().data();
+  const StringPiece& descriptor = klass->GetDescriptor();
   const RawDexFile* raw = dex_file->GetRaw();
   const RawDexFile::ClassDef* class_def = raw->FindClassDef(descriptor);
   CHECK(class_def != NULL);
@@ -1207,7 +1195,7 @@
     JType type = static_cast<JType>(descriptor[0]);
     resolved = FindPrimitiveClass(type);
   } else {
-    resolved = FindClass(descriptor, referrer->GetClassLoader(), NULL);
+    resolved = FindClass(descriptor, referrer->GetClassLoader());
   }
   if (resolved != NULL) {
     Class* check = resolved->IsArray() ? resolved->component_type_ : resolved;