Skip to content

Commit a2b3586

Browse files
authored
Merge pull request RustPython#4722 from youknowone/mmap
clean up mmap
2 parents 99b7a5b + ccc8f7e commit a2b3586

File tree

4 files changed

+84
-78
lines changed

4 files changed

+84
-78
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
};
@@ -435,7 +435,7 @@ mod mmap {
435435
ass_subscript: atomic_func!(|mapping, needle, value, vm| {
436436
let zelf = PyMmap::mapping_downcast(mapping);
437437
if let Some(value) = value {
438-
PyMmap::_setitem(zelf.to_owned(), needle, value, vm)
438+
PyMmap::_setitem(zelf, needle, value, vm)
439439
} else {
440440
Err(vm
441441
.new_type_error("mmap object doesn't support item deletion".to_owned()))
@@ -458,7 +458,7 @@ mod mmap {
458458
ass_item: atomic_func!(|seq, i, value, vm| {
459459
let zelf = PyMmap::sequence_downcast(seq);
460460
if let Some(value) = value {
461-
PyMmap::setitem_by_index(zelf.to_owned(), i, value, vm)
461+
PyMmap::setitem_by_index(zelf, i, value, vm)
462462
} else {
463463
Err(vm
464464
.new_type_error("mmap object doesn't support item deletion".to_owned()))
@@ -470,7 +470,10 @@ mod mmap {
470470
}
471471
}
472472

473-
#[pyclass(with(Constructor, AsMapping, AsSequence, AsBuffer), flags(BASETYPE))]
473+
#[pyclass(
474+
with(Constructor, AsMapping, AsSequence, AsBuffer, Representable),
475+
flags(BASETYPE)
476+
)]
474477
impl PyMmap {
475478
fn as_bytes_mut(&self) -> BorrowedValueMut<[u8]> {
476479
PyMutexGuard::map(self.mmap.lock(), |m| {
@@ -558,32 +561,6 @@ mod mmap {
558561
self.closed.load()
559562
}
560563

561-
#[pymethod(magic)]
562-
fn repr(zelf: PyRef<Self>) -> PyResult<String> {
563-
let mmap = zelf.mmap.lock();
564-
565-
if mmap.is_none() {
566-
return Ok("<mmap.mmap closed=True>".to_owned());
567-
}
568-
569-
let access_str = match zelf.access {
570-
AccessMode::Default => "ACCESS_DEFAULT",
571-
AccessMode::Read => "ACCESS_READ",
572-
AccessMode::Write => "ACCESS_WRITE",
573-
AccessMode::Copy => "ACCESS_COPY",
574-
};
575-
576-
let repr = format!(
577-
"<mmap.mmap closed=False, access={}, length={}, pos={}, offset={}>",
578-
access_str,
579-
zelf.len(),
580-
zelf.pos(),
581-
zelf.offset
582-
);
583-
584-
Ok(repr)
585-
}
586-
587564
#[pymethod]
588565
fn close(&self, vm: &VirtualMachine) -> PyResult<()> {
589566
if self.closed() {
@@ -741,9 +718,12 @@ mod mmap {
741718
fn read(&self, n: OptionalArg<PyObjectRef>, vm: &VirtualMachine) -> PyResult<PyBytesRef> {
742719
let num_bytes = n
743720
.map(|obj| {
744-
let name = obj.class().name().to_string();
721+
let class = obj.class().to_owned();
745722
obj.try_into_value::<Option<isize>>(vm).map_err(|_| {
746-
vm.new_type_error(format!("read argument must be int or None, not {name}",))
723+
vm.new_type_error(format!(
724+
"read argument must be int or None, not {}",
725+
class.name()
726+
))
747727
})
748728
})
749729
.transpose()?
@@ -821,7 +801,7 @@ mod mmap {
821801
Ok(result)
822802
}
823803

824-
//TODO: supports resize
804+
// TODO: supports resize
825805
#[pymethod]
826806
fn resize(&self, _newsize: PyIntRef, vm: &VirtualMachine) -> PyResult<()> {
827807
self.check_resizeable(vm)?;
@@ -927,6 +907,34 @@ mod mmap {
927907
Ok(())
928908
}
929909

910+
#[pymethod(magic)]
911+
fn getitem(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<PyObjectRef> {
912+
self._getitem(&needle, vm)
913+
}
914+
915+
#[pymethod(magic)]
916+
fn setitem(
917+
zelf: &Py<Self>,
918+
needle: PyObjectRef,
919+
value: PyObjectRef,
920+
vm: &VirtualMachine,
921+
) -> PyResult<()> {
922+
Self::_setitem(zelf, &needle, value, vm)
923+
}
924+
925+
#[pymethod(magic)]
926+
fn enter(zelf: &Py<Self>, vm: &VirtualMachine) -> PyResult<PyRef<Self>> {
927+
let _m = zelf.check_valid(vm)?;
928+
Ok(zelf.to_owned())
929+
}
930+
931+
#[pymethod(magic)]
932+
fn exit(zelf: &Py<Self>, _args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
933+
zelf.close(vm)
934+
}
935+
}
936+
937+
impl PyMmap {
930938
fn getitem_by_index(&self, i: isize, vm: &VirtualMachine) -> PyResult<PyObjectRef> {
931939
let i = i
932940
.wrapped_at(self.len())
@@ -987,13 +995,8 @@ mod mmap {
987995
}
988996
}
989997

990-
#[pymethod(magic)]
991-
fn getitem(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<PyObjectRef> {
992-
self._getitem(&needle, vm)
993-
}
994-
995998
fn _setitem(
996-
zelf: PyRef<Self>,
999+
zelf: &Py<Self>,
9971000
needle: &PyObject,
9981001
value: PyObjectRef,
9991002
vm: &VirtualMachine,
@@ -1005,31 +1008,31 @@ mod mmap {
10051008
}
10061009

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

10171020
let b = value_from_object(vm, &value)?;
10181021

1019-
zelf.try_writable(vm, |mmap| {
1022+
self.try_writable(vm, |mmap| {
10201023
mmap[i] = b;
10211024
})?;
10221025

10231026
Ok(())
10241027
}
10251028

10261029
fn setitem_by_slice(
1027-
zelf: PyRef<Self>,
1030+
&self,
10281031
slice: &SaturatedSlice,
10291032
value: PyObjectRef,
10301033
vm: &VirtualMachine,
10311034
) -> PyResult<()> {
1032-
let (range, step, slice_len) = slice.adjust_indices(zelf.len());
1035+
let (range, step, slice_len) = slice.adjust_indices(self.len());
10331036

10341037
let bytes = bytes_from_object(vm, &value)?;
10351038

@@ -1041,7 +1044,7 @@ mod mmap {
10411044
// do nothing
10421045
Ok(())
10431046
} else if step == 1 {
1044-
zelf.try_writable(vm, |mmap| {
1047+
self.try_writable(vm, |mmap| {
10451048
(&mut mmap[range])
10461049
.write(&bytes)
10471050
.map_err(|e| vm.new_os_error(e.to_string()))?;
@@ -1051,14 +1054,14 @@ mod mmap {
10511054
let mut bi = 0; // bytes index
10521055
if step.is_negative() {
10531056
for i in range.rev().step_by(step.unsigned_abs()) {
1054-
zelf.try_writable(vm, |mmap| {
1057+
self.try_writable(vm, |mmap| {
10551058
mmap[i] = bytes[bi];
10561059
})?;
10571060
bi += 1;
10581061
}
10591062
} else {
10601063
for i in range.step_by(step.unsigned_abs()) {
1061-
zelf.try_writable(vm, |mmap| {
1064+
self.try_writable(vm, |mmap| {
10621065
mmap[i] = bytes[bi];
10631066
})?;
10641067
bi += 1;
@@ -1067,26 +1070,33 @@ mod mmap {
10671070
Ok(())
10681071
}
10691072
}
1073+
}
10701074

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

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

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

vm/src/builtins/str.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,10 +1653,7 @@ mod tests {
16531653
let translated = text.translate(translated, vm).unwrap();
16541654
assert_eq!(translated, "🎅xda".to_owned());
16551655
let translated = text.translate(vm.ctx.new_int(3).into(), vm);
1656-
assert_eq!(
1657-
translated.unwrap_err().class().name().deref(),
1658-
"TypeError".to_owned()
1659-
);
1656+
assert_eq!("TypeError", &*translated.unwrap_err().class().name(),);
16601657
})
16611658
}
16621659
}

vm/src/cformat.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,12 @@ fn spec_format_bytes(
8484
}
8585
},
8686
CFormatType::Float(_) => {
87-
let type_name = obj.class().name().to_string();
87+
let class = obj.class().to_owned();
8888
let value = ArgIntoFloat::try_from_object(vm, obj).map_err(|e| {
8989
if e.fast_isinstance(vm.ctx.exceptions.type_error) {
9090
// formatfloat in bytesobject.c generates its own specific exception
9191
// text in this case, mirror it here.
92-
vm.new_type_error(format!("float argument required, not {type_name}"))
92+
vm.new_type_error(format!("float argument required, not {}", class.name()))
9393
} else {
9494
e
9595
}

vm/src/object/core.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -611,14 +611,13 @@ impl PyObject {
611611
None
612612
};
613613
let cls_is_weakref = typ.is(vm.ctx.types.weakref_type);
614-
self.weak_ref_list()
615-
.map(|wrl| wrl.add(self, typ, cls_is_weakref, callback, dict))
616-
.ok_or_else(|| {
617-
vm.new_type_error(format!(
618-
"cannot create weak reference to '{}' object",
619-
self.class().name()
620-
))
621-
})
614+
let wrl = self.weak_ref_list().ok_or_else(|| {
615+
vm.new_type_error(format!(
616+
"cannot create weak reference to '{}' object",
617+
self.class().name()
618+
))
619+
})?;
620+
Ok(wrl.add(self, typ, cls_is_weakref, callback, dict))
622621
}
623622

624623
pub fn downgrade(

0 commit comments

Comments
 (0)