@@ -804,21 +804,53 @@ mod array {
804804 }
805805 }
806806
807- #[ pymethod]
808- fn frombytes ( zelf : PyRef < Self > , b : ArgBytesLike , vm : & VirtualMachine ) -> PyResult < ( ) > {
809- let b = b. borrow_buf ( ) ;
810- let itemsize = zelf. read ( ) . itemsize ( ) ;
807+ fn _from_bytes ( & self , b : & [ u8 ] , itemsize : usize , vm : & VirtualMachine ) -> PyResult < ( ) > {
811808 if b. len ( ) % itemsize != 0 {
812809 return Err (
813810 vm. new_value_error ( "bytes length not a multiple of item size" . to_owned ( ) )
814811 ) ;
815812 }
816813 if b. len ( ) / itemsize > 0 {
817- zelf . try_resizable ( vm) ?. frombytes ( & b) ;
814+ self . try_resizable ( vm) ?. frombytes ( b) ;
818815 }
819816 Ok ( ( ) )
820817 }
821818
819+ #[ pymethod]
820+ fn frombytes ( & self , b : ArgBytesLike , vm : & VirtualMachine ) -> PyResult < ( ) > {
821+ let b = b. borrow_buf ( ) ;
822+ let itemsize = self . read ( ) . itemsize ( ) ;
823+ self . _from_bytes ( & b, itemsize, vm)
824+ }
825+
826+ #[ pymethod]
827+ fn fromfile ( & self , f : PyObjectRef , n : isize , vm : & VirtualMachine ) -> PyResult < ( ) > {
828+ let itemsize = self . itemsize ( ) ;
829+ if n < 0 {
830+ return Err ( vm. new_value_error ( "negative count" . to_owned ( ) ) ) ;
831+ }
832+ let n = vm. check_repeat_or_memory_error ( itemsize, n) ?;
833+ let nbytes = n * itemsize;
834+
835+ let b = vm. call_method ( & f, "read" , ( nbytes, ) ) ?;
836+ let b = b
837+ . downcast :: < PyBytes > ( )
838+ . map_err ( |_| vm. new_type_error ( "read() didn't return bytes" . to_owned ( ) ) ) ?;
839+
840+ let not_enough_bytes = b. len ( ) != nbytes;
841+
842+ self . _from_bytes ( b. as_bytes ( ) , itemsize, vm) ?;
843+
844+ if not_enough_bytes {
845+ Err ( vm. new_exception_msg (
846+ vm. ctx . exceptions . eof_error . clone ( ) ,
847+ "read() didn't return enough bytes" . to_owned ( ) ,
848+ ) )
849+ } else {
850+ Ok ( ( ) )
851+ }
852+ }
853+
822854 #[ pymethod]
823855 fn byteswap ( & self ) {
824856 self . write ( ) . byteswap ( ) ;
0 commit comments