Merge "Add support for boolean literals." am: 63a0008df7 am: 008f11fb5e am: b626ce6686

am: b32d591ef2

Change-Id: I143699133a65731087fad595a26bfcc9bbd2c1f6
This commit is contained in:
Christopher Ferris 2017-10-12 02:42:26 +00:00 committed by android-build-merger
commit dd3b4f794f
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);