@@ -77,6 +77,12 @@ mod _bz2 {
77
77
unused_data,
78
78
needs_input,
79
79
} = & 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
+ }
80
86
let data_vec = data. borrow_buf ( ) . to_vec ( ) ;
81
87
input_buffer. extend ( data_vec) ;
82
88
@@ -102,6 +108,10 @@ mod _bz2 {
102
108
let consumed = cursor. position ( ) as usize ;
103
109
// Remove the consumed bytes.
104
110
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
+ unused_data. as_mut ( ) . map ( |v| v. shrink_to_fit ( ) ) ;
105
115
106
116
if * eof {
107
117
* needs_input = false ;
@@ -112,8 +122,6 @@ mod _bz2 {
112
122
// If the decoder reached end-of-stream (i.e. no more input remains), mark eof.
113
123
if input_buffer. is_empty ( ) {
114
124
* eof = true ;
115
- * unused_data = Some ( input_buffer. clone ( ) ) ;
116
- input_buffer. clear ( ) ;
117
125
}
118
126
119
127
Ok ( vm. ctx . new_bytes ( output) )
@@ -128,10 +136,9 @@ mod _bz2 {
128
136
#[ pygetset]
129
137
fn unused_data ( & self , vm : & VirtualMachine ) -> PyBytesRef {
130
138
let state = self . state . lock ( ) ;
131
- if state. eof {
132
- vm. ctx . new_bytes ( state. input_buffer . to_vec ( ) )
133
- } else {
134
- vm. ctx . new_bytes ( b"" . to_vec ( ) )
139
+ match & state. unused_data {
140
+ Some ( data) => vm. ctx . new_bytes ( data. clone ( ) ) ,
141
+ None => vm. ctx . new_bytes ( Vec :: new ( ) ) ,
135
142
}
136
143
}
137
144
0 commit comments