mirror of
https://github.com/reactos/wine.git
synced 2024-11-25 20:59:54 +00:00
msvcrt: Add support for __ptr64 attribute in symbol demangling.
This commit is contained in:
parent
6f5e5ec98b
commit
5e1b9c149e
@ -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]));
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user