@@ -70,13 +70,27 @@ private string GetExporting()
70
70
"__declspec(dllexport) " : string . Empty ;
71
71
}
72
72
73
- private string GetWrapper ( Module module )
73
+ private string GetWrapper ( Function function )
74
74
{
75
- var symbolsLibraryName = new StringBuilder ( module . SymbolsLibraryName ) ;
76
- for ( int i = 0 ; i < symbolsLibraryName . Length ; i ++ )
77
- if ( ! char . IsLetterOrDigit ( symbolsLibraryName [ i ] ) )
78
- symbolsLibraryName [ i ] = '_' ;
79
- return $ "{ symbolsLibraryName } { ++ functionCount } ";
75
+ if ( function is Method method && ( method . IsConstructor || method . IsDestructor ) )
76
+ {
77
+ var nameBuilder = new StringBuilder ( method . USR ) ;
78
+ for ( int i = 0 ; i < nameBuilder . Length ; i ++ )
79
+ if ( ! char . IsLetterOrDigit ( nameBuilder [ i ] ) &&
80
+ nameBuilder [ i ] != '_' )
81
+ {
82
+ if ( nameBuilder [ i ] == '&' )
83
+ nameBuilder . Insert ( i + 1 , '_' ) ;
84
+ nameBuilder [ i ] = '_' ;
85
+ }
86
+ string @class = function . Namespace . Name ;
87
+ nameBuilder . Replace ( "c__S_" , string . Empty ) . Replace (
88
+ $ "{ @class } _F_", $ "{ @class } _") . TrimUnderscores ( ) ;
89
+ if ( function . IsOperator )
90
+ nameBuilder . Append ( function . OperatorKind ) ;
91
+ return nameBuilder . ToString ( ) ;
92
+ }
93
+ return $ "_{ functionCount ++ } ";
80
94
}
81
95
82
96
private static string GetDerivedType ( string @namespace , string wrapper )
@@ -86,7 +100,7 @@ private static string GetDerivedType(string @namespace, string wrapper)
86
100
87
101
private void WrapConstructor ( Method method )
88
102
{
89
- string wrapper = GetWrapper ( method . TranslationUnit . Module ) ;
103
+ string wrapper = GetWrapper ( method ) ;
90
104
if ( Options . CheckSymbols )
91
105
{
92
106
method . Mangled = wrapper ;
@@ -144,7 +158,7 @@ private string CastIfRVReference(Parameter p)
144
158
145
159
private void WrapDestructor ( Method method )
146
160
{
147
- string wrapper = GetWrapper ( method . TranslationUnit . Module ) ;
161
+ string wrapper = GetWrapper ( method ) ;
148
162
if ( Options . CheckSymbols )
149
163
{
150
164
method . Mangled = wrapper ;
@@ -178,7 +192,7 @@ private void WrapDestructor(Method method)
178
192
179
193
private void TakeFunctionAddress ( Function function )
180
194
{
181
- string wrapper = GetWrapper ( function . TranslationUnit . Module ) ;
195
+ string wrapper = GetWrapper ( function ) ;
182
196
string @namespace = function . Namespace . Visit ( cppTypePrinter ) ;
183
197
if ( function . Access == AccessSpecifier . Protected )
184
198
{
0 commit comments