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