@@ -45,21 +45,28 @@ public override BNumber Parse(BencodeReader reader)
4545 if ( reader . ReadChar ( ) != 'i' )
4646 throw InvalidBencodeException < BNumber > . UnexpectedChar ( 'i' , reader . PreviousChar , startPosition ) ;
4747
48- using var digits = MemoryPool < char > . Shared . Rent ( BNumber . MaxDigits ) ;
49- var digitCount = 0 ;
50- for ( var c = reader . ReadChar ( ) ; c != default && c != 'e' ; c = reader . ReadChar ( ) )
48+ var digits = ArrayPool < char > . Shared . Rent ( BNumber . MaxDigits ) ;
49+ try
5150 {
52- digits . Memory . Span [ digitCount ++ ] = c ;
53- }
51+ var digitCount = 0 ;
52+ for ( var c = reader . ReadChar ( ) ; c != default && c != 'e' ; c = reader . ReadChar ( ) )
53+ {
54+ digits [ digitCount ++ ] = c ;
55+ }
5456
55- if ( digitCount == 0 )
56- throw NoDigitsException ( startPosition ) ;
57+ if ( digitCount == 0 )
58+ throw NoDigitsException ( startPosition ) ;
5759
58- // Last read character should be 'e'
59- if ( reader . PreviousChar != 'e' )
60- throw InvalidBencodeException < BNumber > . MissingEndChar ( startPosition ) ;
60+ // Last read character should be 'e'
61+ if ( reader . PreviousChar != 'e' )
62+ throw InvalidBencodeException < BNumber > . MissingEndChar ( startPosition ) ;
6163
62- return ParseNumber ( digits . Memory . Span . Slice ( 0 , digitCount ) , startPosition ) ;
64+ return ParseNumber ( digits [ ..digitCount ] , startPosition ) ;
65+ }
66+ finally
67+ {
68+ ArrayPool < char > . Shared . Return ( digits ) ;
69+ }
6370 }
6471
6572 /// <summary>
@@ -80,24 +87,30 @@ public override async ValueTask<BNumber> ParseAsync(PipeBencodeReader reader, Ca
8087 if ( await reader . ReadCharAsync ( cancellationToken ) . ConfigureAwait ( false ) != 'i' )
8188 throw InvalidBencodeException < BNumber > . UnexpectedChar ( 'i' , reader . PreviousChar , startPosition ) ;
8289
83- using var memoryOwner = MemoryPool < char > . Shared . Rent ( BNumber . MaxDigits ) ;
84- var digits = memoryOwner . Memory ;
85- var digitCount = 0 ;
86- for ( var c = await reader . ReadCharAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
87- c != default && c != 'e' ;
88- c = await reader . ReadCharAsync ( cancellationToken ) . ConfigureAwait ( false ) )
90+ var digits = ArrayPool < char > . Shared . Rent ( BNumber . MaxDigits ) ;
91+ try
8992 {
90- digits . Span [ digitCount ++ ] = c ;
93+ var digitCount = 0 ;
94+ for ( var c = await reader . ReadCharAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
95+ c != default && c != 'e' ;
96+ c = await reader . ReadCharAsync ( cancellationToken ) . ConfigureAwait ( false ) )
97+ {
98+ digits [ digitCount ++ ] = c ;
99+ }
100+
101+ if ( digitCount == 0 )
102+ throw NoDigitsException ( startPosition ) ;
103+
104+ // Last read character should be 'e'
105+ if ( reader . PreviousChar != 'e' )
106+ throw InvalidBencodeException < BNumber > . MissingEndChar ( startPosition ) ;
107+
108+ return ParseNumber ( digits . AsSpan ( ) [ ..digitCount ] , startPosition ) ;
109+ }
110+ finally
111+ {
112+ ArrayPool < char > . Shared . Return ( digits ) ;
91113 }
92-
93- if ( digitCount == 0 )
94- throw NoDigitsException ( startPosition ) ;
95-
96- // Last read character should be 'e'
97- if ( reader . PreviousChar != 'e' )
98- throw InvalidBencodeException < BNumber > . MissingEndChar ( startPosition ) ;
99-
100- return ParseNumber ( digits . Span . Slice ( 0 , digitCount ) , startPosition ) ;
101114 }
102115
103116 private BNumber ParseNumber ( in ReadOnlySpan < char > digits , long startPosition )
0 commit comments