mirror of
https://github.com/python/cpython
synced 2026-09-29 12:10:30 +03:00
gh-109611: Add convenient C API function _PyFile_Flush() (GH-109612)
This commit is contained in:
parent
92af0cc580
commit
b8d1744e7b
11 changed files with 54 additions and 97 deletions
|
|
@ -553,17 +553,14 @@ _io__Buffered_close_impl(buffered *self)
|
|||
}
|
||||
/* flush() will most probably re-take the lock, so drop it first */
|
||||
LEAVE_BUFFERED(self)
|
||||
res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush));
|
||||
r = _PyFile_Flush((PyObject *)self);
|
||||
if (!ENTER_BUFFERED(self)) {
|
||||
return NULL;
|
||||
}
|
||||
PyObject *exc = NULL;
|
||||
if (res == NULL) {
|
||||
if (r < 0) {
|
||||
exc = PyErr_GetRaisedException();
|
||||
}
|
||||
else {
|
||||
Py_DECREF(res);
|
||||
}
|
||||
|
||||
res = PyObject_CallMethodNoArgs(self->raw, &_Py_ID(close));
|
||||
|
||||
|
|
@ -593,12 +590,11 @@ static PyObject *
|
|||
_io__Buffered_detach_impl(buffered *self)
|
||||
/*[clinic end generated code: output=dd0fc057b8b779f7 input=482762a345cc9f44]*/
|
||||
{
|
||||
PyObject *raw, *res;
|
||||
PyObject *raw;
|
||||
CHECK_INITIALIZED(self)
|
||||
res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush));
|
||||
if (res == NULL)
|
||||
if (_PyFile_Flush((PyObject *)self) < 0) {
|
||||
return NULL;
|
||||
Py_DECREF(res);
|
||||
}
|
||||
raw = self->raw;
|
||||
self->raw = NULL;
|
||||
self->detached = 1;
|
||||
|
|
|
|||
|
|
@ -265,7 +265,7 @@ static PyObject *
|
|||
_io__IOBase_close_impl(PyObject *self)
|
||||
/*[clinic end generated code: output=63c6a6f57d783d6d input=f4494d5c31dbc6b7]*/
|
||||
{
|
||||
int rc, closed = iobase_is_closed(self);
|
||||
int rc1, rc2, closed = iobase_is_closed(self);
|
||||
|
||||
if (closed < 0) {
|
||||
return NULL;
|
||||
|
|
@ -274,19 +274,14 @@ _io__IOBase_close_impl(PyObject *self)
|
|||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
PyObject *res = PyObject_CallMethodNoArgs(self, &_Py_ID(flush));
|
||||
|
||||
rc1 = _PyFile_Flush(self);
|
||||
PyObject *exc = PyErr_GetRaisedException();
|
||||
rc = PyObject_SetAttr(self, &_Py_ID(__IOBase_closed), Py_True);
|
||||
rc2 = PyObject_SetAttr(self, &_Py_ID(__IOBase_closed), Py_True);
|
||||
_PyErr_ChainExceptions1(exc);
|
||||
if (rc < 0) {
|
||||
Py_CLEAR(res);
|
||||
if (rc1 < 0 || rc2 < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (res == NULL)
|
||||
return NULL;
|
||||
|
||||
Py_DECREF(res);
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1368,11 +1368,9 @@ _io_TextIOWrapper_reconfigure_impl(textio *self, PyObject *encoding,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush));
|
||||
if (res == NULL) {
|
||||
if (_PyFile_Flush((PyObject *)self) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
Py_DECREF(res);
|
||||
self->b2cratio = 0;
|
||||
|
||||
if (newline_obj != NULL && set_newline(self, newline) < 0) {
|
||||
|
|
@ -1508,12 +1506,11 @@ static PyObject *
|
|||
_io_TextIOWrapper_detach_impl(textio *self)
|
||||
/*[clinic end generated code: output=7ba3715cd032d5f2 input=e5a71fbda9e1d9f9]*/
|
||||
{
|
||||
PyObject *buffer, *res;
|
||||
PyObject *buffer;
|
||||
CHECK_ATTACHED(self);
|
||||
res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush));
|
||||
if (res == NULL)
|
||||
if (_PyFile_Flush((PyObject *)self) < 0) {
|
||||
return NULL;
|
||||
Py_DECREF(res);
|
||||
}
|
||||
buffer = self->buffer;
|
||||
self->buffer = NULL;
|
||||
self->detached = 1;
|
||||
|
|
@ -1713,10 +1710,9 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text)
|
|||
}
|
||||
|
||||
if (needflush) {
|
||||
ret = PyObject_CallMethodNoArgs(self->buffer, &_Py_ID(flush));
|
||||
if (ret == NULL)
|
||||
if (_PyFile_Flush(self->buffer) < 0) {
|
||||
return NULL;
|
||||
Py_DECREF(ret);
|
||||
}
|
||||
}
|
||||
|
||||
textiowrapper_set_decoded_chars(self, NULL);
|
||||
|
|
@ -2502,10 +2498,9 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush));
|
||||
if (res == NULL)
|
||||
if (_PyFile_Flush((PyObject *)self) < 0) {
|
||||
goto fail;
|
||||
Py_DECREF(res);
|
||||
}
|
||||
|
||||
textiowrapper_set_decoded_chars(self, NULL);
|
||||
Py_CLEAR(self->snapshot);
|
||||
|
|
@ -2550,10 +2545,9 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush));
|
||||
if (res == NULL)
|
||||
if (_PyFile_Flush((PyObject *)self) < 0) {
|
||||
goto fail;
|
||||
Py_DECREF(res);
|
||||
}
|
||||
|
||||
/* The strategy of seek() is to go back to the safe start point
|
||||
* and replay the effect of read(chars_to_skip) from there.
|
||||
|
|
@ -2677,10 +2671,9 @@ _io_TextIOWrapper_tell_impl(textio *self)
|
|||
|
||||
if (_textiowrapper_writeflush(self) < 0)
|
||||
return NULL;
|
||||
res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush));
|
||||
if (res == NULL)
|
||||
if (_PyFile_Flush((PyObject *)self) < 0) {
|
||||
goto fail;
|
||||
Py_DECREF(res);
|
||||
}
|
||||
|
||||
posobj = PyObject_CallMethodNoArgs(self->buffer, &_Py_ID(tell));
|
||||
if (posobj == NULL)
|
||||
|
|
@ -2885,14 +2878,11 @@ static PyObject *
|
|||
_io_TextIOWrapper_truncate_impl(textio *self, PyObject *pos)
|
||||
/*[clinic end generated code: output=90ec2afb9bb7745f input=56ec8baa65aea377]*/
|
||||
{
|
||||
PyObject *res;
|
||||
|
||||
CHECK_ATTACHED(self)
|
||||
|
||||
res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush));
|
||||
if (res == NULL)
|
||||
if (_PyFile_Flush((PyObject *)self) < 0) {
|
||||
return NULL;
|
||||
Py_DECREF(res);
|
||||
}
|
||||
|
||||
return PyObject_CallMethodOneArg(self->buffer, &_Py_ID(truncate), pos);
|
||||
}
|
||||
|
|
@ -3076,13 +3066,9 @@ _io_TextIOWrapper_close_impl(textio *self)
|
|||
PyErr_Clear();
|
||||
}
|
||||
}
|
||||
res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(flush));
|
||||
if (res == NULL) {
|
||||
if (_PyFile_Flush((PyObject *)self) < 0) {
|
||||
exc = PyErr_GetRaisedException();
|
||||
}
|
||||
else {
|
||||
Py_DECREF(res);
|
||||
}
|
||||
|
||||
res = PyObject_CallMethodNoArgs(self->buffer, &_Py_ID(close));
|
||||
if (exc != NULL) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue