[Python-checkins] r68673 - sandbox/trunk/io-c/_fileio.c
antoine.pitrou
python-checkins at python.org
Sat Jan 17 22:41:56 CET 2009
Author: antoine.pitrou
Date: Sat Jan 17 22:41:56 2009
New Revision: 68673
Log:
Backport some FileIO changes, and fix its name and repr
Modified:
sandbox/trunk/io-c/_fileio.c
Modified: sandbox/trunk/io-c/_fileio.c
==============================================================================
--- sandbox/trunk/io-c/_fileio.c (original)
+++ sandbox/trunk/io-c/_fileio.c Sat Jan 17 22:41:56 2009
@@ -57,20 +57,27 @@
#define PyFileIO_Check(op) (PyObject_TypeCheck((op), &PyFileIO_Type))
-/* Returns 0 on success, errno (which is < 0) on failure. */
+/* Returns 0 on success, -1 with exception set on failure. */
static int
internal_close(PyFileIOObject *self)
{
- int save_errno = 0;
+ int err = 0;
+ int save_errno;
if (self->fd >= 0) {
int fd = self->fd;
self->fd = -1;
Py_BEGIN_ALLOW_THREADS
- if (close(fd) < 0)
+ err = close(fd);
+ if (err < 0)
save_errno = errno;
Py_END_ALLOW_THREADS
}
- return save_errno;
+ if (err < 0) {
+ errno = save_errno;
+ PyErr_SetFromErrno(PyExc_IOError);
+ return -1;
+ }
+ return 0;
}
static PyObject *
@@ -115,7 +122,7 @@
directories, so we need a check. */
static int
-dircheck(PyFileIOObject* self)
+dircheck(PyFileIOObject* self, const char *name)
{
#if defined(HAVE_FSTAT) && defined(S_IFDIR) && defined(EISDIR)
struct stat buf;
@@ -124,10 +131,11 @@
if (fstat(self->fd, &buf) == 0 && S_ISDIR(buf.st_mode)) {
char *msg = strerror(EISDIR);
PyObject *exc;
- internal_close(self);
+ if (internal_close(self))
+ return -1;
- exc = PyObject_CallFunction(PyExc_IOError, "(is)",
- EISDIR, msg);
+ exc = PyObject_CallFunction(PyExc_IOError, "(iss)",
+ EISDIR, msg, name);
PyErr_SetObject(PyExc_IOError, exc);
Py_XDECREF(exc);
return -1;
@@ -301,13 +309,14 @@
Py_END_ALLOW_THREADS
if (self->fd < 0) {
#ifdef MS_WINDOWS
- PyErr_SetFromErrnoWithUnicodeFilename(PyExc_IOError, widename);
-#else
- PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
+ if (widename != NULL)
+ PyErr_SetFromErrnoWithUnicodeFilename(PyExc_IOError, widename);
+ else
#endif
+ PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
goto error;
}
- if(dircheck(self) < 0)
+ if(dircheck(self, name) < 0)
goto error;
}
@@ -330,11 +339,8 @@
PyObject_ClearWeakRefs((PyObject *) self);
if (self->fd >= 0 && self->closefd) {
- errno = internal_close(self);
- if (errno < 0) {
- PySys_WriteStderr("close failed: [Errno %d] %s\n",
- errno, strerror(errno));
- }
+ if(internal_close(self))
+ PyErr_WriteUnraisable((PyObject*)self);
}
Py_CLEAR(self->dict);
@@ -754,9 +760,9 @@
fileio_repr(PyFileIOObject *self)
{
if (self->fd < 0)
- return PyUnicode_FromFormat("_fileio._FileIO(-1)");
+ return PyUnicode_FromFormat("io.FileIO(-1)");
- return PyUnicode_FromFormat("_fileio._FileIO(%d, '%s')",
+ return PyUnicode_FromFormat("io.FileIO(%d, '%s')",
self->fd, mode_string(self));
}
@@ -899,7 +905,7 @@
PyTypeObject PyFileIO_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "_FileIO",
+ "FileIO",
sizeof(PyFileIOObject),
0,
(destructor)fileio_dealloc, /* tp_dealloc */
More information about the Python-checkins
mailing list