MCPcopy Index your code
hub / github.com/RustPython/RustPython / decompress

Method decompress

crates/stdlib/src/compression.rs:312–358  ·  view source on GitHub ↗
(
        &mut self,
        data: &[u8],
        max_length: Option<usize>,
        bufsize: usize,
        vm: &VirtualMachine,
    )

Source from the content-addressed store, hash-verified

310 }
311
312 pub fn decompress(
313 &mut self,
314 data: &[u8],
315 max_length: Option<usize>,
316 bufsize: usize,
317 vm: &VirtualMachine,
318 ) -> Result<Vec<u8>, DecompressError<D::Error>> {
319 if self.eof {
320 return Err(DecompressError::Eof(EofError));
321 }
322
323 let input_buffer = &mut self.input_buffer;
324 let d = &mut self.decompress;
325
326 let mut chunks = Chunker::chain(input_buffer, data);
327
328 let prev_len = chunks.len();
329 let (ret, stream_end) =
330 match _decompress_chunks(&mut chunks, d, bufsize, max_length, flush_sync) {
331 Ok((buf, stream_end)) => (Ok(buf), stream_end),
332 Err(err) => (Err(err), false),
333 };
334 let consumed = prev_len - chunks.len();
335
336 self.eof |= stream_end;
337
338 if self.eof {
339 self.needs_input = false;
340 if !chunks.is_empty() {
341 self.unused_data = vm.ctx.new_bytes(chunks.to_vec());
342 }
343 } else if chunks.is_empty() {
344 input_buffer.clear();
345 self.needs_input = true;
346 } else {
347 self.needs_input = false;
348 if let Some(n_consumed_from_data) = consumed.checked_sub(input_buffer.len()) {
349 input_buffer.clear();
350 input_buffer.extend_from_slice(&data[n_consumed_from_data..]);
351 } else {
352 input_buffer.drain(..consumed);
353 input_buffer.extend_from_slice(data);
354 }
355 }
356
357 ret.map_err(DecompressError::Decompress)
358 }
359}
360
361pub enum DecompressError<E> {

Callers 1

stdlib_zlib.pyFile · 0.45

Calls 8

_decompress_chunksFunction · 0.85
to_vecMethod · 0.80
ErrClass · 0.50
lenMethod · 0.45
is_emptyMethod · 0.45
new_bytesMethod · 0.45
clearMethod · 0.45
drainMethod · 0.45

Tested by

no test coverage detected