Module: wine Branch: master Commit: 638b06015b6696358f4e30037a72981672ae3730 URL: https://gitlab.winehq.org/wine/wine/-/commit/638b06015b6696358f4e30037a72981...
Author: Eric Pouech eric.pouech@gmail.com Date: Wed Aug 31 10:39:16 2022 +0200
msvcrt: Use enum to clarify post-processing actions.
Signed-off-by: Eric Pouech eric.pouech@gmail.com
---
dlls/msvcrt/undname.c | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-)
diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c index a3ad3497c00..424d977a2a7 100644 --- a/dlls/msvcrt/undname.c +++ b/dlls/msvcrt/undname.c @@ -1421,7 +1421,12 @@ done: static BOOL symbol_demangle(struct parsed_symbol* sym) { BOOL ret = FALSE; - unsigned do_after = 0; + enum { + PP_NONE, + PP_CONSTRUCTOR, + PP_DESTRUCTOR, + PP_CAST_OPERATOR, + } post_process = PP_NONE;
/* FIXME seems wrong as name, as it demangles a simple data type */ if (sym->flags & UNDNAME_NO_ARGUMENTS) @@ -1455,8 +1460,8 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) /* C++ operator code (one character, or two if the first is '_') */ switch (*++sym->current) { - case '0': function_name = ""; do_after = 1; break; - case '1': function_name = ""; do_after = 2; break; + case '0': function_name = ""; post_process = PP_CONSTRUCTOR; break; + case '1': function_name = ""; post_process = PP_DESTRUCTOR; break; case '2': function_name = "operator new"; break; case '3': function_name = "operator delete"; break; case '4': function_name = "operator="; break; @@ -1466,7 +1471,7 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) case '8': function_name = "operator=="; break; case '9': function_name = "operator!="; break; case 'A': function_name = "operator[]"; break; - case 'B': function_name = "operator"; do_after = 3; break; + case 'B': function_name = "operator"; post_process = PP_CAST_OPERATOR; break; case 'C': function_name = "operator->"; break; case 'D': function_name = "operator*"; break; case 'E': function_name = "operator++"; break; @@ -1506,7 +1511,10 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) case '9': function_name = "`vcall'"; break; case 'A': function_name = "`typeof'"; break; case 'B': function_name = "`local static guard'"; break; - case 'C': function_name = "`string'"; do_after = 4; break; + case 'C': sym->result = (char*)"`string'"; /* string literal: followed by string encoding (native nevers undecode it) */ + /* FIXME: should unmangle the whole string for error reporting */ + if (*sym->current && sym->current[strlen(sym->current) - 1] == '@') ret = TRUE; + goto done; case 'D': function_name = "`vbase destructor'"; break; case 'E': function_name = "`vector deleting destructor'"; break; case 'F': function_name = "`default constructor closure'"; break; @@ -1601,18 +1609,8 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) if (args) function_name = function_name ? str_printf(sym, "%s%s", function_name, args) : args; sym->names.num = 0; } - switch (do_after) - { - case 4: - sym->result = (char*)function_name; - ret = TRUE; - goto done; - /* fall through */ - default: - if (!str_array_push(sym, function_name, -1, &sym->stack)) - return FALSE; - break; - } + if (!str_array_push(sym, function_name, -1, &sym->stack)) + return FALSE; } else if (*sym->current == '$') { @@ -1634,20 +1632,18 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) break; }
- switch (do_after) + switch (post_process) { - case 0: default: break; - case 1: case 2: + case PP_NONE: default: break; + case PP_CONSTRUCTOR: case PP_DESTRUCTOR: /* it's time to set the member name for ctor & dtor */ if (sym->stack.num <= 1) goto done; - if (do_after == 1) - sym->stack.elts[0] = str_printf(sym, "%s%s", sym->stack.elts[1], sym->stack.elts[0]); - else - sym->stack.elts[0] = str_printf(sym, "~%s%s", sym->stack.elts[1], sym->stack.elts[0]); + sym->stack.elts[0] = str_printf(sym, "%s%s%s", post_process == PP_DESTRUCTOR ? "~" : NULL, + sym->stack.elts[1], sym->stack.elts[0]); /* ctors and dtors don't have return type */ sym->flags |= UNDNAME_NO_FUNCTION_RETURNS; break; - case 3: + case PP_CAST_OPERATOR: sym->flags &= ~UNDNAME_NO_FUNCTION_RETURNS; break; } @@ -1656,7 +1652,7 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) if (*sym->current >= '0' && *sym->current <= '9') ret = handle_data(sym); else if ((*sym->current >= 'A' && *sym->current <= 'Z') || *sym->current == '$') - ret = handle_method(sym, do_after == 3); + ret = handle_method(sym, post_process == PP_CAST_OPERATOR); else ret = FALSE; done: if (ret) assert(sym->result);