(
&mut self,
v: Either<Option<&mut Vec<u8>>, PyBuffer>,
buf_range: Range<usize>,
vm: &VirtualMachine,
)
| 1294 | } |
| 1295 | |
| 1296 | fn raw_read( |
| 1297 | &mut self, |
| 1298 | v: Either<Option<&mut Vec<u8>>, PyBuffer>, |
| 1299 | buf_range: Range<usize>, |
| 1300 | vm: &VirtualMachine, |
| 1301 | ) -> PyResult<Option<usize>> { |
| 1302 | let len = buf_range.len(); |
| 1303 | let res = match v { |
| 1304 | Either::A(v) => { |
| 1305 | let v = v.unwrap_or(&mut self.buffer); |
| 1306 | let read_buf = VecBuffer::from(core::mem::take(v)).into_ref(&vm.ctx); |
| 1307 | let mem_obj = PyMemoryView::from_buffer_range( |
| 1308 | read_buf.clone().into_pybuffer(false), |
| 1309 | buf_range, |
| 1310 | vm, |
| 1311 | )? |
| 1312 | .into_ref(&vm.ctx); |
| 1313 | |
| 1314 | // Loop if readinto() raises EINTR (PEP 475) |
| 1315 | let res = loop { |
| 1316 | let res = vm.call_method( |
| 1317 | self.raw.as_ref().unwrap(), |
| 1318 | "readinto", |
| 1319 | (mem_obj.clone(),), |
| 1320 | ); |
| 1321 | match trap_eintr(res, vm) { |
| 1322 | Ok(Some(val)) => break Ok(val), |
| 1323 | Ok(None) => continue, // EINTR, retry |
| 1324 | Err(e) => break Err(e), |
| 1325 | } |
| 1326 | }; |
| 1327 | |
| 1328 | mem_obj.release(); |
| 1329 | // Always restore the buffer, even if an error occurred |
| 1330 | *v = read_buf.take(); |
| 1331 | |
| 1332 | res? |
| 1333 | } |
| 1334 | Either::B(buf) => { |
| 1335 | let mem_obj = |
| 1336 | PyMemoryView::from_buffer_range(buf, buf_range, vm)?.into_ref(&vm.ctx); |
| 1337 | // Loop if readinto() raises EINTR (PEP 475) |
| 1338 | loop { |
| 1339 | let res = vm.call_method( |
| 1340 | self.raw.as_ref().unwrap(), |
| 1341 | "readinto", |
| 1342 | (mem_obj.clone(),), |
| 1343 | ); |
| 1344 | match trap_eintr(res, vm)? { |
| 1345 | Some(val) => break val, |
| 1346 | None => continue, |
| 1347 | } |
| 1348 | } |
| 1349 | } |
| 1350 | }; |
| 1351 | |
| 1352 | if vm.is_none(&res) { |
| 1353 | return Ok(None); |
no test coverage detected