@@ -6,7 +6,8 @@ pub(crate) use _bz2::make_module;
66mod _bz2 {
77 use crate :: common:: lock:: PyMutex ;
88 use crate :: vm:: {
9- FromArgs , VirtualMachine ,
9+ FromArgs ,
10+ VirtualMachine ,
1011 builtins:: { PyBytesRef , PyTypeRef } ,
1112 function:: { ArgBytesLike , OptionalArg } ,
1213 object:: { PyPayload , PyResult } ,
@@ -25,7 +26,7 @@ mod _bz2 {
2526 eof : bool ,
2627 // Unused data found after the end of stream.
2728 unused_data : Option < Vec < u8 > > ,
28- needs_input : bool ,
29+ needs_input : bool
2930 }
3031
3132 #[ pyattr]
@@ -50,7 +51,7 @@ mod _bz2 {
5051 eof : false ,
5152 input_buffer : Vec :: new ( ) ,
5253 unused_data : None ,
53- needs_input : true ,
54+ needs_input : true
5455 } ) ,
5556 }
5657 . into_ref_with_type ( vm, cls)
@@ -62,27 +63,25 @@ mod _bz2 {
6263 struct DecompressArgs {
6364 #[ pyarg( positional) ]
6465 data : ArgBytesLike ,
65- #[ pyarg( any, default = "-1" ) ]
66+ #[ pyarg( any, default = - 1 ) ]
6667 max_length : i64 ,
6768 }
6869
6970 #[ pyclass( with( Constructor ) ) ]
7071 impl BZ2Decompressor {
7172 #[ pymethod]
72- fn decompress ( & self , args : DecompressArgs , vm : & VirtualMachine ) -> PyResult < PyBytesRef > {
73+ fn decompress (
74+ & self ,
75+ args : DecompressArgs ,
76+ vm : & VirtualMachine ,
77+ ) -> PyResult < PyBytesRef > {
7378 let DecompressArgs { data, max_length } = args;
7479 let DecompressorState {
7580 eof,
7681 input_buffer,
7782 unused_data,
7883 needs_input,
7984 } = & mut * self . state . lock ( ) ;
80- if * eof {
81- return Err ( vm. new_exception_msg (
82- vm. ctx . exceptions . eof_error . to_owned ( ) ,
83- "End of stream already reached" . to_owned ( ) ,
84- ) ) ;
85- }
8685 let data_vec = data. borrow_buf ( ) . to_vec ( ) ;
8786 input_buffer. extend ( data_vec) ;
8887
@@ -95,35 +94,33 @@ mod _bz2 {
9594 // If max_length is nonnegative, read at most that many bytes.
9695 if max_length >= 0 {
9796 let mut limited = decoder. by_ref ( ) . take ( max_length as u64 ) ;
98- limited
99- . read_to_end ( & mut output )
100- . map_err ( |e| vm . new_os_error ( format ! ( "Decompression error: {}" , e ) ) ) ?;
97+ limited. read_to_end ( & mut output ) . map_err ( |e| {
98+ vm . new_os_error ( format ! ( "Decompression error: {}" , e ) )
99+ } ) ?;
101100 } else {
102- decoder
103- . read_to_end ( & mut output )
104- . map_err ( |e| vm . new_os_error ( format ! ( "Decompression error: {}" , e ) ) ) ?;
101+ decoder. read_to_end ( & mut output ) . map_err ( |e| {
102+ vm . new_os_error ( format ! ( "Decompression error: {}" , e ) )
103+ } ) ?;
105104 }
106105
107106 // Determine how many bytes were consumed from the input.
108107 let consumed = cursor. position ( ) as usize ;
109108 // Remove the consumed bytes.
110109 input_buffer. drain ( 0 ..consumed) ;
111- unused_data. replace ( input_buffer. clone ( ) ) ;
112- // skrink the vector to save memory
113- input_buffer. shrink_to_fit ( ) ;
114- if let Some ( v) = unused_data. as_mut ( ) {
115- v. shrink_to_fit ( ) ;
116- }
117110
118111 if * eof {
119112 * needs_input = false ;
120113 } else {
121114 * needs_input = input_buffer. is_empty ( ) ;
122115 }
116+ let data_vec = data. borrow_buf ( ) . to_vec ( ) ;
117+ input_buffer. extend ( data_vec) ;
123118
124119 // If the decoder reached end-of-stream (i.e. no more input remains), mark eof.
125120 if input_buffer. is_empty ( ) {
126121 * eof = true ;
122+ * unused_data = Some ( input_buffer. clone ( ) ) ;
123+ input_buffer. clear ( ) ;
127124 }
128125
129126 Ok ( vm. ctx . new_bytes ( output) )
@@ -138,9 +135,10 @@ mod _bz2 {
138135 #[ pygetset]
139136 fn unused_data ( & self , vm : & VirtualMachine ) -> PyBytesRef {
140137 let state = self . state . lock ( ) ;
141- match & state. unused_data {
142- Some ( data) => vm. ctx . new_bytes ( data. clone ( ) ) ,
143- None => vm. ctx . new_bytes ( Vec :: new ( ) ) ,
138+ if state. eof {
139+ vm. ctx . new_bytes ( state. input_buffer . to_vec ( ) )
140+ } else {
141+ vm. ctx . new_bytes ( b"" . to_vec ( ) )
144142 }
145143 }
146144
0 commit comments