From 05232758934f36308e95333d53b637dc79df31ce Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Wed, 11 Oct 2017 15:22:29 -0700 Subject: [PATCH] Add support for boolean literals. Bug: 67678053 Test: Passes new unit tests. Change-Id: I9d0ede56aa5d7071e682f366870148320545406e --- demangle/DemangleTest.cpp | 8 ++++++++ demangle/Demangler.cpp | 28 ++++++++++++++++++++++++++++ demangle/Demangler.h | 1 + 3 files changed, 37 insertions(+) diff --git a/demangle/DemangleTest.cpp b/demangle/DemangleTest.cpp index f56a9be3c..c93e2ab93 100644 --- a/demangle/DemangleTest.cpp +++ b/demangle/DemangleTest.cpp @@ -428,6 +428,14 @@ TEST(DemangleTest, StringTooLong) { ASSERT_EQ("_ZN3one3twoEDa", demangler.Parse("_ZN3one3twoEDa", 12)); } +TEST(DemangleTest, BooleanLiterals) { + Demangler demangler; + + ASSERT_EQ("one", demangler.Parse("_ZN3oneILb1EEE")); + ASSERT_EQ("one", demangler.Parse("_ZN3oneILb0EEE")); + ASSERT_EQ("one", demangler.Parse("_ZN3oneILb0ELb1EEE")); +} + TEST(DemangleTest, demangle) { std::string str; diff --git a/demangle/Demangler.cpp b/demangle/Demangler.cpp index c0a96aae5..f148b21a5 100644 --- a/demangle/Demangler.cpp +++ b/demangle/Demangler.cpp @@ -660,6 +660,29 @@ const char* Demangler::ParseArguments(const char* name) { return nullptr; } +const char* Demangler::ParseTemplateLiteral(const char* name) { + if (*name == 'E') { + parse_func_ = parse_funcs_.back(); + parse_funcs_.pop_back(); + return name + 1; + } + // Only understand boolean values with 0 or 1. + if (*name == 'b') { + name++; + if (*name == '0') { + AppendArgument("false"); + cur_state_.str.clear(); + } else if (*name == '1') { + AppendArgument("true"); + cur_state_.str.clear(); + } else { + return nullptr; + } + return name + 1; + } + return nullptr; +} + const char* Demangler::ParseTemplateArgumentsComplex(const char* name) { if (*name == 'E') { if (parse_funcs_.empty()) { @@ -670,6 +693,11 @@ const char* Demangler::ParseTemplateArgumentsComplex(const char* name) { FinalizeTemplate(); Save(cur_state_.str, false); return name + 1; + } else if (*name == 'L') { + // Literal value for a template. + parse_funcs_.push_back(parse_func_); + parse_func_ = &Demangler::ParseTemplateLiteral; + return name + 1; } return ParseArguments(name); } diff --git a/demangle/Demangler.h b/demangle/Demangler.h index 3bd4f3c00..f76def64a 100644 --- a/demangle/Demangler.h +++ b/demangle/Demangler.h @@ -92,6 +92,7 @@ class Demangler { const char* ParseArguments(const char* name); const char* ParseTemplateArguments(const char* name); const char* ParseTemplateArgumentsComplex(const char* name); + const char* ParseTemplateLiteral(const char* name); const char* ParseFunctionArgument(const char* name); const char* ParseFunctionName(const char* name); const char* FindFunctionName(const char* name);