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

Method readinto_generic

crates/vm/src/stdlib/_io.rs:1466–1531  ·  view source on GitHub ↗
(
            &mut self,
            buf: PyBuffer,
            readinto1: bool,
            vm: &VirtualMachine,
        )

Source from the content-addressed store, hash-verified

1464 }
1465
1466 fn readinto_generic(
1467 &mut self,
1468 buf: PyBuffer,
1469 readinto1: bool,
1470 vm: &VirtualMachine,
1471 ) -> PyResult<Option<usize>> {
1472 let mut written = 0;
1473 let n = self.readahead();
1474 let buf_len;
1475 {
1476 let mut b = buf.as_contiguous_mut().unwrap();
1477 buf_len = b.len();
1478 if n > 0 {
1479 if n as usize >= b.len() {
1480 b.copy_from_slice(&self.buffer[self.pos as usize..][..buf_len]);
1481 self.pos += buf_len as Offset;
1482 return Ok(Some(buf_len));
1483 }
1484 b[..n as usize]
1485 .copy_from_slice(&self.buffer[self.pos as usize..][..n as usize]);
1486 self.pos += n;
1487 written = n as usize;
1488 }
1489 }
1490 if self.writable() {
1491 self.flush_rewind(vm)?;
1492 }
1493 self.reset_read();
1494 self.pos = 0;
1495
1496 let mut remaining = buf_len - written;
1497 while remaining > 0 {
1498 let n = if remaining > self.buffer.len() {
1499 self.raw_read(Either::B(buf.clone()), written..written + remaining, vm)?
1500 } else if !(readinto1 && written != 0) {
1501 let n = self.fill_buffer(vm)?;
1502 if let Some(n) = n.filter(|&n| n > 0) {
1503 let n = core::cmp::min(n, remaining);
1504 buf.as_contiguous_mut().unwrap()[written..][..n]
1505 .copy_from_slice(&self.buffer[self.pos as usize..][..n]);
1506 self.pos += n as Offset;
1507 written += n;
1508 remaining -= n;
1509 continue;
1510 }
1511 n
1512 } else {
1513 break;
1514 };
1515 let n = match n {
1516 Some(0) => break,
1517 None if written > 0 => break,
1518 None => return Ok(None),
1519 Some(n) => n,
1520 };
1521
1522 if readinto1 {
1523 written += n;

Callers 2

readintoMethod · 0.80
readinto1Method · 0.80

Calls 14

minFunction · 0.85
readaheadMethod · 0.80
as_contiguous_mutMethod · 0.80
flush_rewindMethod · 0.80
reset_readMethod · 0.80
raw_readMethod · 0.80
SomeClass · 0.50
BClass · 0.50
unwrapMethod · 0.45
lenMethod · 0.45
writableMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected