evgeny777 created this revision. evgeny777 added a reviewer: granata.enrico. evgeny777 added subscribers: lldb-commits, KLapshin.
This patch enables type summary for 'char' type. Let's suppose we have: **char c = 'h'; ** Current revision evaluates c as: **(char) $0 = 'h'** After this patch (104 is the ASCII code of 'h'): **(char) $0 = 104 'h'** This change primary objective is to conform MI evaluation of character type, so that MI formatting can be eliminated and entirely replaced with one of lldb. Also this can be useful when evaluating non-printable characters http://reviews.llvm.org/D13657 Files: source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp source/Plugins/Language/CPlusPlus/CxxStringTypes.h test/lang/cpp/wchar_t/TestCxxWCharT.py test/lang/cpp/wchar_t/main.cpp Index: test/lang/cpp/wchar_t/main.cpp =================================================================== --- test/lang/cpp/wchar_t/main.cpp +++ test/lang/cpp/wchar_t/main.cpp @@ -26,6 +26,7 @@ Foo<int> foo_x('a'); Foo<wchar_t> foo_y(L'a'); const wchar_t *mazeltov = L"מזל טוב"; + char c8 = 'h'; wchar_t *ws_NULL = nullptr; wchar_t *ws_empty = L""; wchar_t array[200], * array_source = L"Hey, I'm a super wchar_t string, éõñž"; Index: test/lang/cpp/wchar_t/TestCxxWCharT.py =================================================================== --- test/lang/cpp/wchar_t/TestCxxWCharT.py +++ test/lang/cpp/wchar_t/TestCxxWCharT.py @@ -37,6 +37,10 @@ if not process: self.fail("SBTarget.Launch() failed") + + # Check that summary for char type works + self.expect("frame variable c8", + substrs = ["(char) c8 = 104 'h'"]) # Check that we correctly report templates on wchar_t self.expect("frame variable foo_y", Index: source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp =================================================================== --- source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -656,7 +656,9 @@ .SetDontShowChildren(true) .SetHideItemNames(true) .SetShowMembersOneLiner(false); - + const TypeSummaryImpl::Flags char_flags = widechar_flags; + + AddCXXSummary(cpp_category_sp, lldb_private::formatters::CharSummaryProvider, "char summary provider", ConstString("char"), char_flags); AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char16SummaryProvider, "char16_t summary provider", ConstString("char16_t"), widechar_flags); AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char32SummaryProvider, "char32_t summary provider", ConstString("char32_t"), widechar_flags); AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharSummaryProvider, "wchar_t summary provider", ConstString("wchar_t"), widechar_flags); Index: source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp =================================================================== --- source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp +++ source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp @@ -131,6 +131,18 @@ } bool +lldb_private::formatters::CharSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) +{ + bool success; + int64_t code = valobj.GetValueAsSigned(0, &success); + if (!success) + return false; + + stream.Printf("%d %s", (int)code, valobj.GetValueAsCString()); + return true; +} + +bool lldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) { DataExtractor data; Index: source/Plugins/Language/CPlusPlus/CxxStringTypes.h =================================================================== --- source/Plugins/Language/CPlusPlus/CxxStringTypes.h +++ source/Plugins/Language/CPlusPlus/CxxStringTypes.h @@ -18,6 +18,9 @@ namespace formatters { bool + CharSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&); + + bool Char16StringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // char16_t* and unichar* bool
Index: test/lang/cpp/wchar_t/main.cpp =================================================================== --- test/lang/cpp/wchar_t/main.cpp +++ test/lang/cpp/wchar_t/main.cpp @@ -26,6 +26,7 @@ Foo<int> foo_x('a'); Foo<wchar_t> foo_y(L'a'); const wchar_t *mazeltov = L"מזל טוב"; + char c8 = 'h'; wchar_t *ws_NULL = nullptr; wchar_t *ws_empty = L""; wchar_t array[200], * array_source = L"Hey, I'm a super wchar_t string, éõñž"; Index: test/lang/cpp/wchar_t/TestCxxWCharT.py =================================================================== --- test/lang/cpp/wchar_t/TestCxxWCharT.py +++ test/lang/cpp/wchar_t/TestCxxWCharT.py @@ -37,6 +37,10 @@ if not process: self.fail("SBTarget.Launch() failed") + + # Check that summary for char type works + self.expect("frame variable c8", + substrs = ["(char) c8 = 104 'h'"]) # Check that we correctly report templates on wchar_t self.expect("frame variable foo_y", Index: source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp =================================================================== --- source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -656,7 +656,9 @@ .SetDontShowChildren(true) .SetHideItemNames(true) .SetShowMembersOneLiner(false); - + const TypeSummaryImpl::Flags char_flags = widechar_flags; + + AddCXXSummary(cpp_category_sp, lldb_private::formatters::CharSummaryProvider, "char summary provider", ConstString("char"), char_flags); AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char16SummaryProvider, "char16_t summary provider", ConstString("char16_t"), widechar_flags); AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char32SummaryProvider, "char32_t summary provider", ConstString("char32_t"), widechar_flags); AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharSummaryProvider, "wchar_t summary provider", ConstString("wchar_t"), widechar_flags); Index: source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp =================================================================== --- source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp +++ source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp @@ -131,6 +131,18 @@ } bool +lldb_private::formatters::CharSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) +{ + bool success; + int64_t code = valobj.GetValueAsSigned(0, &success); + if (!success) + return false; + + stream.Printf("%d %s", (int)code, valobj.GetValueAsCString()); + return true; +} + +bool lldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) { DataExtractor data; Index: source/Plugins/Language/CPlusPlus/CxxStringTypes.h =================================================================== --- source/Plugins/Language/CPlusPlus/CxxStringTypes.h +++ source/Plugins/Language/CPlusPlus/CxxStringTypes.h @@ -18,6 +18,9 @@ namespace formatters { bool + CharSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&); + + bool Char16StringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // char16_t* and unichar* bool
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits