Various dex index tweaks to improve verifier performance

Change-Id: I9369443495b69fc8092f6a69118691c056db3188
diff --git a/src/class_linker.cc b/src/class_linker.cc
index 60bd614..952bacf 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -3223,20 +3223,30 @@
     return NULL;
   }
 
-  const char* name = dex_file.StringDataByIdx(method_id.name_idx_);
-  std::string signature(dex_file.CreateMethodSignature(method_id.proto_idx_, NULL));
   if (is_direct) {
-    resolved = klass->FindDirectMethod(name, signature);
+    resolved = klass->FindDirectMethod(dex_cache, method_idx);
   } else if (klass->IsInterface()) {
-    resolved = klass->FindInterfaceMethod(name, signature);
+    resolved = klass->FindInterfaceMethod(dex_cache, method_idx);
   } else {
-    resolved = klass->FindVirtualMethod(name, signature);
+    resolved = klass->FindVirtualMethod(dex_cache, method_idx);
   }
-  if (resolved != NULL) {
-    dex_cache->SetResolvedMethod(method_idx, resolved);
-  } else {
-    ThrowNoSuchMethodError(is_direct, klass, name, signature);
+
+  if (resolved == NULL) {
+    const char* name = dex_file.StringDataByIdx(method_id.name_idx_);
+    std::string signature(dex_file.CreateMethodSignature(method_id.proto_idx_, NULL));
+    if (is_direct) {
+      resolved = klass->FindDirectMethod(name, signature);
+    } else if (klass->IsInterface()) {
+      resolved = klass->FindInterfaceMethod(name, signature);
+    } else {
+      resolved = klass->FindVirtualMethod(name, signature);
+    }
+    if (resolved == NULL) {
+      ThrowNoSuchMethodError(is_direct, klass, name, signature);
+      return NULL;
+    }
   }
+  dex_cache->SetResolvedMethod(method_idx, resolved);
   return resolved;
 }
 
@@ -3256,18 +3266,26 @@
     return NULL;
   }
 
-  const char* name = dex_file.GetFieldName(field_id);
-  const char* type = dex_file.GetFieldTypeDescriptor(field_id);
   if (is_static) {
-    resolved = klass->FindStaticField(name, type);
+    resolved = klass->FindStaticField(dex_cache, field_idx);
   } else {
-    resolved = klass->FindInstanceField(name, type);
+    resolved = klass->FindInstanceField(dex_cache, field_idx);
   }
-  if (resolved != NULL) {
-    dex_cache->SetResolvedField(field_idx, resolved);
-  } else {
-    ThrowNoSuchFieldError(is_static ? "static " : "instance ", klass, type, name);
+
+  if (resolved == NULL) {
+    const char* name = dex_file.GetFieldName(field_id);
+    const char* type = dex_file.GetFieldTypeDescriptor(field_id);
+    if (is_static) {
+      resolved = klass->FindStaticField(name, type);
+    } else {
+      resolved = klass->FindInstanceField(name, type);
+    }
+    if (resolved == NULL) {
+      ThrowNoSuchFieldError(is_static ? "static " : "instance ", klass, type, name);
+      return NULL;
+    }
   }
+  dex_cache->SetResolvedField(field_idx, resolved);
   return resolved;
 }