Skip to content

Commit 8d38bf8

Browse files
committed
clean up mmap
1 parent 4fba939 commit 8d38bf8

File tree

1 file changed

+74
-64
lines changed

1 file changed

+74
-64
lines changed

stdlib/src/mmap.rs

Lines changed: 74 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ mod mmap {
1616
BufferDescriptor, BufferMethods, PyBuffer, PyMappingMethods, PySequenceMethods,
1717
},
1818
sliceable::{SaturatedSlice, SequenceIndex, SequenceIndexOp},
19-
types::{AsBuffer, AsMapping, AsSequence, Constructor},
19+
types::{AsBuffer, AsMapping, AsSequence, Constructor, Representable},
2020
AsObject, FromArgs, Py, PyObject, PyObjectRef, PyPayload, PyRef, PyResult,
2121
TryFromBorrowedObject, VirtualMachine,
2222
};
@@ -433,7 +433,7 @@ mod mmap {
433433
ass_subscript: atomic_func!(|mapping, needle, value, vm| {
434434
let zelf = PyMmap::mapping_downcast(mapping);
435435
if let Some(value) = value {
436-
PyMmap::_setitem(zelf.to_owned(), needle, value, vm)
436+
PyMmap::_setitem(zelf, needle, value, vm)
437437
} else {
438438
Err(vm
439439
.new_type_error("mmap object doesn't support item deletion".to_owned()))
@@ -456,7 +456,7 @@ mod mmap {
456456
ass_item: atomic_func!(|seq, i, value, vm| {
457457
let zelf = PyMmap::sequence_downcast(seq);
458458
if let Some(value) = value {
459-
PyMmap::setitem_by_index(zelf.to_owned(), i, value, vm)
459+
PyMmap::setitem_by_index(zelf, i, value, vm)
460460
} else {
461461
Err(vm
462462
.new_type_error("mmap object doesn't support item deletion".to_owned()))
@@ -468,7 +468,10 @@ mod mmap {
468468
}
469469
}
470470

471-
#[pyclass(with(Constructor, AsMapping, AsSequence, AsBuffer), flags(BASETYPE))]
471+
#[pyclass(
472+
with(Constructor, AsMapping, AsSequence, AsBuffer, Representable),
473+
flags(BASETYPE)
474+
)]
472475
impl PyMmap {
473476
fn as_bytes_mut(&self) -> BorrowedValueMut<[u8]> {
474477
PyMutexGuard::map(self.mmap.lock(), |m| {
@@ -556,32 +559,6 @@ mod mmap {
556559
self.closed.load()
557560
}
558561

559-
#[pymethod(magic)]
560-
fn repr(zelf: PyRef<Self>) -> PyResult<String> {
561-
let mmap = zelf.mmap.lock();
562-
563-
if mmap.is_none() {
564-
return Ok("<mmap.mmap closed=True>".to_owned());
565-
}
566-
567-
let access_str = match zelf.access {
568-
AccessMode::Default => "ACCESS_DEFAULT",
569-
AccessMode::Read => "ACCESS_READ",
570-
AccessMode::Write => "ACCESS_WRITE",
571-
AccessMode::Copy => "ACCESS_COPY",
572-
};
573-
574-
let repr = format!(
575-
"<mmap.mmap closed=False, access={}, length={}, pos={}, offset={}>",
576-
access_str,
577-
zelf.len(),
578-
zelf.pos(),
579-
zelf.offset
580-
);
581-
582-
Ok(repr)
583-
}
584-
585562
#[pymethod]
586563
fn close(&self, vm: &VirtualMachine) -> PyResult<()> {
587564
if self.closed() {
@@ -738,9 +715,12 @@ mod mmap {
738715
fn read(&self, n: OptionalArg<PyObjectRef>, vm: &VirtualMachine) -> PyResult<PyBytesRef> {
739716
let num_bytes = n
740717
.map(|obj| {
741-
let name = obj.class().name().to_string();
718+
let class = obj.class().to_owned();
742719
obj.try_into_value::<Option<isize>>(vm).map_err(|_| {
743-
vm.new_type_error(format!("read argument must be int or None, not {name}",))
720+
vm.new_type_error(format!(
721+
"read argument must be int or None, not {}",
722+
class.name()
723+
))
744724
})
745725
})
746726
.transpose()?
@@ -818,7 +798,7 @@ mod mmap {
818798
Ok(result)
819799
}
820800

821-
//TODO: supports resize
801+
// TODO: supports resize
822802
#[pymethod]
823803
fn resize(&self, _newsize: PyIntRef, vm: &VirtualMachine) -> PyResult<()> {
824804
self.check_resizeable(vm)?;
@@ -924,6 +904,34 @@ mod mmap {
924904
Ok(())
925905
}
926906

907+
#[pymethod(magic)]
908+
fn getitem(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<PyObjectRef> {
909+
self._getitem(&needle, vm)
910+
}
911+
912+
#[pymethod(magic)]
913+
fn setitem(
914+
zelf: &Py<Self>,
915+
needle: PyObjectRef,
916+
value: PyObjectRef,
917+
vm: &VirtualMachine,
918+
) -> PyResult<()> {
919+
Self::_setitem(zelf, &needle, value, vm)
920+
}
921+
922+
#[pymethod(magic)]
923+
fn enter(zelf: &Py<Self>, vm: &VirtualMachine) -> PyResult<PyRef<Self>> {
924+
let _m = zelf.check_valid(vm)?;
925+
Ok(zelf.to_owned())
926+
}
927+
928+
#[pymethod(magic)]
929+
fn exit(zelf: &Py<Self>, _args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
930+
zelf.close(vm)
931+
}
932+
}
933+
934+
impl PyMmap {
927935
fn getitem_by_index(&self, i: isize, vm: &VirtualMachine) -> PyResult<PyObjectRef> {
928936
let i = i
929937
.wrapped_at(self.len())
@@ -984,13 +992,8 @@ mod mmap {
984992
}
985993
}
986994

987-
#[pymethod(magic)]
988-
fn getitem(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<PyObjectRef> {
989-
self._getitem(&needle, vm)
990-
}
991-
992995
fn _setitem(
993-
zelf: PyRef<Self>,
996+
zelf: &Py<Self>,
994997
needle: &PyObject,
995998
value: PyObjectRef,
996999
vm: &VirtualMachine,
@@ -1002,31 +1005,31 @@ mod mmap {
10021005
}
10031006

10041007
fn setitem_by_index(
1005-
zelf: PyRef<Self>,
1008+
&self,
10061009
i: isize,
10071010
value: PyObjectRef,
10081011
vm: &VirtualMachine,
10091012
) -> PyResult<()> {
10101013
let i: usize = i
1011-
.wrapped_at(zelf.len())
1014+
.wrapped_at(self.len())
10121015
.ok_or_else(|| vm.new_index_error("mmap index out of range".to_owned()))?;
10131016

10141017
let b = value_from_object(vm, &value)?;
10151018

1016-
zelf.try_writable(vm, |mmap| {
1019+
self.try_writable(vm, |mmap| {
10171020
mmap[i] = b;
10181021
})?;
10191022

10201023
Ok(())
10211024
}
10221025

10231026
fn setitem_by_slice(
1024-
zelf: PyRef<Self>,
1027+
&self,
10251028
slice: &SaturatedSlice,
10261029
value: PyObjectRef,
10271030
vm: &VirtualMachine,
10281031
) -> PyResult<()> {
1029-
let (range, step, slice_len) = slice.adjust_indices(zelf.len());
1032+
let (range, step, slice_len) = slice.adjust_indices(self.len());
10301033

10311034
let bytes = bytes_from_object(vm, &value)?;
10321035

@@ -1038,7 +1041,7 @@ mod mmap {
10381041
// do nothing
10391042
Ok(())
10401043
} else if step == 1 {
1041-
zelf.try_writable(vm, |mmap| {
1044+
self.try_writable(vm, |mmap| {
10421045
(&mut mmap[range])
10431046
.write(&bytes)
10441047
.map_err(|e| vm.new_os_error(e.to_string()))?;
@@ -1048,14 +1051,14 @@ mod mmap {
10481051
let mut bi = 0; // bytes index
10491052
if step.is_negative() {
10501053
for i in range.rev().step_by(step.unsigned_abs()) {
1051-
zelf.try_writable(vm, |mmap| {
1054+
self.try_writable(vm, |mmap| {
10521055
mmap[i] = bytes[bi];
10531056
})?;
10541057
bi += 1;
10551058
}
10561059
} else {
10571060
for i in range.step_by(step.unsigned_abs()) {
1058-
zelf.try_writable(vm, |mmap| {
1061+
self.try_writable(vm, |mmap| {
10591062
mmap[i] = bytes[bi];
10601063
})?;
10611064
bi += 1;
@@ -1064,26 +1067,33 @@ mod mmap {
10641067
Ok(())
10651068
}
10661069
}
1070+
}
10671071

1068-
#[pymethod(magic)]
1069-
fn setitem(
1070-
zelf: PyRef<Self>,
1071-
needle: PyObjectRef,
1072-
value: PyObjectRef,
1073-
vm: &VirtualMachine,
1074-
) -> PyResult<()> {
1075-
Self::_setitem(zelf, &needle, value, vm)
1076-
}
1072+
impl Representable for PyMmap {
1073+
#[inline]
1074+
fn repr_str(zelf: &Py<Self>, _vm: &VirtualMachine) -> PyResult<String> {
1075+
let mmap = zelf.mmap.lock();
10771076

1078-
#[pymethod(magic)]
1079-
fn enter(zelf: PyRef<Self>, vm: &VirtualMachine) -> PyResult<PyRef<Self>> {
1080-
let _m = zelf.check_valid(vm)?;
1081-
Ok(zelf.to_owned())
1082-
}
1077+
if mmap.is_none() {
1078+
return Ok("<mmap.mmap closed=True>".to_owned());
1079+
}
10831080

1084-
#[pymethod(magic)]
1085-
fn exit(zelf: PyRef<Self>, _args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
1086-
zelf.close(vm)
1081+
let access_str = match zelf.access {
1082+
AccessMode::Default => "ACCESS_DEFAULT",
1083+
AccessMode::Read => "ACCESS_READ",
1084+
AccessMode::Write => "ACCESS_WRITE",
1085+
AccessMode::Copy => "ACCESS_COPY",
1086+
};
1087+
1088+
let repr = format!(
1089+
"<mmap.mmap closed=False, access={}, length={}, pos={}, offset={}>",
1090+
access_str,
1091+
zelf.len(),
1092+
zelf.pos(),
1093+
zelf.offset
1094+
);
1095+
1096+
Ok(repr)
10871097
}
10881098
}
10891099
}

0 commit comments

Comments
 (0)