Loading demangle/DemangleTest.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,14 @@ TEST(DemangleTest, StringTooLong) { ASSERT_EQ("_ZN3one3twoEDa", demangler.Parse("_ZN3one3twoEDa", 12)); } TEST(DemangleTest, BooleanLiterals) { Demangler demangler; ASSERT_EQ("one<true>", demangler.Parse("_ZN3oneILb1EEE")); ASSERT_EQ("one<false>", demangler.Parse("_ZN3oneILb0EEE")); ASSERT_EQ("one<false, true>", demangler.Parse("_ZN3oneILb0ELb1EEE")); } TEST(DemangleTest, demangle) { std::string str; Loading demangle/Demangler.cpp +28 −0 Original line number Diff line number Diff line Loading @@ -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()) { Loading @@ -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); } Loading demangle/Demangler.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
demangle/DemangleTest.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,14 @@ TEST(DemangleTest, StringTooLong) { ASSERT_EQ("_ZN3one3twoEDa", demangler.Parse("_ZN3one3twoEDa", 12)); } TEST(DemangleTest, BooleanLiterals) { Demangler demangler; ASSERT_EQ("one<true>", demangler.Parse("_ZN3oneILb1EEE")); ASSERT_EQ("one<false>", demangler.Parse("_ZN3oneILb0EEE")); ASSERT_EQ("one<false, true>", demangler.Parse("_ZN3oneILb0ELb1EEE")); } TEST(DemangleTest, demangle) { std::string str; Loading
demangle/Demangler.cpp +28 −0 Original line number Diff line number Diff line Loading @@ -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()) { Loading @@ -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); } Loading
demangle/Demangler.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading