@@ -496,7 +496,7 @@ mod array {
496
496
}
497
497
498
498
macro_rules! impl_array_element {
499
- ( $( ( $t: ty, $f_from: path, $f_swap: path, $totype : ty ) , ) * ) => { $(
499
+ ( $( ( $t: ty, $f_from: path, $f_swap: path, $f_to : path ) , ) * ) => { $(
500
500
impl ArrayElement for $t {
501
501
fn try_into_from_object( vm: & VirtualMachine , obj: PyObjectRef ) -> PyResult <Self > {
502
502
$f_from( vm, obj)
@@ -505,23 +505,28 @@ mod array {
505
505
$f_swap( self )
506
506
}
507
507
fn to_object( self , vm: & VirtualMachine ) -> PyObjectRef {
508
- <$totype> :: from ( self ) . into_object( vm)
508
+ $f_to ( self ) . into_object( vm)
509
509
}
510
510
}
511
511
) * } ;
512
512
}
513
513
514
514
impl_array_element ! (
515
- ( i8 , i8 :: try_from_object, i8 :: swap_bytes, PyInt ) ,
516
- ( u8 , u8 :: try_from_object, u8 :: swap_bytes, PyInt ) ,
517
- ( i16 , i16 :: try_from_object, i16 :: swap_bytes, PyInt ) ,
518
- ( u16 , u16 :: try_from_object, u16 :: swap_bytes, PyInt ) ,
519
- ( i32 , i32 :: try_from_object, i32 :: swap_bytes, PyInt ) ,
520
- ( u32 , u32 :: try_from_object, u32 :: swap_bytes, PyInt ) ,
521
- ( i64 , i64 :: try_from_object, i64 :: swap_bytes, PyInt ) ,
522
- ( u64 , u64 :: try_from_object, u64 :: swap_bytes, PyInt ) ,
523
- ( f32 , f32_try_into_from_object, f32_swap_bytes, PyFloat ) ,
524
- ( f64 , f64_try_into_from_object, f64_swap_bytes, PyFloat ) ,
515
+ ( i8 , i8 :: try_from_object, i8 :: swap_bytes, PyInt :: from) ,
516
+ ( u8 , u8 :: try_from_object, u8 :: swap_bytes, PyInt :: from) ,
517
+ ( i16 , i16 :: try_from_object, i16 :: swap_bytes, PyInt :: from) ,
518
+ ( u16 , u16 :: try_from_object, u16 :: swap_bytes, PyInt :: from) ,
519
+ ( i32 , i32 :: try_from_object, i32 :: swap_bytes, PyInt :: from) ,
520
+ ( u32 , u32 :: try_from_object, u32 :: swap_bytes, PyInt :: from) ,
521
+ ( i64 , i64 :: try_from_object, i64 :: swap_bytes, PyInt :: from) ,
522
+ ( u64 , u64 :: try_from_object, u64 :: swap_bytes, PyInt :: from) ,
523
+ (
524
+ f32 ,
525
+ f32_try_into_from_object,
526
+ f32_swap_bytes,
527
+ pyfloat_from_f32
528
+ ) ,
529
+ ( f64 , f64_try_into_from_object, f64_swap_bytes, PyFloat :: from) ,
525
530
) ;
526
531
527
532
fn f32_swap_bytes ( x : f32 ) -> f32 {
@@ -540,6 +545,10 @@ mod array {
540
545
IntoPyFloat :: try_from_object ( vm, obj) . map ( |x| x. to_f64 ( ) )
541
546
}
542
547
548
+ fn pyfloat_from_f32 ( value : f32 ) -> PyFloat {
549
+ PyFloat :: from ( value as f64 )
550
+ }
551
+
543
552
impl ArrayElement for WideChar {
544
553
fn try_into_from_object ( vm : & VirtualMachine , obj : PyObjectRef ) -> PyResult < Self > {
545
554
PyStrRef :: try_from_object ( vm, obj) ?
@@ -1102,20 +1111,36 @@ mod array {
1102
1111
zelf : PyRef < Self > ,
1103
1112
proto : usize ,
1104
1113
vm : & VirtualMachine ,
1105
- ) -> ( PyTypeRef , PyTupleRef , Option < PyDictRef > ) {
1106
- Self :: reduce ( zelf, vm)
1114
+ ) -> PyResult < ( PyObjectRef , PyTupleRef , Option < PyDictRef > ) > {
1115
+ if proto < 3 {
1116
+ return Ok ( Self :: reduce ( zelf, vm) ) ;
1117
+ }
1118
+ let array = zelf. read ( ) ;
1119
+ let cls = zelf. as_object ( ) . clone_class ( ) . into_object ( ) ;
1120
+ let typecode = vm. ctx . new_str ( array. typecode_str ( ) ) ;
1121
+ let bytes = vm. ctx . new_bytes ( array. get_bytes ( ) . to_vec ( ) ) ;
1122
+ let code = MachineFormatCode :: from_typecode ( array. typecode ( ) ) . unwrap ( ) ;
1123
+ let code = PyInt :: from ( u8:: from ( code) ) . into_object ( vm) ;
1124
+ let module = vm. import ( "array" , None , 0 ) ?;
1125
+ let func = vm. get_attribute ( module, "_array_reconstructor" ) ?;
1126
+ Ok ( (
1127
+ func,
1128
+ PyTupleRef :: with_elements ( vec ! [ cls, typecode, code, bytes] , & vm. ctx ) ,
1129
+ zelf. as_object ( ) . dict ( ) ,
1130
+ ) )
1107
1131
}
1108
1132
1109
1133
#[ pymethod( magic) ]
1110
1134
fn reduce (
1111
1135
zelf : PyRef < Self > ,
1112
1136
vm : & VirtualMachine ,
1113
- ) -> ( PyTypeRef , PyTupleRef , Option < PyDictRef > ) {
1137
+ ) -> ( PyObjectRef , PyTupleRef , Option < PyDictRef > ) {
1114
1138
let array = zelf. read ( ) ;
1115
- let values = vm . ctx . new_list ( array . get_objects ( vm ) ) ;
1139
+ let cls = zelf . as_object ( ) . clone_class ( ) . into_object ( ) ;
1116
1140
let typecode = vm. ctx . new_str ( array. typecode_str ( ) ) ;
1141
+ let values = vm. ctx . new_list ( array. get_objects ( vm) ) ;
1117
1142
(
1118
- zelf . as_object ( ) . clone_class ( ) ,
1143
+ cls ,
1119
1144
PyTupleRef :: with_elements ( vec ! [ typecode, values] , & vm. ctx ) ,
1120
1145
zelf. as_object ( ) . dict ( ) ,
1121
1146
)
0 commit comments