@@ -558,17 +558,7 @@ impl PyMemoryView {
558
558
let bytes = & * zelf. obj_bytes ( ) ;
559
559
let elements: Vec < PyObjectRef > = ( 0 ..zelf. options . len )
560
560
. map ( |i| zelf. get_pos ( i as isize ) . unwrap ( ) )
561
- . map ( |i| {
562
- zelf. format_spec
563
- . unpack ( & bytes[ i..i + zelf. options . itemsize ] , vm)
564
- . map ( |x| {
565
- if x. len ( ) == 1 {
566
- x. fast_getitem ( 0 )
567
- } else {
568
- x. into_object ( )
569
- }
570
- } )
571
- } )
561
+ . map ( |i| format_unpack ( & zelf. format_spec , & bytes[ i..i + zelf. options . itemsize ] , vm) )
572
562
. try_collect ( ) ?;
573
563
574
564
Ok ( PyList :: from ( elements) . into_ref ( vm) )
@@ -634,13 +624,15 @@ impl PyMemoryView {
634
624
return Ok ( false ) ;
635
625
}
636
626
637
- let options_cmp = |a : & BufferOptions , b : & BufferOptions | -> bool {
638
- a. len == b. len && a. itemsize == b. itemsize
639
- } ;
640
-
641
627
let other = try_buffer_from_object ( vm, other) ?;
642
628
643
- if !options_cmp ( & zelf. options , & other. get_options ( ) ) {
629
+ let a_options = & zelf. options ;
630
+ let b_options = & * other. get_options ( ) ;
631
+
632
+ if a_options. len != b_options. len
633
+ || a_options. ndim != b_options. ndim
634
+ || a_options. shape != b_options. shape
635
+ {
644
636
return Ok ( false ) ;
645
637
}
646
638
@@ -669,7 +661,14 @@ impl PyMemoryView {
669
661
}
670
662
} ;
671
663
672
- Ok ( a == b)
664
+ if a_options. format == b_options. format {
665
+ Ok ( a == b)
666
+ } else {
667
+ let a_list = unpack_bytes_seq_to_list ( a, & a_options. format , vm) ?;
668
+ let b_list = unpack_bytes_seq_to_list ( b, & b_options. format , vm) ?;
669
+
670
+ Ok ( vm. bool_eq ( a_list. as_object ( ) , b_list. as_object ( ) ) ?)
671
+ }
673
672
}
674
673
}
675
674
@@ -788,3 +787,38 @@ pub fn try_buffer_from_object(vm: &VirtualMachine, obj: &PyObjectRef) -> PyResul
788
787
obj_cls. name
789
788
) ) )
790
789
}
790
+
791
+ fn format_unpack (
792
+ format_spec : & FormatSpec ,
793
+ bytes : & [ u8 ] ,
794
+ vm : & VirtualMachine ,
795
+ ) -> PyResult < PyObjectRef > {
796
+ format_spec. unpack ( bytes, vm) . map ( |x| {
797
+ if x. len ( ) == 1 {
798
+ x. fast_getitem ( 0 )
799
+ } else {
800
+ x. into_object ( )
801
+ }
802
+ } )
803
+ }
804
+
805
+ pub fn unpack_bytes_seq_to_list (
806
+ bytes : & [ u8 ] ,
807
+ format : & str ,
808
+ vm : & VirtualMachine ,
809
+ ) -> PyResult < PyListRef > {
810
+ let format_spec = PyMemoryView :: parse_format ( format, vm) ?;
811
+ let itemsize = format_spec. size ( ) ;
812
+
813
+ if bytes. len ( ) % itemsize != 0 {
814
+ return Err ( vm. new_value_error ( "bytes length not a multiple of item size" . to_owned ( ) ) ) ;
815
+ }
816
+
817
+ let len = bytes. len ( ) / itemsize;
818
+
819
+ let elements: Vec < PyObjectRef > = ( 0 ..len)
820
+ . map ( |i| format_unpack ( & format_spec, & bytes[ i..i + itemsize] , vm) )
821
+ . try_collect ( ) ?;
822
+
823
+ Ok ( PyList :: from ( elements) . into_ref ( vm) )
824
+ }
0 commit comments