Module: wine Branch: master Commit: 5e1b9c149eb88ba87238e49e079824d89c9bd131 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5e1b9c149eb88ba87238e49e07...
Author: Alexandre Julliard julliard@winehq.org Date: Sat May 14 14:11:50 2011 +0200
msvcrt: Add support for __ptr64 attribute in symbol demangling.
---
dlls/msvcrt/tests/cpp.c | 2 + dlls/msvcrt/undname.c | 54 ++++++++++++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 19 deletions(-)
diff --git a/dlls/msvcrt/tests/cpp.c b/dlls/msvcrt/tests/cpp.c index dfb2cd7..b4eb515 100644 --- a/dlls/msvcrt/tests/cpp.c +++ b/dlls/msvcrt/tests/cpp.c @@ -1051,6 +1051,8 @@ static void test_demangle(void) /* 116 */ {"?vswprintf@@YAHPAGIPBGPAD@Z", "int __cdecl vswprintf(unsigned short *,unsigned int,unsigned short const *,char *)"}, /* 117 */ {"?vswprintf@@YAHPA_WIPB_WPAD@Z", "int __cdecl vswprintf(wchar_t *,unsigned int,wchar_t const *,char *)"}, /* 118 */ {"?swprintf@@YAHPA_WIPB_WZZ", "int __cdecl swprintf(wchar_t *,unsigned int,wchar_t const *,...)"}, +/* 119 */ {"??Xstd@@YAAEAV?$complex@M@0@AEAV10@AEBV10@@Z", "class std::complex<float> & __ptr64 __cdecl std::operator*=(class std::complex<float> & __ptr64,class std::complex<float> const & __ptr64)"}, +/* 120 */ {"?_Doraise@bad_cast@std@@MEBAXXZ", "protected: virtual void __cdecl std::bad_cast::_Doraise(void)const __ptr64"},
}; int i, num_test = (sizeof(test)/sizeof(test[0])); diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c index 920a763..8ed0757 100644 --- a/dlls/msvcrt/undname.c +++ b/dlls/msvcrt/undname.c @@ -416,11 +416,17 @@ static char* get_args(struct parsed_symbol* sym, struct array* pmt_ref, BOOL z_t
/****************************************************************** * get_modifier - * Parses the type modifier. Always returns a static string + * Parses the type modifier. Always returns static strings. */ -static BOOL get_modifier(char ch, const char** ret) +static BOOL get_modifier(struct parsed_symbol *sym, const char **ret, const char **ptr_modif) { - switch (ch) + *ptr_modif = NULL; + if (*sym->current == 'E') + { + *ptr_modif = "__ptr64"; + sym->current++; + } + switch (*sym->current++) { case 'A': *ret = NULL; break; case 'B': *ret = "const"; break; @@ -436,20 +442,27 @@ static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol* sym, { const char* modifier; const char* str_modif; + const char *ptr_modif = ""; + + if (*sym->current == 'E') + { + ptr_modif = " __ptr64"; + sym->current++; + }
switch (modif) { - case 'A': str_modif = " &"; break; - case 'B': str_modif = " & volatile"; break; - case 'P': str_modif = " *"; break; - case 'Q': str_modif = " * const"; break; - case 'R': str_modif = " * volatile"; break; - case 'S': str_modif = " * const volatile"; break; + case 'A': str_modif = str_printf(sym, " &%s", ptr_modif); break; + case 'B': str_modif = str_printf(sym, " &%s volatile", ptr_modif); break; + case 'P': str_modif = str_printf(sym, " *%s", ptr_modif); break; + case 'Q': str_modif = str_printf(sym, " *%s const", ptr_modif); break; + case 'R': str_modif = str_printf(sym, " *%s volatile", ptr_modif); break; + case 'S': str_modif = str_printf(sym, " *%s const volatile", ptr_modif); break; case '?': str_modif = ""; break; default: return FALSE; }
- if (get_modifier(*sym->current++, &modifier)) + if (get_modifier(sym, &modifier, &ptr_modif)) { unsigned mark = sym->stack.num; struct datatype_t sub_ct; @@ -924,10 +937,10 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, case '$': if (*sym->current == 'C') { - const char* ptr; + const char *ptr, *ptr_modif;
sym->current++; - if (!get_modifier(*sym->current++, &ptr)) goto done; + if (!get_modifier(sym, &ptr, &ptr_modif)) goto done; if (!demangle_datatype(sym, ct, pmt_ref, in_args)) goto done; ct->left = str_printf(sym, "%s %s", ct->left, ptr); } @@ -960,6 +973,7 @@ static BOOL handle_data(struct parsed_symbol* sym) const char* access = NULL; const char* member_type = NULL; const char* modifier = NULL; + const char* ptr_modif; struct datatype_t ct; char* name = NULL; BOOL ret = FALSE; @@ -1004,14 +1018,16 @@ static BOOL handle_data(struct parsed_symbol* sym) str_array_init(&pmt);
if (!demangle_datatype(sym, &ct, &pmt, FALSE)) goto done; - if (!get_modifier(*sym->current++, &modifier)) goto done; + if (!get_modifier(sym, &modifier, &ptr_modif)) goto done; + if (modifier && ptr_modif) modifier = str_printf(sym, "%s %s", modifier, ptr_modif); + else if (!modifier) modifier = ptr_modif; sym->stack.num = mark; } break; case '6' : /* compiler generated static */ case '7' : /* compiler generated static */ ct.left = ct.right = NULL; - if (!get_modifier(*sym->current++, &modifier)) goto done; + if (!get_modifier(sym, &modifier, &ptr_modif)) goto done; if (*sym->current != '@') { char* cls = NULL; @@ -1123,10 +1139,11 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op) { if (((accmem - 'A') % 8) != 2 && ((accmem - 'A') % 8) != 3) { + const char *ptr_modif; /* Implicit 'this' pointer */ /* If there is an implicit this pointer, const modifier follows */ - if (!get_modifier(*sym->current, &modifier)) goto done; - sym->current++; + if (!get_modifier(sym, &modifier, &ptr_modif)) goto done; + if (modifier || ptr_modif) modifier = str_printf(sym, "%s %s", modifier, ptr_modif); } }
@@ -1164,12 +1181,11 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op) /* Note: '()' after 'Z' means 'throws', but we don't care here * Yet!!! FIXME */ - sym->result = str_printf(sym, "%s%s%s%s%s%s%s%s%s%s%s%s", + sym->result = str_printf(sym, "%s%s%s%s%s%s%s%s%s%s%s", access, member_type, ct_ret.left, (ct_ret.left && !ct_ret.right) ? " " : NULL, call_conv, call_conv ? " " : NULL, exported, - name, args_str, modifier, - modifier ? " " : NULL, ct_ret.right); + name, args_str, modifier, ct_ret.right); ret = TRUE; done: return ret;