Module: wine Branch: master Commit: cadac12760161d724a1c3c05cdaca78d73a4b4b5 URL: https://gitlab.winehq.org/wine/wine/-/commit/cadac12760161d724a1c3c05cdaca78...
Author: Eric Pouech eric.pouech@gmail.com Date: Sat Jul 16 12:20:25 2022 +0200
msvcrt: Fix demangling of variables being an array.
Signed-off-by: Eric Pouech eric.pouech@gmail.com
---
dlls/msvcrt/tests/cpp.c | 1 + dlls/msvcrt/undname.c | 32 ++++++++++++++++++-------------- 2 files changed, 19 insertions(+), 14 deletions(-)
diff --git a/dlls/msvcrt/tests/cpp.c b/dlls/msvcrt/tests/cpp.c index 79ea9d75c6b..58ecd1327a5 100644 --- a/dlls/msvcrt/tests/cpp.c +++ b/dlls/msvcrt/tests/cpp.c @@ -1294,6 +1294,7 @@ static void test_demangle(void) /* 131 */ {"??_R0?AVCC@DD@@@8", "class DD::CC `RTTI Type Descriptor'"}, /* 132 */ {"??$meth@FD@DD@CC@@QAE_NK@Z", "public: bool __thiscall CC::DD::meth<short,char>(unsigned long)"}, /* 133 */ {"?func@@YAXPIFAH@Z", "void __cdecl func(int __unaligned * __restrict)"}, +/* 135 */ {"?x@@3PAY02HA", "int (* x)[3]"}, }; int i, num_test = ARRAY_SIZE(test); char* name; diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c index 4b53ac459fb..acfe96fe436 100644 --- a/dlls/msvcrt/undname.c +++ b/dlls/msvcrt/undname.c @@ -466,11 +466,14 @@ static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol* sym, default: return FALSE; } if (ref || str_modif || xdt.left || xdt.right) - str_modif = str_printf(sym, " %s%s%s%s%s%s%s", - xdt.left, - xdt.left && ref ? " " : NULL, ref, - (xdt.left || ref) && xdt.right ? " " : NULL, xdt.right, - (xdt.left || ref || xdt.right) && str_modif ? " " : NULL, str_modif); + ct->left = str_printf(sym, " %s%s%s%s%s%s%s", + xdt.left, + xdt.left && ref ? " " : NULL, ref, + (xdt.left || ref) && xdt.right ? " " : NULL, xdt.right, + (xdt.left || ref || xdt.right) && str_modif ? " " : NULL, str_modif); + else + ct->left = NULL; + ct->right = NULL;
if (get_modifier(sym, &xdt)) { @@ -487,29 +490,30 @@ static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol* sym, if (!(n1 = get_number(sym))) return FALSE; num = atoi(n1);
- if (str_modif[0] == ' ' && !xdt.left) - str_modif++; + if (ct->left && ct->left[0] == ' ' && !xdt.left) + ct->left++;
- str_modif = str_printf(sym, " (%s%s)", xdt.left, str_modif); + ct->left = str_printf(sym, " (%s%s", xdt.left, ct->left); + ct->right = ")"; xdt.left = NULL;
while (num--) - str_modif = str_printf(sym, "%s[%s]", str_modif, get_number(sym)); + ct->right = str_printf(sym, "%s[%s]", ct->right, get_number(sym)); }
/* Recurse to get the referred-to type */ if (!demangle_datatype(sym, &sub_ct, pmt_ref, FALSE)) return FALSE; if (xdt.left) - ct->left = str_printf(sym, "%s %s%s", sub_ct.left, xdt.left, str_modif); + ct->left = str_printf(sym, "%s %s%s", sub_ct.left, xdt.left, ct->left); else { /* don't insert a space between duplicate '*' */ - if (!in_args && str_modif && str_modif[0] && str_modif[1] == '*' && sub_ct.left[strlen(sub_ct.left)-1] == '*') - str_modif++; - ct->left = str_printf(sym, "%s%s", sub_ct.left, str_modif ); + if (!in_args && ct->left && ct->left[0] && ct->left[1] == '*' && sub_ct.left[strlen(sub_ct.left)-1] == '*') + ct->left++; + ct->left = str_printf(sym, "%s%s", sub_ct.left, ct->left); } - ct->right = sub_ct.right; + if (sub_ct.right) ct->right = str_printf(sym, "%s%s", ct->right, sub_ct.right); sym->stack.num = mark; } return TRUE;