diff options
author | Christopher Ferris <cferris@google.com> | 2017-10-27 12:29:02 -0700 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2017-10-31 15:00:54 -0700 |
commit | 584333e3b2da923537076944bf4eb94ddb2a4fff (patch) | |
tree | b9e0e6348a83a9f27964de9c4c01c21fb2c779c2 /demangle/Demangler.h | |
parent | bb3769349de0f4becb8a4fd2ed33ffeaf8d56862 (diff) | |
download | system_core-584333e3b2da923537076944bf4eb94ddb2a4fff.tar.gz system_core-584333e3b2da923537076944bf4eb94ddb2a4fff.tar.bz2 system_core-584333e3b2da923537076944bf4eb94ddb2a4fff.zip |
Fix template support.
- Fix template applying to function name without a starting N.
- Fix return types for templates handling.
- Add support for the T substitution parameter.
- Fix a case where the literal L handler was not being set properly.
Bug: 67678053
Test: New unit tests, fuzzer.
Change-Id: I4f831038047eb2cd8519426f16aa2bdcb846d92d
Diffstat (limited to 'demangle/Demangler.h')
-rw-r--r-- | demangle/Demangler.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/demangle/Demangler.h b/demangle/Demangler.h index f76def64a..3b7d44ef3 100644 --- a/demangle/Demangler.h +++ b/demangle/Demangler.h @@ -39,6 +39,7 @@ class Demangler { std::string GetArgumentsString(); void FinalizeTemplate(); const char* ParseS(const char* name); + const char* ParseT(const char* name); const char* AppendOperatorString(const char* name); void Save(const std::string& str, bool is_name); @@ -50,17 +51,21 @@ class Demangler { first_save_.clear(); cur_state_.Clear(); saves_.clear(); + template_saves_.clear(); while (!state_stack_.empty()) { state_stack_.pop(); } last_save_name_ = false; + template_found_ = false; } using parse_func_type = const char* (Demangler::*)(const char*); parse_func_type parse_func_; std::vector<parse_func_type> parse_funcs_; std::vector<std::string> saves_; + std::vector<std::string> template_saves_; bool last_save_name_; + bool template_found_; std::string function_name_; std::string function_suffix_; @@ -89,12 +94,15 @@ class Demangler { // Parsing functions. const char* ParseComplexString(const char* name); const char* ParseComplexArgument(const char* name); + const char* ParseArgumentsAtTopLevel(const char* name); 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* ParseFunctionNameTemplate(const char* name); + const char* ParseFunctionTemplateArguments(const char* name); const char* FindFunctionName(const char* name); const char* Fail(const char*) { return nullptr; } |