diff options
author | 2016-06-27 13:50:16 +0100 | |
---|---|---|
committer | 2016-06-27 15:53:11 +0100 | |
commit | 5c6a58734ef0c07dbb1e951e91c66b20a25160ce (patch) | |
tree | c9b4e7fda6b1314b3315e3ee84adc2e42fe74590 | |
parent | 1e28d1e145a898e34dbb43bb655d905653e9c1e9 (diff) |
Clean up StringReferenceValueComparator and DexFile.
Add a helper function to StringReference, so that the
StringReferenceValueComparator doesn't need to repeatedly
reference the same StringReference variable which led to
the bug 29602109.
Also clean up the DexFile, moving definitions of functions
that depend on the dex_file-inl.h from dex_file.h also to
the dex_file-inl.h.
Test: Run standard ART test suite on host and Nexus 5.
Bug: 29602109
Change-Id: I83e2aa67173c62b3432c26478e528bbb53b6d09f
-rw-r--r-- | compiler/utils/string_reference.h | 14 | ||||
-rw-r--r-- | runtime/dex_file-inl.h | 78 | ||||
-rw-r--r-- | runtime/dex_file.h | 78 |
3 files changed, 103 insertions, 67 deletions
diff --git a/compiler/utils/string_reference.h b/compiler/utils/string_reference.h index 0ab45c86e3..e4c34ca605 100644 --- a/compiler/utils/string_reference.h +++ b/compiler/utils/string_reference.h @@ -29,6 +29,10 @@ namespace art { struct StringReference { StringReference(const DexFile* file, uint32_t index) : dex_file(file), string_index(index) { } + const char* GetStringData() const { + return dex_file->GetStringData(dex_file->GetStringId(string_index)); + } + const DexFile* dex_file; uint32_t string_index; }; @@ -45,15 +49,13 @@ struct StringReferenceValueComparator { // Use the string order enforced by the dex file verifier. DCHECK_EQ( sr1.string_index < sr2.string_index, - CompareModifiedUtf8ToModifiedUtf8AsUtf16CodePointValues( - sr1.dex_file->GetStringData(sr1.dex_file->GetStringId(sr1.string_index)), - sr2.dex_file->GetStringData(sr2.dex_file->GetStringId(sr2.string_index))) < 0); + CompareModifiedUtf8ToModifiedUtf8AsUtf16CodePointValues(sr1.GetStringData(), + sr2.GetStringData()) < 0); return sr1.string_index < sr2.string_index; } else { // Cannot compare indexes, so do the string comparison. - return CompareModifiedUtf8ToModifiedUtf8AsUtf16CodePointValues( - sr1.dex_file->GetStringData(sr1.dex_file->GetStringId(sr1.string_index)), - sr2.dex_file->GetStringData(sr2.dex_file->GetStringId(sr2.string_index))) < 0; + return CompareModifiedUtf8ToModifiedUtf8AsUtf16CodePointValues(sr1.GetStringData(), + sr2.GetStringData()) < 0; } } }; diff --git a/runtime/dex_file-inl.h b/runtime/dex_file-inl.h index 4e6c3ca279..108a5af908 100644 --- a/runtime/dex_file-inl.h +++ b/runtime/dex_file-inl.h @@ -38,10 +38,88 @@ inline const char* DexFile::GetStringDataAndUtf16Length(const StringId& string_i return reinterpret_cast<const char*>(ptr); } +inline const char* DexFile::GetStringData(const StringId& string_id) const { + uint32_t ignored; + return GetStringDataAndUtf16Length(string_id, &ignored); +} + +inline const char* DexFile::StringDataAndUtf16LengthByIdx(uint32_t idx, + uint32_t* utf16_length) const { + if (idx == kDexNoIndex) { + *utf16_length = 0; + return nullptr; + } + const StringId& string_id = GetStringId(idx); + return GetStringDataAndUtf16Length(string_id, utf16_length); +} + +inline const char* DexFile::StringDataByIdx(uint32_t idx) const { + uint32_t unicode_length; + return StringDataAndUtf16LengthByIdx(idx, &unicode_length); +} + +inline const char* DexFile::StringByTypeIdx(uint32_t idx, uint32_t* unicode_length) const { + const TypeId& type_id = GetTypeId(idx); + return StringDataAndUtf16LengthByIdx(type_id.descriptor_idx_, unicode_length); +} + +inline const char* DexFile::StringByTypeIdx(uint32_t idx) const { + const TypeId& type_id = GetTypeId(idx); + return StringDataByIdx(type_id.descriptor_idx_); +} + +inline const char* DexFile::GetTypeDescriptor(const TypeId& type_id) const { + return StringDataByIdx(type_id.descriptor_idx_); +} + +inline const char* DexFile::GetFieldTypeDescriptor(const FieldId& field_id) const { + const DexFile::TypeId& type_id = GetTypeId(field_id.type_idx_); + return GetTypeDescriptor(type_id); +} + +inline const char* DexFile::GetFieldName(const FieldId& field_id) const { + return StringDataByIdx(field_id.name_idx_); +} + +inline const char* DexFile::GetMethodDeclaringClassDescriptor(const MethodId& method_id) const { + const DexFile::TypeId& type_id = GetTypeId(method_id.class_idx_); + return GetTypeDescriptor(type_id); +} + inline const Signature DexFile::GetMethodSignature(const MethodId& method_id) const { return Signature(this, GetProtoId(method_id.proto_idx_)); } +inline const char* DexFile::GetMethodName(const MethodId& method_id) const { + return StringDataByIdx(method_id.name_idx_); +} + +inline const char* DexFile::GetMethodShorty(uint32_t idx) const { + return StringDataByIdx(GetProtoId(GetMethodId(idx).proto_idx_).shorty_idx_); +} + +inline const char* DexFile::GetMethodShorty(const MethodId& method_id) const { + return StringDataByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_); +} + +inline const char* DexFile::GetMethodShorty(const MethodId& method_id, uint32_t* length) const { + // Using the UTF16 length is safe here as shorties are guaranteed to be ASCII characters. + return StringDataAndUtf16LengthByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_, length); +} + +inline const char* DexFile::GetClassDescriptor(const ClassDef& class_def) const { + return StringByTypeIdx(class_def.class_idx_); +} + +inline const char* DexFile::GetReturnTypeDescriptor(const ProtoId& proto_id) const { + return StringByTypeIdx(proto_id.return_type_idx_); +} + +inline const char* DexFile::GetShorty(uint32_t proto_idx) const { + const ProtoId& proto_id = GetProtoId(proto_idx); + return StringDataByIdx(proto_id.shorty_idx_); +} + inline const DexFile::TryItem* DexFile::GetTryItems(const CodeItem& code_item, uint32_t offset) { const uint16_t* insns_end_ = &code_item.insns_[code_item.insns_size_in_code_units_]; return reinterpret_cast<const TryItem*> diff --git a/runtime/dex_file.h b/runtime/dex_file.h index 759986e183..3dffe4b6f1 100644 --- a/runtime/dex_file.h +++ b/runtime/dex_file.h @@ -528,25 +528,12 @@ class DexFile { // as the string length of the string data. const char* GetStringDataAndUtf16Length(const StringId& string_id, uint32_t* utf16_length) const; - const char* GetStringData(const StringId& string_id) const { - uint32_t ignored; - return GetStringDataAndUtf16Length(string_id, &ignored); - } + const char* GetStringData(const StringId& string_id) const; // Index version of GetStringDataAndUtf16Length. - const char* StringDataAndUtf16LengthByIdx(uint32_t idx, uint32_t* utf16_length) const { - if (idx == kDexNoIndex) { - *utf16_length = 0; - return nullptr; - } - const StringId& string_id = GetStringId(idx); - return GetStringDataAndUtf16Length(string_id, utf16_length); - } + const char* StringDataAndUtf16LengthByIdx(uint32_t idx, uint32_t* utf16_length) const; - const char* StringDataByIdx(uint32_t idx) const { - uint32_t unicode_length; - return StringDataAndUtf16LengthByIdx(idx, &unicode_length); - } + const char* StringDataByIdx(uint32_t idx) const; // Looks up a string id for a given modified utf8 string. const StringId* FindStringId(const char* string) const; @@ -577,20 +564,12 @@ class DexFile { } // Get the descriptor string associated with a given type index. - const char* StringByTypeIdx(uint32_t idx, uint32_t* unicode_length) const { - const TypeId& type_id = GetTypeId(idx); - return StringDataAndUtf16LengthByIdx(type_id.descriptor_idx_, unicode_length); - } + const char* StringByTypeIdx(uint32_t idx, uint32_t* unicode_length) const; - const char* StringByTypeIdx(uint32_t idx) const { - const TypeId& type_id = GetTypeId(idx); - return StringDataByIdx(type_id.descriptor_idx_); - } + const char* StringByTypeIdx(uint32_t idx) const; // Returns the type descriptor string of a type id. - const char* GetTypeDescriptor(const TypeId& type_id) const { - return StringDataByIdx(type_id.descriptor_idx_); - } + const char* GetTypeDescriptor(const TypeId& type_id) const; // Looks up a type for the given string index const TypeId* FindTypeId(uint32_t string_idx) const; @@ -625,15 +604,10 @@ class DexFile { } // Returns the class descriptor string of a field id. - const char* GetFieldTypeDescriptor(const FieldId& field_id) const { - const DexFile::TypeId& type_id = GetTypeId(field_id.type_idx_); - return GetTypeDescriptor(type_id); - } + const char* GetFieldTypeDescriptor(const FieldId& field_id) const; // Returns the name of a field id. - const char* GetFieldName(const FieldId& field_id) const { - return StringDataByIdx(field_id.name_idx_); - } + const char* GetFieldName(const FieldId& field_id) const; // Returns the number of method identifiers in the .dex file. size_t NumMethodIds() const { @@ -659,10 +633,7 @@ class DexFile { const DexFile::ProtoId& signature) const; // Returns the declaring class descriptor string of a method id. - const char* GetMethodDeclaringClassDescriptor(const MethodId& method_id) const { - const DexFile::TypeId& type_id = GetTypeId(method_id.class_idx_); - return GetTypeDescriptor(type_id); - } + const char* GetMethodDeclaringClassDescriptor(const MethodId& method_id) const; // Returns the prototype of a method id. const ProtoId& GetMethodPrototype(const MethodId& method_id) const { @@ -673,23 +644,15 @@ class DexFile { const Signature GetMethodSignature(const MethodId& method_id) const; // Returns the name of a method id. - const char* GetMethodName(const MethodId& method_id) const { - return StringDataByIdx(method_id.name_idx_); - } + const char* GetMethodName(const MethodId& method_id) const; // Returns the shorty of a method by its index. - const char* GetMethodShorty(uint32_t idx) const { - return StringDataByIdx(GetProtoId(GetMethodId(idx).proto_idx_).shorty_idx_); - } + const char* GetMethodShorty(uint32_t idx) const; // Returns the shorty of a method id. - const char* GetMethodShorty(const MethodId& method_id) const { - return StringDataByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_); - } - const char* GetMethodShorty(const MethodId& method_id, uint32_t* length) const { - // Using the UTF16 length is safe here as shorties are guaranteed to be ASCII characters. - return StringDataAndUtf16LengthByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_, length); - } + const char* GetMethodShorty(const MethodId& method_id) const; + const char* GetMethodShorty(const MethodId& method_id, uint32_t* length) const; + // Returns the number of class definitions in the .dex file. uint32_t NumClassDefs() const { DCHECK(header_ != nullptr) << GetLocation(); @@ -709,9 +672,7 @@ class DexFile { } // Returns the class descriptor string of a class definition. - const char* GetClassDescriptor(const ClassDef& class_def) const { - return StringByTypeIdx(class_def.class_idx_); - } + const char* GetClassDescriptor(const ClassDef& class_def) const; // Looks up a class definition by its class descriptor. Hash must be // ComputeModifiedUtf8Hash(descriptor). @@ -749,9 +710,7 @@ class DexFile { } } - const char* GetReturnTypeDescriptor(const ProtoId& proto_id) const { - return StringByTypeIdx(proto_id.return_type_idx_); - } + const char* GetReturnTypeDescriptor(const ProtoId& proto_id) const; // Returns the number of prototype identifiers in the .dex file. size_t NumProtoIds() const { @@ -788,10 +747,7 @@ class DexFile { const Signature CreateSignature(const StringPiece& signature) const; // Returns the short form method descriptor for the given prototype. - const char* GetShorty(uint32_t proto_idx) const { - const ProtoId& proto_id = GetProtoId(proto_idx); - return StringDataByIdx(proto_id.shorty_idx_); - } + const char* GetShorty(uint32_t proto_idx) const; const TypeList* GetProtoParameters(const ProtoId& proto_id) const { if (proto_id.parameters_off_ == 0) { |