Fix bugs in demangler

This commit is contained in:
Amber Brault 2024-11-11 13:39:35 -05:00
parent c62b236627
commit 3ab293e820
1 changed files with 8 additions and 5 deletions

View File

@ -58,6 +58,8 @@ std::tuple<std::string, std::string, std::string> CWDemangler::parse_qualifiers(
{ {
std::string pre = ""; std::string pre = "";
std::string post = ""; std::string post = "";
int index = 0;
for (char c : str) for (char c : str)
{ {
bool foundNonQualifier = false; bool foundNonQualifier = false;
@ -105,8 +107,9 @@ std::tuple<std::string, std::string, std::string> CWDemangler::parse_qualifiers(
if (foundNonQualifier) if (foundNonQualifier)
break; break;
str = str.substr(1); index++;
} }
str = str.substr(index);
post = StripWhitespaceEnd(post); post = StripWhitespaceEnd(post);
return {pre, post, str}; return {pre, post, str};
} }
@ -236,7 +239,7 @@ CWDemangler::demangle_qualified_name(std::string str, DemangleOptions options)
return {}; return {};
} }
int count; int count = 0;
if (!(std::istringstream(str.substr(1,1)) >> count)) if (!(std::istringstream(str.substr(1,1)) >> count))
return {}; return {};
@ -416,8 +419,8 @@ CWDemangler::demangle_arg(std::string str, DemangleOptions options)
std::string ret_pre, ret_post; std::string ret_pre, ret_post;
std::tie(ret_pre, ret_post, rest) = demangleArgResult.value(); std::tie(ret_pre, ret_post, rest) = demangleArgResult.value();
std::string const_str = const_member ? " const" : ""; std::string const_str = const_member ? " const" : "";
std::string res_pre = fmt::format("{} ({}{})", ret_pre, pre, post); std::string res_pre = fmt::format("{} ({}{}", ret_pre, pre, post);
std::string res_post = fmt::format(")({}){}{}", res_pre, res_post, rest); std::string res_post = fmt::format(")({}){}{}", args, const_str, ret_post);
return {{res_pre, res_post, rest}}; return {{res_pre, res_post, rest}};
} }
@ -509,7 +512,7 @@ CWDemangler::demangle_arg(std::string str, DemangleOptions options)
result += post; result += post;
return {{result, "", str.substr(1)}}; return {{result, "", str.substr(1)}};
} }
std::optional<std::tuple<std::string, std::string>> std::optional<std::tuple<std::string, std::string>>
CWDemangler::demangle_function_args(std::string str, DemangleOptions options) CWDemangler::demangle_function_args(std::string str, DemangleOptions options)