@@ -23,6 +23,7 @@ use crossbeam_utils::atomic::AtomicCell;
23
23
use itertools:: Itertools ;
24
24
use num_bigint:: BigInt ;
25
25
use num_traits:: { One , Signed , ToPrimitive , Zero } ;
26
+ use rustpython_common:: borrow:: BorrowValue ;
26
27
27
28
#[ derive( Debug ) ]
28
29
pub struct BufferRef ( Box < dyn Buffer > ) ;
@@ -654,6 +655,7 @@ impl PyMemoryView {
654
655
fn toreadonly ( zelf : PyRef < Self > , vm : & VirtualMachine ) -> PyResult < PyRef < Self > > {
655
656
zelf. try_not_released ( vm) ?;
656
657
let buffer = BufferRef ( Box :: new ( zelf. clone ( ) ) ) ;
658
+ zelf. exports . fetch_add ( 1 ) ;
657
659
Ok ( PyMemoryView {
658
660
obj : zelf. obj . clone ( ) ,
659
661
buffer,
@@ -703,6 +705,48 @@ impl PyMemoryView {
703
705
bytes_to_hex ( bytes, sep, bytes_per_sep, vm)
704
706
}
705
707
708
+ // TODO: support cast shape
709
+ #[ pymethod]
710
+ fn cast ( zelf : PyRef < Self > , format : PyStrRef , vm : & VirtualMachine ) -> PyResult < PyRef < Self > > {
711
+ zelf. try_not_released ( vm) ?;
712
+ if !zelf. options . contiguous {
713
+ return Err ( vm. new_type_error (
714
+ "memoryview: casts are restricted to C-contiguous views" . to_owned ( ) ,
715
+ ) ) ;
716
+ }
717
+
718
+ let format_spec = Self :: parse_format ( format. borrow_value ( ) , vm) ?;
719
+ let itemsize = format_spec. size ( ) ;
720
+ let bytelen = zelf. options . len * zelf. options . itemsize ;
721
+
722
+ if bytelen % itemsize != 0 {
723
+ return Err (
724
+ vm. new_type_error ( "memoryview: length is not a multiple of itemsize" . to_owned ( ) )
725
+ ) ;
726
+ }
727
+
728
+ let buffer = BufferRef ( Box :: new ( zelf. clone ( ) ) ) ;
729
+ zelf. exports . fetch_add ( 1 ) ;
730
+
731
+ Ok ( PyMemoryView {
732
+ obj : zelf. obj . clone ( ) ,
733
+ buffer,
734
+ options : BufferOptions {
735
+ itemsize,
736
+ len : bytelen / itemsize,
737
+ format : format. to_string ( ) . into ( ) ,
738
+ ..zelf. options . clone ( )
739
+ } ,
740
+ released : AtomicCell :: new ( false ) ,
741
+ stop : zelf. stop + itemsize - zelf. options . itemsize ,
742
+ exports : AtomicCell :: new ( 0 ) ,
743
+ format_spec,
744
+ hash : OnceCell :: new ( ) ,
745
+ ..* zelf
746
+ }
747
+ . into_ref ( vm) )
748
+ }
749
+
706
750
fn eq ( zelf : & PyRef < Self > , other : & PyObjectRef , vm : & VirtualMachine ) -> PyResult < bool > {
707
751
if zelf. is ( other) {
708
752
return Ok ( true ) ;
0 commit comments