@@ -516,25 +516,25 @@ private static bool TryParseExactD<TChar>(ReadOnlySpan<TChar> guidString, ref Gu
516516            } 
517517
518518            Span < byte >  bytes  =  MemoryMarshal . AsBytes ( new  Span < GuidResult > ( ref  result ) ) ; 
519-             uint   invalidIfGreaterThan7F  =  0 ; 
520-             bytes [ 0 ]  =  DecodeByte ( guidString [ 6 ] ,    guidString [ 7 ] ,   ref  invalidIfGreaterThan7F ) ; 
521-             bytes [ 1 ]  =  DecodeByte ( guidString [ 4 ] ,    guidString [ 5 ] ,   ref  invalidIfGreaterThan7F ) ; 
522-             bytes [ 2 ]  =  DecodeByte ( guidString [ 2 ] ,    guidString [ 3 ] ,   ref  invalidIfGreaterThan7F ) ; 
523-             bytes [ 3 ]  =  DecodeByte ( guidString [ 0 ] ,    guidString [ 1 ] ,   ref  invalidIfGreaterThan7F ) ; 
524-             bytes [ 4 ]  =  DecodeByte ( guidString [ 11 ] ,   guidString [ 12 ] ,  ref  invalidIfGreaterThan7F ) ; 
525-             bytes [ 5 ]  =  DecodeByte ( guidString [ 9 ] ,    guidString [ 10 ] ,  ref  invalidIfGreaterThan7F ) ; 
526-             bytes [ 6 ]  =  DecodeByte ( guidString [ 16 ] ,   guidString [ 17 ] ,  ref  invalidIfGreaterThan7F ) ; 
527-             bytes [ 7 ]  =  DecodeByte ( guidString [ 14 ] ,   guidString [ 15 ] ,  ref  invalidIfGreaterThan7F ) ; 
528-             bytes [ 8 ]  =  DecodeByte ( guidString [ 19 ] ,   guidString [ 20 ] ,  ref  invalidIfGreaterThan7F ) ; 
529-             bytes [ 9 ]  =  DecodeByte ( guidString [ 21 ] ,   guidString [ 22 ] ,  ref  invalidIfGreaterThan7F ) ; 
530-             bytes [ 10 ]  =  DecodeByte ( guidString [ 24 ] ,  guidString [ 25 ] ,  ref  invalidIfGreaterThan7F ) ; 
531-             bytes [ 11 ]  =  DecodeByte ( guidString [ 26 ] ,  guidString [ 27 ] ,  ref  invalidIfGreaterThan7F ) ; 
532-             bytes [ 12 ]  =  DecodeByte ( guidString [ 28 ] ,  guidString [ 29 ] ,  ref  invalidIfGreaterThan7F ) ; 
533-             bytes [ 13 ]  =  DecodeByte ( guidString [ 30 ] ,  guidString [ 31 ] ,  ref  invalidIfGreaterThan7F ) ; 
534-             bytes [ 14 ]  =  DecodeByte ( guidString [ 32 ] ,  guidString [ 33 ] ,  ref  invalidIfGreaterThan7F ) ; 
535-             bytes [ 15 ]  =  DecodeByte ( guidString [ 34 ] ,  guidString [ 35 ] ,  ref  invalidIfGreaterThan7F ) ; 
536- 
537-             if  ( invalidIfGreaterThan7F   <=   0x7F ) 
519+             int   invalidIfNegative  =  0 ; 
520+             bytes [ 0 ]  =  DecodeByte ( guidString [ 6 ] ,    guidString [ 7 ] ,   ref  invalidIfNegative ) ; 
521+             bytes [ 1 ]  =  DecodeByte ( guidString [ 4 ] ,    guidString [ 5 ] ,   ref  invalidIfNegative ) ; 
522+             bytes [ 2 ]  =  DecodeByte ( guidString [ 2 ] ,    guidString [ 3 ] ,   ref  invalidIfNegative ) ; 
523+             bytes [ 3 ]  =  DecodeByte ( guidString [ 0 ] ,    guidString [ 1 ] ,   ref  invalidIfNegative ) ; 
524+             bytes [ 4 ]  =  DecodeByte ( guidString [ 11 ] ,   guidString [ 12 ] ,  ref  invalidIfNegative ) ; 
525+             bytes [ 5 ]  =  DecodeByte ( guidString [ 9 ] ,    guidString [ 10 ] ,  ref  invalidIfNegative ) ; 
526+             bytes [ 6 ]  =  DecodeByte ( guidString [ 16 ] ,   guidString [ 17 ] ,  ref  invalidIfNegative ) ; 
527+             bytes [ 7 ]  =  DecodeByte ( guidString [ 14 ] ,   guidString [ 15 ] ,  ref  invalidIfNegative ) ; 
528+             bytes [ 8 ]  =  DecodeByte ( guidString [ 19 ] ,   guidString [ 20 ] ,  ref  invalidIfNegative ) ; 
529+             bytes [ 9 ]  =  DecodeByte ( guidString [ 21 ] ,   guidString [ 22 ] ,  ref  invalidIfNegative ) ; 
530+             bytes [ 10 ]  =  DecodeByte ( guidString [ 24 ] ,  guidString [ 25 ] ,  ref  invalidIfNegative ) ; 
531+             bytes [ 11 ]  =  DecodeByte ( guidString [ 26 ] ,  guidString [ 27 ] ,  ref  invalidIfNegative ) ; 
532+             bytes [ 12 ]  =  DecodeByte ( guidString [ 28 ] ,  guidString [ 29 ] ,  ref  invalidIfNegative ) ; 
533+             bytes [ 13 ]  =  DecodeByte ( guidString [ 30 ] ,  guidString [ 31 ] ,  ref  invalidIfNegative ) ; 
534+             bytes [ 14 ]  =  DecodeByte ( guidString [ 32 ] ,  guidString [ 33 ] ,  ref  invalidIfNegative ) ; 
535+             bytes [ 15 ]  =  DecodeByte ( guidString [ 34 ] ,  guidString [ 35 ] ,  ref  invalidIfNegative ) ; 
536+ 
537+             if  ( invalidIfNegative   >=   0 ) 
538538            { 
539539                if  ( ! BitConverter . IsLittleEndian ) 
540540                { 
@@ -602,25 +602,25 @@ private static bool TryParseExactN<TChar>(ReadOnlySpan<TChar> guidString, ref Gu
602602            } 
603603
604604            Span < byte >  bytes  =  MemoryMarshal . AsBytes ( new  Span < GuidResult > ( ref  result ) ) ; 
605-             uint   invalidIfGreaterThan7F  =  0 ; 
606-             bytes [ 0 ]  =  DecodeByte ( guidString [ 6 ] ,  guidString [ 7 ] ,  ref  invalidIfGreaterThan7F ) ; 
607-             bytes [ 1 ]  =  DecodeByte ( guidString [ 4 ] ,  guidString [ 5 ] ,  ref  invalidIfGreaterThan7F ) ; 
608-             bytes [ 2 ]  =  DecodeByte ( guidString [ 2 ] ,  guidString [ 3 ] ,  ref  invalidIfGreaterThan7F ) ; 
609-             bytes [ 3 ]  =  DecodeByte ( guidString [ 0 ] ,  guidString [ 1 ] ,  ref  invalidIfGreaterThan7F ) ; 
610-             bytes [ 4 ]  =  DecodeByte ( guidString [ 10 ] ,  guidString [ 11 ] ,  ref  invalidIfGreaterThan7F ) ; 
611-             bytes [ 5 ]  =  DecodeByte ( guidString [ 8 ] ,  guidString [ 9 ] ,  ref  invalidIfGreaterThan7F ) ; 
612-             bytes [ 6 ]  =  DecodeByte ( guidString [ 14 ] ,  guidString [ 15 ] ,  ref  invalidIfGreaterThan7F ) ; 
613-             bytes [ 7 ]  =  DecodeByte ( guidString [ 12 ] ,  guidString [ 13 ] ,  ref  invalidIfGreaterThan7F ) ; 
614-             bytes [ 8 ]  =  DecodeByte ( guidString [ 16 ] ,  guidString [ 17 ] ,  ref  invalidIfGreaterThan7F ) ; 
615-             bytes [ 9 ]  =  DecodeByte ( guidString [ 18 ] ,  guidString [ 19 ] ,  ref  invalidIfGreaterThan7F ) ; 
616-             bytes [ 10 ]  =  DecodeByte ( guidString [ 20 ] ,  guidString [ 21 ] ,  ref  invalidIfGreaterThan7F ) ; 
617-             bytes [ 11 ]  =  DecodeByte ( guidString [ 22 ] ,  guidString [ 23 ] ,  ref  invalidIfGreaterThan7F ) ; 
618-             bytes [ 12 ]  =  DecodeByte ( guidString [ 24 ] ,  guidString [ 25 ] ,  ref  invalidIfGreaterThan7F ) ; 
619-             bytes [ 13 ]  =  DecodeByte ( guidString [ 26 ] ,  guidString [ 27 ] ,  ref  invalidIfGreaterThan7F ) ; 
620-             bytes [ 14 ]  =  DecodeByte ( guidString [ 28 ] ,  guidString [ 29 ] ,  ref  invalidIfGreaterThan7F ) ; 
621-             bytes [ 15 ]  =  DecodeByte ( guidString [ 30 ] ,  guidString [ 31 ] ,  ref  invalidIfGreaterThan7F ) ; 
622- 
623-             if  ( invalidIfGreaterThan7F   <=   0x7F ) 
605+             int   invalidIfNegative  =  0 ; 
606+             bytes [ 0 ]  =  DecodeByte ( guidString [ 6 ] ,  guidString [ 7 ] ,  ref  invalidIfNegative ) ; 
607+             bytes [ 1 ]  =  DecodeByte ( guidString [ 4 ] ,  guidString [ 5 ] ,  ref  invalidIfNegative ) ; 
608+             bytes [ 2 ]  =  DecodeByte ( guidString [ 2 ] ,  guidString [ 3 ] ,  ref  invalidIfNegative ) ; 
609+             bytes [ 3 ]  =  DecodeByte ( guidString [ 0 ] ,  guidString [ 1 ] ,  ref  invalidIfNegative ) ; 
610+             bytes [ 4 ]  =  DecodeByte ( guidString [ 10 ] ,  guidString [ 11 ] ,  ref  invalidIfNegative ) ; 
611+             bytes [ 5 ]  =  DecodeByte ( guidString [ 8 ] ,  guidString [ 9 ] ,  ref  invalidIfNegative ) ; 
612+             bytes [ 6 ]  =  DecodeByte ( guidString [ 14 ] ,  guidString [ 15 ] ,  ref  invalidIfNegative ) ; 
613+             bytes [ 7 ]  =  DecodeByte ( guidString [ 12 ] ,  guidString [ 13 ] ,  ref  invalidIfNegative ) ; 
614+             bytes [ 8 ]  =  DecodeByte ( guidString [ 16 ] ,  guidString [ 17 ] ,  ref  invalidIfNegative ) ; 
615+             bytes [ 9 ]  =  DecodeByte ( guidString [ 18 ] ,  guidString [ 19 ] ,  ref  invalidIfNegative ) ; 
616+             bytes [ 10 ]  =  DecodeByte ( guidString [ 20 ] ,  guidString [ 21 ] ,  ref  invalidIfNegative ) ; 
617+             bytes [ 11 ]  =  DecodeByte ( guidString [ 22 ] ,  guidString [ 23 ] ,  ref  invalidIfNegative ) ; 
618+             bytes [ 12 ]  =  DecodeByte ( guidString [ 24 ] ,  guidString [ 25 ] ,  ref  invalidIfNegative ) ; 
619+             bytes [ 13 ]  =  DecodeByte ( guidString [ 26 ] ,  guidString [ 27 ] ,  ref  invalidIfNegative ) ; 
620+             bytes [ 14 ]  =  DecodeByte ( guidString [ 28 ] ,  guidString [ 29 ] ,  ref  invalidIfNegative ) ; 
621+             bytes [ 15 ]  =  DecodeByte ( guidString [ 30 ] ,  guidString [ 31 ] ,  ref  invalidIfNegative ) ; 
622+ 
623+             if  ( invalidIfNegative   >=   0 ) 
624624            { 
625625                if  ( ! BitConverter . IsLittleEndian ) 
626626                { 
@@ -813,21 +813,19 @@ private static bool TryParseExactX<TChar>(ReadOnlySpan<TChar> guidString, ref Gu
813813        } 
814814
815815        [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ] 
816-         private  static byte  DecodeByte < TChar > ( TChar  ch1 ,  TChar  ch2 ,  ref  uint  invalidIfGreaterThan7F ) 
817-             where  TChar  :  unmanaged,  IUtfChar < TChar > 
816+         private  static byte  DecodeByte < TChar > ( TChar  ch1 ,  TChar  ch2 ,  ref  uint  invalidIfNegative )  where  TChar  :  unmanaged,  IUtfChar < TChar > 
818817        { 
819818            ReadOnlySpan < byte >  lookup  =  HexConverter . CharToHexLookup ; 
820819            Debug . Assert ( lookup . Length  ==  256 ) ; 
821820
822821            uint  c1  =  typeof ( TChar )  ==  typeof ( byte )  ?  TChar . CastToUInt32 ( ch1 )  :  Math . Min ( TChar . CastToUInt32 ( ch1 ) ,  0x7F ) ; 
823-             uint  upper  =  lookup [ ( int ) c1 ] ; 
824-             invalidIfGreaterThan7F  |=  upper ; 
825- 
826822            uint  c2  =  typeof ( TChar )  ==  typeof ( byte )  ?  TChar . CastToUInt32 ( ch2 )  :  Math . Min ( TChar . CastToUInt32 ( ch2 ) ,  0x7F ) ; 
827-             uint   lower  =  lookup [ ( int ) c2 ] ; 
828-             invalidIfGreaterThan7F   |=   lower ; 
823+             int   upper  =  ( sbyte ) Unsafe . Add ( ref   MemoryMarshal . GetReference ( lookup ) ,   ch1 ) ; 
824+             int   lower   =   ( sbyte ) Unsafe . Add ( ref   MemoryMarshal . GetReference ( lookup ) ,   ch2 ) ; 
829825
830-             return  ( byte ) ( ( upper  <<  4 )  |  lower ) ; 
826+             int  result  =  ( upper  <<  4 )  |  lower ; 
827+             invalidIfNegative  |=  result ; 
828+             return  ( byte ) result ; 
831829        } 
832830
833831        private  static bool  TryParseHex < TChar > ( ReadOnlySpan < TChar >  guidString ,  out  ushort  result ,  ref  bool  overflow )  where  TChar  :  unmanaged,  IUtfChar < TChar > 
0 commit comments