Module: wine Branch: master Commit: bdd04f5f714c7bed42c30687977c4e40662ed519 URL: https://gitlab.winehq.org/wine/wine/-/commit/bdd04f5f714c7bed42c30687977c4e4...
Author: Piotr Caban piotr@codeweavers.com Date: Tue Dec 5 19:25:59 2023 +0100
msvcrt: Add partial support for managed handle demangling.
---
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;