(&mut self, vm: &VirtualMachine)
| 1373 | } |
| 1374 | |
| 1375 | fn read_all(&mut self, vm: &VirtualMachine) -> PyResult<Option<PyBytesRef>> { |
| 1376 | let buf = self.active_read_slice(); |
| 1377 | let data = if buf.is_empty() { |
| 1378 | None |
| 1379 | } else { |
| 1380 | let b = buf.to_vec(); |
| 1381 | self.pos += buf.len() as Offset; |
| 1382 | Some(b) |
| 1383 | }; |
| 1384 | |
| 1385 | if self.writable() { |
| 1386 | self.flush_rewind(vm)?; |
| 1387 | } |
| 1388 | |
| 1389 | let readall = vm |
| 1390 | .get_str_method(self.raw.clone().unwrap(), "readall") |
| 1391 | .transpose()?; |
| 1392 | if let Some(readall) = readall { |
| 1393 | let res = readall.call((), vm)?; |
| 1394 | let res = <Option<PyBytesRef>>::try_from_object(vm, res)?; |
| 1395 | let ret = if let Some(mut data) = data { |
| 1396 | if let Some(bytes) = res { |
| 1397 | data.extend_from_slice(bytes.as_bytes()); |
| 1398 | } |
| 1399 | Some(PyBytes::from(data).into_ref(&vm.ctx)) |
| 1400 | } else { |
| 1401 | res |
| 1402 | }; |
| 1403 | return Ok(ret); |
| 1404 | } |
| 1405 | |
| 1406 | let mut chunks = Vec::new(); |
| 1407 | |
| 1408 | let mut read_size = 0; |
| 1409 | loop { |
| 1410 | // Loop with EINTR handling (PEP 475) |
| 1411 | let read_data = loop { |
| 1412 | let res = vm.call_method(self.raw.as_ref().unwrap(), "read", ()); |
| 1413 | match trap_eintr(res, vm)? { |
| 1414 | Some(val) => break val, |
| 1415 | None => continue, |
| 1416 | } |
| 1417 | }; |
| 1418 | let read_data = <Option<PyBytesRef>>::try_from_object(vm, read_data)?; |
| 1419 | |
| 1420 | match read_data { |
| 1421 | Some(b) if !b.as_bytes().is_empty() => { |
| 1422 | let l = b.as_bytes().len(); |
| 1423 | read_size += l; |
| 1424 | if self.abs_pos != -1 { |
| 1425 | self.abs_pos += l as Offset; |
| 1426 | } |
| 1427 | chunks.push(b); |
| 1428 | } |
| 1429 | read_data => { |
| 1430 | let ret = if data.is_none() && read_size == 0 { |
| 1431 | read_data |
| 1432 | } else { |
no test coverage detected