Eric Pouech : msvcrt: Fix demangling of variables being an array.

Alexandre Julliard julliard at winehq.org
Mon Jul 18 15:45:51 CDT 2022


Module: wine
Branch: master
Commit: cadac12760161d724a1c3c05cdaca78d73a4b4b5
URL:    https://gitlab.winehq.org/wine/wine/-/commit/cadac12760161d724a1c3c05cdaca78d73a4b4b5

Author: Eric Pouech <eric.pouech at 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 at 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 at DD@@@8", "class DD::CC `RTTI Type Descriptor'"},
 /* 132 */ {"??$meth at FD@DD at CC@@QAE_NK at Z", "public: bool __thiscall CC::DD::meth<short,char>(unsigned long)"},
 /* 133 */ {"?func@@YAXPIFAH at 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;




More information about the wine-cvs mailing list