summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Berg <sebastianb@nvidia.com>2023-05-16 10:54:57 +0200
committerSebastian Berg <sebastianb@nvidia.com>2023-05-16 10:54:57 +0200
commit1c1779490376077b8fef643f65222bb4834567b1 (patch)
tree46f2907f9402d6e9cf4908fe03c02c431adb2a4a
parent40426744f9dedab3e03997bb916abdeaa69667b0 (diff)
downloadnumpy-1c1779490376077b8fef643f65222bb4834567b1.tar.gz
MAINT: Use fwrite chunking generally on Windows 64 and size_t as type
This is a bit too broad because msys UCRT runtime may actually not need it. Changes the type in the loop to `size_t`. This is not necessary but the current constants are buggy without it if the branch is accidentally used on 32bit.
-rw-r--r--numpy/core/src/multiarray/convert.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/numpy/core/src/multiarray/convert.c b/numpy/core/src/multiarray/convert.c
index 565cce773..8a6b517a4 100644
--- a/numpy/core/src/multiarray/convert.c
+++ b/numpy/core/src/multiarray/convert.c
@@ -157,9 +157,12 @@ PyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format)
size = PyArray_SIZE(self);
NPY_BEGIN_ALLOW_THREADS;
-#if defined(_MSC_VER) && defined(_WIN64) || \
- defined(__MINGW32__) || defined(__MINGW64__)
- /* Workaround Win64 fwrite() bug. Issue gh-2256
+#if defined(NPY_OS_WIN64)
+ /*
+ * Workaround Win64 fwrite() bug. Issue gh-2256
+ * The native 64 windows runtime has this issue, the above will
+ * also trigger UCRT (which doesn't), so it could be more precise.
+ *
* If you touch this code, please run this test which is so slow
* it was removed from the test suite. Note that the original
* failure mode involves an infinite loop during tofile()
@@ -181,8 +184,8 @@ PyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format)
* assert_((a[-n:] == testbytes).all())
*/
{
- npy_intp maxsize = 2147483648 / PyArray_DESCR(self)->elsize;
- npy_intp chunksize;
+ size_t maxsize = 2147483648 / (size_t)PyArray_DESCR(self)->elsize;
+ size_t chunksize;
n = 0;
while (size > 0) {
@@ -190,7 +193,7 @@ PyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format)
n2 = fwrite((const void *)
((char *)PyArray_DATA(self) + (n * PyArray_DESCR(self)->elsize)),
(size_t) PyArray_DESCR(self)->elsize,
- (size_t) chunksize, fp);
+ chunksize, fp);
if (n2 < chunksize) {
break;
}