@@ -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