@@ -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}
0 commit comments