@@ -11,6 +11,7 @@ mod mmap {
11
11
atomic_func,
12
12
builtins:: { PyBytes , PyBytesRef , PyInt , PyIntRef , PyTypeRef } ,
13
13
byte:: { bytes_from_object, value_from_object} ,
14
+ convert:: ToPyException ,
14
15
function:: { ArgBytesLike , FuncArgs , OptionalArg } ,
15
16
protocol:: {
16
17
BufferDescriptor , BufferMethods , PyBuffer , PyMappingMethods , PySequenceMethods ,
@@ -348,9 +349,7 @@ mod mmap {
348
349
349
350
if fd != -1 {
350
351
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) ) ?;
354
353
let file_len: libc:: off_t = metadata. len ( ) . try_into ( ) . expect ( "file size overflow" ) ;
355
354
// File::from_raw_fd will consume the fd, so we
356
355
// have to get it again.
@@ -379,32 +378,23 @@ mod mmap {
379
378
let mut mmap_opt = MmapOptions :: new ( ) ;
380
379
let mmap_opt = mmap_opt. offset ( offset. try_into ( ) . unwrap ( ) ) . len ( map_size) ;
381
380
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) ) ?;
408
398
409
399
let m_obj = Self {
410
400
closed : AtomicCell :: new ( false ) ,
@@ -662,7 +652,7 @@ mod mmap {
662
652
MmapObj :: Read ( _mmap) => { }
663
653
MmapObj :: Write ( mmap) => {
664
654
mmap. flush_range ( offset, size)
665
- . map_err ( |e| vm . new_os_error ( e . to_string ( ) ) ) ?;
655
+ . map_err ( |e| e . to_pyexception ( vm ) ) ?;
666
656
}
667
657
}
668
658
@@ -681,7 +671,7 @@ mod mmap {
681
671
MmapObj :: Read ( mmap) => mmap. advise ( advice) ,
682
672
MmapObj :: Write ( mmap) => mmap. advise ( advice) ,
683
673
}
684
- . map_err ( |e| vm . new_os_error ( e . to_string ( ) ) ) ?;
674
+ . map_err ( |e| e . to_pyexception ( vm ) ) ?;
685
675
686
676
Ok ( ( ) )
687
677
}
@@ -728,7 +718,7 @@ mod mmap {
728
718
let src_buf = mmap[ src..src_end] . to_vec ( ) ;
729
719
( & mut mmap[ dest..dest_end] )
730
720
. write ( & src_buf)
731
- . map_err ( |e| vm . new_os_error ( e . to_string ( ) ) ) ?;
721
+ . map_err ( |e| e . to_pyexception ( vm ) ) ?;
732
722
Ok ( ( ) )
733
723
} ) ?
734
724
}
@@ -867,14 +857,10 @@ mod mmap {
867
857
}
868
858
869
859
#[ 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 ) ?;
872
862
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 ( ) ;
878
864
Ok ( PyInt :: from ( file_len) . into_ref ( & vm. ctx ) )
879
865
}
880
866
@@ -897,7 +883,7 @@ mod mmap {
897
883
let len = self . try_writable ( vm, |mmap| {
898
884
( & mut mmap[ pos..( pos + data. len ( ) ) ] )
899
885
. write ( & data)
900
- . map_err ( |e| vm . new_os_error ( e . to_string ( ) ) ) ?;
886
+ . map_err ( |err| err . to_pyexception ( vm ) ) ?;
901
887
Ok ( data. len ( ) )
902
888
} ) ??;
903
889
@@ -1066,7 +1052,7 @@ mod mmap {
1066
1052
self . try_writable ( vm, |mmap| {
1067
1053
( & mut mmap[ range] )
1068
1054
. write ( & bytes)
1069
- . map_err ( |e| vm . new_os_error ( e . to_string ( ) ) ) ?;
1055
+ . map_err ( |err| err . to_pyexception ( vm ) ) ?;
1070
1056
Ok ( ( ) )
1071
1057
} ) ?
1072
1058
} else {
0 commit comments