diff options
author | 2017-04-28 13:50:45 +0000 | |
---|---|---|
committer | 2017-04-28 13:50:47 +0000 | |
commit | b718d01d94f06ae6bdf52aa61be5eb37aef09c88 (patch) | |
tree | 260e07b5219ceb137f390f4986231473625a0179 | |
parent | 3f5f85d9382416b053359c3c1f11ab824843f3b4 (diff) | |
parent | 095d6a6be5228ad734568892b820eaf18e549365 (diff) |
Merge "Fix unquickening in the presence of duplicate methods."
-rw-r--r-- | runtime/dex_to_dex_decompiler.cc | 15 | ||||
-rw-r--r-- | test/649-vdex-duplicate-method/classes.dex | bin | 0 -> 900 bytes | |||
-rw-r--r-- | test/649-vdex-duplicate-method/expected.txt | 1 | ||||
-rw-r--r-- | test/649-vdex-duplicate-method/info.txt | 1 |
4 files changed, 13 insertions, 4 deletions
diff --git a/runtime/dex_to_dex_decompiler.cc b/runtime/dex_to_dex_decompiler.cc index 85d5784c7a..c15c9ec448 100644 --- a/runtime/dex_to_dex_decompiler.cc +++ b/runtime/dex_to_dex_decompiler.cc @@ -32,6 +32,7 @@ class DexDecompiler { bool decompile_return_instruction) : code_item_(code_item), quickened_info_ptr_(quickened_info.data()), + quickened_info_start_(quickened_info.data()), quickened_info_end_(quickened_info.data() + quickened_info.size()), decompile_return_instruction_(decompile_return_instruction) {} @@ -89,6 +90,7 @@ class DexDecompiler { const DexFile::CodeItem& code_item_; const uint8_t* quickened_info_ptr_; + const uint8_t* const quickened_info_start_; const uint8_t* const quickened_info_end_; const bool decompile_return_instruction_; @@ -185,10 +187,15 @@ bool DexDecompiler::Decompile() { } if (quickened_info_ptr_ != quickened_info_end_) { - LOG(FATAL) << "Failed to use all values in quickening info." - << " Actual: " << std::hex << quickened_info_ptr_ - << " Expected: " << quickened_info_end_; - return false; + if (quickened_info_start_ == quickened_info_ptr_) { + LOG(WARNING) << "Failed to use any value in quickening info," + << " potentially due to duplicate methods."; + } else { + LOG(FATAL) << "Failed to use all values in quickening info." + << " Actual: " << std::hex << reinterpret_cast<uintptr_t>(quickened_info_ptr_) + << " Expected: " << reinterpret_cast<uintptr_t>(quickened_info_end_); + return false; + } } return true; diff --git a/test/649-vdex-duplicate-method/classes.dex b/test/649-vdex-duplicate-method/classes.dex Binary files differnew file mode 100644 index 0000000000..8036a2f896 --- /dev/null +++ b/test/649-vdex-duplicate-method/classes.dex diff --git a/test/649-vdex-duplicate-method/expected.txt b/test/649-vdex-duplicate-method/expected.txt new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/test/649-vdex-duplicate-method/expected.txt @@ -0,0 +1 @@ +0 diff --git a/test/649-vdex-duplicate-method/info.txt b/test/649-vdex-duplicate-method/info.txt new file mode 100644 index 0000000000..d2c995914b --- /dev/null +++ b/test/649-vdex-duplicate-method/info.txt @@ -0,0 +1 @@ +Regression test for unquickening a vdex that has duplicate methods. |