@@ -274,8 +274,8 @@ private static JsValue IsFinite(JsValue thisObject, JsValue[] arguments)
274274
275275 private const string UriReservedString = ";/?:@&=+$," ;
276276 private const string UriUnescapedString = "-.!~*'()" ;
277- private static readonly SearchValues < char > UriUnescaped = SearchValues . Create ( UriUnescapedString ) ;
278- private static readonly SearchValues < char > UnescapedUriSet = SearchValues . Create ( UriReservedString + UriUnescapedString + '#' ) ;
277+ private static readonly SearchValues < char > UriUnescaped = SearchValues . Create ( Character . AsciiWordCharacters + UriUnescapedString ) ;
278+ private static readonly SearchValues < char > UnescapedUriSet = SearchValues . Create ( Character . AsciiWordCharacters + UriReservedString + UriUnescapedString + '#' ) ;
279279 private static readonly SearchValues < char > ReservedUriSet = SearchValues . Create ( UriReservedString + '#' ) ;
280280
281281 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
@@ -300,7 +300,7 @@ private JsValue EncodeUriComponent(JsValue thisObject, JsValue[] arguments)
300300 return Encode ( uriString , UriUnescaped ) ;
301301 }
302302
303- private JsValue Encode ( string uriString , SearchValues < char > unescapedUriSet )
303+ private JsValue Encode ( string uriString , SearchValues < char > allowedCharacters )
304304 {
305305 var strLen = uriString . Length ;
306306 var builder = new ValueStringBuilder ( uriString . Length ) ;
@@ -309,7 +309,7 @@ private JsValue Encode(string uriString, SearchValues<char> unescapedUriSet)
309309 for ( var k = 0 ; k < strLen ; k ++ )
310310 {
311311 var c = uriString [ k ] ;
312- if ( c . IsAsciiWordCharacter ( ) || unescapedUriSet . Contains ( c ) )
312+ if ( allowedCharacters . Contains ( c ) )
313313 {
314314 builder . Append ( c ) ;
315315 }
@@ -416,7 +416,7 @@ private JsValue Decode(string uriString, SearchValues<char>? reservedSet)
416416 _stringBuilder . Clear ( ) ;
417417
418418#if SUPPORTS_SPAN_PARSE
419- Span < byte > octets = stackalloc byte [ 4 ] ;
419+ Span < byte > octets = stackalloc byte [ 4 ] ;
420420#else
421421 var octets = new byte [ 4 ] ;
422422#endif
@@ -576,36 +576,36 @@ private static bool IsDigit(char c, int radix, out int result)
576576 return tmp < radix ;
577577 }
578578
579+ private static readonly SearchValues < char > EscapeAllowList = SearchValues . Create ( Character . AsciiWordCharacters + "@*+-./" ) ;
580+
579581 /// <summary>
580582 /// https://tc39.es/ecma262/#sec-escape-string
581583 /// </summary>
582584 private JsValue Escape ( JsValue thisObject , JsValue [ ] arguments )
583585 {
584586 var uriString = TypeConverter . ToString ( arguments . At ( 0 ) ) ;
585587
586- var strLen = uriString . Length ;
587-
588- _stringBuilder . EnsureCapacity ( strLen ) ;
589- _stringBuilder . Clear ( ) ;
588+ var builder = new ValueStringBuilder ( uriString . Length ) ;
590589
591- for ( var k = 0 ; k < strLen ; k ++ )
590+ foreach ( var c in uriString )
592591 {
593- var c = uriString [ k ] ;
594- if ( c . IsAsciiWordCharacter ( ) || c == '@' || c == '*' || c == '+' || c == '-' || c == '.' || c == '/' )
592+ if ( EscapeAllowList . Contains ( c ) )
595593 {
596- _stringBuilder . Append ( c ) ;
594+ builder . Append ( c ) ;
597595 }
598596 else if ( c < 256 )
599597 {
600- _stringBuilder . Append ( '%' ) . AppendFormat ( CultureInfo . InvariantCulture , "{0:X2}" , ( int ) c ) ;
598+ builder . Append ( '%' ) ;
599+ builder . AppendHex ( ( byte ) c ) ;
601600 }
602601 else
603602 {
604- _stringBuilder . Append ( "%u" ) . AppendFormat ( CultureInfo . InvariantCulture , "{0:X4}" , ( int ) c ) ;
603+ builder . Append ( "%u" ) ;
604+ builder . Append ( ( ( int ) c ) . ToString ( "X4" , CultureInfo . InvariantCulture ) ) ;
605605 }
606606 }
607607
608- return _stringBuilder . ToString ( ) ;
608+ return builder . ToString ( ) ;
609609 }
610610
611611 /// <summary>
0 commit comments