(
&mut self,
buf: PyBuffer,
readinto1: bool,
vm: &VirtualMachine,
)
| 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; |
no test coverage detected