diff options
author | Enrico Granata <egranata@apple.com> | 2015-07-17 01:56:25 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2015-07-17 01:56:25 +0000 |
commit | 8101f570f83cf7643b64d38d71dfe00cea3ac6ee (patch) | |
tree | af8e7a3f80cf58e1ed3bf70dd0ece8ca81681c45 /lldb/source/DataFormatters | |
parent | 2d8315f8066bbce201e9b2c28b7d24915dcbe5f0 (diff) | |
download | bcm5719-llvm-8101f570f83cf7643b64d38d71dfe00cea3ac6ee.tar.gz bcm5719-llvm-8101f570f83cf7643b64d38d71dfe00cea3ac6ee.zip |
Teach the std::wstring data formatter how to properly display strings with embedded NUL bytes
llvm-svn: 242501
Diffstat (limited to 'lldb/source/DataFormatters')
-rw-r--r-- | lldb/source/DataFormatters/CXXFormatterFunctions.cpp | 42 | ||||
-rw-r--r-- | lldb/source/DataFormatters/StringPrinter.cpp | 2 |
2 files changed, 41 insertions, 3 deletions
diff --git a/lldb/source/DataFormatters/CXXFormatterFunctions.cpp b/lldb/source/DataFormatters/CXXFormatterFunctions.cpp index 9c59ea189be..611ebedba56 100644 --- a/lldb/source/DataFormatters/CXXFormatterFunctions.cpp +++ b/lldb/source/DataFormatters/CXXFormatterFunctions.cpp @@ -494,7 +494,7 @@ ExtractLibcxxStringInfo (ValueObject& valobj, } bool -lldb_private::formatters::LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) +lldb_private::formatters::LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& summary_options) { uint64_t size = 0; ValueObjectSP location_sp((ValueObject*)nullptr); @@ -507,7 +507,43 @@ lldb_private::formatters::LibcxxWStringSummaryProvider (ValueObject& valobj, Str } if (!location_sp) return false; - return WCharStringSummaryProvider(*location_sp.get(), stream, options); + + DataExtractor extractor; + if (summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryCapped) + size = std::min<decltype(size)>(size, valobj.GetTargetSP()->GetMaximumSizeOfStringSummary()); + location_sp->GetPointeeData(extractor, 0, size); + + // std::wstring::size() is measured in 'characters', not bytes + auto wchar_t_size = valobj.GetTargetSP()->GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeWChar).GetByteSize(nullptr); + + ReadBufferAndDumpToStreamOptions options(valobj); + options.SetData(extractor); + options.SetStream(&stream); + options.SetPrefixToken('L'); + options.SetQuote('"'); + options.SetSourceSize(size); + options.SetBinaryZeroIsTerminator(false); + + switch (wchar_t_size) + { + case 1: + lldb_private::formatters::ReadBufferAndDumpToStream<lldb_private::formatters::StringElementType::UTF8>(options); + break; + + case 2: + lldb_private::formatters::ReadBufferAndDumpToStream<lldb_private::formatters::StringElementType::UTF16>(options); + break; + + case 4: + lldb_private::formatters::ReadBufferAndDumpToStream<lldb_private::formatters::StringElementType::UTF32>(options); + break; + + default: + stream.Printf("size for wchar_t is not valid"); + return true; + } + + return true; } bool @@ -534,7 +570,7 @@ lldb_private::formatters::LibcxxStringSummaryProvider (ValueObject& valobj, Stre location_sp->GetPointeeData(extractor, 0, size); ReadBufferAndDumpToStreamOptions options(valobj); - options.SetData(extractor); // none of this matters for a string - pass some defaults + options.SetData(extractor); options.SetStream(&stream); options.SetPrefixToken(0); options.SetQuote('"'); diff --git a/lldb/source/DataFormatters/StringPrinter.cpp b/lldb/source/DataFormatters/StringPrinter.cpp index 60c246f8341..27f5b51f7d2 100644 --- a/lldb/source/DataFormatters/StringPrinter.cpp +++ b/lldb/source/DataFormatters/StringPrinter.cpp @@ -382,6 +382,8 @@ DumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); utf8_data_end_ptr = utf8_data_ptr + utf8_data_buffer_sp->GetByteSize(); ConvertFunction ( &data_ptr, data_end_ptr, &utf8_data_ptr, utf8_data_end_ptr, lenientConversion ); + if (false == zero_is_terminator) + utf8_data_end_ptr = utf8_data_ptr; utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); // needed because the ConvertFunction will change the value of the data_ptr } else |