diff options
| -rw-r--r-- | libdexfile/dex/art_dex_file_loader_test.cc | 27 | ||||
| -rw-r--r-- | libdexfile/dex/dex_file_tracking_registrar.cc | 103 |
2 files changed, 53 insertions, 77 deletions
diff --git a/libdexfile/dex/art_dex_file_loader_test.cc b/libdexfile/dex/art_dex_file_loader_test.cc index 5f3fc0266f..3f311b7451 100644 --- a/libdexfile/dex/art_dex_file_loader_test.cc +++ b/libdexfile/dex/art_dex_file_loader_test.cc @@ -28,6 +28,7 @@ #include "base/stl_util.h" #include "base/unix_file/fd_file.h" #include "dex/base64_test_util.h" +#include "dex/class_accessor-inl.h" #include "dex/code_item_accessors-inl.h" #include "dex/descriptors_names.h" #include "dex/dex_file.h" @@ -124,16 +125,15 @@ TEST_F(ArtDexFileLoaderTest, GetMethodSignature) { const DexFile::ClassDef& class_def = raw->GetClassDef(0); ASSERT_STREQ("LGetMethodSignature;", raw->GetClassDescriptor(class_def)); - const uint8_t* class_data = raw->GetClassData(class_def); - ASSERT_TRUE(class_data != nullptr); - ClassDataItemIterator it(*raw, class_data); - - EXPECT_EQ(1u, it.NumDirectMethods()); + ClassAccessor accessor(*raw, class_def); + ASSERT_TRUE(accessor.HasClassData()); + auto methods = accessor.GetMethods(); + auto cur_method = methods.begin(); // Check the signature for the static initializer. { - ASSERT_EQ(1U, it.NumDirectMethods()); - const DexFile::MethodId& method_id = raw->GetMethodId(it.GetMemberIndex()); + ASSERT_EQ(1U, accessor.NumDirectMethods()); + const DexFile::MethodId& method_id = raw->GetMethodId(cur_method->GetIndex()); const char* name = raw->StringDataByIdx(method_id.name_idx_); ASSERT_STREQ("<init>", name); std::string signature(raw->GetMethodSignature(method_id).ToString()); @@ -203,10 +203,11 @@ TEST_F(ArtDexFileLoaderTest, GetMethodSignature) { "java.lang.Object[][] GetMethodSignature.mB()" }, }; - ASSERT_EQ(arraysize(results), it.NumVirtualMethods()); + ASSERT_EQ(arraysize(results), accessor.NumVirtualMethods()); for (const Result& r : results) { - it.Next(); - const DexFile::MethodId& method_id = raw->GetMethodId(it.GetMemberIndex()); + ++cur_method; + ASSERT_TRUE(cur_method != methods.end()); + const DexFile::MethodId& method_id = raw->GetMethodId(cur_method->GetIndex()); const char* name = raw->StringDataByIdx(method_id.name_idx_); ASSERT_STREQ(r.name, name); @@ -215,8 +216,10 @@ TEST_F(ArtDexFileLoaderTest, GetMethodSignature) { ASSERT_EQ(r.signature, signature); std::string plain_method = std::string("GetMethodSignature.") + r.name; - ASSERT_EQ(plain_method, raw->PrettyMethod(it.GetMemberIndex(), /* with_signature */ false)); - ASSERT_EQ(r.pretty_method, raw->PrettyMethod(it.GetMemberIndex(), /* with_signature */ true)); + ASSERT_EQ(plain_method, + raw->PrettyMethod(cur_method->GetIndex(), /* with_signature */ false)); + ASSERT_EQ(r.pretty_method, + raw->PrettyMethod(cur_method->GetIndex(), /* with_signature */ true)); } } diff --git a/libdexfile/dex/dex_file_tracking_registrar.cc b/libdexfile/dex/dex_file_tracking_registrar.cc index 551bea108c..29ff6be4fc 100644 --- a/libdexfile/dex/dex_file_tracking_registrar.cc +++ b/libdexfile/dex/dex_file_tracking_registrar.cc @@ -30,6 +30,7 @@ #endif #include "base/memory_tool.h" +#include "class_accessor-inl.h" #include "code_item_accessors-inl.h" #include "dex_file-inl.h" @@ -155,89 +156,61 @@ void DexFileTrackingRegistrar::SetDexFileRegistration(bool should_poison) { } void DexFileTrackingRegistrar::SetAllCodeItemRegistration(bool should_poison) { - for (size_t classdef_ctr = 0; classdef_ctr < dex_file_->NumClassDefs(); ++classdef_ctr) { - const DexFile::ClassDef& cd = dex_file_->GetClassDef(classdef_ctr); - const uint8_t* class_data = dex_file_->GetClassData(cd); - if (class_data != nullptr) { - ClassDataItemIterator cdit(*dex_file_, class_data); - cdit.SkipAllFields(); - while (cdit.HasNextMethod()) { - const DexFile::CodeItem* code_item = cdit.GetMethodCodeItem(); - if (code_item != nullptr) { - const void* code_item_begin = reinterpret_cast<const void*>(code_item); - size_t code_item_size = dex_file_->GetCodeItemSize(*code_item); - range_values_.push_back(std::make_tuple(code_item_begin, code_item_size, should_poison)); - } - cdit.Next(); + for (ClassAccessor accessor : dex_file_->GetClasses()) { + for (const ClassAccessor::Method& method : accessor.GetMethods()) { + const DexFile::CodeItem* code_item = method.GetCodeItem(); + if (code_item != nullptr) { + const void* code_item_begin = reinterpret_cast<const void*>(code_item); + size_t code_item_size = dex_file_->GetCodeItemSize(*code_item); + range_values_.push_back(std::make_tuple(code_item_begin, code_item_size, should_poison)); } } } } void DexFileTrackingRegistrar::SetAllCodeItemStartRegistration(bool should_poison) { - for (size_t classdef_ctr = 0; classdef_ctr < dex_file_->NumClassDefs(); ++classdef_ctr) { - const DexFile::ClassDef& cd = dex_file_->GetClassDef(classdef_ctr); - const uint8_t* class_data = dex_file_->GetClassData(cd); - if (class_data != nullptr) { - ClassDataItemIterator cdit(*dex_file_, class_data); - cdit.SkipAllFields(); - while (cdit.HasNextMethod()) { - const DexFile::CodeItem* code_item = cdit.GetMethodCodeItem(); - if (code_item != nullptr) { - const void* code_item_begin = reinterpret_cast<const void*>(code_item); - size_t code_item_start = reinterpret_cast<size_t>(code_item); - CodeItemInstructionAccessor accessor(*dex_file_, code_item); - size_t code_item_start_end = reinterpret_cast<size_t>(accessor.Insns()); - size_t code_item_start_size = code_item_start_end - code_item_start; - range_values_.push_back(std::make_tuple(code_item_begin, - code_item_start_size, - should_poison)); - } - cdit.Next(); + for (ClassAccessor class_accessor : dex_file_->GetClasses()) { + for (const ClassAccessor::Method& method : class_accessor.GetMethods()) { + const DexFile::CodeItem* code_item = method.GetCodeItem(); + if (code_item != nullptr) { + const void* code_item_begin = reinterpret_cast<const void*>(code_item); + size_t code_item_start = reinterpret_cast<size_t>(code_item); + CodeItemInstructionAccessor accessor(*dex_file_, code_item); + size_t code_item_start_end = reinterpret_cast<size_t>(accessor.Insns()); + size_t code_item_start_size = code_item_start_end - code_item_start; + range_values_.push_back(std::make_tuple(code_item_begin, + code_item_start_size, + should_poison)); } } } } void DexFileTrackingRegistrar::SetAllInsnsRegistration(bool should_poison) { - for (size_t classdef_ctr = 0; classdef_ctr < dex_file_->NumClassDefs(); ++classdef_ctr) { - const DexFile::ClassDef& cd = dex_file_->GetClassDef(classdef_ctr); - const uint8_t* class_data = dex_file_->GetClassData(cd); - if (class_data != nullptr) { - ClassDataItemIterator cdit(*dex_file_, class_data); - cdit.SkipAllFields(); - while (cdit.HasNextMethod()) { - const DexFile::CodeItem* code_item = cdit.GetMethodCodeItem(); - if (code_item != nullptr) { - CodeItemInstructionAccessor accessor(*dex_file_, code_item); - const void* insns_begin = reinterpret_cast<const void*>(accessor.Insns()); - // Member insns_size_in_code_units_ is in 2-byte units - size_t insns_size = accessor.InsnsSizeInCodeUnits() * 2; - range_values_.push_back(std::make_tuple(insns_begin, insns_size, should_poison)); - } - cdit.Next(); + for (ClassAccessor class_accessor : dex_file_->GetClasses()) { + for (const ClassAccessor::Method& method : class_accessor.GetMethods()) { + const DexFile::CodeItem* code_item = method.GetCodeItem(); + if (code_item != nullptr) { + CodeItemInstructionAccessor accessor(*dex_file_, code_item); + const void* insns_begin = reinterpret_cast<const void*>(accessor.Insns()); + // Member insns_size_in_code_units_ is in 2-byte units + size_t insns_size = accessor.InsnsSizeInCodeUnits() * 2; + range_values_.push_back(std::make_tuple(insns_begin, insns_size, should_poison)); } } } } void DexFileTrackingRegistrar::SetCodeItemRegistration(const char* class_name, bool should_poison) { - for (size_t classdef_ctr = 0; classdef_ctr < dex_file_->NumClassDefs(); ++classdef_ctr) { - const DexFile::ClassDef& cd = dex_file_->GetClassDef(classdef_ctr); - const uint8_t* class_data = dex_file_->GetClassData(cd); - if (class_data != nullptr) { - ClassDataItemIterator cdit(*dex_file_, class_data); - cdit.SkipAllFields(); - while (cdit.HasNextMethod()) { - const DexFile::MethodId& methodid_item = dex_file_->GetMethodId(cdit.GetMemberIndex()); - const char * methodid_name = dex_file_->GetMethodName(methodid_item); - const DexFile::CodeItem* code_item = cdit.GetMethodCodeItem(); - if (code_item != nullptr && strcmp(methodid_name, class_name) == 0) { - const void* code_item_begin = reinterpret_cast<const void*>(code_item); - size_t code_item_size = dex_file_->GetCodeItemSize(*code_item); - range_values_.push_back(std::make_tuple(code_item_begin, code_item_size, should_poison)); - } - cdit.Next(); + for (ClassAccessor accessor : dex_file_->GetClasses()) { + for (const ClassAccessor::Method& method : accessor.GetMethods()) { + const DexFile::MethodId& methodid_item = dex_file_->GetMethodId(method.GetIndex()); + const char * methodid_name = dex_file_->GetMethodName(methodid_item); + const DexFile::CodeItem* code_item = method.GetCodeItem(); + if (code_item != nullptr && strcmp(methodid_name, class_name) == 0) { + const void* code_item_begin = reinterpret_cast<const void*>(code_item); + size_t code_item_size = dex_file_->GetCodeItemSize(*code_item); + range_values_.push_back(std::make_tuple(code_item_begin, code_item_size, should_poison)); } } } |