(_cls: &Py<PyType>, args: Self::Args, vm: &VirtualMachine)
| 579 | type Args = LZMADecompressorConstructorArgs; |
| 580 | |
| 581 | fn py_new(_cls: &Py<PyType>, args: Self::Args, vm: &VirtualMachine) -> PyResult<Self> { |
| 582 | if args.format == FORMAT_RAW && args.memlimit.is_some() { |
| 583 | return Err(vm.new_value_error("Cannot specify memory limit with FORMAT_RAW")); |
| 584 | } |
| 585 | |
| 586 | if args.format == FORMAT_RAW && args.filters.is_none() { |
| 587 | return Err(vm.new_value_error("Must specify filters for FORMAT_RAW")); |
| 588 | } |
| 589 | if args.format != FORMAT_RAW && args.filters.is_some() { |
| 590 | return Err(vm.new_value_error("Cannot specify filters except with FORMAT_RAW")); |
| 591 | } |
| 592 | |
| 593 | let memlimit = args.memlimit.unwrap_or(u64::MAX); |
| 594 | let decoder_flags = TELL_ANY_CHECK | TELL_NO_CHECK; |
| 595 | |
| 596 | let lzma_stream = match args.format { |
| 597 | FORMAT_AUTO => { |
| 598 | let stream = Stream::new_auto_decoder(memlimit, decoder_flags) |
| 599 | .map_err(|e| catch_lzma_error(e, vm))?; |
| 600 | LzmaStream::new(stream, CHECK_UNKNOWN, true) |
| 601 | } |
| 602 | FORMAT_XZ => { |
| 603 | let stream = Stream::new_stream_decoder(memlimit, decoder_flags) |
| 604 | .map_err(|e| catch_lzma_error(e, vm))?; |
| 605 | LzmaStream::new(stream, CHECK_UNKNOWN, true) |
| 606 | } |
| 607 | FORMAT_ALONE => { |
| 608 | let stream = |
| 609 | Stream::new_lzma_decoder(memlimit).map_err(|e| catch_lzma_error(e, vm))?; |
| 610 | LzmaStream::new(stream, CHECK_NONE, false) |
| 611 | } |
| 612 | FORMAT_RAW => { |
| 613 | let filter_specs = args.filters.unwrap(); // safe: checked above |
| 614 | let filters = parse_filter_chain_spec(filter_specs, vm)?; |
| 615 | let stream = |
| 616 | Stream::new_raw_decoder(&filters).map_err(|e| catch_lzma_error(e, vm))?; |
| 617 | LzmaStream::new(stream, CHECK_NONE, false) |
| 618 | } |
| 619 | _ => { |
| 620 | return Err( |
| 621 | vm.new_value_error(format!("Invalid container format: {}", args.format)) |
| 622 | ); |
| 623 | } |
| 624 | }; |
| 625 | |
| 626 | Ok(Self { |
| 627 | state: PyMutex::new(DecompressState::new(lzma_stream, vm)), |
| 628 | }) |
| 629 | } |
| 630 | } |
| 631 | |
| 632 | #[pyclass(with(Constructor))] |
nothing calls this directly
no test coverage detected