Piotr Caban : msvcrt: Add support for $$B datatype description format in unDName.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jan 21 11:22:05 CST 2016


Module: wine
Branch: master
Commit: 6ac2acc34f266e2e59e1d1dd2de0f299e750ee01
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6ac2acc34f266e2e59e1d1dd2de0f299e750ee01

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Jan 20 22:01:23 2016 +0100

msvcrt: Add support for $$B datatype description format in unDName.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/tests/cpp.c |  2 ++
 dlls/msvcrt/undname.c   | 32 +++++++++++++++++++++++++++++++-
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/dlls/msvcrt/tests/cpp.c b/dlls/msvcrt/tests/cpp.c
index fac1ab5..e67e344 100644
--- a/dlls/msvcrt/tests/cpp.c
+++ b/dlls/msvcrt/tests/cpp.c
@@ -1321,6 +1321,8 @@ static void test_demangle(void)
 /* 129 */ {"??$run at XVTask_Render_Preview@@@QtConcurrent@@YA?AV?$QFuture at X@@PEAVTask_Render_Preview@@P82 at EAAXXZ@Z",
            "class QFuture<void> __cdecl QtConcurrent::run<void,class Task_Render_Preview>(class Task_Render_Preview * __ptr64,void (__cdecl Task_Render_Preview::*)(void) __ptr64)",
            "??$run at XVTask_Render_Preview@@@QtConcurrent@@YA?AV?$QFuture at X@@PEAVTask_Render_Preview@@P82 at EAAXXZ@Z"},
+/* 130 */ {"??_E?$TStrArray@$$BY0BAA at D$0BA@@@UAEPAXI at Z",
+           "public: virtual void * __thiscall TStrArray<char [256],16>::`vector deleting destructor'(unsigned int)"},
     };
     int i, num_test = (sizeof(test)/sizeof(test[0]));
     char* name;
diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c
index 587a602..e6cb61f 100644
--- a/dlls/msvcrt/undname.c
+++ b/dlls/msvcrt/undname.c
@@ -991,7 +991,37 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct,
             }
             break;
         case '$':
-            if (*sym->current == 'C')
+            if (*sym->current == 'B')
+            {
+                unsigned            mark = sym->stack.num;
+                struct datatype_t   sub_ct;
+                const char*         arr = NULL;
+                sym->current++;
+
+                /* multidimensional arrays */
+                if (*sym->current == 'Y')
+                {
+                    const char* n1;
+                    int num;
+
+                    sym->current++;
+                    if (!(n1 = get_number(sym))) goto done;
+                    num = atoi(n1);
+
+                    while (num--)
+                        arr = str_printf(sym, "%s[%s]", arr, get_number(sym));
+                }
+
+                if (!demangle_datatype(sym, &sub_ct, pmt_ref, FALSE)) goto done;
+
+                if (arr)
+                    ct->left = str_printf(sym, "%s %s", sub_ct.left, arr);
+                else
+                    ct->left = sub_ct.left;
+                ct->right = sub_ct.right;
+                sym->stack.num = mark;
+            }
+            else if (*sym->current == 'C')
             {
                 const char *ptr, *ptr_modif;
 




More information about the wine-cvs mailing list