summaryrefslogtreecommitdiff
path: root/libdexfile/dex/dex_file-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'libdexfile/dex/dex_file-inl.h')
-rw-r--r--libdexfile/dex/dex_file-inl.h13
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;