From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/tests/cpp.c | 4 ++++ dlls/msvcrt/undname.c | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+)
diff --git a/dlls/msvcrt/tests/cpp.c b/dlls/msvcrt/tests/cpp.c index 2dec315ba68..d230659404d 100644 --- a/dlls/msvcrt/tests/cpp.c +++ b/dlls/msvcrt/tests/cpp.c @@ -1320,6 +1320,10 @@ static void test_demangle(void) /* 147 */ {"?ptititi4@@3PETtititi@@IET1@", "unsigned int const volatile tititi::* __ptr64 const volatile __ptr64 ptititi4"}, /* 148 */ {"?ptititi4v@@3RETtititi@@IET1@", "unsigned int const volatile tititi::* __ptr64 const volatile __ptr64 ptititi4v"}, /* 149 */ {"?meth@AAA@@QFCEXXZ", "public: void __thiscall AAA::meth(void)volatile __unaligned "}, +/* 150 */ {"?RegisterModuleUninitializer@<CrtImplementationDetails>@@YAXP$AAVEventHandler@System@@@Z", + "void __cdecl <CrtImplementationDetails>::RegisterModuleUninitializer(class System::EventHandler ^)"}, +/* 151 */ {"?RegisterModuleUninitializer@<CrtImplementationDetails>@@YAXBE$AAVEventHandler@System@@@Z", + "void __cdecl <CrtImplementationDetails>::RegisterModuleUninitializer(class System::EventHandler % __ptr64 volatile)"}, }; int i, num_test = ARRAY_SIZE(test); char* name; diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c index 557f1ce13e0..91d4fdbc3eb 100644 --- a/dlls/msvcrt/undname.c +++ b/dlls/msvcrt/undname.c @@ -519,6 +519,28 @@ static BOOL get_qualified_type(struct datatype_t *ct, struct parsed_symbol* sym, ct->right = NULL; ct->flags = 0;
+ /* parse managed handle information */ + if (sym->current[0] == '$' && sym->current[1] == 'A') + { + sym->current += 2; + + switch (qualif) + { + case 'A': + case 'B': + ref = " %"; + break; + case 'P': + case 'Q': + case 'R': + case 'S': + ref = " ^"; + break; + default: + return FALSE; + } + } + if (get_qualifier(sym, &xdt2, &class)) { unsigned mark = sym->stack.num;