8000 use less vm.new_os_error (#5245) · RustPython/RustPython@39822d7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 39822d7

Browse files
authored
use less vm.new_os_error (#5245)
* vm.new_errno_error * replace new_os_error in mmap * replace posix new_os_error to new_errno_error
1 parent 142d333 commit 39822d7

File tree

3 files changed

+50
-74
lines changed

3 files changed

+50
-74
lines changed

stdlib/src/mmap.rs

Lines changed: 27 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ mod mmap {
1111
atomic_func,
1212
builtins::{PyBytes, PyBytesRef, PyInt, PyIntRef, PyTypeRef},
1313
byte::{bytes_from_object, value_from_object},
14+
convert::ToPyException,
1415
function::{ArgBytesLike, FuncArgs, OptionalArg},
1516
protocol::{
1617
BufferDescriptor, BufferMethods, PyBuffer, PyMappingMethods, PySequenceMethods,
@@ -348,9 +349,7 @@ mod mmap {
348349

349350
if fd != -1 {
350351
let file = unsafe { File::from_raw_fd(fd) };
351-
let metadata = file
352-
.metadata()
353-
.map_err(|e| vm.new_os_error(e.to_string()))?;
352+
let metadata = file.metadata().map_err(|err| err.to_pyexception(vm))?;
354353
let file_len: libc::off_t = metadata.len().try_into().expect("file size overflow");
355354
// File::from_raw_fd will consume the fd, so we
356355
// have to get it again.
@@ -379,32 +378,23 @@ mod mmap {
379378
let mut mmap_opt = MmapOptions::new();
380379
let mmap_opt = mmap_opt.offset(offset.try_into().unwrap()).len(map_size);
381380

382-
let (fd, mmap) = if fd == -1 {
383-
(
384-
fd,
385-
MmapObj::Write(
386-
mmap_opt
387-
.map_anon()
388-
.map_err(|e| vm.new_os_error(e.to_string()))?,
389-
),
390-
)
391-
} else {
392-
let new_fd = unistd::dup(fd).map_err(|e| vm.new_os_error(e.to_string()))?;
393-
let mmap = match access {
394-
AccessMode::Default | AccessMode::Write => MmapObj::Write(
395-
unsafe { mmap_opt.map_mut(fd) }
396-
.map_err(|e| vm.new_os_error(e.to_string()))?,
397-
),
398-
AccessMode::Read => MmapObj::Read(
399-
unsafe { mmap_opt.map(fd) }.map_err(|e| vm.new_os_error(e.to_string()))?,
400-
),
401-
AccessMode::Copy => MmapObj::Write(
402-
unsafe { mmap_opt.map_copy(fd) }
403-
.map_err(|e| vm.new_os_error(e.to_string()))?,
404-
),
405-
};
406-
(new_fd, mmap)
407-
};
381+
let (fd, mmap) = || -> std::io::Result<_> {
382+
if fd == -1 {
383+
let mmap = MmapObj::Write(mmap_opt.map_anon()?);
384+
Ok((fd, mmap))
385+
} else {
386+
let new_fd = unistd::dup(fd)?;
387+
let mmap = match access {
388+
AccessMode::Default | AccessMode::Write => {
389+
MmapObj::Write(unsafe { mmap_opt.map_mut(fd) }?)
390+
}
391+
AccessMode::Read => MmapObj::Read(unsafe { mmap_opt.map(fd) }?),
392+
AccessMode::Copy => MmapObj::Write(unsafe { mmap_opt.map_copy(fd) }?),
393+
};
394+
Ok((new_fd, mmap))
395+
}
396+
}()
397+
.map_err(|e| e.to_pyexception(vm))?;
408398

409399
let m_obj = Self {
410400
closed: AtomicCell::new(false),
@@ -662,7 +652,7 @@ mod mmap {
662652
MmapObj::Read(_mmap) => {}
663653
MmapObj::Write(mmap) => {
664654
mmap.flush_range(offset, size)
665-
.map_err(|e| vm.new_os_error(e.to_string()))?;
655+
.map_err(|e| e.to_pyexception(vm))?;
666656
}
667657
}
668658

@@ -681,7 +671,7 @@ mod mmap {
681671
MmapObj::Read(mmap) => mmap.advise(advice),
682672
MmapObj::Write(mmap) => mmap.advise(advice),
683673
}
684-
.map_err(|e| vm.new_os_error(e.to_string()))?;
674+
.map_err(|e| e.to_pyexception(vm))?;
685675

686676
Ok(())
687677
}
@@ -728,7 +718,7 @@ mod mmap {
728718
let src_buf = mmap[src..src_end].to_vec();
729719
(&mut mmap[dest..dest_end])
730720
.write(&src_buf)
731-
.map_err(|e| vm.new_os_error(e.to_string()))?;
721+
.map_err(|e| e.to_pyexception(vm))?;
732722
Ok(())
733723
})?
734724
}
@@ -867,14 +857,10 @@ mod mmap {
867857
}
868858

869859
#[pymethod]
870-
fn size(&self, vm: &VirtualMachine) -> PyResult<PyIntRef> {
871-
let new_fd = unistd::dup(self.fd).map_err(|e| vm.new_os_error(e.to_string()))?;
860+
fn size(&self, vm: &VirtualMachine) -> std::io::Result<PyIntRef> {
861+
let new_fd = unistd::dup(self.fd)?;
872862
let file = unsafe { File::from_raw_fd(new_fd) };
873-
let file_len = match file.metadata() {
874-
Ok(m) => m.len(),
875-
Err(e) => return Err(vm.new_os_error(e.to_string())),
876-
};
877-
863+
let file_len = file.metadata()?.len();
878864
Ok(PyInt::from(file_len).into_ref(&vm.ctx))
879865
}
880866

@@ -897,7 +883,7 @@ mod mmap {
897883
let len = self.try_writable(vm, |mmap| {
898884
(&mut mmap[pos..(pos + data.len())])
899885
.write(&data)
900-
.map_err(|e| vm.new_os_error(e.to_string()))?;
886+
.map_err(|err| err.to_pyexception(vm))?;
901887
Ok(data.len())
902888
})??;
903889

@@ -1066,7 +1052,7 @@ mod mmap {
10661052
self.try_writable(vm, |mmap| {
10671053
(&mut mmap[range])
10681054
.write(&bytes)
1069-
.map_err(|e| vm.new_os_error(e.to_string()))?;
1055+
.map_err(|err| err.to_pyexception(vm))?;
10701056
Ok(())
10711057
})?
10721058
} else {

vm/src/stdlib/io.rs

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,38 +19,23 @@ pub use _io::io_open as open;
1919

2020
impl ToPyException for std::io::Error {
2121
fn to_pyexception(&self, vm: &VirtualMachine) -> PyBaseExceptionRef {
22-
use std::io::ErrorKind;
23-
24-
let excs = &vm.ctx.exceptions;
25-
#[allow(unreachable_patterns)] // some errors are just aliases of each other
26-
let exc_type = match self.kind() {
27-
ErrorKind::NotFound => excs.file_not_found_error,
28-
ErrorKind::PermissionDenied => excs.permission_error,
29-
ErrorKind::AlreadyExists => excs.file_exists_error,
30-
ErrorKind::WouldBlock => excs.blocking_io_error,
31-
_ => crate::exceptions::errno_to_exc_type(self.posix_errno(), vm)
32-
.unwrap_or(excs.os_error),
33-
};
34-
35-
let errno = self.raw_os_error().unwrap_or(0);
36-
let errno_obj = vm.new_pyobj(errno);
37-
#[cfg(windows)]
38-
let (winerror_obj, errno_obj) = {
39-
let winerror = errno;
40-
let winerror_obj = errno_obj.clone();
41-
let errno = crate::common::os::winerror_to_errno(winerror);
42-
(winerror_obj, vm.new_pyobj(errno))
43-
};
44-
45-
let msg = vm.ctx.new_str(self.to_string()).into();
22+
let errno = self.posix_errno();
23+
let msg = self.to_string();
4624
#[allow(clippy::let_and_return)]
47-
let exc = vm.new_exception(exc_type.to_owned(), vec![errno_obj, msg]);
25+
let exc = vm.new_errno_error(errno, msg);
26+
4827
#[cfg(windows)]
4928
{
50-
// FIXME: manual setup winerror due to lack of OSError.__init__ support
5129
use crate::object::AsObject;
30+
let winerror = if let Some(winerror) = self.raw_os_error() {
31+
vm.new_pyobj(winerror)
32+
} else {
33+
vm.ctx.none()
34+
};
35+
36+
// FIXME: manual setup winerror due to lack of OSError.__init__ support
5237
exc.as_object()
53-
.set_attr("winerror", vm.new_pyobj(winerror_obj), vm)
38+
.set_attr("winerror", vm.new_pyobj(winerror), vm)
5439
.unwrap();
5540
}
5641
exc

vm/src/stdlib/posix.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,14 +1098,16 @@ pub mod module {
10981098

10991099
#[pyfunction]
11001100
fn setgid(gid: Option<Gid>, vm: &VirtualMachine) -> PyResult<()> {
1101-
let gid = gid.ok_or_else(|| vm.new_os_error("Invalid argument".to_string()))?;
1101+
let gid =
1102+
gid.ok_or_else(|| vm.new_errno_error(1, "Operation not permitted".to_string()))?;
11021103
unistd::setgid(gid).map_err(|err| err.into_pyexception(vm))
11031104
}
11041105

11051106
#[cfg(not(target_os = "redox"))]
11061107
#[pyfunction]
11071108
fn setegid(egid: Option<Gid>, vm: &VirtualMachine) -> PyResult<()> {
1108-
let egid = egid.ok_or_else(|| vm.new_os_error("Invalid argument".to_string()))?;
1109+
let egid =
1110+
egid.ok_or_else(|| vm.new_errno_error(1, "Operation not permitted".to_string()))?;
11091111
unistd::setegid(egid).map_err(|err| err.into_pyexception(vm))
11101112
}
11111113

@@ -1160,14 +1162,16 @@ pub mod module {
11601162

11611163
#[pyfunction]
11621164
fn setuid(uid: Option<Uid>, vm: &VirtualMachine) -> PyResult<()> {
1163-
let uid = uid.ok_or_else(|| vm.new_os_error("Invalid argument".to_string()))?;
1165+
let uid =
1166+
uid.ok_or_else(|| vm.new_errno_error(1, "Operation not permitted".to_string()))?;
11641167
unistd::setuid(uid).map_err(|err| err.into_pyexception(vm))
11651168
}
11661169

11671170
#[cfg(not(target_os = "redox"))]
11681171
#[pyfunction]
11691172
fn seteuid(euid: Option<Uid>, vm: &VirtualMachine) -> PyResult<()> {
1170-
let euid = euid.ok_or_else(|| vm.new_os_error("Invalid argument".to_string()))?;
1173+
let euid =
1174+
euid.ok_or_else(|| vm.new_errno_error(1, "Operation not permitted".to_string()))?;
11711175
unistd::seteuid(euid).map_err(|err| err.into_pyexception(vm))
11721176
}
11731177

@@ -1320,7 +1324,8 @@ pub mod module {
13201324
#[pyfunction]
13211325
fn initgroups(user_name: PyStrRef, gid: Option<Gid>, vm: &VirtualMachine) -> PyResult<()> {
13221326
let user = CString::new(user_name.as_str()).unwrap();
1323-
let gid = gid.ok_or_else(|| vm.new_os_error("Invalid argument".to_string()))?;
1327+
let gid =
1328+
gid.ok_or_else(|| vm.new_errno_error(1, "Operation not permitted".to_string()))?;
13241329
unistd::initgroups(&user, gid).map_err(|err| err.into_pyexception(vm))
13251330
}
13261331

@@ -1334,7 +1339,7 @@ pub mod module {
13341339
let gids = group_ids
13351340
.iter(vm)?
13361341
.collect::<Result<Option<Vec<_>>, _>>()?
1337-
.ok_or_else(|| vm.new_os_error("Invalid argument".to_string()))?;
1342+
.ok_or_else(|| vm.new_errno_error(1, "Operation not permitted".to_string()))?;
13381343
let ret = unistd::setgroups(&gids);
13391344
ret.map_err(|err| err.into_pyexception(vm))
13401345
}

0 commit comments

Comments
 (0)
0