Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
5e1b9c14
Commit
5e1b9c14
authored
May 14, 2011
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msvcrt: Add support for __ptr64 attribute in symbol demangling.
parent
6f5e5ec9
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
37 additions
and
19 deletions
+37
-19
cpp.c
dlls/msvcrt/tests/cpp.c
+2
-0
undname.c
dlls/msvcrt/undname.c
+35
-19
No files found.
dlls/msvcrt/tests/cpp.c
View file @
5e1b9c14
...
...
@@ -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
]));
...
...
dlls/msvcrt/undname.c
View file @
5e1b9c14
...
...
@@ -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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment