diff options
Diffstat (limited to 'libdexfile/dex/dex_file-inl.h')
-rw-r--r-- | libdexfile/dex/dex_file-inl.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/libdexfile/dex/dex_file-inl.h b/libdexfile/dex/dex_file-inl.h index b777ef7ac1..61c45934e8 100644 --- a/libdexfile/dex/dex_file-inl.h +++ b/libdexfile/dex/dex_file-inl.h @@ -32,6 +32,13 @@ namespace art { +inline std::string_view StringViewFromUtf16Length(const char* utf8_data, size_t utf16_length) { + size_t utf8_length = LIKELY(utf8_data[utf16_length] == 0) // Is ASCII? + ? utf16_length + : utf16_length + strlen(utf8_data + utf16_length); + 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); @@ -65,6 +72,12 @@ inline const char* DexFile::StringDataByIdx(dex::StringIndex idx) const { return StringDataAndUtf16LengthByIdx(idx, &unicode_length); } +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 const char* DexFile::StringByTypeIdx(dex::TypeIndex idx, uint32_t* unicode_length) const { if (!idx.IsValid()) { return nullptr; |