From: Eric Pouech eric.pouech@gmail.com
Signed-off-by: Eric Pouech eric.pouech@gmail.com --- dlls/msvcrt/tests/cpp.c | 1 + dlls/msvcrt/undname.c | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/dlls/msvcrt/tests/cpp.c b/dlls/msvcrt/tests/cpp.c index 3487dba1318..c4dbec0b0fb 100644 --- a/dlls/msvcrt/tests/cpp.c +++ b/dlls/msvcrt/tests/cpp.c @@ -1293,6 +1293,7 @@ static void test_demangle(void) "public: virtual void * __thiscall TStrArray<char [256],16>::`vector deleting destructor'(unsigned int)"}, /* 131 */ {"??_R0?AVCC@DD@@@8", "class DD::CC `RTTI Type Descriptor'"}, /* 132 */ {"??__K_l@@YA?AUCC@@I@Z", "struct CC __cdecl operator "" _l(unsigned int)"}, +/* 133 */ {"??$meth@FD@DD@CC@@QAE_NK@Z", "public: bool __thiscall CC::DD::meth<short,char>(unsigned long)"}, }; int i, num_test = ARRAY_SIZE(test); char* name; diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c index 04da631ead5..15465d73117 100644 --- a/dlls/msvcrt/undname.c +++ b/dlls/msvcrt/undname.c @@ -1368,13 +1368,13 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) sym->current++;
/* Then function name or operator code */ - if (*sym->current == '?' && (sym->current[1] != '$' || sym->current[2] == '?')) + if (*sym->current == '?') { const char* function_name = NULL;
- if (sym->current[1] == '$') + if (sym->current[1] == '$' && sym->current[2] == '?') { - do_after = 6; + do_after = 5; sym->current += 2; }
@@ -1507,6 +1507,11 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) return FALSE; } break; + case '$': + sym->current++; + if (!(function_name = get_template_name(sym))) goto done; + --sym->current; + break; default: /* FIXME: Other operators */ ERR("Unknown operator: %c\n", *sym->current); @@ -1523,7 +1528,7 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) sym->result = (char*)function_name; ret = TRUE; goto done; - case 6: + case 5: { char *args; struct array array_pmt; @@ -1548,8 +1553,6 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) ret = (sym->result = get_template_name(sym)) != NULL; goto done; } - else if (*sym->current == '?' && sym->current[1] == '$') - do_after = 5;
/* Either a class name, or '@' if the symbol is not a class member */ switch (*sym->current) @@ -1578,9 +1581,6 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) case 3: sym->flags &= ~UNDNAME_NO_FUNCTION_RETURNS; break; - case 5: - sym->names.start++; - break; }
/* Function/Data type and access level */