@@ -8,9 +8,10 @@ namespace System.Globalization
88{
99 sealed partial class IdnMapping
1010 {
11- private unsafe string GetAsciiCore ( char * unicode , int count )
11+ private unsafe string GetAsciiCore ( string unicodeString , char * unicode , int count )
1212 {
1313 Debug . Assert ( ! GlobalizationMode . Invariant ) ;
14+ Debug . Assert ( unicodeString != null && unicodeString . Length >= count ) ;
1415
1516 uint flags = Flags ;
1617 CheckInvalidIdnCharacters ( unicode , count , flags , nameof ( unicode ) ) ;
@@ -26,7 +27,7 @@ private unsafe string GetAsciiCore(char* unicode, int count)
2627 actualLength = Interop . Globalization . ToAscii ( flags , unicode , count , outputStack , estimatedLength ) ;
2728 if ( actualLength > 0 && actualLength <= estimatedLength )
2829 {
29- return new string ( outputStack , 0 , actualLength ) ;
30+ return GetStringForOutput ( unicodeString , unicode , count , outputStack , actualLength ) ;
3031 }
3132 }
3233 else
@@ -46,13 +47,14 @@ private unsafe string GetAsciiCore(char* unicode, int count)
4647 {
4748 throw new ArgumentException ( SR . Argument_IdnIllegalName , nameof ( unicode ) ) ;
4849 }
49- return new string ( pOutputHeap , 0 , actualLength ) ;
50+ return GetStringForOutput ( unicodeString , unicode , count , pOutputHeap , actualLength ) ;
5051 }
5152 }
5253
53- private unsafe string GetUnicodeCore ( char * ascii , int count )
54+ private unsafe string GetUnicodeCore ( string asciiString , char * ascii , int count )
5455 {
5556 Debug . Assert ( ! GlobalizationMode . Invariant ) ;
57+ Debug . Assert ( asciiString != null && asciiString . Length >= count ) ;
5658
5759 uint flags = Flags ;
5860 CheckInvalidIdnCharacters ( ascii , count , flags , nameof ( ascii ) ) ;
@@ -61,21 +63,22 @@ private unsafe string GetUnicodeCore(char* ascii, int count)
6163 if ( count < StackAllocThreshold )
6264 {
6365 char * output = stackalloc char [ count ] ;
64- return GetUnicodeCore ( ascii , count , flags , output , count , reattempt : true ) ;
66+ return GetUnicodeCore ( asciiString , ascii , count , flags , output , count , reattempt : true ) ;
6567 }
6668 else
6769 {
6870 char [ ] output = new char [ count ] ;
6971 fixed ( char * pOutput = & output [ 0 ] )
7072 {
71- return GetUnicodeCore ( ascii , count , flags , pOutput , count , reattempt : true ) ;
73+ return GetUnicodeCore ( asciiString , ascii , count , flags , pOutput , count , reattempt : true ) ;
7274 }
7375 }
7476 }
7577
76- private unsafe string GetUnicodeCore ( char * ascii , int count , uint flags , char * output , int outputLength , bool reattempt )
78+ private unsafe string GetUnicodeCore ( string asciiString , char * ascii , int count , uint flags , char * output , int outputLength , bool reattempt )
7779 {
7880 Debug . Assert ( ! GlobalizationMode . Invariant ) ;
81+ Debug . Assert ( asciiString != null && asciiString . Length >= count ) ;
7982
8083 int realLen = Interop . Globalization . ToUnicode ( flags , ascii , count , output , outputLength ) ;
8184
@@ -85,14 +88,14 @@ private unsafe string GetUnicodeCore(char* ascii, int count, uint flags, char* o
8588 }
8689 else if ( realLen <= outputLength )
8790 {
88- return new string ( output , 0 , realLen ) ;
91+ return GetStringForOutput ( asciiString , ascii , count , output , realLen ) ;
8992 }
9093 else if ( reattempt )
9194 {
9295 char [ ] newOutput = new char [ realLen ] ;
9396 fixed ( char * pNewOutput = newOutput )
9497 {
95- return GetUnicodeCore ( ascii , count , flags , pNewOutput , realLen , reattempt : false ) ;
98+ return GetUnicodeCore ( asciiString , ascii , count , flags , pNewOutput , realLen , reattempt : false ) ;
9699 }
97100 }
98101
0 commit comments