[Lldb-commits] [lldb] r172492 - in /lldb/trunk: include/lldb/Core/CXXFormatterFunctions.h source/Commands/CommandObjectExpression.cpp source/Core/CXXFormatterFunctions.cpp source/Core/FormatManager.cpp test/lang/cpp/char1632_t/TestChar1632T.py test/lang/cpp/wchar_t/TestCxxWCharT.py
Enrico Granata
egranata at apple.com
Mon Jan 14 15:53:26 PST 2013
Author: enrico
Date: Mon Jan 14 17:53:26 2013
New Revision: 172492
URL: http://llvm.org/viewvc/llvm-project?rev=172492&view=rev
Log:
<rdar://problem/12790664>
Single-character Unicode data formatters
Modified:
lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h
lldb/trunk/source/Commands/CommandObjectExpression.cpp
lldb/trunk/source/Core/CXXFormatterFunctions.cpp
lldb/trunk/source/Core/FormatManager.cpp
lldb/trunk/test/lang/cpp/char1632_t/TestChar1632T.py
lldb/trunk/test/lang/cpp/wchar_t/TestCxxWCharT.py
Modified: lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h?rev=172492&r1=172491&r2=172492&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h (original)
+++ lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h Mon Jan 14 17:53:26 2013
@@ -41,7 +41,7 @@
const char* key);
bool
- Char16StringSummaryProvider (ValueObject& valobj, Stream& stream); // char16_t*
+ Char16StringSummaryProvider (ValueObject& valobj, Stream& stream); // char16_t* and unichar*
bool
Char32StringSummaryProvider (ValueObject& valobj, Stream& stream); // char32_t*
@@ -50,6 +50,15 @@
WCharStringSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t*
bool
+ Char16SummaryProvider (ValueObject& valobj, Stream& stream); // char16_t and unichar
+
+ bool
+ Char32SummaryProvider (ValueObject& valobj, Stream& stream); // char32_t
+
+ bool
+ WCharSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t
+
+ bool
LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::string
bool
Modified: lldb/trunk/source/Commands/CommandObjectExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectExpression.cpp?rev=172492&r1=172491&r2=172492&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectExpression.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectExpression.cpp Mon Jan 14 17:53:26 2013
@@ -370,6 +370,9 @@
.SetSummary()
.SetShowSummary(!m_varobj_options.use_objc)
.SetHideRootType(m_varobj_options.use_objc);
+
+ if (m_varobj_options.be_raw)
+ options.SetRawDisplay(true);
ValueObject::DumpValueObject (*(output_stream),
result_valobj_sp.get(), // Variable object to dump
Modified: lldb/trunk/source/Core/CXXFormatterFunctions.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/CXXFormatterFunctions.cpp?rev=172492&r1=172491&r2=172492&view=diff
==============================================================================
--- lldb/trunk/source/Core/CXXFormatterFunctions.cpp (original)
+++ lldb/trunk/source/Core/CXXFormatterFunctions.cpp Mon Jan 14 17:53:26 2013
@@ -135,55 +135,34 @@
return valobj_sp;
}
-template<typename SourceDataType, ConversionResult (*ConvertFunction) (const SourceDataType**,
- const SourceDataType*,
- UTF8**,
- UTF8*,
- ConversionFlags)>
+// use this call if you already have an LLDB-side buffer for the data
+template<typename SourceDataType>
static bool
-ReadUTFBufferAndDumpToStream (uint64_t location,
- const ProcessSP& process_sp,
- Stream& stream,
- char prefix_token = '@',
- bool want_quotes = true)
-{
- if (location == 0 || location == LLDB_INVALID_ADDRESS)
- return false;
- if (!process_sp)
- return false;
-
- const int origin_encoding = 8*sizeof(SourceDataType);
- if (origin_encoding != 8 && origin_encoding != 16 && origin_encoding != 32)
- return false;
- // if not UTF8, I need a conversion function to return proper UTF8
- if (origin_encoding != 8 && !ConvertFunction)
- return false;
-
- const int sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary();
- const int bufferSPSize = sourceSize * (origin_encoding >> 2);
-
- Error error;
- lldb::DataBufferSP buffer_sp(new DataBufferHeap(bufferSPSize,0));
-
- if (!buffer_sp->GetBytes())
- return false;
-
- size_t data_read = process_sp->ReadMemoryFromInferior(location, (char*)buffer_sp->GetBytes(), bufferSPSize, error);
- if (error.Fail())
- {
- stream.Printf("unable to read data");
- return true;
- }
- else
+DumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType**,
+ const SourceDataType*,
+ UTF8**,
+ UTF8*,
+ ConversionFlags),
+ DataExtractor& data,
+ Stream& stream,
+ char prefix_token = '@',
+ char quote = '"',
+ int sourceSize = 0)
+{
+ if (prefix_token != 0)
+ stream.Printf("%c",prefix_token);
+ if (quote != 0)
+ stream.Printf("%c",quote);
+ if (data.GetByteSize() && data.GetDataStart() && data.GetDataEnd())
{
- if (prefix_token != 0)
- stream.Printf("%c",prefix_token);
- if (want_quotes)
- stream.Printf("\"");
- }
- if (data_read)
- {
- SourceDataType *data_ptr = (SourceDataType*)buffer_sp->GetBytes();
+ const int bufferSPSize = data.GetByteSize();
+ if (sourceSize == 0)
+ {
+ const int origin_encoding = 8*sizeof(SourceDataType);
+ sourceSize = bufferSPSize/(origin_encoding >> 2);
+ }
+
+ SourceDataType *data_ptr = (SourceDataType*)data.GetDataStart();
SourceDataType *data_end_ptr = data_ptr + sourceSize;
while (data_ptr < data_end_ptr)
@@ -197,12 +176,12 @@
}
*data_ptr = 0;
- data_ptr = (SourceDataType*)buffer_sp->GetBytes();
+ data_ptr = (SourceDataType*)data.GetDataStart();
lldb::DataBufferSP utf8_data_buffer_sp;
UTF8* utf8_data_ptr = nullptr;
UTF8* utf8_data_end_ptr = nullptr;
-
+
if (ConvertFunction)
{
utf8_data_buffer_sp.reset(new DataBufferHeap(bufferSPSize,0));
@@ -228,15 +207,60 @@
break;
stream.Printf("%c",*utf8_data_ptr);
}
- if (want_quotes)
- stream.Printf("\"");
- return true;
}
- if (want_quotes)
- stream.Printf("\"");
+ if (quote != 0)
+ stream.Printf("%c",quote);
return true;
}
+template<typename SourceDataType>
+static bool
+ReadUTFBufferAndDumpToStream (ConversionResult (*ConvertFunction) (const SourceDataType**,
+ const SourceDataType*,
+ UTF8**,
+ UTF8*,
+ ConversionFlags),
+ uint64_t location,
+ const ProcessSP& process_sp,
+ Stream& stream,
+ char prefix_token = '@',
+ char quote = '"',
+ int sourceSize = 0)
+{
+ if (location == 0 || location == LLDB_INVALID_ADDRESS)
+ return false;
+ if (!process_sp)
+ return false;
+
+ const int origin_encoding = 8*sizeof(SourceDataType);
+ if (origin_encoding != 8 && origin_encoding != 16 && origin_encoding != 32)
+ return false;
+ // if not UTF8, I need a conversion function to return proper UTF8
+ if (origin_encoding != 8 && !ConvertFunction)
+ return false;
+
+ if (sourceSize == 0)
+ sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary();
+ const int bufferSPSize = sourceSize * (origin_encoding >> 2);
+
+ Error error;
+ lldb::DataBufferSP buffer_sp(new DataBufferHeap(bufferSPSize,0));
+
+ if (!buffer_sp->GetBytes())
+ return false;
+
+ size_t data_read = process_sp->ReadMemoryFromInferior(location, (char*)buffer_sp->GetBytes(), bufferSPSize, error);
+ if (error.Fail() || data_read == 0)
+ {
+ stream.Printf("unable to read data");
+ return true;
+ }
+
+ DataExtractor data(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize());
+
+ return DumpUTFBufferToStream(ConvertFunction, data, stream, prefix_token, quote, sourceSize);
+}
+
bool
lldb_private::formatters::Char16StringSummaryProvider (ValueObject& valobj, Stream& stream)
{
@@ -249,11 +273,10 @@
if (!valobj_addr)
return false;
- if (!ReadUTFBufferAndDumpToStream<UTF16, ConvertUTF16toUTF8>(valobj_addr,
+ if (!ReadUTFBufferAndDumpToStream<UTF16>(ConvertUTF16toUTF8,valobj_addr,
process_sp,
stream,
- 'u',
- true)) // but use quotes
+ 'u'))
{
stream.Printf("Summary Unavailable");
return true;
@@ -274,11 +297,10 @@
if (!valobj_addr)
return false;
- if (!ReadUTFBufferAndDumpToStream<UTF32, ConvertUTF32toUTF8>(valobj_addr,
+ if (!ReadUTFBufferAndDumpToStream<UTF32>(ConvertUTF32toUTF8,valobj_addr,
process_sp,
stream,
- 'U',
- true)) // but use quotes
+ 'U'))
{
stream.Printf("Summary Unavailable");
return true;
@@ -315,25 +337,107 @@
{
case 8:
// utf 8
- return ReadUTFBufferAndDumpToStream<UTF8, nullptr>(data_addr,
+ return ReadUTFBufferAndDumpToStream<UTF8>(nullptr, data_addr,
process_sp,
stream,
- 'L',
- true); // but use quotes
+ 'L');
case 16:
// utf 16
- return ReadUTFBufferAndDumpToStream<UTF16, ConvertUTF16toUTF8>(data_addr,
+ return ReadUTFBufferAndDumpToStream<UTF16>(ConvertUTF16toUTF8, data_addr,
process_sp,
stream,
- 'L',
- true); // but use quotes
+ 'L');
case 32:
// utf 32
- return ReadUTFBufferAndDumpToStream<UTF32, ConvertUTF32toUTF8>(data_addr,
+ return ReadUTFBufferAndDumpToStream<UTF32>(ConvertUTF32toUTF8, data_addr,
process_sp,
stream,
- 'L',
- true); // but use quotes
+ 'L');
+ default:
+ stream.Printf("size for wchar_t is not valid");
+ return true;
+ }
+ return true;
+}
+
+bool
+lldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream)
+{
+ DataExtractor data;
+ valobj.GetData(data);
+
+ std::string value;
+ valobj.GetValueAsCString(lldb::eFormatUnicode16, value);
+ if (!value.empty())
+ stream.Printf("%s ", value.c_str());
+
+ return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8,data,stream, 'u','\'',1);
+}
+
+bool
+lldb_private::formatters::Char32SummaryProvider (ValueObject& valobj, Stream& stream)
+{
+ DataExtractor data;
+ valobj.GetData(data);
+
+ std::string value;
+ valobj.GetValueAsCString(lldb::eFormatUnicode32, value);
+ if (!value.empty())
+ stream.Printf("%s ", value.c_str());
+
+ return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8,data,stream, 'U','\'',1);
+}
+
+bool
+lldb_private::formatters::WCharSummaryProvider (ValueObject& valobj, Stream& stream)
+{
+ DataExtractor data;
+ valobj.GetData(data);
+
+ clang::ASTContext* ast = valobj.GetClangAST();
+
+ if (!ast)
+ return false;
+
+ std::string value;
+
+ uint32_t wchar_size = ClangASTType::GetClangTypeBitWidth(ast, ClangASTType::GetBasicType(ast, lldb::eBasicTypeWChar).GetOpaqueQualType());
+
+ switch (wchar_size)
+ {
+ case 8:
+ // utf 8
+ valobj.GetValueAsCString(lldb::eFormatChar, value);
+ if (!value.empty())
+ stream.Printf("%s ", value.c_str());
+ return DumpUTFBufferToStream<UTF8>(nullptr,
+ data,
+ stream,
+ 'L',
+ '\'',
+ 1);
+ case 16:
+ // utf 16
+ valobj.GetValueAsCString(lldb::eFormatUnicode16, value);
+ if (!value.empty())
+ stream.Printf("%s ", value.c_str());
+ return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8,
+ data,
+ stream,
+ 'L',
+ '\'',
+ 1);
+ case 32:
+ // utf 32
+ valobj.GetValueAsCString(lldb::eFormatUnicode32, value);
+ if (!value.empty())
+ stream.Printf("%s ", value.c_str());
+ return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8,
+ data,
+ stream,
+ 'L',
+ '\'',
+ 1);
default:
stream.Printf("size for wchar_t is not valid");
return true;
@@ -827,7 +931,7 @@
if (error.Fail())
return false;
if (has_explicit_length and is_unicode)
- return ReadUTFBufferAndDumpToStream<UTF16,ConvertUTF16toUTF8> (location, process_sp, stream, '@');
+ return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8,location, process_sp, stream, '@');
else
{
location++;
@@ -870,12 +974,12 @@
if (error.Fail())
return false;
}
- return ReadUTFBufferAndDumpToStream<UTF16,ConvertUTF16toUTF8> (location, process_sp, stream, '@');
+ return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@');
}
else if (is_special)
{
uint64_t location = valobj_addr + (ptr_size == 8 ? 12 : 8);
- return ReadUTFBufferAndDumpToStream<UTF16,ConvertUTF16toUTF8> (location, process_sp, stream, '@');
+ return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@');
}
else if (is_inline)
{
Modified: lldb/trunk/source/Core/FormatManager.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FormatManager.cpp?rev=172492&r1=172491&r2=172492&view=diff
==============================================================================
--- lldb/trunk/source/Core/FormatManager.cpp (original)
+++ lldb/trunk/source/Core/FormatManager.cpp Mon Jan 14 17:53:26 2013
@@ -968,6 +968,25 @@
AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("wchar_t *"), string_flags);
AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("const wchar_t *"), string_flags);
+
+ AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "unichar * summary provider", ConstString("unichar *"), string_flags);
+ AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "unichar * summary provider", ConstString("const unichar *"), string_flags);
+
+ TypeSummaryImpl::Flags widechar_flags;
+ widechar_flags.SetDontShowValue(true)
+ .SetSkipPointers(true)
+ .SetSkipReferences(false)
+ .SetCascades(true)
+ .SetDontShowChildren(true)
+ .SetHideItemNames(true)
+ .SetShowMembersOneLiner(false);
+
+ AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16SummaryProvider, "char16_t summary provider", ConstString("char16_t"), widechar_flags);
+ AddCXXSummary(sys_category_sp, lldb_private::formatters::Char32SummaryProvider, "char32_t summary provider", ConstString("char32_t"), widechar_flags);
+ AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharSummaryProvider, "wchar_t summary provider", ConstString("wchar_t"), widechar_flags);
+
+ AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16SummaryProvider, "unichar summary provider", ConstString("unichar"), widechar_flags);
+
#endif
}
Modified: lldb/trunk/test/lang/cpp/char1632_t/TestChar1632T.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/cpp/char1632_t/TestChar1632T.py?rev=172492&r1=172491&r2=172492&view=diff
==============================================================================
--- lldb/trunk/test/lang/cpp/char1632_t/TestChar1632T.py (original)
+++ lldb/trunk/test/lang/cpp/char1632_t/TestChar1632T.py Mon Jan 14 17:53:26 2013
@@ -74,6 +74,10 @@
self.expect("frame variable s16 s32",
substrs = ['(char16_t *) s16 = 0x','(char32_t *) s32 = ','"è²ãåããæ£ãªãã«ã²"','"à·´"'])
+ # Check that we can run expressions that return charN_t
+ self.expect("expression u'a'",substrs = ['(char16_t) $',"61 u'a'"])
+ self.expect("expression U'a'",substrs = ['(char32_t) $',"61 U'a'"])
+
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
Modified: lldb/trunk/test/lang/cpp/wchar_t/TestCxxWCharT.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/cpp/wchar_t/TestCxxWCharT.py?rev=172492&r1=172491&r2=172492&view=diff
==============================================================================
--- lldb/trunk/test/lang/cpp/wchar_t/TestCxxWCharT.py (original)
+++ lldb/trunk/test/lang/cpp/wchar_t/TestCxxWCharT.py Mon Jan 14 17:53:26 2013
@@ -67,7 +67,7 @@
substrs = ['(int) foo_x.object = '])
# Check that we can run expressions that return wchar_t
- self.expect("expression L'a'",substrs = ['(wchar_t) $'])
+ self.expect("expression L'a'",substrs = ['(wchar_t) $',"61 L'a'"])
# Mazel Tov if this works!
self.expect("frame variable mazeltov",
More information about the lldb-commits
mailing list