diff options
Diffstat (limited to 'Modules/_io/textio.c')
-rw-r--r-- | Modules/_io/textio.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 89d922c..b039c2f 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -2398,16 +2398,30 @@ static PyObject * textiowrapper_close(textio *self, PyObject *args) { PyObject *res; + int r; CHECK_INITIALIZED(self); - res = PyObject_CallMethod((PyObject *)self, "flush", NULL); - if (res == NULL) { - /* If flush() fails, just give up */ - PyErr_Clear(); + + res = textiowrapper_closed_get(self, NULL); + if (res == NULL) + return NULL; + r = PyObject_IsTrue(res); + Py_DECREF(res); + if (r < 0) + return NULL; + + if (r > 0) { + Py_RETURN_NONE; /* stream already closed */ } - else - Py_DECREF(res); + else { + res = PyObject_CallMethod((PyObject *)self, "flush", NULL); + if (res == NULL) { + return NULL; + } + else + Py_DECREF(res); - return PyObject_CallMethod(self->buffer, "close", NULL); + return PyObject_CallMethod(self->buffer, "close", NULL); + } } static PyObject * |