diff options
author | 2024-04-09 12:49:48 +0000 | |
---|---|---|
committer | 2024-04-11 15:10:07 +0000 | |
commit | e8da7cd1d0e7d3535c82f8d05adcef3edd43cd40 (patch) | |
tree | f39114f368998a7b6415bb905fa71dc04dc3b232 | |
parent | 69dc24557f951ce2513d0ea77f35a499fa58467b (diff) |
Clean up string data access in `DexFile`.
The `*ByIdx()` and `*ByTypeIdx()` functions were doing
validity checks that were needed only for processing the
debug data, so move the checks to these callers. Replace
these functions with new overloads of other functions to
provide consistent naming.
In a few cases, rewrite calls to these functions to fetch
and work with a `string_view` instead.
Rename `GetStringLength()` to `GetStringUtf16Length()` and
change its return type to `uint32_t`.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Change-Id: I561899606f6e5ec5f23aa4be617349dacdb376e3
50 files changed, 233 insertions, 260 deletions
diff --git a/compiler/debug/elf_debug_info_writer.h b/compiler/debug/elf_debug_info_writer.h index 50d3f2b6c8..ae4cbd85ab 100644 --- a/compiler/debug/elf_debug_info_writer.h +++ b/compiler/debug/elf_debug_info_writer.h @@ -48,8 +48,8 @@ static std::vector<const char*> GetParamNames(const MethodDebugInfo* mi) { DCHECK(mi->dex_file != nullptr); CodeItemDebugInfoAccessor accessor(*mi->dex_file, mi->code_item, mi->dex_method_index); if (accessor.HasCodeItem()) { - accessor.VisitParameterNames([&](const dex::StringIndex& id) { - names.push_back(mi->dex_file->StringDataByIdx(id)); + accessor.VisitParameterNames([&](dex::StringIndex string_idx) { + names.push_back(string_idx.IsValid() ? mi->dex_file->GetStringData(string_idx) : nullptr); }); } return names; @@ -225,7 +225,7 @@ class ElfCompilationUnitWriter { WriteName(param_names[i]); } // Write the type. - const char* type_desc = dex->StringByTypeIdx(dex_params->GetTypeItem(i).type_idx_); + const char* type_desc = dex->GetTypeDescriptor(dex_params->GetTypeItem(i).type_idx_); WriteLazyType(type_desc); const bool is64bitValue = type_desc[0] == 'D' || type_desc[0] == 'J'; if (accessor.HasCodeItem()) { diff --git a/compiler/exception_test.cc b/compiler/exception_test.cc index 3c7ff0a984..89fe56dda0 100644 --- a/compiler/exception_test.cc +++ b/compiler/exception_test.cc @@ -159,17 +159,17 @@ TEST_F(ExceptionTest, FindCatchHandler) { EXPECT_LE(t0.start_addr_, t1.start_addr_); { CatchHandlerIterator iter(accessor, 4 /* Dex PC in the first try block */); - EXPECT_STREQ("Ljava/io/IOException;", dex_->StringByTypeIdx(iter.GetHandlerTypeIndex())); + EXPECT_STREQ("Ljava/io/IOException;", dex_->GetTypeDescriptor(iter.GetHandlerTypeIndex())); ASSERT_TRUE(iter.HasNext()); iter.Next(); - EXPECT_STREQ("Ljava/lang/Exception;", dex_->StringByTypeIdx(iter.GetHandlerTypeIndex())); + EXPECT_STREQ("Ljava/lang/Exception;", dex_->GetTypeDescriptor(iter.GetHandlerTypeIndex())); ASSERT_TRUE(iter.HasNext()); iter.Next(); EXPECT_FALSE(iter.HasNext()); } { CatchHandlerIterator iter(accessor, 8 /* Dex PC in the second try block */); - EXPECT_STREQ("Ljava/io/IOException;", dex_->StringByTypeIdx(iter.GetHandlerTypeIndex())); + EXPECT_STREQ("Ljava/io/IOException;", dex_->GetTypeDescriptor(iter.GetHandlerTypeIndex())); ASSERT_TRUE(iter.HasNext()); iter.Next(); EXPECT_FALSE(iter.HasNext()); diff --git a/compiler/optimizing/constant_folding.cc b/compiler/optimizing/constant_folding.cc index 52cbfe8322..e31de9e1da 100644 --- a/compiler/optimizing/constant_folding.cc +++ b/compiler/optimizing/constant_folding.cc @@ -596,7 +596,8 @@ void HConstantFoldingVisitor::VisitArrayLength(HArrayLength* inst) { HLoadString* load_string = input->AsLoadString(); const DexFile& dex_file = load_string->GetDexFile(); const dex::StringId& string_id = dex_file.GetStringId(load_string->GetStringIndex()); - inst->ReplaceWith(GetGraph()->GetIntConstant(dex_file.GetStringLength(string_id))); + inst->ReplaceWith(GetGraph()->GetIntConstant( + dchecked_integral_cast<int32_t>(dex_file.GetStringUtf16Length(string_id)))); } } diff --git a/compiler/optimizing/instruction_builder.cc b/compiler/optimizing/instruction_builder.cc index c3918683ce..3e9c42ba70 100644 --- a/compiler/optimizing/instruction_builder.cc +++ b/compiler/optimizing/instruction_builder.cc @@ -60,7 +60,7 @@ class SamePackageCompare { const DexFile* dex_file = dex_compilation_unit_.GetDexFile(); uint32_t referrers_method_idx = dex_compilation_unit_.GetDexMethodIndex(); referrers_descriptor_ = - dex_file->StringByTypeIdx(dex_file->GetMethodId(referrers_method_idx).class_idx_); + dex_file->GetMethodDeclaringClassDescriptor(dex_file->GetMethodId(referrers_method_idx)); referrers_package_length_ = PackageLength(referrers_descriptor_); } std::string temp; @@ -2439,7 +2439,7 @@ HNewArray* HInstructionBuilder::BuildFilledNewArray(uint32_t dex_pc, HInstruction* length = graph_->GetIntConstant(number_of_operands, dex_pc); HNewArray* new_array = BuildNewArray(dex_pc, type_index, length); - const char* descriptor = dex_file_->StringByTypeIdx(type_index); + const char* descriptor = dex_file_->GetTypeDescriptor(type_index); DCHECK_EQ(descriptor[0], '[') << descriptor; char primitive = descriptor[1]; DCHECK(primitive == 'I' @@ -2657,14 +2657,11 @@ bool HInstructionBuilder::LoadClassNeedsAccessCheck(dex::TypeIndex type_index, return true; } } else { - uint32_t outer_utf16_length; - const char* outer_descriptor = - outer_dex_file->StringByTypeIdx(outer_class_def.class_idx_, &outer_utf16_length); - uint32_t target_utf16_length; - const char* target_descriptor = - inner_dex_file->StringByTypeIdx(type_index, &target_utf16_length); - if (outer_utf16_length != target_utf16_length || - strcmp(outer_descriptor, target_descriptor) != 0) { + const std::string_view outer_descriptor = + outer_dex_file->GetTypeDescriptorView(outer_class_def.class_idx_); + const std::string_view target_descriptor = + inner_dex_file->GetTypeDescriptorView(type_index); + if (outer_descriptor != target_descriptor) { return true; } } diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc index ae778b421a..2710f49ef2 100644 --- a/compiler/optimizing/instruction_simplifier.cc +++ b/compiler/optimizing/instruction_simplifier.cc @@ -2716,7 +2716,7 @@ void InstructionSimplifierVisitor::SimplifyStringIndexOf(HInvoke* invoke) { const DexFile& dex_file = load_string->GetDexFile(); uint32_t utf16_length; const char* data = - dex_file.StringDataAndUtf16LengthByIdx(load_string->GetStringIndex(), &utf16_length); + dex_file.GetStringDataAndUtf16Length(load_string->GetStringIndex(), &utf16_length); if (utf16_length == 0) { invoke->ReplaceWith(GetGraph()->GetIntConstant(-1)); invoke->GetBlock()->RemoveInstruction(invoke); diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc index 4de6d5d582..3dde811958 100644 --- a/compiler/optimizing/intrinsics_arm64.cc +++ b/compiler/optimizing/intrinsics_arm64.cc @@ -2053,7 +2053,7 @@ static const char* GetConstString(HInstruction* candidate, uint32_t* utf16_lengt if (candidate->IsLoadString()) { HLoadString* load_string = candidate->AsLoadString(); const DexFile& dex_file = load_string->GetDexFile(); - return dex_file.StringDataAndUtf16LengthByIdx(load_string->GetStringIndex(), utf16_length); + return dex_file.GetStringDataAndUtf16Length(load_string->GetStringIndex(), utf16_length); } return nullptr; } diff --git a/compiler/optimizing/intrinsics_arm_vixl.cc b/compiler/optimizing/intrinsics_arm_vixl.cc index c763721aec..ea7b65181a 100644 --- a/compiler/optimizing/intrinsics_arm_vixl.cc +++ b/compiler/optimizing/intrinsics_arm_vixl.cc @@ -838,7 +838,7 @@ static const char* GetConstString(HInstruction* candidate, uint32_t* utf16_lengt if (candidate->IsLoadString()) { HLoadString* load_string = candidate->AsLoadString(); const DexFile& dex_file = load_string->GetDexFile(); - return dex_file.StringDataAndUtf16LengthByIdx(load_string->GetStringIndex(), utf16_length); + return dex_file.GetStringDataAndUtf16Length(load_string->GetStringIndex(), utf16_length); } return nullptr; } diff --git a/compiler/optimizing/sharpening.cc b/compiler/optimizing/sharpening.cc index 5a697e32a1..e900b3ef3a 100644 --- a/compiler/optimizing/sharpening.cc +++ b/compiler/optimizing/sharpening.cc @@ -54,7 +54,7 @@ static bool BootImageAOTCanEmbedMethod(ArtMethod* method, const CompilerOptions& ObjPtr<mirror::Class> klass = method->GetDeclaringClass(); DCHECK(klass != nullptr); const DexFile& dex_file = klass->GetDexFile(); - return compiler_options.IsImageClass(dex_file.StringByTypeIdx(klass->GetDexTypeIndex())); + return compiler_options.IsImageClass(dex_file.GetTypeDescriptor(klass->GetDexTypeIndex())); } HInvokeStaticOrDirect::DispatchInfo HSharpening::SharpenLoadMethod( @@ -173,7 +173,7 @@ HLoadClass::LoadKind HSharpening::ComputeLoadClassKind( auto is_class_in_current_boot_image = [&]() { return (compiler_options.IsBootImage() || compiler_options.IsBootImageExtension()) && - compiler_options.IsImageClass(dex_file.StringByTypeIdx(type_index)); + compiler_options.IsImageClass(dex_file.GetTypeDescriptor(type_index)); }; bool is_in_boot_image = false; @@ -210,12 +210,12 @@ HLoadClass::LoadKind HSharpening::ComputeLoadClassKind( const char* slash_pos = strrchr(descriptor, '/'); return (slash_pos != nullptr) ? static_cast<size_t>(slash_pos - descriptor) : 0u; }; - const char* klass_descriptor = dex_file.StringByTypeIdx(type_index); + const char* klass_descriptor = dex_file.GetTypeDescriptor(type_index); const uint32_t klass_package_length = package_length(klass_descriptor); const DexFile* referrer_dex_file = dex_compilation_unit.GetDexFile(); const dex::TypeIndex referrer_type_index = referrer_dex_file->GetClassDef(dex_compilation_unit.GetClassDefIndex()).class_idx_; - const char* referrer_descriptor = referrer_dex_file->StringByTypeIdx(referrer_type_index); + const char* referrer_descriptor = referrer_dex_file->GetTypeDescriptor(referrer_type_index); const uint32_t referrer_package_length = package_length(referrer_descriptor); bool same_package = (referrer_package_length == klass_package_length) && @@ -240,7 +240,7 @@ HLoadClass::LoadKind HSharpening::ComputeLoadClassKind( is_in_boot_image = true; desired_load_kind = HLoadClass::LoadKind::kBootImageRelRo; } else if ((klass != nullptr) && - compiler_options.IsImageClass(dex_file.StringByTypeIdx(type_index))) { + compiler_options.IsImageClass(dex_file.GetTypeDescriptor(type_index))) { is_in_boot_image = true; desired_load_kind = HLoadClass::LoadKind::kBootImageLinkTimePcRelative; } else { @@ -317,7 +317,7 @@ static inline bool CanUseTypeCheckBitstring(ObjPtr<mirror::Class> klass, CodeGen if (compiler_options.IsJitCompiler()) { // If we're JITting, try to assign a type check bitstring (fall through). } else if (codegen->GetCompilerOptions().IsBootImage()) { - const char* descriptor = klass->GetDexFile().StringByTypeIdx(klass->GetDexTypeIndex()); + const char* descriptor = klass->GetDexFile().GetTypeDescriptor(klass->GetDexTypeIndex()); if (!codegen->GetCompilerOptions().IsImageClass(descriptor)) { return false; } diff --git a/dex2oat/driver/compiler_driver.cc b/dex2oat/driver/compiler_driver.cc index 3415efae3d..4386f671fc 100644 --- a/dex2oat/driver/compiler_driver.cc +++ b/dex2oat/driver/compiler_driver.cc @@ -687,7 +687,7 @@ static void InitializeTypeCheckBitstrings(CompilerDriver* driver, case Instruction::INSTANCE_OF: { dex::TypeIndex type_index( (inst->Opcode() == Instruction::CHECK_CAST) ? inst->VRegB_21c() : inst->VRegC_22c()); - const char* descriptor = dex_file.StringByTypeIdx(type_index); + const char* descriptor = dex_file.GetTypeDescriptor(type_index); // We currently do not use the bitstring type check for array or final (including // primitive) classes. We may reconsider this in future if it's deemed to be beneficial. // And we cannot use it for classes outside the boot image as we do not know the runtime @@ -2097,7 +2097,7 @@ class InitializeClassVisitor : public CompilationVisitor { const DexFile& dex_file = *manager_->GetDexFile(); const dex::ClassDef& class_def = dex_file.GetClassDef(class_def_index); const dex::TypeId& class_type_id = dex_file.GetTypeId(class_def.class_idx_); - const char* descriptor = dex_file.StringDataByIdx(class_type_id.descriptor_idx_); + const char* descriptor = dex_file.GetStringData(class_type_id.descriptor_idx_); ScopedObjectAccess soa(Thread::Current()); StackHandleScope<3> hs(soa.Self()); @@ -2124,7 +2124,7 @@ class InitializeClassVisitor : public CompilationVisitor { const DexFile& dex_file = klass->GetDexFile(); const dex::ClassDef* class_def = klass->GetClassDef(); const dex::TypeId& class_type_id = dex_file.GetTypeId(class_def->class_idx_); - const char* descriptor = dex_file.StringDataByIdx(class_type_id.descriptor_idx_); + const char* descriptor = dex_file.GetStringData(class_type_id.descriptor_idx_); StackHandleScope<3> hs(self); ClassLinker* const class_linker = manager_->GetClassLinker(); Runtime* const runtime = Runtime::Current(); diff --git a/dex2oat/linker/image_writer.cc b/dex2oat/linker/image_writer.cc index c9be7de2c2..63ac71fc12 100644 --- a/dex2oat/linker/image_writer.cc +++ b/dex2oat/linker/image_writer.cc @@ -2078,8 +2078,8 @@ void ImageWriter::LayoutHelper::ProcessInterns(Thread* self) { // Assign bin slots for strings defined in this dex file in StringId (lexicographical) order. for (size_t i = 0, count = dex_file->NumStringIds(); i != count; ++i) { uint32_t utf16_length; - const char* utf8_data = dex_file->StringDataAndUtf16LengthByIdx(dex::StringIndex(i), - &utf16_length); + const char* utf8_data = dex_file->GetStringDataAndUtf16Length(dex::StringIndex(i), + &utf16_length); uint32_t hash = InternTable::Utf8String::Hash(utf16_length, utf8_data); auto intern_it = intern_set.FindWithHash(InternTable::Utf8String(utf16_length, utf8_data), hash); diff --git a/dexdump/dexdump.cc b/dexdump/dexdump.cc index 0ed3c52c07..fd42454007 100644 --- a/dexdump/dexdump.cc +++ b/dexdump/dexdump.cc @@ -578,28 +578,28 @@ static void dumpEncodedValue(const DexFile* pDexFile, const u1** data, u1 type, case DexFile::kDexAnnotationString: { const u4 idx = static_cast<u4>(readVarWidth(data, arg, false)); if (gOptions.outputFormat == OUTPUT_PLAIN) { - dumpEscapedString(pDexFile->StringViewByIdx(dex::StringIndex(idx))); + dumpEscapedString(pDexFile->GetStringView(dex::StringIndex(idx))); } else { - dumpXmlAttribute(pDexFile->StringViewByIdx(dex::StringIndex(idx))); + dumpXmlAttribute(pDexFile->GetStringView(dex::StringIndex(idx))); } break; } case DexFile::kDexAnnotationType: { const u4 str_idx = static_cast<u4>(readVarWidth(data, arg, false)); - fputs(pDexFile->StringByTypeIdx(dex::TypeIndex(str_idx)), gOutFile); + fputs(pDexFile->GetTypeDescriptor(dex::TypeIndex(str_idx)), gOutFile); break; } case DexFile::kDexAnnotationField: case DexFile::kDexAnnotationEnum: { const u4 field_idx = static_cast<u4>(readVarWidth(data, arg, false)); const dex::FieldId& pFieldId = pDexFile->GetFieldId(field_idx); - fputs(pDexFile->StringDataByIdx(pFieldId.name_idx_), gOutFile); + fputs(pDexFile->GetStringData(pFieldId.name_idx_), gOutFile); break; } case DexFile::kDexAnnotationMethod: { const u4 method_idx = static_cast<u4>(readVarWidth(data, arg, false)); const dex::MethodId& pMethodId = pDexFile->GetMethodId(method_idx); - fputs(pDexFile->StringDataByIdx(pMethodId.name_idx_), gOutFile); + fputs(pDexFile->GetStringData(pMethodId.name_idx_), gOutFile); break; } case DexFile::kDexAnnotationArray: { @@ -615,13 +615,13 @@ static void dumpEncodedValue(const DexFile* pDexFile, const u1** data, u1 type, } case DexFile::kDexAnnotationAnnotation: { const u4 type_idx = DecodeUnsignedLeb128(data); - fputs(pDexFile->StringByTypeIdx(dex::TypeIndex(type_idx)), gOutFile); + fputs(pDexFile->GetTypeDescriptor(dex::TypeIndex(type_idx)), gOutFile); // Decode and display all name=value pairs. const u4 size = DecodeUnsignedLeb128(data); for (u4 i = 0; i < size; i++) { const u4 name_idx = DecodeUnsignedLeb128(data); fputc(' ', gOutFile); - fputs(pDexFile->StringDataByIdx(dex::StringIndex(name_idx)), gOutFile); + fputs(pDexFile->GetStringData(dex::StringIndex(name_idx)), gOutFile); fputc('=', gOutFile); dumpEncodedValue(pDexFile, data); } @@ -772,7 +772,7 @@ static void dumpClassAnnotations(const DexFile* pDexFile, int idx) { for (u4 i = 0; i < dir->fields_size_; i++) { const u4 field_idx = fields[i].field_idx_; const dex::FieldId& pFieldId = pDexFile->GetFieldId(field_idx); - const char* field_name = pDexFile->StringDataByIdx(pFieldId.name_idx_); + const char* field_name = pDexFile->GetStringData(pFieldId.name_idx_); fprintf(gOutFile, "Annotations on field #%u '%s'\n", field_idx, field_name); dumpAnnotationSetItem(pDexFile, pDexFile->GetFieldAnnotationSetItem(fields[i])); } @@ -783,7 +783,7 @@ static void dumpClassAnnotations(const DexFile* pDexFile, int idx) { for (u4 i = 0; i < dir->methods_size_; i++) { const u4 method_idx = methods[i].method_idx_; const dex::MethodId& pMethodId = pDexFile->GetMethodId(method_idx); - const char* method_name = pDexFile->StringDataByIdx(pMethodId.name_idx_); + const char* method_name = pDexFile->GetStringData(pMethodId.name_idx_); fprintf(gOutFile, "Annotations on method #%u '%s'\n", method_idx, method_name); dumpAnnotationSetItem(pDexFile, pDexFile->GetMethodAnnotationSetItem(methods[i])); } @@ -794,7 +794,7 @@ static void dumpClassAnnotations(const DexFile* pDexFile, int idx) { for (u4 i = 0; i < dir->parameters_size_; i++) { const u4 method_idx = pars[i].method_idx_; const dex::MethodId& pMethodId = pDexFile->GetMethodId(method_idx); - const char* method_name = pDexFile->StringDataByIdx(pMethodId.name_idx_); + const char* method_name = pDexFile->GetStringData(pMethodId.name_idx_); fprintf(gOutFile, "Annotations on method #%u '%s' parameters\n", method_idx, method_name); const dex::AnnotationSetRefList* list = pDexFile->GetParameterAnnotationSetRefList(&pars[i]); @@ -814,7 +814,7 @@ static void dumpClassAnnotations(const DexFile* pDexFile, int idx) { * Dumps an interface that a class declares to implement. */ static void dumpInterface(const DexFile* pDexFile, const dex::TypeItem& pTypeItem, int i) { - const char* interfaceName = pDexFile->StringByTypeIdx(pTypeItem.type_idx_); + const char* interfaceName = pDexFile->GetTypeDescriptor(pTypeItem.type_idx_); if (gOptions.outputFormat == OUTPUT_PLAIN) { fprintf(gOutFile, " #%d : '%s'\n", i, interfaceName); } else { @@ -844,7 +844,7 @@ static void dumpCatches(const DexFile* pDexFile, const dex::CodeItem* pCode) { fprintf(gOutFile, " 0x%04x - 0x%04x\n", start, end); for (CatchHandlerIterator it(accessor, try_item); it.HasNext(); it.Next()) { const dex::TypeIndex tidx = it.GetHandlerTypeIndex(); - const char* descriptor = (!tidx.IsValid()) ? "<any>" : pDexFile->StringByTypeIdx(tidx); + const char* descriptor = (!tidx.IsValid()) ? "<any>" : pDexFile->GetTypeDescriptor(tidx); fprintf(gOutFile, " %s -> 0x%04x\n", descriptor, it.GetHandlerAddress()); } // for } // for @@ -910,7 +910,7 @@ static std::unique_ptr<char[]> indexString(const DexFile* pDexFile, break; case Instruction::kIndexTypeRef: if (index < pDexFile->GetHeader().type_ids_size_) { - const char* tp = pDexFile->StringByTypeIdx(dex::TypeIndex(index)); + const char* tp = pDexFile->GetTypeDescriptor(dex::TypeIndex(index)); outSize = snprintf(buf.get(), bufSize, "%s // type@%0*x", tp, width, index); } else { outSize = snprintf(buf.get(), bufSize, "<type?> // type@%0*x", width, index); @@ -918,7 +918,7 @@ static std::unique_ptr<char[]> indexString(const DexFile* pDexFile, break; case Instruction::kIndexStringRef: if (index < pDexFile->GetHeader().string_ids_size_) { - const char* st = pDexFile->StringDataByIdx(dex::StringIndex(index)); + const char* st = pDexFile->GetStringData(dex::StringIndex(index)); if (needsEscape(std::string_view(st))) { std::string escaped = escapeString(st); outSize = @@ -933,9 +933,9 @@ static std::unique_ptr<char[]> indexString(const DexFile* pDexFile, case Instruction::kIndexMethodRef: if (index < pDexFile->GetHeader().method_ids_size_) { const dex::MethodId& pMethodId = pDexFile->GetMethodId(index); - const char* name = pDexFile->StringDataByIdx(pMethodId.name_idx_); + const char* name = pDexFile->GetStringData(pMethodId.name_idx_); const Signature signature = pDexFile->GetMethodSignature(pMethodId); - const char* backDescriptor = pDexFile->StringByTypeIdx(pMethodId.class_idx_); + const char* backDescriptor = pDexFile->GetTypeDescriptor(pMethodId.class_idx_); outSize = snprintf(buf.get(), bufSize, "%s.%s:%s // method@%0*x", backDescriptor, name, signature.ToString().c_str(), width, index); } else { @@ -945,9 +945,9 @@ static std::unique_ptr<char[]> indexString(const DexFile* pDexFile, case Instruction::kIndexFieldRef: if (index < pDexFile->GetHeader().field_ids_size_) { const dex::FieldId& pFieldId = pDexFile->GetFieldId(index); - const char* name = pDexFile->StringDataByIdx(pFieldId.name_idx_); - const char* typeDescriptor = pDexFile->StringByTypeIdx(pFieldId.type_idx_); - const char* backDescriptor = pDexFile->StringByTypeIdx(pFieldId.class_idx_); + const char* name = pDexFile->GetStringData(pFieldId.name_idx_); + const char* typeDescriptor = pDexFile->GetTypeDescriptor(pFieldId.type_idx_); + const char* backDescriptor = pDexFile->GetTypeDescriptor(pFieldId.class_idx_); outSize = snprintf(buf.get(), bufSize, "%s.%s:%s // field@%0*x", backDescriptor, name, typeDescriptor, width, index); } else { @@ -966,9 +966,9 @@ static std::unique_ptr<char[]> indexString(const DexFile* pDexFile, std::string proto("<proto?>"); if (index < pDexFile->GetHeader().method_ids_size_) { const dex::MethodId& pMethodId = pDexFile->GetMethodId(index); - const char* name = pDexFile->StringDataByIdx(pMethodId.name_idx_); + const char* name = pDexFile->GetStringData(pMethodId.name_idx_); const Signature signature = pDexFile->GetMethodSignature(pMethodId); - const char* backDescriptor = pDexFile->StringByTypeIdx(pMethodId.class_idx_); + const char* backDescriptor = pDexFile->GetTypeDescriptor(pMethodId.class_idx_); method = android::base::StringPrintf("%s.%s:%s", backDescriptor, name, @@ -1237,9 +1237,9 @@ static void dumpInstruction(const DexFile* pDexFile, static void dumpBytecodes(const DexFile* pDexFile, u4 idx, const dex::CodeItem* pCode, u4 codeOffset) { const dex::MethodId& pMethodId = pDexFile->GetMethodId(idx); - const char* name = pDexFile->StringDataByIdx(pMethodId.name_idx_); + const char* name = pDexFile->GetStringData(pMethodId.name_idx_); const Signature signature = pDexFile->GetMethodSignature(pMethodId); - const char* backDescriptor = pDexFile->StringByTypeIdx(pMethodId.class_idx_); + const char* backDescriptor = pDexFile->GetTypeDescriptor(pMethodId.class_idx_); // Generate header. std::unique_ptr<char[]> dot(descriptorToDot(backDescriptor)); @@ -1353,10 +1353,10 @@ static void dumpMethod(const ClassAccessor::Method& method, int i) { const DexFile& dex_file = method.GetDexFile(); const dex::MethodId& pMethodId = dex_file.GetMethodId(method.GetIndex()); - const char* name = dex_file.StringDataByIdx(pMethodId.name_idx_); + const char* name = dex_file.GetStringData(pMethodId.name_idx_); const Signature signature = dex_file.GetMethodSignature(pMethodId); char* typeDescriptor = strdup(signature.ToString().c_str()); - const char* backDescriptor = dex_file.StringByTypeIdx(pMethodId.class_idx_); + const char* backDescriptor = dex_file.GetTypeDescriptor(pMethodId.class_idx_); char* accessStr = createAccessFlagStr(flags, kAccessForMethod); const uint32_t hiddenapiFlags = method.GetHiddenapiFlags(); @@ -1474,9 +1474,9 @@ static void dumpField(const ClassAccessor::Field& field, int i, const u1** data const DexFile& dex_file = field.GetDexFile(); const dex::FieldId& field_id = dex_file.GetFieldId(field.GetIndex()); - const char* name = dex_file.StringDataByIdx(field_id.name_idx_); - const char* typeDescriptor = dex_file.StringByTypeIdx(field_id.type_idx_); - const char* backDescriptor = dex_file.StringByTypeIdx(field_id.class_idx_); + const char* name = dex_file.GetStringData(field_id.name_idx_); + const char* typeDescriptor = dex_file.GetTypeDescriptor(field_id.type_idx_); + const char* backDescriptor = dex_file.GetTypeDescriptor(field_id.class_idx_); char* accessStr = createAccessFlagStr(flags, kAccessForField); const uint32_t hiddenapiFlags = field.GetHiddenapiFlags(); @@ -1565,7 +1565,7 @@ static void dumpClass(const DexFile* pDexFile, int idx, char** pLastPackage) { // up the classes, sort them, and dump them alphabetically so the // package name wouldn't jump around, but that's not a great plan // for something that needs to run on the device. - const char* classDescriptor = pDexFile->StringByTypeIdx(pClassDef.class_idx_); + const char* classDescriptor = pDexFile->GetTypeDescriptor(pClassDef.class_idx_); if (!(classDescriptor[0] == 'L' && classDescriptor[strlen(classDescriptor)-1] == ';')) { // Arrays and primitives should not be defined explicitly. Keep going? @@ -1607,7 +1607,7 @@ static void dumpClass(const DexFile* pDexFile, int idx, char** pLastPackage) { if (!pClassDef.superclass_idx_.IsValid()) { superclassDescriptor = nullptr; } else { - superclassDescriptor = pDexFile->StringByTypeIdx(pClassDef.superclass_idx_); + superclassDescriptor = pDexFile->GetTypeDescriptor(pClassDef.superclass_idx_); } if (gOptions.outputFormat == OUTPUT_PLAIN) { fprintf(gOutFile, "Class #%d -\n", idx); @@ -1693,7 +1693,7 @@ static void dumpClass(const DexFile* pDexFile, int idx, char** pLastPackage) { if (gOptions.outputFormat == OUTPUT_PLAIN) { const char* fileName; if (pClassDef.source_file_idx_.IsValid()) { - fileName = pDexFile->StringDataByIdx(pClassDef.source_file_idx_); + fileName = pDexFile->GetStringData(pClassDef.source_file_idx_); } else { fileName = "unknown"; } @@ -1803,7 +1803,7 @@ static void dumpCallSite(const DexFile* pDexFile, u4 idx) { uint32_t method_handle_idx = static_cast<uint32_t>(it.GetJavaValue().i); it.Next(); dex::StringIndex method_name_idx = static_cast<dex::StringIndex>(it.GetJavaValue().i); - const char* method_name = pDexFile->StringDataByIdx(method_name_idx); + const char* method_name = pDexFile->GetStringData(method_name_idx); it.Next(); dex::ProtoIndex method_type_idx = static_cast<dex::ProtoIndex>(it.GetJavaValue().i); const dex::ProtoId& method_type_id = pDexFile->GetProtoId(method_type_idx); @@ -1864,7 +1864,7 @@ static void dumpCallSite(const DexFile* pDexFile, u4 idx) { case EncodedArrayValueIterator::ValueType::kString: { type = "String"; dex::StringIndex string_idx = static_cast<dex::StringIndex>(it.GetJavaValue().i); - value = pDexFile->StringDataByIdx(string_idx); + value = pDexFile->GetStringData(string_idx); break; } case EncodedArrayValueIterator::ValueType::kType: { @@ -1925,7 +1925,7 @@ static void dumpStrings(const DexFile* pDexFile) { for (uint32_t i = 0; i < pHeader.string_ids_size_; i++) { dex::StringIndex idx = static_cast<dex::StringIndex>(i); - const char* string = pDexFile->StringDataByIdx(idx); + const char* string = pDexFile->GetStringData(idx); if (!isPrintable(string)) { string = "skipped (not printable)"; } diff --git a/dexlayout/dexlayout.cc b/dexlayout/dexlayout.cc index d674fd2ebc..f43ded0251 100644 --- a/dexlayout/dexlayout.cc +++ b/dexlayout/dexlayout.cc @@ -1119,7 +1119,7 @@ void DexLayout::DumpBytecodes(uint32_t idx, const dex_ir::CodeItem* code, uint32 /* * Lookup functions. */ -static const char* StringDataByIdx(uint32_t idx, dex_ir::Header* header) { +static const char* GetStringData(uint32_t idx, dex_ir::Header* header) { dex_ir::StringId* string_id = header->GetStringIdOrNullPtr(idx); if (string_id == nullptr) { return nullptr; @@ -1170,7 +1170,7 @@ void DexLayout::DumpCode(uint32_t idx, if (debug_info != nullptr) { DexFile::DecodeDebugPositionInfo(debug_info->GetDebugInfo(), [this](uint32_t idx) { - return StringDataByIdx(idx, this->header_); + return GetStringData(idx, this->header_); }, [&](const DexFile::PositionInfo& entry) { fprintf(out_file_, @@ -1202,7 +1202,7 @@ void DexLayout::DumpCode(uint32_t idx, code->InsSize(), code->InsnsSize(), [this](uint32_t idx) { - return StringDataByIdx(idx, this->header_); + return GetStringData(idx, this->header_); }, [this](uint32_t idx) { return diff --git a/dexlist/dexlist.cc b/dexlist/dexlist.cc index 553e364c5e..ed717803ca 100644 --- a/dexlist/dexlist.cc +++ b/dexlist/dexlist.cc @@ -97,8 +97,8 @@ static void dumpMethod(const DexFile* pDexFile, // Method information. const dex::MethodId& pMethodId = pDexFile->GetMethodId(idx); - const char* methodName = pDexFile->StringDataByIdx(pMethodId.name_idx_); - const char* classDescriptor = pDexFile->StringByTypeIdx(pMethodId.class_idx_); + const char* methodName = pDexFile->GetStringData(pMethodId.name_idx_); + const char* classDescriptor = pDexFile->GetTypeDescriptor(pMethodId.class_idx_); std::unique_ptr<char[]> className(descriptorToDot(classDescriptor)); const u4 insnsOff = codeOffset + 0x10; @@ -142,7 +142,7 @@ void dumpClass(const DexFile* pDexFile, u4 idx) { const char* fileName = nullptr; if (class_def.source_file_idx_.IsValid()) { - fileName = pDexFile->StringDataByIdx(class_def.source_file_idx_); + fileName = pDexFile->GetStringData(class_def.source_file_idx_); } ClassAccessor accessor(*pDexFile, class_def); diff --git a/libdexfile/dex/art_dex_file_loader_test.cc b/libdexfile/dex/art_dex_file_loader_test.cc index 23ffad6e78..384452cd4c 100644 --- a/libdexfile/dex/art_dex_file_loader_test.cc +++ b/libdexfile/dex/art_dex_file_loader_test.cc @@ -175,7 +175,7 @@ TEST_F(ArtDexFileLoaderTest, GetMethodSignature) { { ASSERT_EQ(1U, accessor.NumDirectMethods()); const dex::MethodId& method_id = raw->GetMethodId(cur_method->GetIndex()); - const char* name = raw->StringDataByIdx(method_id.name_idx_); + const char* name = raw->GetStringData(method_id.name_idx_); ASSERT_STREQ("<init>", name); std::string signature(raw->GetMethodSignature(method_id).ToString()); ASSERT_EQ("()V", signature); @@ -250,7 +250,7 @@ TEST_F(ArtDexFileLoaderTest, GetMethodSignature) { ASSERT_TRUE(cur_method != methods.end()); const dex::MethodId& method_id = raw->GetMethodId(cur_method->GetIndex()); - const char* name = raw->StringDataByIdx(method_id.name_idx_); + const char* name = raw->GetStringData(method_id.name_idx_); ASSERT_STREQ(r.name, name); std::string signature(raw->GetMethodSignature(method_id).ToString()); @@ -281,7 +281,7 @@ TEST_F(ArtDexFileLoaderTest, FindStringId) { TEST_F(ArtDexFileLoaderTest, FindTypeId) { for (size_t i = 0; i < java_lang_dex_file_->NumTypeIds(); i++) { - const char* type_str = java_lang_dex_file_->StringByTypeIdx(dex::TypeIndex(i)); + const char* type_str = java_lang_dex_file_->GetTypeDescriptor(dex::TypeIndex(i)); const dex::StringId* type_str_id = java_lang_dex_file_->FindStringId(type_str); ASSERT_TRUE(type_str_id != nullptr); dex::StringIndex type_str_idx = java_lang_dex_file_->GetIndexForStringId(*type_str_id); @@ -317,7 +317,7 @@ TEST_F(ArtDexFileLoaderTest, FindMethodId) { const dex::ProtoId& signature = java_lang_dex_file_->GetProtoId(to_find.proto_idx_); const dex::MethodId* found = java_lang_dex_file_->FindMethodId(klass, name, signature); ASSERT_TRUE(found != nullptr) << "Didn't find method " << i << ": " - << java_lang_dex_file_->StringByTypeIdx(to_find.class_idx_) << "." + << java_lang_dex_file_->GetTypeDescriptor(to_find.class_idx_) << "." << java_lang_dex_file_->GetStringData(name) << java_lang_dex_file_->GetMethodSignature(to_find); EXPECT_EQ(java_lang_dex_file_->GetIndexForMethodId(*found), i); @@ -332,8 +332,8 @@ TEST_F(ArtDexFileLoaderTest, FindFieldId) { const dex::TypeId& type = java_lang_dex_file_->GetTypeId(to_find.type_idx_); const dex::FieldId* found = java_lang_dex_file_->FindFieldId(klass, name, type); ASSERT_TRUE(found != nullptr) << "Didn't find field " << i << ": " - << java_lang_dex_file_->StringByTypeIdx(to_find.type_idx_) << " " - << java_lang_dex_file_->StringByTypeIdx(to_find.class_idx_) << "." + << java_lang_dex_file_->GetTypeDescriptor(to_find.type_idx_) << " " + << java_lang_dex_file_->GetTypeDescriptor(to_find.class_idx_) << "." << java_lang_dex_file_->GetStringData(name); EXPECT_EQ(java_lang_dex_file_->GetIndexForFieldId(*found), i); } diff --git a/libdexfile/dex/class_accessor-inl.h b/libdexfile/dex/class_accessor-inl.h index f224a29fc4..4239da97a8 100644 --- a/libdexfile/dex/class_accessor-inl.h +++ b/libdexfile/dex/class_accessor-inl.h @@ -151,7 +151,7 @@ inline CodeItemDataAccessor ClassAccessor::Method::GetInstructionsAndData() cons } inline const char* ClassAccessor::GetDescriptor() const { - return dex_file_.StringByTypeIdx(GetClassIdx()); + return dex_file_.GetTypeDescriptor(GetClassIdx()); } inline const dex::CodeItem* ClassAccessor::Method::GetCodeItem() const { diff --git a/libdexfile/dex/class_accessor_test.cc b/libdexfile/dex/class_accessor_test.cc index 9f2ee23327..cb50096084 100644 --- a/libdexfile/dex/class_accessor_test.cc +++ b/libdexfile/dex/class_accessor_test.cc @@ -31,7 +31,7 @@ TEST_F(ClassAccessorTest, TestVisiting) { ASSERT_GT(dex_file->NumClassDefs(), 0u); for (ClassAccessor accessor : dex_file->GetClasses()) { const dex::ClassDef& class_def = dex_file->GetClassDef(accessor.GetClassDefIndex()); - EXPECT_EQ(accessor.GetDescriptor(), dex_file->StringByTypeIdx(class_def.class_idx_)); + EXPECT_EQ(accessor.GetDescriptor(), dex_file->GetTypeDescriptor(class_def.class_idx_)); EXPECT_EQ(class_def_idx, accessor.GetClassDefIndex()); ++class_def_idx; // Check iterators against visitors. diff --git a/libdexfile/dex/code_item_accessors-inl.h b/libdexfile/dex/code_item_accessors-inl.h index 4586a0ff7a..8fa6ea3fd8 100644 --- a/libdexfile/dex/code_item_accessors-inl.h +++ b/libdexfile/dex/code_item_accessors-inl.h @@ -239,7 +239,7 @@ inline bool CodeItemDebugInfoAccessor::DecodeDebugPositionInfo(Visitor&& visitor return dex_file_->DecodeDebugPositionInfo( dex_file_->GetDebugInfoStream(DebugInfoOffset()), [this](uint32_t idx) { - return dex_file_->StringDataByIdx(dex::StringIndex(idx)); + return dex_file_->GetStringData(dex::StringIndex(idx)); }, std::forward<Visitor>(visitor)); } diff --git a/libdexfile/dex/dex_file-inl.h b/libdexfile/dex/dex_file-inl.h index 8ad065b494..2cd3781023 100644 --- a/libdexfile/dex/dex_file-inl.h +++ b/libdexfile/dex/dex_file-inl.h @@ -39,11 +39,6 @@ inline std::string_view StringViewFromUtf16Length(const char* utf8_data, size_t return std::string_view(utf8_data, utf8_length); } -inline int32_t DexFile::GetStringLength(const dex::StringId& string_id) const { - const uint8_t* ptr = DataBegin() + string_id.string_data_off_; - return DecodeUnsignedLeb128(&ptr); -} - ALWAYS_INLINE inline const char* DexFile::GetStringDataAndUtf16Length(const dex::StringId& string_id, uint32_t* utf16_length) const { @@ -54,64 +49,55 @@ inline const char* DexFile::GetStringDataAndUtf16Length(const dex::StringId& str } ALWAYS_INLINE -inline const char* DexFile::GetStringData(const dex::StringId& string_id) const { - uint32_t ignored; - return GetStringDataAndUtf16Length(string_id, &ignored); +inline const char* DexFile::GetStringDataAndUtf16Length(const dex::StringIndex string_idx, + uint32_t* utf16_length) const { + return GetStringDataAndUtf16Length(GetStringId(string_idx), utf16_length); } ALWAYS_INLINE -inline std::string_view DexFile::GetStringView(const dex::StringId& string_id) const { +inline uint32_t DexFile::GetStringUtf16Length(const dex::StringId& string_id) const { uint32_t utf16_length; - const char* data = GetStringDataAndUtf16Length(string_id, &utf16_length); - return StringViewFromUtf16Length(data, utf16_length); + GetStringDataAndUtf16Length(string_id, &utf16_length); + return utf16_length; } ALWAYS_INLINE -inline const char* DexFile::StringDataAndUtf16LengthByIdx(dex::StringIndex idx, - uint32_t* utf16_length) const { - if (!idx.IsValid()) { - *utf16_length = 0; - return nullptr; - } - const dex::StringId& string_id = GetStringId(idx); - return GetStringDataAndUtf16Length(string_id, utf16_length); +inline const char* DexFile::GetStringData(const dex::StringId& string_id) const { + uint32_t ignored; + return GetStringDataAndUtf16Length(string_id, &ignored); } ALWAYS_INLINE -inline const char* DexFile::StringDataByIdx(dex::StringIndex idx) const { - uint32_t unicode_length; - return StringDataAndUtf16LengthByIdx(idx, &unicode_length); +inline const char* DexFile::GetStringData(dex::StringIndex string_idx) const { + return GetStringData(GetStringId(string_idx)); } ALWAYS_INLINE -inline std::string_view DexFile::StringViewByIdx(dex::StringIndex idx) const { - uint32_t unicode_length; - const char* data = StringDataAndUtf16LengthByIdx(idx, &unicode_length); - return data != nullptr ? StringViewFromUtf16Length(data, unicode_length) : std::string_view(""); +inline std::string_view DexFile::GetStringView(const dex::StringId& string_id) const { + uint32_t utf16_length; + const char* data = GetStringDataAndUtf16Length(string_id, &utf16_length); + return StringViewFromUtf16Length(data, utf16_length); } -inline const char* DexFile::StringByTypeIdx(dex::TypeIndex idx, uint32_t* unicode_length) const { - if (!idx.IsValid()) { - return nullptr; - } - const dex::TypeId& type_id = GetTypeId(idx); - return StringDataAndUtf16LengthByIdx(type_id.descriptor_idx_, unicode_length); +ALWAYS_INLINE +inline std::string_view DexFile::GetStringView(dex::StringIndex string_idx) const { + return GetStringView(GetStringId(string_idx)); } -inline const char* DexFile::StringByTypeIdx(dex::TypeIndex idx) const { - if (!idx.IsValid()) { - return nullptr; - } - const dex::TypeId& type_id = GetTypeId(idx); - return StringDataByIdx(type_id.descriptor_idx_); +inline const char* DexFile::GetTypeDescriptor(const dex::TypeId& type_id) const { + return GetStringData(type_id.descriptor_idx_); } -inline const char* DexFile::GetTypeDescriptor(const dex::TypeId& type_id) const { - return StringDataByIdx(type_id.descriptor_idx_); +inline const char* DexFile::GetTypeDescriptor(dex::TypeIndex type_idx) const { + return GetTypeDescriptor(GetTypeId(type_idx)); } inline std::string_view DexFile::GetTypeDescriptorView(const dex::TypeId& type_id) const { - return StringViewByIdx(type_id.descriptor_idx_); + return GetStringView(type_id.descriptor_idx_); +} + +inline std::string_view DexFile::GetTypeDescriptorView(dex::TypeIndex type_idx) const { + return GetTypeDescriptorView(GetTypeId(type_idx)); } inline const char* DexFile::GetFieldTypeDescriptor(const dex::FieldId& field_id) const { @@ -125,11 +111,11 @@ inline std::string_view DexFile::GetFieldTypeDescriptorView(const dex::FieldId& } inline const char* DexFile::GetFieldName(const dex::FieldId& field_id) const { - return StringDataByIdx(field_id.name_idx_); + return GetStringData(field_id.name_idx_); } inline std::string_view DexFile::GetFieldNameView(const dex::FieldId& field_id) const { - return StringViewByIdx(field_id.name_idx_); + return GetStringView(field_id.name_idx_); } inline const char* DexFile::GetMethodDeclaringClassDescriptor(const dex::MethodId& method_id) @@ -147,25 +133,25 @@ inline const Signature DexFile::GetProtoSignature(const dex::ProtoId& proto_id) } inline const char* DexFile::GetMethodName(const dex::MethodId& method_id) const { - return StringDataByIdx(method_id.name_idx_); + return GetStringData(method_id.name_idx_); } inline const char* DexFile::GetMethodName(const dex::MethodId& method_id, uint32_t* utf_length) const { - return StringDataAndUtf16LengthByIdx(method_id.name_idx_, utf_length); + return GetStringDataAndUtf16Length(method_id.name_idx_, utf_length); } inline const char* DexFile::GetMethodName(uint32_t idx) const { - return StringDataByIdx(GetMethodId(idx).name_idx_); + return GetStringData(GetMethodId(idx).name_idx_); } inline const char* DexFile::GetMethodName(uint32_t idx, uint32_t* utf_length) const { - return StringDataAndUtf16LengthByIdx(GetMethodId(idx).name_idx_, utf_length); + return GetStringDataAndUtf16Length(GetMethodId(idx).name_idx_, utf_length); } ALWAYS_INLINE inline std::string_view DexFile::GetMethodNameView(const dex::MethodId& method_id) const { - return StringViewByIdx(method_id.name_idx_); + return GetStringView(method_id.name_idx_); } ALWAYS_INLINE @@ -182,13 +168,13 @@ inline std::string_view DexFile::GetMethodShortyView(uint32_t idx) const { } inline const char* DexFile::GetMethodShorty(const dex::MethodId& method_id) const { - return StringDataByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_); + return GetStringData(GetProtoId(method_id.proto_idx_).shorty_idx_); } inline const char* DexFile::GetMethodShorty(const dex::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); + return GetStringDataAndUtf16Length(GetProtoId(method_id.proto_idx_).shorty_idx_, length); } inline std::string_view DexFile::GetMethodShortyView(const dex::MethodId& method_id) const { @@ -196,16 +182,16 @@ inline std::string_view DexFile::GetMethodShortyView(const dex::MethodId& method } inline const char* DexFile::GetClassDescriptor(const dex::ClassDef& class_def) const { - return StringByTypeIdx(class_def.class_idx_); + return GetTypeDescriptor(class_def.class_idx_); } inline const char* DexFile::GetReturnTypeDescriptor(const dex::ProtoId& proto_id) const { - return StringByTypeIdx(proto_id.return_type_idx_); + return GetTypeDescriptor(proto_id.return_type_idx_); } inline const char* DexFile::GetShorty(dex::ProtoIndex proto_idx) const { const dex::ProtoId& proto_id = GetProtoId(proto_idx); - return StringDataByIdx(proto_id.shorty_idx_); + return GetStringData(proto_id.shorty_idx_); } ALWAYS_INLINE @@ -216,7 +202,7 @@ inline std::string_view DexFile::GetShortyView(dex::ProtoIndex proto_idx) const ALWAYS_INLINE inline std::string_view DexFile::GetShortyView(const dex::ProtoId& proto_id) const { uint32_t shorty_len; - const char* shorty_data = StringDataAndUtf16LengthByIdx(proto_id.shorty_idx_, &shorty_len); + const char* shorty_data = GetStringDataAndUtf16Length(proto_id.shorty_idx_, &shorty_len); DCHECK_EQ(shorty_data[shorty_len], '\0'); // For a shorty utf16 length == mutf8 length. return std::string_view(shorty_data, shorty_len); } @@ -231,9 +217,9 @@ inline const dex::TryItem* DexFile::GetTryItems(const DexInstructionIterator& co inline bool DexFile::StringEquals(const DexFile* df1, dex::StringIndex sidx1, const DexFile* df2, dex::StringIndex sidx2) { uint32_t s1_len; // Note: utf16 length != mutf8 length. - const char* s1_data = df1->StringDataAndUtf16LengthByIdx(sidx1, &s1_len); + const char* s1_data = df1->GetStringDataAndUtf16Length(sidx1, &s1_len); uint32_t s2_len; - const char* s2_data = df2->StringDataAndUtf16LengthByIdx(sidx2, &s2_len); + const char* s2_data = df2->GetStringDataAndUtf16Length(sidx2, &s2_len); return (s1_len == s2_len) && (strcmp(s1_data, s2_data) == 0); } @@ -349,7 +335,7 @@ bool DexFile::DecodeDebugLocalInfo(const uint8_t* stream, } local_in_reg[reg].name_ = index_to_string_data(name_idx); - local_in_reg[reg].descriptor_ = type_index_to_string_data(descriptor_idx);; + local_in_reg[reg].descriptor_ = type_index_to_string_data(descriptor_idx); local_in_reg[reg].signature_ = index_to_string_data(signature_idx); local_in_reg[reg].start_address_ = address; local_in_reg[reg].reg_ = reg; @@ -427,11 +413,12 @@ bool DexFile::DecodeDebugLocalInfo(uint32_t registers_size, ins_size, insns_size_in_code_units, [this](uint32_t idx) { - return StringDataByIdx(dex::StringIndex(idx)); + dex::StringIndex string_idx(idx); + return string_idx.IsValid() ? GetStringData(string_idx) : nullptr; }, - [this](uint32_t idx) { - return StringByTypeIdx(dex::TypeIndex( - dchecked_integral_cast<uint16_t>(idx))); + [this](uint16_t idx) { + dex::TypeIndex type_idx(idx); + return type_idx.IsValid() ? GetTypeDescriptor(type_idx) : nullptr; }, new_local_callback); } diff --git a/libdexfile/dex/dex_file.cc b/libdexfile/dex/dex_file.cc index 927adddfad..9940cc0458 100644 --- a/libdexfile/dex/dex_file.cc +++ b/libdexfile/dex/dex_file.cc @@ -666,7 +666,7 @@ void DexFile::AppendPrettyMethod(uint32_t method_idx, const MethodId& method_id = GetMethodId(method_idx); const ProtoId* proto_id = with_signature ? &GetProtoId(method_id.proto_idx_) : nullptr; if (with_signature) { - AppendPrettyDescriptor(StringByTypeIdx(proto_id->return_type_idx_), result); + AppendPrettyDescriptor(GetTypeDescriptor(proto_id->return_type_idx_), result); result->push_back(' '); } AppendPrettyDescriptor(GetMethodDeclaringClassDescriptor(method_id), result); @@ -680,7 +680,7 @@ void DexFile::AppendPrettyMethod(uint32_t method_idx, for (uint32_t i = 0u, size = params->Size(); i != size; ++i) { result->append(separator); separator = ", "; - AppendPrettyDescriptor(StringByTypeIdx(params->GetTypeItem(i).type_idx_), result); + AppendPrettyDescriptor(GetTypeDescriptor(params->GetTypeItem(i).type_idx_), result); } } result->push_back(')'); diff --git a/libdexfile/dex/dex_file.h b/libdexfile/dex/dex_file.h index ed3bdcd036..5d67c6cca4 100644 --- a/libdexfile/dex/dex_file.h +++ b/libdexfile/dex/dex_file.h @@ -340,23 +340,21 @@ class DexFile { return dex::StringIndex(&string_id - string_ids_); } - int32_t GetStringLength(const dex::StringId& string_id) const; - // Returns a pointer to the UTF-8 string data referred to by the given string_id as well as the // length of the string when decoded as a UTF-16 string. Note the UTF-16 length is not the same // as the string length of the string data. const char* GetStringDataAndUtf16Length(const dex::StringId& string_id, uint32_t* utf16_length) const; + const char* GetStringDataAndUtf16Length(dex::StringIndex string_idx, + uint32_t* utf16_length) const; + + uint32_t GetStringUtf16Length(const dex::StringId& string_id) const; const char* GetStringData(const dex::StringId& string_id) const; + const char* GetStringData(dex::StringIndex string_idx) const; std::string_view GetStringView(const dex::StringId& string_id) const; - - // Index version of GetStringDataAndUtf16Length. - const char* StringDataAndUtf16LengthByIdx(dex::StringIndex idx, uint32_t* utf16_length) const; - - const char* StringDataByIdx(dex::StringIndex idx) const; - std::string_view StringViewByIdx(dex::StringIndex idx) const; + std::string_view GetStringView(dex::StringIndex string_idx) const; // Looks up a string id for a given modified utf8 string. const dex::StringId* FindStringId(const char* string) const; @@ -390,14 +388,11 @@ class DexFile { return dex::TypeIndex(static_cast<uint16_t>(result)); } - // Get the descriptor string associated with a given type index. - const char* StringByTypeIdx(dex::TypeIndex idx, uint32_t* unicode_length) const; - - const char* StringByTypeIdx(dex::TypeIndex idx) const; - // Returns the type descriptor string of a type id. const char* GetTypeDescriptor(const dex::TypeId& type_id) const; + const char* GetTypeDescriptor(dex::TypeIndex type_idx) const; std::string_view GetTypeDescriptorView(const dex::TypeId& type_id) const; + std::string_view GetTypeDescriptorView(dex::TypeIndex type_idx) const; // Looks up a type for the given string index const dex::TypeId* FindTypeId(dex::StringIndex string_idx) const; @@ -799,7 +794,7 @@ class DexFile { if (!class_def.source_file_idx_.IsValid()) { return nullptr; } else { - return StringDataByIdx(class_def.source_file_idx_); + return GetStringData(class_def.source_file_idx_); } } @@ -1041,7 +1036,7 @@ class DexFileParameterIterator { return type_list_->GetTypeItem(pos_).type_idx_; } const char* GetDescriptor() { - return dex_file_.StringByTypeIdx(dex::TypeIndex(GetTypeIdx())); + return dex_file_.GetTypeDescriptor(dex::TypeIndex(GetTypeIdx())); } private: const DexFile& dex_file_; diff --git a/libdexfile/dex/dex_file_loader_test.cc b/libdexfile/dex/dex_file_loader_test.cc index 48e31785a4..3de1103256 100644 --- a/libdexfile/dex/dex_file_loader_test.cc +++ b/libdexfile/dex/dex_file_loader_test.cc @@ -608,13 +608,6 @@ TEST_F(DexFileLoaderTest, OpenDexBadMapOffset) { EXPECT_EQ(raw, nullptr); } -TEST_F(DexFileLoaderTest, GetStringWithNoIndex) { - std::vector<uint8_t> dex_bytes; - std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex, kLocationString, &dex_bytes)); - dex::TypeIndex idx; - EXPECT_EQ(raw->StringByTypeIdx(idx), nullptr); -} - TEST_F(DexFileLoaderTest, OpenDexDebugInfoLocalNullType) { std::vector<uint8_t> dex_bytes; std::unique_ptr<const DexFile> raw = OpenDexFileInMemoryBase64(kRawDexDebugInfoLocalNullType, diff --git a/libdexfile/dex/dex_file_verifier.cc b/libdexfile/dex/dex_file_verifier.cc index ba3472015d..007181b1d7 100644 --- a/libdexfile/dex/dex_file_verifier.cc +++ b/libdexfile/dex/dex_file_verifier.cc @@ -481,14 +481,14 @@ bool DexFileVerifier::VerifyTypeDescriptor(dex::TypeIndex idx, char cached_char = verified_type_descriptors_[idx.index_]; if (cached_char != 0) { if (!extra_check(cached_char)) { - const char* descriptor = dex_file_->StringByTypeIdx(idx); + const char* descriptor = dex_file_->GetTypeDescriptor(idx); ErrorStringPrintf("%s: '%s'", error_msg, descriptor); return false; } return true; } - const char* descriptor = dex_file_->StringByTypeIdx(idx); + const char* descriptor = dex_file_->GetTypeDescriptor(idx); if (UNLIKELY(!IsValidDescriptor(descriptor))) { ErrorStringPrintf("%s: '%s'", error_msg, descriptor); return false; @@ -2698,7 +2698,7 @@ bool DexFileVerifier::CheckInterTypeIdItem() { bool DexFileVerifier::CheckInterProtoIdItem() { const dex::ProtoId* item = reinterpret_cast<const dex::ProtoId*>(ptr_); - const char* shorty = dex_file_->StringDataByIdx(item->shorty_idx_); + const char* shorty = dex_file_->GetStringData(item->shorty_idx_); if (item->parameters_off_ != 0 && !CheckOffsetToTypeMap(item->parameters_off_, DexFile::kDexTypeTypeList)) { @@ -2712,7 +2712,7 @@ bool DexFileVerifier::CheckInterProtoIdItem() { return false; } // Check the return type and advance the shorty. - const char* return_type = dex_file_->StringByTypeIdx(item->return_type_idx_); + const char* return_type = dex_file_->GetTypeDescriptor(item->return_type_idx_); if (!CheckShortyDescriptorMatch(*shorty, return_type, true)) { return false; } @@ -2794,7 +2794,7 @@ bool DexFileVerifier::CheckInterFieldIdItem() { } // Check that the name is valid. - const char* field_name = dex_file_->StringDataByIdx(item->name_idx_); + const char* field_name = dex_file_->GetStringData(item->name_idx_); if (UNLIKELY(!IsValidMemberName(field_name))) { ErrorStringPrintf("Invalid field name: '%s'", field_name); return false; @@ -2834,7 +2834,7 @@ bool DexFileVerifier::CheckInterMethodIdItem() { } // Check that the name is valid. - const char* method_name = dex_file_->StringDataByIdx(item->name_idx_); + const char* method_name = dex_file_->GetStringData(item->name_idx_); if (UNLIKELY(!IsValidMemberName(method_name))) { ErrorStringPrintf("Invalid method name: '%s'", method_name); return false; @@ -2997,7 +2997,7 @@ bool DexFileVerifier::CheckInterClassDefItem() { for (uint32_t j =0; j < i; j++) { dex::TypeIndex idx2 = interfaces->GetTypeItem(j).type_idx_; if (UNLIKELY(idx1 == idx2)) { - ErrorStringPrintf("Duplicate interface: '%s'", dex_file_->StringByTypeIdx(idx1)); + ErrorStringPrintf("Duplicate interface: '%s'", dex_file_->GetTypeDescriptor(idx1)); return false; } } diff --git a/libdexfile/dex/dex_instruction.cc b/libdexfile/dex/dex_instruction.cc index 8b8b6a71cc..c1bc34b602 100644 --- a/libdexfile/dex/dex_instruction.cc +++ b/libdexfile/dex/dex_instruction.cc @@ -207,7 +207,7 @@ std::string Instruction::DumpString(const DexFile* file) const { os << StringPrintf( "const-string v%d, %s // string@%d", VRegA_21c(), - PrintableString(file->StringDataByIdx(dex::StringIndex(string_idx))).c_str(), + PrintableString(file->GetStringData(dex::StringIndex(string_idx))).c_str(), string_idx); } else { os << StringPrintf("const-string v%d, <<invalid-string-idx-%d>> // string@%d", @@ -333,7 +333,7 @@ std::string Instruction::DumpString(const DexFile* file) const { "%s v%d, %s // string@%d", opcode, VRegA_31c(), - PrintableString(file->StringDataByIdx(dex::StringIndex(string_idx))).c_str(), + PrintableString(file->GetStringData(dex::StringIndex(string_idx))).c_str(), string_idx); } else { os << StringPrintf("%s v%d, <<invalid-string-idx-%d>> // string@%d", diff --git a/libdexfile/dex/method_reference.h b/libdexfile/dex/method_reference.h index 9d4eabef2a..0472f2d492 100644 --- a/libdexfile/dex/method_reference.h +++ b/libdexfile/dex/method_reference.h @@ -56,8 +56,11 @@ struct MethodReferenceValueComparator { // Compare the class descriptors first. const dex::MethodId& mid1 = mr1.GetMethodId(); const dex::MethodId& mid2 = mr2.GetMethodId(); - int descriptor_diff = strcmp(mr1.dex_file->StringByTypeIdx(mid1.class_idx_), - mr2.dex_file->StringByTypeIdx(mid2.class_idx_)); + // Note: `std::string_view::compare()` uses lexicographical comparison and treats the `char` + // as unsigned; for Modified-UTF-8 without embedded nulls this is consistent with the + // `CompareModifiedUtf8ToModifiedUtf8AsUtf16CodePointValues()` ordering. + int descriptor_diff = mr1.dex_file->GetTypeDescriptorView(mid1.class_idx_).compare( + mr2.dex_file->GetTypeDescriptorView(mid2.class_idx_)); if (descriptor_diff != 0) { return descriptor_diff < 0; } diff --git a/libdexfile/dex/signature.cc b/libdexfile/dex/signature.cc index ac004286f2..1ab232dabf 100644 --- a/libdexfile/dex/signature.cc +++ b/libdexfile/dex/signature.cc @@ -39,11 +39,11 @@ std::string Signature::ToString() const { } else { result += "("; for (uint32_t i = 0; i < params->Size(); ++i) { - result += dex_file_->StringByTypeIdx(params->GetTypeItem(i).type_idx_); + result += dex_file_->GetTypeDescriptorView(params->GetTypeItem(i).type_idx_); } result += ")"; } - result += dex_file_->StringByTypeIdx(proto_id_->return_type_idx_); + result += dex_file_->GetTypeDescriptorView(proto_id_->return_type_idx_); return result; } @@ -69,7 +69,7 @@ bool Signature::operator==(std::string_view rhs) const { const TypeList* params = dex_file_->GetProtoParameters(*proto_id_); if (params != nullptr) { for (uint32_t i = 0; i < params->Size(); ++i) { - std::string_view param(dex_file_->StringByTypeIdx(params->GetTypeItem(i).type_idx_)); + std::string_view param = dex_file_->GetTypeDescriptorView(params->GetTypeItem(i).type_idx_); if (!StartsWith(tail, param)) { return false; } @@ -80,7 +80,7 @@ bool Signature::operator==(std::string_view rhs) const { return false; } tail.remove_prefix(1); // ")"; - return tail == dex_file_->StringByTypeIdx(proto_id_->return_type_idx_); + return tail == dex_file_->GetTypeDescriptorView(proto_id_->return_type_idx_); } std::ostream& operator<<(std::ostream& os, const Signature& sig) { diff --git a/libprofile/profile/profile_compilation_info.cc b/libprofile/profile/profile_compilation_info.cc index e6c1619217..21dc675e54 100644 --- a/libprofile/profile/profile_compilation_info.cc +++ b/libprofile/profile/profile_compilation_info.cc @@ -694,7 +694,7 @@ dex::TypeIndex ProfileCompilationInfo::FindOrCreateTypeIndex(const DexFile& dex_ return class_ref.TypeIndex(); } // Try to find a `TypeId` in the method's dex file. - const char* descriptor = class_ref.dex_file->StringByTypeIdx(class_ref.TypeIndex()); + const char* descriptor = class_ref.dex_file->GetTypeDescriptor(class_ref.TypeIndex()); return FindOrCreateTypeIndex(dex_file, descriptor); } diff --git a/libprofile/profile/profile_compilation_info.h b/libprofile/profile/profile_compilation_info.h index 2da33a0c02..745b9a2401 100644 --- a/libprofile/profile/profile_compilation_info.h +++ b/libprofile/profile/profile_compilation_info.h @@ -684,7 +684,7 @@ class ProfileCompilationInfo { DCHECK(type_index.IsValid()); uint32_t num_type_ids = dex_file->NumTypeIds(); if (type_index.index_ < num_type_ids) { - return dex_file->StringByTypeIdx(type_index); + return dex_file->GetTypeDescriptor(type_index); } else { return extra_descriptors_[type_index.index_ - num_type_ids].c_str(); } diff --git a/libprofile/profile/profile_test_helper.h b/libprofile/profile/profile_test_helper.h index 1140ee7bbe..fdb062b744 100644 --- a/libprofile/profile/profile_test_helper.h +++ b/libprofile/profile/profile_test_helper.h @@ -134,7 +134,7 @@ class ProfileTestHelper { return type_index == type_ref.TypeIndex(); } else { const char* expected_descriptor = - type_ref.dex_file->StringByTypeIdx(type_ref.TypeIndex()); + type_ref.dex_file->GetTypeDescriptor(type_ref.TypeIndex()); const char* descriptor = info.GetTypeDescriptor(dex_file, type_index); return strcmp(expected_descriptor, descriptor) == 0; } diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index b597494e04..0c362d9c1a 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -1772,7 +1772,7 @@ class OatDumper { string_bss_mapping, dex_file->NumStringIds(), sizeof(GcRoot<mirror::Class>), - [=](uint32_t index) { return dex_file->StringDataByIdx(dex::StringIndex(index)); }); + [=](uint32_t index) { return dex_file->GetStringData(dex::StringIndex(index)); }); } void DumpBssOffsets(std::ostream& os, const char* slot_type, const IndexBssMapping* mapping) { diff --git a/openjdkjvmti/ti_redefine.cc b/openjdkjvmti/ti_redefine.cc index 9be55e54e9..3282432cee 100644 --- a/openjdkjvmti/ti_redefine.cc +++ b/openjdkjvmti/ti_redefine.cc @@ -1091,7 +1091,7 @@ bool Redefiner::ClassRedefinition::CheckClass() { // Check class name. // These should have been checked by the dexfile verifier on load. DCHECK_NE(def.class_idx_, art::dex::TypeIndex::Invalid()) << "Invalid type index"; - const char* descriptor = dex_file_->StringByTypeIdx(def.class_idx_); + const char* descriptor = dex_file_->GetTypeDescriptor(def.class_idx_); DCHECK(descriptor != nullptr) << "Invalid dex file structure!"; if (!current_class->DescriptorEquals(descriptor)) { std::string storage; @@ -1107,7 +1107,7 @@ bool Redefiner::ClassRedefinition::CheckClass() { return false; } } else { - const char* super_descriptor = dex_file_->StringByTypeIdx(def.superclass_idx_); + const char* super_descriptor = dex_file_->GetTypeDescriptor(def.superclass_idx_); DCHECK(descriptor != nullptr) << "Invalid dex file structure!"; if (!current_class->GetSuperClass()->DescriptorEquals(super_descriptor)) { RecordFailure(ERR(UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED), "Superclass changed"); @@ -1133,8 +1133,8 @@ bool Redefiner::ClassRedefinition::CheckClass() { const art::DexFile& orig_dex_file = current_class->GetDexFile(); for (uint32_t i = 0; i < interfaces->Size(); i++) { if (strcmp( - dex_file_->StringByTypeIdx(interfaces->GetTypeItem(i).type_idx_), - orig_dex_file.StringByTypeIdx(current_interfaces->GetTypeItem(i).type_idx_)) != 0) { + dex_file_->GetTypeDescriptor(interfaces->GetTypeItem(i).type_idx_), + orig_dex_file.GetTypeDescriptor(current_interfaces->GetTypeItem(i).type_idx_)) != 0) { RecordFailure(ERR(UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED), "Interfaces changed or re-ordered"); return false; diff --git a/profman/profile_assistant_test.cc b/profman/profile_assistant_test.cc index d31df20c1c..2a8dc84a85 100644 --- a/profman/profile_assistant_test.cc +++ b/profman/profile_assistant_test.cc @@ -399,7 +399,8 @@ class ProfileAssistantTest : public CommonRuntimeTest, public ProfileTestHelper } } else { // Match by descriptor. - const char* expected_descriptor = type_ref.dex_file->StringByTypeIdx(type_ref.TypeIndex()); + const char* expected_descriptor = + type_ref.dex_file->GetTypeDescriptor(type_ref.TypeIndex()); for (dex::TypeIndex type_index : dex_pc_data.classes) { ASSERT_TRUE(type_index.IsValid()); const char* descriptor = info.GetTypeDescriptor(dex_file, type_index); diff --git a/runtime/art_method-inl.h b/runtime/art_method-inl.h index e957d6a1c2..024272a10d 100644 --- a/runtime/art_method-inl.h +++ b/runtime/art_method-inl.h @@ -451,7 +451,7 @@ inline bool ArtMethod::NameEquals(ObjPtr<mirror::String> name) { const dex::MethodId& method_id = dex_file->GetMethodId(GetDexMethodIndex()); const dex::StringIndex name_idx = method_id.name_idx_; uint32_t utf16_length; - const char* utf8_name = dex_file->StringDataAndUtf16LengthByIdx(name_idx, &utf16_length); + const char* utf8_name = dex_file->GetStringDataAndUtf16Length(name_idx, &utf16_length); return dchecked_integral_cast<uint32_t>(name->GetLength()) == utf16_length && name->Equals(utf8_name); } diff --git a/runtime/art_method.cc b/runtime/art_method.cc index 8ad4b63dc7..c8b16990b2 100644 --- a/runtime/art_method.cc +++ b/runtime/art_method.cc @@ -302,7 +302,7 @@ uint32_t ArtMethod::FindDexMethodIndexInOtherDexFile(const DexFile& other_dexfil if (dexfile == &other_dexfile) { return dex_method_idx; } - const char* mid_declaring_class_descriptor = dexfile->StringByTypeIdx(mid.class_idx_); + const char* mid_declaring_class_descriptor = dexfile->GetTypeDescriptor(mid.class_idx_); const dex::TypeId* other_type_id = other_dexfile.FindTypeId(mid_declaring_class_descriptor); if (other_type_id != nullptr) { const dex::MethodId* other_mid = other_dexfile.FindMethodId( diff --git a/runtime/class_linker-inl.h b/runtime/class_linker-inl.h index e771341d5a..6951e35791 100644 --- a/runtime/class_linker-inl.h +++ b/runtime/class_linker-inl.h @@ -418,7 +418,7 @@ inline ArtMethod* ClassLinker::ResolveMethod(uint32_t method_idx, ThrowIncompatibleClassChangeError(type, resolved->GetInvokeType(), resolved, referrer); } else { // We failed to find the method (using all lookup types), so throw a NoSuchMethodError. - const char* name = dex_file.StringDataByIdx(method_id.name_idx_); + const char* name = dex_file.GetStringData(method_id.name_idx_); const Signature signature = dex_file.GetMethodSignature(method_id); ThrowNoSuchMethodError(type, klass, name, signature); } diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index ac9dda637a..d7c0582e7b 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -3363,7 +3363,7 @@ ObjPtr<mirror::Class> ClassLinker::FindClass(Thread* self, // capable class loaders. (All class loaders are considered parallel capable on Android.) ObjPtr<mirror::Class> loader_class = class_loader->GetClass(); const char* loader_class_name = - loader_class->GetDexFile().StringByTypeIdx(loader_class->GetDexTypeIndex()); + loader_class->GetDexFile().GetTypeDescriptor(loader_class->GetDexTypeIndex()); LOG(WARNING) << "Initiating class loader of type " << DescriptorToDot(loader_class_name) << " is not well-behaved; it returned a different Class for racing loadClass(\"" << DescriptorToDot(descriptor) << "\")."; @@ -4082,8 +4082,8 @@ void ClassLinker::LoadMethod(const DexFile& dex_file, const uint32_t dex_method_idx = method.GetIndex(); const dex::MethodId& method_id = dex_file.GetMethodId(dex_method_idx); uint32_t name_utf16_length; - const char* method_name = dex_file.StringDataAndUtf16LengthByIdx(method_id.name_idx_, - &name_utf16_length); + const char* method_name = dex_file.GetStringDataAndUtf16Length(method_id.name_idx_, + &name_utf16_length); std::string_view shorty = dex_file.GetShortyView(dex_file.GetProtoId(method_id.proto_idx_)); dst->SetDexMethodIndex(dex_method_idx); @@ -6595,7 +6595,7 @@ class MethodNameAndSignatureComparator final : public ValueObject { ALWAYS_INLINE std::string_view GetNameView() { if (name_view_.empty()) { - name_view_ = dex_file_->StringViewByIdx(mid_->name_idx_); + name_view_ = dex_file_->GetStringView(mid_->name_idx_); } return name_view_; } @@ -6608,7 +6608,7 @@ class MethodNameAndSignatureComparator final : public ValueObject { if (dex_file_ == other_dex_file) { return mid_->name_idx_ == other_mid.name_idx_ && mid_->proto_idx_ == other_mid.proto_idx_; } - return GetNameView() == other_dex_file->StringViewByIdx(other_mid.name_idx_) && + return GetNameView() == other_dex_file->GetStringView(other_mid.name_idx_) && dex_file_->GetMethodSignature(*mid_) == other_dex_file->GetMethodSignature(other_mid); } @@ -7310,7 +7310,7 @@ void CheckVTableHasNoDuplicates(Thread* self, Handle<mirror::Class> klass) // This call writes `name_len` and it is therefore necessary that the // initializer for `name_len` comes before it, otherwise the value // from the call would be overwritten by that initializer. - name(dex_file->StringDataAndUtf16LengthByIdx(mid.name_idx_, &name_len)), + name(dex_file->GetStringDataAndUtf16Length(mid.name_idx_, &name_len)), signature(dex_file->GetMethodSignature(mid)) { // The `name_len` has been initialized to the UTF16 length. Calculate length in bytes. if (name[name_len] != 0) { @@ -9896,7 +9896,7 @@ ObjPtr<mirror::String> ClassLinker::DoResolveString(dex::StringIndex string_idx, Handle<mirror::DexCache> dex_cache) { const DexFile& dex_file = *dex_cache->GetDexFile(); uint32_t utf16_length; - const char* utf8_data = dex_file.StringDataAndUtf16LengthByIdx(string_idx, &utf16_length); + const char* utf8_data = dex_file.GetStringDataAndUtf16Length(string_idx, &utf16_length); ObjPtr<mirror::String> string = intern_table_->InternStrong(utf16_length, utf8_data); if (string != nullptr) { dex_cache->SetResolvedString(string_idx, string); @@ -9909,7 +9909,7 @@ ObjPtr<mirror::String> ClassLinker::DoLookupString(dex::StringIndex string_idx, DCHECK(dex_cache != nullptr); const DexFile& dex_file = *dex_cache->GetDexFile(); uint32_t utf16_length; - const char* utf8_data = dex_file.StringDataAndUtf16LengthByIdx(string_idx, &utf16_length); + const char* utf8_data = dex_file.GetStringDataAndUtf16Length(string_idx, &utf16_length); ObjPtr<mirror::String> string = intern_table_->LookupStrong(Thread::Current(), utf16_length, utf8_data); if (string != nullptr) { @@ -9928,7 +9928,7 @@ ObjPtr<mirror::Class> ClassLinker::DoLookupResolvedType(dex::TypeIndex type_idx, ObjPtr<mirror::ClassLoader> class_loader) { DCHECK(dex_cache->GetClassLoader() == class_loader); const DexFile& dex_file = *dex_cache->GetDexFile(); - const char* descriptor = dex_file.StringByTypeIdx(type_idx); + const char* descriptor = dex_file.GetTypeDescriptor(type_idx); ObjPtr<mirror::Class> type = LookupResolvedType(descriptor, class_loader); if (type != nullptr) { DCHECK(type->IsResolved()); @@ -9976,7 +9976,7 @@ ObjPtr<mirror::Class> ClassLinker::DoResolveType(dex::TypeIndex type_idx, Handle<mirror::ClassLoader> class_loader) { DCHECK(dex_cache->GetClassLoader() == class_loader.Get()); Thread* self = Thread::Current(); - const char* descriptor = dex_cache->GetDexFile()->StringByTypeIdx(type_idx); + const char* descriptor = dex_cache->GetDexFile()->GetTypeDescriptor(type_idx); ObjPtr<mirror::Class> resolved = FindClass(self, descriptor, class_loader); if (resolved != nullptr) { // TODO: we used to throw here if resolved's class loader was not the diff --git a/runtime/dex/dex_file_annotations.cc b/runtime/dex/dex_file_annotations.cc index 8488993ae4..3d334e70fd 100644 --- a/runtime/dex/dex_file_annotations.cc +++ b/runtime/dex/dex_file_annotations.cc @@ -193,7 +193,7 @@ const AnnotationItem* SearchAnnotationSet(const DexFile& dex_file, const uint8_t* annotation = annotation_item->annotation_; uint32_t type_index = DecodeUnsignedLeb128(&annotation); - if (strcmp(descriptor, dex_file.StringByTypeIdx(dex::TypeIndex(type_index))) == 0) { + if (strcmp(descriptor, dex_file.GetTypeDescriptor(dex::TypeIndex(type_index))) == 0) { result = annotation_item; break; } @@ -495,7 +495,7 @@ bool ProcessAnnotationValue(const ClassData& klass, if (element_object == nullptr) { CHECK(self->IsExceptionPending()); if (result_style == DexFile::kAllObjects) { - const char* msg = dex_file.StringByTypeIdx(type_index); + const char* msg = dex_file.GetTypeDescriptor(type_index); self->ThrowNewWrappedException("Ljava/lang/TypeNotPresentException;", msg); element_object = self->GetException(); self->ClearException(); @@ -701,7 +701,7 @@ ObjPtr<mirror::Object> CreateAnnotationMember(const ClassData& klass, ScopedObjectAccessUnchecked soa(self); StackHandleScope<5> hs(self); uint32_t element_name_index = DecodeUnsignedLeb128(annotation); - const char* name = dex_file.StringDataByIdx(dex::StringIndex(element_name_index)); + const char* name = dex_file.GetStringData(dex::StringIndex(element_name_index)); PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize(); ArtMethod* annotation_method = @@ -1286,7 +1286,7 @@ static bool IsMethodBuildAnnotationPresent(const DexFile& dex_file, } const uint8_t* annotation = annotation_item->annotation_; uint32_t type_index = DecodeUnsignedLeb128(&annotation); - const char* descriptor = dex_file.StringByTypeIdx(dex::TypeIndex(type_index)); + const char* descriptor = dex_file.GetTypeDescriptor(dex::TypeIndex(type_index)); if (strcmp(descriptor, annotation_descriptor) == 0) { DCheckNativeAnnotation(descriptor, annotation_class); return true; @@ -1754,7 +1754,7 @@ const char* GetSourceDebugExtension(Handle<mirror::Class> klass) { return nullptr; } dex::StringIndex index(static_cast<uint32_t>(annotation_value.value_.GetI())); - return data.GetDexFile().StringDataByIdx(index); + return data.GetDexFile().GetStringData(index); } ObjPtr<mirror::Class> GetNestHost(Handle<mirror::Class> klass) { @@ -1994,7 +1994,7 @@ void VisitClassAnnotations(Handle<mirror::Class> klass, AnnotationVisitor* visit uint8_t visibility = annotation_item->visibility_; const uint8_t* annotation = annotation_item->annotation_; uint32_t type_index = DecodeUnsignedLeb128(&annotation); - const char* annotation_descriptor = dex_file.StringByTypeIdx(dex::TypeIndex(type_index)); + const char* annotation_descriptor = dex_file.GetTypeDescriptor(dex::TypeIndex(type_index)); VisitorStatus status = visitor->VisitAnnotation(annotation_descriptor, visibility); switch (status) { case VisitorStatus::kVisitBreak: diff --git a/runtime/entrypoints/entrypoint_utils-inl.h b/runtime/entrypoints/entrypoint_utils-inl.h index 6cda30ee9d..b0d0ab4b07 100644 --- a/runtime/entrypoints/entrypoint_utils-inl.h +++ b/runtime/entrypoints/entrypoint_utils-inl.h @@ -485,15 +485,14 @@ EXPLICIT_FIND_FIELD_FROM_CODE_TEMPLATE_DECL(StaticPrimitiveWrite); static inline bool IsStringInit(const DexFile* dex_file, uint32_t method_idx) REQUIRES_SHARED(Locks::mutator_lock_) { const dex::MethodId& method_id = dex_file->GetMethodId(method_idx); - const char* class_name = dex_file->StringByTypeIdx(method_id.class_idx_); - const char* method_name = dex_file->GetMethodName(method_id); + const std::string_view class_name = dex_file->GetTypeDescriptorView(method_id.class_idx_); + const std::string_view method_name = dex_file->GetMethodNameView(method_id); // Instead of calling ResolveMethod() which has suspend point and can trigger // GC, look up the method symbolically. // Compare method's class name and method name against string init. // It's ok since it's not allowed to create your own java/lang/String. // TODO: verify that assumption. - if ((strcmp(class_name, "Ljava/lang/String;") == 0) && - (strcmp(method_name, "<init>") == 0)) { + if (class_name == "Ljava/lang/String;" && method_name == "<init>") { return true; } return false; diff --git a/runtime/jit/profile_saver.cc b/runtime/jit/profile_saver.cc index 3acf5c8050..942d2923fc 100644 --- a/runtime/jit/profile_saver.cc +++ b/runtime/jit/profile_saver.cc @@ -660,7 +660,7 @@ void ProfileSaver::GetClassesAndMethodsHelper::UpdateProfile(const std::set<std: DCHECK(ShouldCollectClasses(startup)); DCHECK(class_record.methods == nullptr); // No methods to process. array_class_descriptor.assign(class_record.array_dimension, '['); - array_class_descriptor += dex_file->StringByTypeIdx(class_record.type_index); + array_class_descriptor += dex_file->GetTypeDescriptorView(class_record.type_index); dex::TypeIndex type_index = profile_info->FindOrCreateTypeIndex(*dex_file, array_class_descriptor.c_str()); if (type_index.IsValid()) { diff --git a/runtime/mirror/class.cc b/runtime/mirror/class.cc index 7811302a13..828ab968a3 100644 --- a/runtime/mirror/class.cc +++ b/runtime/mirror/class.cc @@ -573,7 +573,7 @@ ArtMethod* Class::FindInterfaceMethod(ObjPtr<DexCache> dex_cache, // We always search by name and signature, ignoring the type index in the MethodId. const DexFile& dex_file = *dex_cache->GetDexFile(); const dex::MethodId& method_id = dex_file.GetMethodId(dex_method_idx); - std::string_view name = dex_file.StringViewByIdx(method_id.name_idx_); + std::string_view name = dex_file.GetStringView(method_id.name_idx_); const Signature signature = dex_file.GetMethodSignature(method_id); return FindInterfaceMethod(name, signature, pointer_size); } @@ -913,7 +913,7 @@ ArtMethod* Class::FindClassMethod(ObjPtr<DexCache> dex_cache, for (klass = this; klass != end_klass; klass = klass->GetSuperClass()) { ArraySlice<ArtMethod> copied_methods = klass->GetCopiedMethodsSlice(pointer_size); if (!copied_methods.empty() && name.empty()) { - name = dex_file.StringDataByIdx(method_id.name_idx_); + name = dex_file.GetMethodNameView(method_id); } for (ArtMethod& method : copied_methods) { if (method.GetNameView() == name && method.GetSignature() == signature) { @@ -1043,9 +1043,9 @@ static std::tuple<bool, ArtField*> FindFieldByNameAndType(const DexFile& dex_fil // Fields are sorted by class, then name, then type descriptor. This is verified in dex file // verifier. There can be multiple fields with the same name in the same class due to proguard. - // Note: std::string_view::compare() uses lexicographical comparison and treats the `char` as - // unsigned; for Modified-UTF-8 without embedded nulls this is consistent with the - // CompareModifiedUtf8ToModifiedUtf8AsUtf16CodePointValues() ordering. + // Note: `std::string_view::compare()` uses lexicographical comparison and treats the `char` + // as unsigned; for Modified-UTF-8 without embedded nulls this is consistent with the + // `CompareModifiedUtf8ToModifiedUtf8AsUtf16CodePointValues()` ordering. auto get_field_id = [&](uint32_t mid) REQUIRES_SHARED(Locks::mutator_lock_) ALWAYS_INLINE -> const dex::FieldId& { ArtField& field = fields->At(mid); diff --git a/runtime/native/java_lang_reflect_Executable.cc b/runtime/native/java_lang_reflect_Executable.cc index 3f3b648ecf..e9b7545926 100644 --- a/runtime/native/java_lang_reflect_Executable.cc +++ b/runtime/native/java_lang_reflect_Executable.cc @@ -278,18 +278,15 @@ static jint Executable_compareMethodParametersInternal(JNIEnv* env, } for (int32_t i = 0; i < this_size; ++i) { - const dex::TypeId& lhs = this_method->GetDexFile()->GetTypeId( + const std::string_view lhs_data = this_method->GetDexFile()->GetTypeDescriptorView( this_list->GetTypeItem(i).type_idx_); - const dex::TypeId& rhs = other_method->GetDexFile()->GetTypeId( + const std::string_view rhs_data = other_method->GetDexFile()->GetTypeDescriptorView( other_list->GetTypeItem(i).type_idx_); - uint32_t lhs_len, rhs_len; - const char* lhs_data = this_method->GetDexFile()->StringDataAndUtf16LengthByIdx( - lhs.descriptor_idx_, &lhs_len); - const char* rhs_data = other_method->GetDexFile()->StringDataAndUtf16LengthByIdx( - rhs.descriptor_idx_, &rhs_len); - - int cmp = strcmp(lhs_data, rhs_data); + // Note: `std::string_view::compare()` uses lexicographical comparison and treats the `char` + // as unsigned; for Modified-UTF-8 without embedded nulls this is consistent with the + // `CompareModifiedUtf8ToModifiedUtf8AsUtf16CodePointValues()` ordering. + int cmp = lhs_data.compare(rhs_data); if (cmp != 0) { return (cmp < 0) ? -1 : 1; } diff --git a/runtime/vdex_file.cc b/runtime/vdex_file.cc index b67786c2a7..6702970c68 100644 --- a/runtime/vdex_file.cc +++ b/runtime/vdex_file.cc @@ -410,7 +410,7 @@ static const char* GetStringFromId(const DexFile& dex_file, const uint8_t* verifier_deps) { uint32_t num_ids_in_dex = dex_file.NumStringIds(); if (string_id.index_ < num_ids_in_dex) { - return dex_file.StringDataByIdx(string_id); + return dex_file.GetStringData(string_id); } else { CHECK_LT(string_id.index_ - num_ids_in_dex, number_of_extra_strings); uint32_t offset = extra_strings_offsets[string_id.index_ - num_ids_in_dex]; diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc index 8de83f4dd6..aca2b477fc 100644 --- a/runtime/verifier/method_verifier.cc +++ b/runtime/verifier/method_verifier.cc @@ -851,9 +851,9 @@ bool MethodVerifier<kVerifierDebug>::Verify() { // Some older code doesn't correctly mark constructors as such. Test for this case by looking at // the name. const dex::MethodId& method_id = dex_file_->GetMethodId(dex_method_idx_); - const char* method_name = dex_file_->StringDataByIdx(method_id.name_idx_); - bool instance_constructor_by_name = strcmp("<init>", method_name) == 0; - bool static_constructor_by_name = strcmp("<clinit>", method_name) == 0; + const std::string_view method_name = dex_file_->GetStringView(method_id.name_idx_); + bool instance_constructor_by_name = method_name == "<init>"; + bool static_constructor_by_name = method_name == "<clinit>"; bool constructor_by_name = instance_constructor_by_name || static_constructor_by_name; // Check that only constructors are tagged, and check for bad code that doesn't tag constructors. if ((method_access_flags_ & kAccConstructor) != 0) { @@ -1286,11 +1286,11 @@ inline bool MethodVerifier<kVerifierDebug>::CheckNewInstance(dex::TypeIndex idx) return false; } // We don't need the actual class, just a pointer to the class name. - const char* descriptor = dex_file_->StringByTypeIdx(idx); + const std::string_view descriptor = dex_file_->GetTypeDescriptorView(idx); if (UNLIKELY(descriptor[0] != 'L')) { Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "can't call new-instance on type '" << descriptor << "'"; return false; - } else if (UNLIKELY(strcmp(descriptor, "Ljava/lang/Class;") == 0)) { + } else if (UNLIKELY(descriptor == "Ljava/lang/Class;")) { // An unlikely new instance on Class is not allowed. Fall back to interpreter to ensure an // exception is thrown when this statement is executed (compiled code would not do that). Fail(VERIFY_ERROR_INSTANTIATION); @@ -1306,7 +1306,7 @@ bool MethodVerifier<kVerifierDebug>::CheckNewArray(dex::TypeIndex idx) { return false; } int bracket_count = 0; - const char* descriptor = dex_file_->StringByTypeIdx(idx); + const char* descriptor = dex_file_->GetTypeDescriptor(idx); const char* cp = descriptor; while (*cp++ == '[') { bracket_count++; @@ -2372,7 +2372,7 @@ bool MethodVerifier<kVerifierDebug>::CodeFlowVerifyInstruction(uint32_t* start_g type_idx, dex_cache_.Get(), class_loader_.Get()); if (klass != nullptr && klass->IsPrimitive()) { Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "using primitive type " - << dex_file_->StringByTypeIdx(type_idx) << " in instanceof in " + << dex_file_->GetTypeDescriptorView(type_idx) << " in instanceof in " << GetDeclaringClass(); break; } @@ -2877,7 +2877,7 @@ bool MethodVerifier<kVerifierDebug>::CodeFlowVerifyInstruction(uint32_t* start_g const dex::MethodId& method_id = dex_file_->GetMethodId(method_idx); dex::TypeIndex return_type_idx = dex_file_->GetProtoId(method_id.proto_idx_).return_type_idx_; - const char* descriptor = dex_file_->StringByTypeIdx(return_type_idx); + const char* descriptor = dex_file_->GetTypeDescriptor(return_type_idx); return_type = ®_types_.FromDescriptor(class_loader_.Get(), descriptor, false); } if (!return_type->IsLowHalf()) { @@ -2898,10 +2898,10 @@ bool MethodVerifier<kVerifierDebug>::CodeFlowVerifyInstruction(uint32_t* start_g if (called_method == nullptr) { uint32_t method_idx = (is_range) ? inst->VRegB_3rc() : inst->VRegB_35c(); const dex::MethodId& method_id = dex_file_->GetMethodId(method_idx); - is_constructor = strcmp("<init>", dex_file_->StringDataByIdx(method_id.name_idx_)) == 0; + is_constructor = dex_file_->GetStringView(method_id.name_idx_) == "<init>"; dex::TypeIndex return_type_idx = dex_file_->GetProtoId(method_id.proto_idx_).return_type_idx_; - return_type_descriptor = dex_file_->StringByTypeIdx(return_type_idx); + return_type_descriptor = dex_file_->GetTypeDescriptor(return_type_idx); } else { is_constructor = called_method->IsConstructor(); return_type_descriptor = called_method->GetReturnTypeDescriptor(); @@ -2980,7 +2980,7 @@ bool MethodVerifier<kVerifierDebug>::CodeFlowVerifyInstruction(uint32_t* start_g const dex::MethodId& method_id = dex_file_->GetMethodId(method_idx); dex::TypeIndex return_type_idx = dex_file_->GetProtoId(method_id.proto_idx_).return_type_idx_; - descriptor = dex_file_->StringByTypeIdx(return_type_idx); + descriptor = dex_file_->GetTypeDescriptor(return_type_idx); } else { descriptor = called_method->GetReturnTypeDescriptor(); } @@ -3037,7 +3037,7 @@ bool MethodVerifier<kVerifierDebug>::CodeFlowVerifyInstruction(uint32_t* start_g const dex::MethodId& method_id = dex_file_->GetMethodId(method_idx); dex::TypeIndex return_type_idx = dex_file_->GetProtoId(method_id.proto_idx_).return_type_idx_; - descriptor = dex_file_->StringByTypeIdx(return_type_idx); + descriptor = dex_file_->GetTypeDescriptor(return_type_idx); } else { descriptor = abs_method->GetReturnTypeDescriptor(); } @@ -3607,22 +3607,22 @@ const RegType& MethodVerifier<kVerifierDebug>::ResolveClass(dex::TypeIndex class if (klass != nullptr) { bool precise = klass->CannotBeAssignedFromOtherTypes(); if (precise && !IsInstantiableOrPrimitive(klass)) { - const char* descriptor = dex_file_->StringByTypeIdx(class_idx); + const char* descriptor = dex_file_->GetTypeDescriptor(class_idx); UninstantiableError(descriptor); precise = false; } result = reg_types_.FindClass(klass, precise); if (result == nullptr) { - const char* descriptor = dex_file_->StringByTypeIdx(class_idx); + const char* descriptor = dex_file_->GetTypeDescriptor(class_idx); result = reg_types_.InsertClass(descriptor, klass, precise); } } else { - const char* descriptor = dex_file_->StringByTypeIdx(class_idx); + const char* descriptor = dex_file_->GetTypeDescriptor(class_idx); result = ®_types_.FromDescriptor(class_loader_.Get(), descriptor, false); } DCHECK(result != nullptr); if (result->IsConflict()) { - const char* descriptor = dex_file_->StringByTypeIdx(class_idx); + const char* descriptor = dex_file_->GetTypeDescriptor(class_idx); Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "accessing broken descriptor '" << descriptor << "' in " << GetDeclaringClass(); return *result; @@ -3943,7 +3943,7 @@ ArtMethod* MethodVerifier<kVerifierDebug>::VerifyInvocationArgsFromIterator( const dex::TypeIndex class_idx = dex_file_->GetMethodId(method_idx).class_idx_; res_method_class = ®_types_.FromDescriptor( class_loader_.Get(), - dex_file_->StringByTypeIdx(class_idx), + dex_file_->GetTypeDescriptor(class_idx), false); } if (!res_method_class->IsAssignableFrom(adjusted_type, this)) { @@ -4141,7 +4141,7 @@ ArtMethod* MethodVerifier<kVerifierDebug>::VerifyInvocationArgs( dex::TypeIndex class_idx = dex_file_->GetMethodId(method_idx).class_idx_; const RegType& reference_type = reg_types_.FromDescriptor( class_loader_.Get(), - dex_file_->StringByTypeIdx(class_idx), + dex_file_->GetTypeDescriptor(class_idx), false); if (reference_type.IsUnresolvedTypes()) { // We cannot differentiate on whether this is a class change error or just diff --git a/runtime/verifier/verifier_deps.cc b/runtime/verifier/verifier_deps.cc index ffd5206cbe..e09e007d93 100644 --- a/runtime/verifier/verifier_deps.cc +++ b/runtime/verifier/verifier_deps.cc @@ -176,7 +176,7 @@ std::string VerifierDeps::GetStringFromId(const DexFile& dex_file, dex::StringIndex string_id) const { uint32_t num_ids_in_dex = dex_file.NumStringIds(); if (string_id.index_ < num_ids_in_dex) { - return std::string(dex_file.StringDataByIdx(string_id)); + return std::string(dex_file.GetStringView(string_id)); } else { const DexFileDeps* deps = GetDexFileDeps(dex_file); DCHECK(deps != nullptr); diff --git a/tools/dexanalyze/dexanalyze_experiments.cc b/tools/dexanalyze/dexanalyze_experiments.cc index 384ab374cd..62098783f0 100644 --- a/tools/dexanalyze/dexanalyze_experiments.cc +++ b/tools/dexanalyze/dexanalyze_experiments.cc @@ -217,13 +217,13 @@ void CountDexIndices::ProcessDexFiles( for (const std::unique_ptr<const DexFile>& dex_file : dex_files) { for (size_t i = 0; i < dex_file->NumTypeIds(); ++i) { unique_type_names.insert( - dex_file->StringDataByIdx(dex_file->GetTypeId(dex::TypeIndex(i)).descriptor_idx_)); + dex_file->GetStringData(dex_file->GetTypeId(dex::TypeIndex(i)).descriptor_idx_)); } for (size_t i = 0; i < dex_file->NumFieldIds(); ++i) { - unique_field_names.insert(dex_file->StringDataByIdx(dex_file->GetFieldId(i).name_idx_)); + unique_field_names.insert(dex_file->GetStringData(dex_file->GetFieldId(i).name_idx_)); } for (size_t i = 0; i < dex_file->NumMethodIds(); ++i) { - unique_method_names.insert(dex_file->StringDataByIdx(dex_file->GetMethodId(i).name_idx_)); + unique_method_names.insert(dex_file->GetStringData(dex_file->GetMethodId(i).name_idx_)); } ProcessDexFile(*dex_file); } diff --git a/tools/dexanalyze/dexanalyze_strings.cc b/tools/dexanalyze/dexanalyze_strings.cc index dcadb59e35..155240a0d5 100644 --- a/tools/dexanalyze/dexanalyze_strings.cc +++ b/tools/dexanalyze/dexanalyze_strings.cc @@ -425,7 +425,7 @@ void AnalyzeStrings::ProcessDexFiles(const std::vector<std::unique_ptr<const Dex for (const std::unique_ptr<const DexFile>& dex_file : dex_files) { for (size_t i = 0; i < dex_file->NumStringIds(); ++i) { uint32_t length = 0; - const char* data = dex_file->StringDataAndUtf16LengthByIdx(dex::StringIndex(i), &length); + const char* data = dex_file->GetStringDataAndUtf16Length(dex::StringIndex(i), &length); // Analyze if the string has any UTF16 chars. bool have_wide_char = false; const char* ptr = data; diff --git a/tools/hiddenapi/hiddenapi.cc b/tools/hiddenapi/hiddenapi.cc index a1fea05f82..85be3ed555 100644 --- a/tools/hiddenapi/hiddenapi.cc +++ b/tools/hiddenapi/hiddenapi.cc @@ -133,14 +133,14 @@ class DexClass : public ClassAccessor { bool HasSuperclass() const { return dex_file_.IsTypeIndexValid(GetSuperclassIndex()); } std::string_view GetSuperclassDescriptor() const { - return HasSuperclass() ? dex_file_.StringByTypeIdx(GetSuperclassIndex()) : ""; + return HasSuperclass() ? dex_file_.GetTypeDescriptorView(GetSuperclassIndex()) : ""; } std::set<std::string_view> GetInterfaceDescriptors() const { std::set<std::string_view> list; const dex::TypeList* ifaces = dex_file_.GetInterfacesList(GetClassDef()); for (uint32_t i = 0; ifaces != nullptr && i < ifaces->Size(); ++i) { - list.insert(dex_file_.StringByTypeIdx(ifaces->GetTypeItem(i).type_idx_)); + list.insert(dex_file_.GetTypeDescriptorView(ifaces->GetTypeItem(i).type_idx_)); } return list; } diff --git a/tools/veridex/flow_analysis.h b/tools/veridex/flow_analysis.h index 2151a41725..2476668749 100644 --- a/tools/veridex/flow_analysis.h +++ b/tools/veridex/flow_analysis.h @@ -77,7 +77,7 @@ class RegisterValue { std::string ToString() const { switch (source_) { case RegisterSource::kString: { - const char* str = reference_.dex_file->StringDataByIdx(dex::StringIndex(reference_.index)); + const char* str = reference_.dex_file->GetStringData(dex::StringIndex(reference_.index)); if (type_ == VeriClass::class_) { // Class names at the Java level are of the form x.y.z, but the list encodes // them of the form Lx/y/z;. Inner classes have '$' for both Java level class @@ -88,7 +88,7 @@ class RegisterValue { } } case RegisterSource::kClass: - return reference_.dex_file->StringByTypeIdx(dex::TypeIndex(reference_.index)); + return reference_.dex_file->GetTypeDescriptor(dex::TypeIndex(reference_.index)); case RegisterSource::kParameter: return std::string("Parameter of ") + reference_.dex_file->PrettyMethod(reference_.index); default: diff --git a/tools/veridex/hidden_api.cc b/tools/veridex/hidden_api.cc index 69e6fe403f..4156aa954b 100644 --- a/tools/veridex/hidden_api.cc +++ b/tools/veridex/hidden_api.cc @@ -82,7 +82,7 @@ void HiddenApi::AddSignatureToApiList(const std::string& signature, hiddenapi::A std::string HiddenApi::GetApiMethodName(const DexFile& dex_file, uint32_t method_index) { std::stringstream ss; const dex::MethodId& method_id = dex_file.GetMethodId(method_index); - ss << dex_file.StringByTypeIdx(method_id.class_idx_) + ss << dex_file.GetTypeDescriptorView(method_id.class_idx_) << "->" << dex_file.GetMethodName(method_id) << dex_file.GetMethodSignature(method_id).ToString(); @@ -92,7 +92,7 @@ std::string HiddenApi::GetApiMethodName(const DexFile& dex_file, uint32_t method std::string HiddenApi::GetApiFieldName(const DexFile& dex_file, uint32_t field_index) { std::stringstream ss; const dex::FieldId& field_id = dex_file.GetFieldId(field_index); - ss << dex_file.StringByTypeIdx(field_id.class_idx_) + ss << dex_file.GetTypeDescriptorView(field_id.class_idx_) << "->" << dex_file.GetFieldName(field_id) << ":" diff --git a/tools/veridex/hidden_api_finder.cc b/tools/veridex/hidden_api_finder.cc index 0f9ed52e3d..9455b0f10b 100644 --- a/tools/veridex/hidden_api_finder.cc +++ b/tools/veridex/hidden_api_finder.cc @@ -53,7 +53,7 @@ void HiddenApiFinder::CollectAccesses(VeridexResolver* resolver, // Look at all types referenced in this dex file. Any of these // types can lead to being used through reflection. for (uint32_t i = 0; i < dex_file.NumTypeIds(); ++i) { - std::string name(dex_file.StringByTypeIdx(dex::TypeIndex(i))); + std::string name(dex_file.GetTypeDescriptorView(dex::TypeIndex(i))); classes_.insert(name); } // Note: we collect strings constants only referenced in code items as the string table @@ -72,7 +72,7 @@ void HiddenApiFinder::CollectAccesses(VeridexResolver* resolver, switch (inst->Opcode()) { case Instruction::CONST_STRING: { dex::StringIndex string_index(inst->VRegB_21c()); - const auto& name = std::string(dex_file.StringDataByIdx(string_index)); + const std::string name(dex_file.GetStringView(string_index)); // Cheap filtering on the string literal. We know it cannot be a field/method/class // if it contains a space. if (name.find(' ') == std::string::npos) { diff --git a/tools/veridex/resolver.cc b/tools/veridex/resolver.cc index df097b6263..a56ea6e5ae 100644 --- a/tools/veridex/resolver.cc +++ b/tools/veridex/resolver.cc @@ -76,7 +76,7 @@ VeriClass* VeridexResolver::GetVeriClass(dex::TypeIndex index) { VeriClass* cls = &type_infos_[index.index_]; if (cls->IsUninitialized()) { // Class is defined in another dex file. Lookup in the global cache. - std::string name(dex_file_.StringByTypeIdx(index)); + std::string name(dex_file_.GetTypeDescriptorView(index)); auto existing = type_map_.find(name); if (existing == type_map_.end()) { // Class hasn't been defined, so check if it's an array class. |