@@ -776,7 +776,14 @@ impl<T: Element> PyArray<T, Ix1> {
776
776
/// });
777
777
/// ```
778
778
pub fn from_exact_iter ( py : Python < ' _ > , iter : impl ExactSizeIterator < Item = T > ) -> & Self {
779
- let array = Self :: new ( py, [ iter. len ( ) ] , false ) ;
779
+ // Use zero-initialized pointers for object arrays
780
+ // so that partially initialized arrays can be dropped safely
781
+ // in case the iterator implementation panics.
782
+ let array = if T :: DATA_TYPE == DataType :: Object {
783
+ Self :: zeros ( py, [ iter. len ( ) ] , false )
784
+ } else {
785
+ Self :: new ( py, [ iter. len ( ) ] , false )
786
+ } ;
780
787
unsafe {
781
788
for ( i, item) in iter. enumerate ( ) {
782
789
* array. uget_mut ( [ i] ) = item;
@@ -804,7 +811,14 @@ impl<T: Element> PyArray<T, Ix1> {
804
811
let iter = iter. into_iter ( ) ;
805
812
let ( min_len, max_len) = iter. size_hint ( ) ;
806
813
let mut capacity = max_len. unwrap_or_else ( || min_len. max ( 512 / mem:: size_of :: < T > ( ) ) ) ;
807
- let array = Self :: new ( py, [ capacity] , false ) ;
814
+ // Use zero-initialized pointers for object arrays
815
+ // so that partially initialized arrays can be dropped safely
816
+ // in case the iterator implementation panics.
817
+ let array = if T :: DATA_TYPE == DataType :: Object {
818
+ Self :: zeros ( py, [ capacity] , false )
819
+ } else {
820
+ Self :: new ( py, [ capacity] , false )
821
+ } ;
808
822
let mut length = 0 ;
809
823
unsafe {
810
824
for ( i, item) in iter. enumerate ( ) {
0 commit comments