summaryrefslogtreecommitdiffstats
path: root/demangle
diff options
context:
space:
mode:
authorChristopher Ferris <cferris@google.com>2017-10-11 15:22:29 -0700
committerChristopher Ferris <cferris@google.com>2017-10-11 15:23:45 -0700
commit05232758934f36308e95333d53b637dc79df31ce (patch)
treefc4047200f1481be6bc35d5cd1b27a309f7600ac /demangle
parent85b80dc18db98b7950062f57457f8fcd49ba927e (diff)
downloadsystem_core-05232758934f36308e95333d53b637dc79df31ce.tar.gz
system_core-05232758934f36308e95333d53b637dc79df31ce.tar.bz2
system_core-05232758934f36308e95333d53b637dc79df31ce.zip
Add support for boolean literals.
Bug: 67678053 Test: Passes new unit tests. Change-Id: I9d0ede56aa5d7071e682f366870148320545406e
Diffstat (limited to 'demangle')
-rw-r--r--demangle/DemangleTest.cpp8
-rw-r--r--demangle/Demangler.cpp28
-rw-r--r--demangle/Demangler.h1
3 files changed, 37 insertions, 0 deletions
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<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;
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);