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

Method read_chunk

crates/vm/src/stdlib/_io.rs:3871–3922  ·  view source on GitHub ↗

returns true on EOF

(&mut self, size_hint: usize, vm: &VirtualMachine)

Source from the content-addressed store, hash-verified

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)

Callers 2

readMethod · 0.80
readlineMethod · 0.80

Calls 15

parse_decoder_stateFunction · 0.85
maxFunction · 0.85
check_decodedFunction · 0.85
ok_or_elseMethod · 0.80
set_decoded_charsMethod · 0.80
to_vecMethod · 0.80
SomeClass · 0.50
as_refMethod · 0.45
to_ownedMethod · 0.45
call_methodMethod · 0.45
maxMethod · 0.45

Tested by

no test coverage detected