Module: wine Branch: stable Commit: fe94dc9fe50d26ad9ab569c298c92dbd4466fc1e URL: http://source.winehq.org/git/wine.git/?a=commit;h=fe94dc9fe50d26ad9ab569c298...
Author: Piotr Caban piotr@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 6ac2acc34f266e2e59e1d1dd2de0f299e750ee01) Signed-off-by: Michael Stefaniuc mstefani@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 73011b0..18fe78e 100644 --- a/dlls/msvcrt/tests/cpp.c +++ b/dlls/msvcrt/tests/cpp.c @@ -1326,6 +1326,8 @@ static void test_demangle(void) /* 129 */ {"??$run@XVTask_Render_Preview@@@QtConcurrent@@YA?AV?$QFuture@X@@PEAVTask_Render_Preview@@P82@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@XVTask_Render_Preview@@@QtConcurrent@@YA?AV?$QFuture@X@@PEAVTask_Render_Preview@@P82@EAAXXZ@Z"}, +/* 130 */ {"??_E?$TStrArray@$$BY0BAA@D$0BA@@@UAEPAXI@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 dd5e599..48ead68 100644 --- a/dlls/msvcrt/undname.c +++ b/dlls/msvcrt/undname.c @@ -992,7 +992,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;