@@ -274,8 +274,8 @@ private static JsValue IsFinite(JsValue thisObject, JsValue[] arguments)
274
274
275
275
private const string UriReservedString = ";/?:@&=+$," ;
276
276
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 + '#' ) ;
279
279
private static readonly SearchValues < char > ReservedUriSet = SearchValues . Create ( UriReservedString + '#' ) ;
280
280
281
281
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
@@ -300,7 +300,7 @@ private JsValue EncodeUriComponent(JsValue thisObject, JsValue[] arguments)
300
300
return Encode ( uriString , UriUnescaped ) ;
301
301
}
302
302
303
- private JsValue Encode ( string uriString , SearchValues < char > unescapedUriSet )
303
+ private JsValue Encode ( string uriString , SearchValues < char > allowedCharacters )
304
304
{
305
305
var strLen = uriString . Length ;
306
306
var builder = new ValueStringBuilder ( uriString . Length ) ;
@@ -309,7 +309,7 @@ private JsValue Encode(string uriString, SearchValues<char> unescapedUriSet)
309
309
for ( var k = 0 ; k < strLen ; k ++ )
310
310
{
311
311
var c = uriString [ k ] ;
312
- if ( c . IsAsciiWordCharacter ( ) || unescapedUriSet . Contains ( c ) )
312
+ if ( allowedCharacters . Contains ( c ) )
313
313
{
314
314
builder . Append ( c ) ;
315
315
}
@@ -416,7 +416,7 @@ private JsValue Decode(string uriString, SearchValues<char>? reservedSet)
416
416
_stringBuilder . Clear ( ) ;
417
417
418
418
#if SUPPORTS_SPAN_PARSE
419
- Span < byte > octets = stackalloc byte [ 4 ] ;
419
+ Span < byte > octets = stackalloc byte [ 4 ] ;
420
420
#else
421
421
var octets = new byte [ 4 ] ;
422
422
#endif
@@ -576,36 +576,36 @@ private static bool IsDigit(char c, int radix, out int result)
576
576
return tmp < radix ;
577
577
}
578
578
579
+ private static readonly SearchValues < char > EscapeAllowList = SearchValues . Create ( Character . AsciiWordCharacters + "@*+-./" ) ;
580
+
579
581
/// <summary>
580
582
/// https://tc39.es/ecma262/#sec-escape-string
581
583
/// </summary>
582
584
private JsValue Escape ( JsValue thisObject , JsValue [ ] arguments )
583
585
{
584
586
var uriString = TypeConverter . ToString ( arguments . At ( 0 ) ) ;
585
587
586
- var strLen = uriString . Length ;
587
-
588
- _stringBuilder . EnsureCapacity ( strLen ) ;
589
- _stringBuilder . Clear ( ) ;
588
+ var builder = new ValueStringBuilder ( uriString . Length ) ;
590
589
591
- for ( var k = 0 ; k < strLen ; k ++ )
590
+ foreach ( var c in uriString )
592
591
{
593
- var c = uriString [ k ] ;
594
- if ( c . IsAsciiWordCharacter ( ) || c == '@' || c == '*' || c == '+' || c == '-' || c == '.' || c == '/' )
592
+ if ( EscapeAllowList . Contains ( c ) )
595
593
{
596
- _stringBuilder . Append ( c ) ;
594
+ builder . Append ( c ) ;
597
595
}
598
596
else if ( c < 256 )
599
597
{
600
- _stringBuilder . Append ( '%' ) . AppendFormat ( CultureInfo . InvariantCulture , "{0:X2}" , ( int ) c ) ;
598
+ builder . Append ( '%' ) ;
599
+ builder . AppendHex ( ( byte ) c ) ;
601
600
}
602
601
else
603
602
{
604
- _stringBuilder . Append ( "%u" ) . AppendFormat ( CultureInfo . InvariantCulture , "{0:X4}" , ( int ) c ) ;
603
+ builder . Append ( "%u" ) ;
604
+ builder . Append ( ( ( int ) c ) . ToString ( "X4" , CultureInfo . InvariantCulture ) ) ;
605
605
}
606
606
}
607
607
608
- return _stringBuilder . ToString ( ) ;
608
+ return builder . ToString ( ) ;
609
609
}
610
610
611
611
/// <summary>
0 commit comments