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

am: 008f11fb5e

Change-Id: I43f85bff0bc7973cea368f8fd873498cf0bb1e32
This commit is contained in:
Christopher Ferris 2017-10-12 01:38:44 +00:00 committed by android-build-merger
commit b626ce6686
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);