@@ -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