summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPauli Virtanen <pav@iki.fi>2010-02-20 18:06:00 +0000
committerPauli Virtanen <pav@iki.fi>2010-02-20 18:06:00 +0000
commitfdf9d7fa476c4717028ea424b0a96fc027dc9971 (patch)
tree1ec4f397f2470c0a9b5d1cf7bfefe38f4761cf94
parent87cf71e97cc256fb6e86c921c0c5d6c54a037910 (diff)
downloadnumpy-fdf9d7fa476c4717028ea424b0a96fc027dc9971.tar.gz
3K: BUG: fix tofile/fromfile on Py3 by dup-ing the file descriptor before fdopening -- works around issues in flushing data
-rw-r--r--numpy/core/src/multiarray/methods.c9
-rw-r--r--numpy/core/src/multiarray/multiarraymodule.c9
-rw-r--r--numpy/core/src/private/npy_3kcompat.h21
3 files changed, 31 insertions, 8 deletions
diff --git a/numpy/core/src/multiarray/methods.c b/numpy/core/src/multiarray/methods.c
index 10b3cc6ee..b2600e962 100644
--- a/numpy/core/src/multiarray/methods.c
+++ b/numpy/core/src/multiarray/methods.c
@@ -498,7 +498,11 @@ array_tofile(PyArrayObject *self, PyObject *args, PyObject *kwds)
else {
Py_INCREF(file);
}
- fd = npy_PyFile_AsFile(file, "wb");
+#if defined(NPY_PY3K)
+ fd = npy_PyFile_Dup(file, "wb");
+#else
+ fd = PyFile_AsFile(file);
+#endif
if (fd == NULL) {
PyErr_SetString(PyExc_IOError, "first argument must be a " \
"string or open file");
@@ -506,6 +510,9 @@ array_tofile(PyArrayObject *self, PyObject *args, PyObject *kwds)
return NULL;
}
ret = PyArray_ToFile(self, fd, sep, format);
+#if defined(NPY_PY3K)
+ fclose(fd);
+#endif
Py_DECREF(file);
if (ret < 0) {
return NULL;
diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c
index c89eade0d..5b8420656 100644
--- a/numpy/core/src/multiarray/multiarraymodule.c
+++ b/numpy/core/src/multiarray/multiarraymodule.c
@@ -1723,7 +1723,11 @@ array_fromfile(PyObject *NPY_UNUSED(ignored), PyObject *args, PyObject *keywds)
else {
Py_INCREF(file);
}
- fp = npy_PyFile_AsFile(file, "rb");
+#if defined(NPY_PY3K)
+ fp = npy_PyFile_Dup(file, "rb");
+#else
+ fp = PyFile_AsFile(file);
+#endif
if (fp == NULL) {
PyErr_SetString(PyExc_IOError,
"first argument must be an open file");
@@ -1734,6 +1738,9 @@ array_fromfile(PyObject *NPY_UNUSED(ignored), PyObject *args, PyObject *keywds)
type = PyArray_DescrFromType(PyArray_DEFAULT);
}
ret = PyArray_FromFile(fp, type, (intp) nin, sep);
+#if defined(NPY_PY3K)
+ fclose(fp);
+#endif
Py_DECREF(file);
return ret;
}
diff --git a/numpy/core/src/private/npy_3kcompat.h b/numpy/core/src/private/npy_3kcompat.h
index b2d085d2f..b7df15294 100644
--- a/numpy/core/src/private/npy_3kcompat.h
+++ b/numpy/core/src/private/npy_3kcompat.h
@@ -134,18 +134,27 @@ PyUnicode_Concat2(PyObject **left, PyObject *right)
*/
#if defined(NPY_PY3K)
static NPY_INLINE FILE*
-npy_PyFile_AsFile(PyObject *file, char *mode)
+npy_PyFile_Dup(PyObject *file, char *mode)
{
- int fd;
+ int fd, fd2;
+ PyObject *ret, *os;
fd = PyObject_AsFileDescriptor(file);
if (fd == -1) {
return NULL;
}
-#warning XXX -- who releases the FILE* returned by fdopen? fclose() closes the file...
- return fdopen(fd, mode);
+ os = PyImport_ImportModule("os");
+ if (os == NULL) {
+ return NULL;
+ }
+ ret = PyObject_CallMethod(os, "dup", "i", fd);
+ Py_DECREF(os);
+ if (ret == NULL) {
+ return NULL;
+ }
+ fd2 = PyNumber_AsSsize_t(ret, NULL);
+ Py_DECREF(ret);
+ return fdopen(fd2, mode);
}
-#else
-#define npy_PyFile_AsFile(file, mode) PyFile_AsFile(file)
#endif
static NPY_INLINE PyObject*