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

Method raw_read

crates/vm/src/stdlib/_io.rs:1296–1373  ·  view source on GitHub ↗
(
            &mut self,
            v: Either<Option<&mut Vec<u8>>, PyBuffer>,
            buf_range: Range<usize>,
            vm: &VirtualMachine,
        )

Source from the content-addressed store, hash-verified

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);

Callers 4

read_genericMethod · 0.80
fill_bufferMethod · 0.80
readinto_genericMethod · 0.80
read1Method · 0.80

Calls 15

takeFunction · 0.85
trap_eintrFunction · 0.85
into_pybufferMethod · 0.80
new_os_errorMethod · 0.80
set___cause__Method · 0.80
ErrClass · 0.50
SomeClass · 0.50
lenMethod · 0.45
into_refMethod · 0.45
cloneMethod · 0.45
call_methodMethod · 0.45
unwrapMethod · 0.45

Tested by

no test coverage detected