@@ -3580,6 +3580,7 @@ array_fromfile_binary(FILE *fp, PyArray_Descr *dtype, npy_intp num, size_t *nrea
3580
3580
{
3581
3581
PyArrayObject * r ;
3582
3582
npy_off_t start , numbytes ;
3583
+ int elsize ;
3583
3584
3584
3585
if (num < 0 ) {
3585
3586
int fail = 0 ;
@@ -3606,16 +3607,21 @@ array_fromfile_binary(FILE *fp, PyArray_Descr *dtype, npy_intp num, size_t *nrea
3606
3607
}
3607
3608
num = numbytes / dtype -> elsize ;
3608
3609
}
3610
+
3611
+ /*
3612
+ * Array creation may move sub-array dimensions from the dtype to array
3613
+ * dimensions, so we need to use the original element size when reading.
3614
+ */
3615
+ elsize = dtype -> elsize ;
3616
+
3609
3617
r = (PyArrayObject * )PyArray_NewFromDescr (& PyArray_Type , dtype , 1 , & num ,
3610
3618
NULL , NULL , 0 , NULL );
3611
3619
if (r == NULL ) {
3612
3620
return NULL ;
3613
3621
}
3614
- /* In some cases NewFromDescr can replace the dtype, so fetch new one */
3615
- dtype = PyArray_DESCR (r );
3616
3622
3617
3623
NPY_BEGIN_ALLOW_THREADS ;
3618
- * nread = fread (PyArray_DATA (r ), dtype -> elsize , num , fp );
3624
+ * nread = fread (PyArray_DATA (r ), elsize , num , fp );
3619
3625
NPY_END_ALLOW_THREADS ;
3620
3626
return r ;
3621
3627
}
@@ -3642,14 +3648,19 @@ array_from_text(PyArray_Descr *dtype, npy_intp num, char *sep, size_t *nread,
3642
3648
3643
3649
size = (num >= 0 ) ? num : FROM_BUFFER_SIZE ;
3644
3650
3651
+ /*
3652
+ * Array creation may move sub-array dimensions from the dtype to array
3653
+ * dimensions, so we need to use the original dtype when reading.
3654
+ */
3655
+ Py_INCREF (dtype );
3656
+
3645
3657
r = (PyArrayObject * )
3646
3658
PyArray_NewFromDescr (& PyArray_Type , dtype , 1 , & size ,
3647
3659
NULL , NULL , 0 , NULL );
3648
3660
if (r == NULL ) {
3661
+ Py_DECREF (dtype );
3649
3662
return NULL ;
3650
3663
}
3651
- /* In some cases NewFromDescr can replace the dtype, so fetch new one */
3652
- dtype = PyArray_DESCR (r );
3653
3664
3654
3665
clean_sep = swab_separator (sep );
3655
3666
if (clean_sep == NULL ) {
@@ -3710,6 +3721,7 @@ array_from_text(PyArray_Descr *dtype, npy_intp num, char *sep, size_t *nread,
3710
3721
if (PyErr_Occurred ()) {
3711
3722
/* If an error is already set (unlikely), do not create new one */
3712
3723
Py_DECREF (r );
3724
+ Py_DECREF (dtype );
3713
3725
return NULL ;
3714
3726
}
3715
3727
/* 2019-09-12, NumPy 1.18 */
@@ -3721,6 +3733,7 @@ array_from_text(PyArray_Descr *dtype, npy_intp num, char *sep, size_t *nread,
3721
3733
}
3722
3734
3723
3735
fail :
3736
+ Py_DECREF (dtype );
3724
3737
if (err == 1 ) {
3725
3738
PyErr_NoMemory ();
3726
3739
}
@@ -3986,14 +3999,19 @@ PyArray_FromString(char *data, npy_intp slen, PyArray_Descr *dtype,
3986
3999
return NULL ;
3987
4000
}
3988
4001
}
4002
+ /*
4003
+ * NewFromDescr may replace dtype to absorb subarray shape
4004
+ * into the array, so get size beforehand.
4005
+ */
4006
+ npy_intp size_to_copy = num * dtype -> elsize ;
3989
4007
ret = (PyArrayObject * )
3990
4008
PyArray_NewFromDescr (& PyArray_Type , dtype ,
3991
4009
1 , & num , NULL , NULL ,
3992
4010
0 , NULL );
3993
4011
if (ret == NULL ) {
3994
4012
return NULL ;
3995
4013
}
3996
- memcpy (PyArray_DATA (ret ), data , num * dtype -> elsize );
4014
+ memcpy (PyArray_DATA (ret ), data , size_to_copy );
3997
4015
}
3998
4016
else {
3999
4017
/* read from character-based string */
0 commit comments