gh-109611: Add convenient C API function _PyFile_Flush() (GH-109612)

This commit is contained in:
Serhiy Storchaka 2023-09-23 09:35:30 +03:00 committed by GitHub
parent 92af0cc580
commit b8d1744e7b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 54 additions and 97 deletions

View file

@ -2083,11 +2083,9 @@ builtin_print_impl(PyObject *module, PyObject *args, PyObject *sep,
}
if (flush) {
PyObject *tmp = PyObject_CallMethodNoArgs(file, &_Py_ID(flush));
if (tmp == NULL) {
if (_PyFile_Flush(file) < 0) {
return NULL;
}
Py_DECREF(tmp);
}
Py_RETURN_NONE;
@ -2146,11 +2144,9 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
}
/* First of all, flush stderr */
tmp = PyObject_CallMethodNoArgs(ferr, &_Py_ID(flush));
if (tmp == NULL)
if (_PyFile_Flush(ferr) < 0) {
PyErr_Clear();
else
Py_DECREF(tmp);
}
/* We should only use (GNU) readline if Python's sys.stdin and
sys.stdout are the same as C's stdin and stdout, because we
@ -2218,11 +2214,9 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
if (stdin_errors_str == NULL) {
goto _readline_errors;
}
tmp = PyObject_CallMethodNoArgs(fout, &_Py_ID(flush));
if (tmp == NULL)
if (_PyFile_Flush(fout) < 0) {
PyErr_Clear();
else
Py_DECREF(tmp);
}
if (prompt != NULL) {
/* We have a prompt, encode it as stdout would */
const char *stdout_encoding_str, *stdout_errors_str;
@ -2325,11 +2319,9 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
if (PyFile_WriteObject(prompt, fout, Py_PRINT_RAW) != 0)
return NULL;
}
tmp = PyObject_CallMethodNoArgs(fout, &_Py_ID(flush));
if (tmp == NULL)
if (_PyFile_Flush(fout) < 0) {
PyErr_Clear();
else
Py_DECREF(tmp);
}
return PyFile_GetLine(fin, -1);
}