diff options
Diffstat (limited to 'demangle/Demangler.cpp')
-rw-r--r-- | demangle/Demangler.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
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); } |