Piotr Caban : ucrtbase: Add support for r-value demangling in unDName.

Alexandre Julliard julliard at winehq.org
Mon Feb 7 15:56:06 CST 2022


Module: wine
Branch: master
Commit: a656a8b64459845dd68ea4aa43639b06f452193b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a656a8b64459845dd68ea4aa43639b06f452193b

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Feb  7 17:44:46 2022 +0100

ucrtbase: Add support for r-value demangling in unDName.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=44202
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/undname.c     |  6 ++++++
 dlls/ucrtbase/tests/cpp.c | 21 ++++++++++++++++++++-
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c
index 7d79ca30dcf..bee171de42f 100644
--- a/dlls/msvcrt/undname.c
+++ b/dlls/msvcrt/undname.c
@@ -450,6 +450,7 @@ static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol* sym,
     case 'R': str_modif = str_printf(sym, " *%s volatile", ptr_modif); break;
     case 'S': str_modif = str_printf(sym, " *%s const volatile", ptr_modif); break;
     case '?': str_modif = ""; break;
+    case '$': str_modif = str_printf(sym, " &&%s", ptr_modif); break;
     default: return FALSE;
     }
 
@@ -1031,6 +1032,11 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct,
                 if (!demangle_datatype(sym, ct, pmt_ref, in_args)) goto done;
                 ct->left = str_printf(sym, "%s %s", ct->left, ptr);
             }
+            else if (*sym->current == 'Q')
+            {
+                sym->current++;
+                if (!get_modified_type(ct, sym, pmt_ref, '$', in_args)) goto done;
+            }
             break;
         }
         break;
diff --git a/dlls/ucrtbase/tests/cpp.c b/dlls/ucrtbase/tests/cpp.c
index 163e1968069..77b06e7cd42 100644
--- a/dlls/ucrtbase/tests/cpp.c
+++ b/dlls/ucrtbase/tests/cpp.c
@@ -52,7 +52,7 @@ static int (CDECL *p___std_type_info_compare)(const type_info140*, const type_in
 static const char* (CDECL *p___std_type_info_name)(type_info140*, SLIST_HEADER*);
 static void (CDECL *p___std_type_info_destroy_list)(SLIST_HEADER*);
 static size_t (CDECL *p___std_type_info_hash)(type_info140*);
-
+static char* (__cdecl *p___unDName)(char*,const char*,int,void*,void*,unsigned short int);
 
 static BOOL init(void)
 {
@@ -72,6 +72,7 @@ static BOOL init(void)
     p___std_type_info_name = (void*)GetProcAddress(module, "__std_type_info_name");
     p___std_type_info_destroy_list = (void*)GetProcAddress(module, "__std_type_info_destroy_list");
     p___std_type_info_hash = (void*)GetProcAddress(module, "__std_type_info_hash");
+    p___unDName = (void*)GetProcAddress(module, "__unDName");
     return TRUE;
 }
 
@@ -189,9 +190,27 @@ static void test___std_type_info(void)
     ok(hash1 != hash2, "hash1 == hash2 for different strings\n");
 }
 
+static void test___unDName(void)
+{
+    char *name;
+
+    name = p___unDName(0, "??4QDnsDomainNameRecord@@QAEAAV0@$$QAV0@@Z", 0, malloc, free, 0);
+    ok(!strcmp(name, "public: class QDnsDomainNameRecord & __thiscall "
+                "QDnsDomainNameRecord::operator=(class QDnsDomainNameRecord &&)"),
+            "unDName returned %s\n", wine_dbgstr_a(name));
+    free(name);
+
+    name = p___unDName(0, "??4QDnsDomainNameRecord@@QAEAAV0@$$QEAV0@@Z", 0, malloc, free, 0);
+    ok(!strcmp(name, "public: class QDnsDomainNameRecord & __thiscall "
+                "QDnsDomainNameRecord::operator=(class QDnsDomainNameRecord && __ptr64)"),
+            "unDName returned %s\n", wine_dbgstr_a(name));
+    free(name);
+}
+
 START_TEST(cpp)
 {
     if (!init()) return;
     test___std_exception();
     test___std_type_info();
+    test___unDName();
 }




More information about the wine-cvs mailing list