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());