Module: wine Branch: master Commit: d42b1d56b54b298a9eac4c050cbdafac21909e80 URL: https://gitlab.winehq.org/wine/wine/-/commit/d42b1d56b54b298a9eac4c050cbdafa...
Author: Eric Pouech epouech@codeweavers.com Date: Fri May 17 11:22:38 2024 +0200
winedump: Don't consider end of list encoding as real data types.
This allows while unmangling: - to avoid considering them as "real" datatypes in other contexts - to handle better void (which is only supported as single argument in function args list, while is a fully acceptable datatype in template args list)
Signed-off-by: Eric Pouech epouech@codeweavers.com
---
tools/winedump/msmangle.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/tools/winedump/msmangle.c b/tools/winedump/msmangle.c index 94e91706585..2ac96a3fe5a 100644 --- a/tools/winedump/msmangle.c +++ b/tools/winedump/msmangle.c @@ -260,6 +260,12 @@ static char* get_args(struct parsed_symbol* sym, BOOL z_term, unsigned int i; const char *p;
+ if (z_term && sym->current[0] == 'X' && sym->current[1] == 'Z') + { + sym->current += 2; + return str_printf(sym, "%cvoid%c", open_char, close_char); + } + str_array_init(&arg_collect);
/* Now come the function arguments */ @@ -273,6 +279,13 @@ static char* get_args(struct parsed_symbol* sym, BOOL z_term, sym->current++; break; } + if (z_term && sym->current[0] == 'Z') + { + sym->current++; + if (!str_array_push(sym, "...", -1, &arg_collect)) + return NULL; + break; + } /* Handle empty list in variadic template */ if (!z_term && sym->current[0] == '$' && sym->current[1] == '$' && sym->current[2] == 'V') { @@ -281,12 +294,9 @@ static char* get_args(struct parsed_symbol* sym, BOOL z_term, } if (!demangle_datatype(sym, &ct, IN_ARGS)) return NULL; - /* 'void' terminates an argument list in a function */ - if (z_term && !strcmp(ct.left, "void")) break; if (!str_array_push(sym, str_printf(sym, "%s%s", ct.left, ct.right), -1, &arg_collect)) return NULL; - if (!strcmp(ct.left, "...")) break; if (z_term && sym->current - p > 1 && sym->args.num < 20) { if (!str_array_push(sym, ct.left ? ct.left : "", -1, &sym->args) || @@ -299,9 +309,7 @@ static char* get_args(struct parsed_symbol* sym, BOOL z_term, */ if (z_term && *sym->current++ != 'Z') return NULL;
- if (arg_collect.num == 0 || - (arg_collect.num == 1 && !strcmp(arg_collect.elts[0], "void"))) - return str_printf(sym, "%cvoid%c", open_char, close_char); + if (!arg_collect.num) return str_printf(sym, "%c%c", open_char, close_char); for (i = 1; i < arg_collect.num; i++) { args_str = str_printf(sym, "%s,%s", args_str, arg_collect.elts[i]); @@ -749,7 +757,7 @@ static const char* get_simple_type(char c) case 'N': type_string = "double"; break; case 'O': type_string = "long double"; break; case 'X': type_string = "void"; break; - case 'Z': type_string = "..."; break; +/* case 'Z': (...) variadic function arguments. Handled in get_args() */ default: type_string = NULL; break; } return type_string; @@ -800,7 +808,7 @@ static BOOL get_function_signature(struct parsed_symbol* sym, struct function_si if (!get_calling_convention(*sym->current++, &fs->call_conv, &fs->exported, sym->flags & ~UNDNAME_NO_ALLOCATION_LANGUAGE) || - !demangle_datatype(sym, &fs->return_ct, FALSE)) + !demangle_datatype(sym, &fs->return_ct, 0)) return FALSE;
if (!(fs->arguments = get_args(sym, TRUE, '(', ')')))