summaryrefslogtreecommitdiff
path: root/dexlayout/dex_ir_builder.cc
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2018-08-02 10:05:28 -0700
committer android-build-merger <android-build-merger@google.com> 2018-08-02 10:05:28 -0700
commitf18cf560eb93575f21ce718e62247714a8fc22e5 (patch)
tree1a763efe6797b36792a0b4d991410d9e5c6b1fd6 /dexlayout/dex_ir_builder.cc
parentcf20fd84969075deb5d4c84285f304fda5938afd (diff)
parentefcdd13a3d820aa084ed4255196da1363cf9e5cf (diff)
Merge "Move dex_file_verifier_test and dexlayout to ClassAccessor"
am: efcdd13a3d Change-Id: I06b10702373947fd34d5a699c5ee43d35c9bca0b
Diffstat (limited to 'dexlayout/dex_ir_builder.cc')
-rw-r--r--dexlayout/dex_ir_builder.cc60
1 files changed, 34 insertions, 26 deletions
diff --git a/dexlayout/dex_ir_builder.cc b/dexlayout/dex_ir_builder.cc
index a04a2349c4..a83a46b7e2 100644
--- a/dexlayout/dex_ir_builder.cc
+++ b/dexlayout/dex_ir_builder.cc
@@ -21,6 +21,7 @@
#include "dex_ir_builder.h"
+#include "dex/class_accessor-inl.h"
#include "dex/code_item_accessors-inl.h"
#include "dex/dex_file_exception_helpers.h"
#include "dexlayout.h"
@@ -162,7 +163,7 @@ class BuilderMaps {
const DexFile::CodeItem* disk_code_item,
uint32_t offset,
uint32_t dex_method_index);
- ClassData* CreateClassData(const DexFile& dex_file, const uint8_t* encoded_data, uint32_t offset);
+ ClassData* CreateClassData(const DexFile& dex_file, const DexFile::ClassDef& class_def);
void AddAnnotationsFromMapListSection(const DexFile& dex_file,
uint32_t start_offset,
@@ -197,7 +198,7 @@ class BuilderMaps {
uint8_t length,
EncodedValue* item);
- MethodItem GenerateMethodItem(const DexFile& dex_file, ClassDataItemIterator& cdii);
+ MethodItem GenerateMethodItem(const DexFile& dex_file, const ClassAccessor::Method& method);
ParameterAnnotation* GenerateParameterAnnotation(
const DexFile& dex_file,
@@ -488,8 +489,7 @@ void BuilderMaps::CreateClassDef(const DexFile& dex_file, uint32_t i) {
const uint8_t* static_data = dex_file.GetEncodedStaticFieldValuesArray(disk_class_def);
EncodedArrayItem* static_values =
CreateEncodedArrayItem(dex_file, static_data, disk_class_def.static_values_off_);
- ClassData* class_data = CreateClassData(
- dex_file, dex_file.GetClassData(disk_class_def), disk_class_def.class_data_off_);
+ ClassData* class_data = CreateClassData(dex_file, disk_class_def);
CreateAndAddIndexedItem(header_->ClassDefs(),
header_->ClassDefs().GetOffset() + i * ClassDef::ItemSize(),
i,
@@ -894,36 +894,43 @@ CodeItem* BuilderMaps::DedupeOrCreateCodeItem(const DexFile& dex_file,
return code_item;
}
-ClassData* BuilderMaps::CreateClassData(
- const DexFile& dex_file, const uint8_t* encoded_data, uint32_t offset) {
+ClassData* BuilderMaps::CreateClassData(const DexFile& dex_file,
+ const DexFile::ClassDef& class_def) {
// Read the fields and methods defined by the class, resolving the circular reference from those
// to classes by setting class at the same time.
+ const uint32_t offset = class_def.class_data_off_;
ClassData* class_data = class_datas_map_.GetExistingObject(offset);
- if (class_data == nullptr && encoded_data != nullptr) {
- ClassDataItemIterator cdii(dex_file, encoded_data);
+ if (class_data == nullptr && offset != 0u) {
+ ClassAccessor accessor(dex_file, class_def);
// Static fields.
FieldItemVector* static_fields = new FieldItemVector();
- for (; cdii.HasNextStaticField(); cdii.Next()) {
- FieldId* field_item = header_->FieldIds()[cdii.GetMemberIndex()];
- uint32_t access_flags = cdii.GetRawMemberAccessFlags();
+ for (const ClassAccessor::Field& field : accessor.GetStaticFields()) {
+ FieldId* field_item = header_->FieldIds()[field.GetIndex()];
+ uint32_t access_flags = field.GetRawAccessFlags();
static_fields->emplace_back(access_flags, field_item);
}
- // Instance fields.
FieldItemVector* instance_fields = new FieldItemVector();
- for (; cdii.HasNextInstanceField(); cdii.Next()) {
- FieldId* field_item = header_->FieldIds()[cdii.GetMemberIndex()];
- uint32_t access_flags = cdii.GetRawMemberAccessFlags();
+ for (const ClassAccessor::Field& field : accessor.GetInstanceFields()) {
+ FieldId* field_item = header_->FieldIds()[field.GetIndex()];
+ uint32_t access_flags = field.GetRawAccessFlags();
instance_fields->emplace_back(access_flags, field_item);
}
// Direct methods.
MethodItemVector* direct_methods = new MethodItemVector();
- for (; cdii.HasNextDirectMethod(); cdii.Next()) {
- direct_methods->push_back(GenerateMethodItem(dex_file, cdii));
+ auto direct_methods_it = accessor.GetDirectMethods();
+ for (auto it = direct_methods_it.begin(); it != direct_methods_it.end(); ++it) {
+ direct_methods->push_back(GenerateMethodItem(dex_file, *it));
}
// Virtual methods.
MethodItemVector* virtual_methods = new MethodItemVector();
- for (; cdii.HasNextVirtualMethod(); cdii.Next()) {
- virtual_methods->push_back(GenerateMethodItem(dex_file, cdii));
+ auto virtual_methods_it = accessor.GetVirtualMethods();
+ const uint8_t* last_data_ptr;
+ for (auto it = virtual_methods_it.begin(); ; ++it) {
+ if (it == virtual_methods_it.end()) {
+ last_data_ptr = it->GetDataPointer();
+ break;
+ }
+ virtual_methods->push_back(GenerateMethodItem(dex_file, *it));
}
class_data = class_datas_map_.CreateAndAddItem(header_->ClassDatas(),
eagerly_assign_offsets_,
@@ -932,7 +939,7 @@ ClassData* BuilderMaps::CreateClassData(
instance_fields,
direct_methods,
virtual_methods);
- class_data->SetSize(cdii.EndDataPointer() - encoded_data);
+ class_data->SetSize(last_data_ptr - dex_file.GetClassData(class_def));
}
return class_data;
}
@@ -1168,16 +1175,17 @@ void BuilderMaps::ReadEncodedValue(const DexFile& dex_file,
}
}
-MethodItem BuilderMaps::GenerateMethodItem(const DexFile& dex_file, ClassDataItemIterator& cdii) {
- MethodId* method_id = header_->MethodIds()[cdii.GetMemberIndex()];
- uint32_t access_flags = cdii.GetRawMemberAccessFlags();
- const DexFile::CodeItem* disk_code_item = cdii.GetMethodCodeItem();
+MethodItem BuilderMaps::GenerateMethodItem(const DexFile& dex_file,
+ const ClassAccessor::Method& method) {
+ MethodId* method_id = header_->MethodIds()[method.GetIndex()];
+ uint32_t access_flags = method.GetRawAccessFlags();
+ const DexFile::CodeItem* disk_code_item = method.GetCodeItem();
// Temporary hack to prevent incorrectly deduping code items if they have the same offset since
// they may have different debug info streams.
CodeItem* code_item = DedupeOrCreateCodeItem(dex_file,
disk_code_item,
- cdii.GetMethodCodeItemOffset(),
- cdii.GetMemberIndex());
+ method.GetCodeItemOffset(),
+ method.GetIndex());
return MethodItem(access_flags, method_id, code_item);
}