Alexandre Julliard : msvcrt: Add support for function namespaces in symbol demangling.

Alexandre Julliard julliard at winehq.org
Mon May 16 11:36:45 CDT 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Sun May 15 19:55:56 2011 +0200

msvcrt: Add support for function namespaces in symbol demangling.

---

 dlls/msvcrt/tests/cpp.c |    3 +++
 dlls/msvcrt/undname.c   |   29 +++++++++++++++++++++++++----
 2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcrt/tests/cpp.c b/dlls/msvcrt/tests/cpp.c
index 8d0dbd4..bb6ba16 100644
--- a/dlls/msvcrt/tests/cpp.c
+++ b/dlls/msvcrt/tests/cpp.c
@@ -1056,6 +1056,9 @@ static void test_demangle(void)
 /* 121 */ {"??$?DM at std@@YA?AV?$complex at M@0 at ABMABV10@@Z",
            "class std::complex<float> __cdecl std::operator*<float>(float const &,class std::complex<float> const &)",
            "??$?DM at std@@YA?AV?$complex at M@0 at ABMABV10@@Z"},
+/* 122 */ {"?_R2@?BN@???$_Fabs at N@std@@YANAEBV?$complex at N@1 at PEAH@Z at 4NB",
+           "double const `double __cdecl std::_Fabs<double>(class std::complex<double> const & __ptr64,int * __ptr64)'::`29'::_R2",
+           "?_R2@?BN@???$_Fabs at N@std@@YANAEBV?$complex at N@1 at PEAH@Z at 4NB"},
 
     };
     int i, num_test = (sizeof(test)/sizeof(test[0]));
diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c
index 9c24f4a..7d296e1 100644
--- a/dlls/msvcrt/undname.c
+++ b/dlls/msvcrt/undname.c
@@ -106,6 +106,8 @@ struct datatype_t
     const char*         right;
 };
 
+static BOOL symbol_demangle(struct parsed_symbol* sym);
+
 /******************************************************************
  *		und_alloc
  *
@@ -597,12 +599,31 @@ static BOOL get_class(struct parsed_symbol* sym)
             name = str_array_get_ref(&sym->names, *sym->current++ - '0');
             break;
         case '?':
-            if (*++sym->current == '$') 
+            switch (*++sym->current)
             {
+            case '$':
                 sym->current++;
                 if ((name = get_template_name(sym)) &&
                     !str_array_push(sym, name, -1, &sym->names))
                     return FALSE;
+                break;
+            case '?':
+                {
+                    struct array stack = sym->stack;
+                    unsigned int start = sym->names.start;
+                    unsigned int num = sym->names.num;
+
+                    str_array_init( &sym->stack );
+                    if (symbol_demangle( sym )) name = str_printf( sym, "`%s'", sym->result );
+                    sym->names.start = start;
+                    sym->names.num = num;
+                    sym->stack = stack;
+                }
+                break;
+            default:
+                if (!(name = get_number( sym ))) return FALSE;
+                name = str_printf( sym, "`%s'", name );
+                break;
             }
             break;
         default:
@@ -1233,8 +1254,6 @@ static BOOL symbol_demangle(struct parsed_symbol* sym)
 
     /* MS mangled names always begin with '?' */
     if (*sym->current != '?') return FALSE;
-    str_array_init(&sym->names);
-    str_array_init(&sym->stack);
     sym->current++;
 
     /* Then function name or operator code */
@@ -1436,7 +1455,7 @@ static BOOL symbol_demangle(struct parsed_symbol* sym)
         sym->flags &= ~UNDNAME_NO_FUNCTION_RETURNS;
         break;
     case 5:
-        sym->names.start = 1;
+        sym->names.start++;
         break;
     }
 
@@ -1497,6 +1516,8 @@ char* CDECL __unDNameEx(char* buffer, const char* mangled, int buflen,
     sym.mem_alloc_ptr = memget;
     sym.mem_free_ptr  = memfree;
     sym.current       = mangled;
+    str_array_init( &sym.names );
+    str_array_init( &sym.stack );
 
     result = symbol_demangle(&sym) ? sym.result : mangled;
     if (buffer && buflen)




More information about the wine-cvs mailing list