Move dex_file_tracking_registrar and art_dex_file_loader_test to class_accessor
Test: test-art-host
Bug: 79758018
Change-Id: Ic114d407697176be55c89adf4486cd63fc018844
diff --git a/libdexfile/dex/art_dex_file_loader_test.cc b/libdexfile/dex/art_dex_file_loader_test.cc
index 5f3fc026..3f311b7 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 @@
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 @@
"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 @@
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 551bea1..29ff6be 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::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));
}
}
}