summaryrefslogtreecommitdiffstats
path: root/demangle/Demangler.h
diff options
context:
space:
mode:
authorChristopher Ferris <cferris@google.com>2017-10-27 12:29:02 -0700
committerChristopher Ferris <cferris@google.com>2017-10-31 15:00:54 -0700
commit584333e3b2da923537076944bf4eb94ddb2a4fff (patch)
treeb9e0e6348a83a9f27964de9c4c01c21fb2c779c2 /demangle/Demangler.h
parentbb3769349de0f4becb8a4fd2ed33ffeaf8d56862 (diff)
downloadsystem_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.h8
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; }