Skip compilation of dead code from duplicate methods

Change-Id: If6114b3cd8e9a2d9a901dc93c352cee6afa3361f
diff --git a/src/compiler.cc b/src/compiler.cc
index ce1803c..cf37d6f 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -1414,15 +1414,33 @@
     it.Next();
   }
   // Compile direct methods
+  uint32_t previous_direct_method_idx = 0;
   while (it.HasNextDirectMethod()) {
+    uint32_t method_idx = it.GetMemberIndex();
+    if (method_idx == previous_direct_method_idx) {
+      // smali can create dex files with two encoded_methods sharing the same method_idx
+      // http://code.google.com/p/smali/issues/detail?id=119
+      it.Next();
+      continue;
+    }
+    previous_direct_method_idx = method_idx;
     context->GetCompiler()->CompileMethod(it.GetMethodCodeItem(), it.GetMemberAccessFlags(),
-                                          it.GetMemberIndex(), class_loader, dex_file);
+                                          method_idx, class_loader, dex_file);
     it.Next();
   }
   // Compile virtual methods
+  uint32_t previous_virtual_method_idx = 0;
   while (it.HasNextVirtualMethod()) {
+    uint32_t method_idx = it.GetMemberIndex();
+    if (method_idx == previous_virtual_method_idx) {
+      // smali can create dex files with two encoded_methods sharing the same method_idx
+      // http://code.google.com/p/smali/issues/detail?id=119
+      it.Next();
+      continue;
+    }
+    previous_virtual_method_idx = method_idx;
     context->GetCompiler()->CompileMethod(it.GetMethodCodeItem(), it.GetMemberAccessFlags(),
-                                          it.GetMemberIndex(), class_loader, dex_file);
+                                          method_idx, class_loader, dex_file);
     it.Next();
   }
   DCHECK(!it.HasNext());