Merge "Add support for boolean literals."

am: 63a0008df7

Change-Id: I050cc47929c0152f05832bbe54a12aa45f93766a
This commit is contained in:
Christopher Ferris 2017-10-12 01:33:49 +00:00 committed by android-build-merger
commit 008f11fb5e
3 changed files with 37 additions and 0 deletions

View file

@ -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;

View file

@ -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);
}

View file

@ -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);