returns true on EOF
(&mut self, size_hint: usize, vm: &VirtualMachine)
| 3869 | |
| 3870 | /// returns true on EOF |
| 3871 | fn read_chunk(&mut self, size_hint: usize, vm: &VirtualMachine) -> PyResult<bool> { |
| 3872 | let decoder = self |
| 3873 | .decoder |
| 3874 | .as_ref() |
| 3875 | .ok_or_else(|| new_unsupported_operation(vm, "not readable".to_owned()))?; |
| 3876 | |
| 3877 | let dec_state = if self.telling { |
| 3878 | let state = vm.call_method(decoder, "getstate", ())?; |
| 3879 | Some(parse_decoder_state(state, vm)?) |
| 3880 | } else { |
| 3881 | None |
| 3882 | }; |
| 3883 | |
| 3884 | let method = if self.has_read1 { "read1" } else { "read" }; |
| 3885 | let size_hint = if size_hint > 0 { |
| 3886 | (self.b2cratio.max(1.0) * size_hint as f64) as usize |
| 3887 | } else { |
| 3888 | size_hint |
| 3889 | }; |
| 3890 | let chunk_size = core::cmp::max(self.chunk_size, size_hint); |
| 3891 | let input_chunk = vm.call_method(&self.buffer, method, (chunk_size,))?; |
| 3892 | |
| 3893 | let buf = ArgBytesLike::try_from_borrowed_object(vm, &input_chunk).map_err(|_| { |
| 3894 | vm.new_type_error(format!( |
| 3895 | "underlying {}() should have returned a bytes-like object, not '{}'", |
| 3896 | method, |
| 3897 | input_chunk.class().name() |
| 3898 | )) |
| 3899 | })?; |
| 3900 | let nbytes = buf.borrow_buf().len(); |
| 3901 | let eof = nbytes == 0; |
| 3902 | let decoded = vm.call_method(decoder, "decode", (input_chunk, eof))?; |
| 3903 | let decoded = check_decoded(decoded, vm)?; |
| 3904 | |
| 3905 | let char_len = decoded.char_len(); |
| 3906 | self.b2cratio = if char_len > 0 { |
| 3907 | nbytes as f64 / char_len as f64 |
| 3908 | } else { |
| 3909 | 0.0 |
| 3910 | }; |
| 3911 | let eof = if char_len > 0 { false } else { eof }; |
| 3912 | self.set_decoded_chars(Some(decoded)); |
| 3913 | |
| 3914 | if let Some((dec_buffer, dec_flags)) = dec_state { |
| 3915 | // TODO: inplace append to bytes when refcount == 1 |
| 3916 | let mut next_input = dec_buffer.as_bytes().to_vec(); |
| 3917 | next_input.extend_from_slice(&buf.borrow_buf()); |
| 3918 | self.snapshot = Some((dec_flags, PyBytes::from(next_input).into_ref(&vm.ctx))); |
| 3919 | } |
| 3920 | |
| 3921 | Ok(eof) |
| 3922 | } |
| 3923 | |
| 3924 | fn check_closed(&self, vm: &VirtualMachine) -> PyResult<()> { |
| 3925 | check_closed(&self.buffer, vm) |
no test coverage detected