gh-116646, AC: Always use PyObject_AsFileDescriptor() in fildes (#116806)

The fildes converter of Argument Clinic now always call
PyObject_AsFileDescriptor(), not only for the limited C API.

The _PyLong_FileDescriptor_Converter() converter stays as a fallback
when PyObject_AsFileDescriptor() cannot be used.
This commit is contained in:
Victor Stinner 2024-03-14 14:58:07 +01:00 committed by GitHub
parent 2a54c4b25e
commit a76288ad9b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 74 additions and 48 deletions

View file

@ -7,7 +7,6 @@ preserve
# include "pycore_runtime.h" // _Py_ID()
#endif
#include "pycore_abstract.h" // _PyNumber_Index()
#include "pycore_fileutils.h" // _PyLong_FileDescriptor_Converter()
#include "pycore_long.h" // _PyLong_UnsignedInt_Converter()
#include "pycore_modsupport.h" // _PyArg_UnpackKeywords()
@ -481,7 +480,8 @@ os_fchdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k
if (!args) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
return_value = os_fchdir_impl(module, fd);
@ -1024,7 +1024,8 @@ os_fsync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw
if (!args) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
return_value = os_fsync_impl(module, fd);
@ -1107,7 +1108,8 @@ os_fdatasync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject
if (!args) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
return_value = os_fdatasync_impl(module, fd);
@ -4531,7 +4533,8 @@ os_grantpt(PyObject *module, PyObject *arg)
PyObject *return_value = NULL;
int fd;
if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
fd = PyObject_AsFileDescriptor(arg);
if (fd < 0) {
goto exit;
}
return_value = os_grantpt_impl(module, fd);
@ -4567,7 +4570,8 @@ os_unlockpt(PyObject *module, PyObject *arg)
PyObject *return_value = NULL;
int fd;
if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
fd = PyObject_AsFileDescriptor(arg);
if (fd < 0) {
goto exit;
}
return_value = os_unlockpt_impl(module, fd);
@ -4604,7 +4608,8 @@ os_ptsname(PyObject *module, PyObject *arg)
PyObject *return_value = NULL;
int fd;
if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
fd = PyObject_AsFileDescriptor(arg);
if (fd < 0) {
goto exit;
}
return_value = os_ptsname_impl(module, fd);
@ -4664,7 +4669,8 @@ os_login_tty(PyObject *module, PyObject *arg)
PyObject *return_value = NULL;
int fd;
if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
fd = PyObject_AsFileDescriptor(arg);
if (fd < 0) {
goto exit;
}
return_value = os_login_tty_impl(module, fd);
@ -5881,7 +5887,8 @@ os_setns(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw
if (!args) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
if (!noptargs) {
@ -6322,7 +6329,8 @@ os_timerfd_settime(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py
if (!args) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
if (!noptargs) {
@ -6435,7 +6443,8 @@ os_timerfd_settime_ns(PyObject *module, PyObject *const *args, Py_ssize_t nargs,
if (!args) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
if (!noptargs) {
@ -6495,7 +6504,8 @@ os_timerfd_gettime(PyObject *module, PyObject *arg)
PyObject *return_value = NULL;
int fd;
if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
fd = PyObject_AsFileDescriptor(arg);
if (fd < 0) {
goto exit;
}
return_value = os_timerfd_gettime_impl(module, fd);
@ -6529,7 +6539,8 @@ os_timerfd_gettime_ns(PyObject *module, PyObject *arg)
PyObject *return_value = NULL;
int fd;
if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
fd = PyObject_AsFileDescriptor(arg);
if (fd < 0) {
goto exit;
}
return_value = os_timerfd_gettime_ns_impl(module, fd);
@ -9691,7 +9702,8 @@ os_fpathconf(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("fpathconf", nargs, 2, 2)) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
if (!conv_path_confname(args[1], &name)) {
@ -10834,7 +10846,8 @@ os_eventfd_read(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj
if (!args) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
return_value = os_eventfd_read_impl(module, fd);
@ -10896,7 +10909,8 @@ os_eventfd_write(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb
if (!args) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
if (!_PyLong_UnsignedLongLong_Converter(args[1], &value)) {
@ -12588,4 +12602,4 @@ os__supports_virtual_terminal(PyObject *module, PyObject *Py_UNUSED(ignored))
#ifndef OS__SUPPORTS_VIRTUAL_TERMINAL_METHODDEF
#define OS__SUPPORTS_VIRTUAL_TERMINAL_METHODDEF
#endif /* !defined(OS__SUPPORTS_VIRTUAL_TERMINAL_METHODDEF) */
/*[clinic end generated code: output=2965306970f31c5d input=a9049054013a1b77]*/
/*[clinic end generated code: output=511f0788a6b90db0 input=a9049054013a1b77]*/

View file

@ -6,7 +6,6 @@ preserve
# include "pycore_gc.h" // PyGC_Head
# include "pycore_runtime.h" // _Py_ID()
#endif
#include "pycore_fileutils.h" // _PyLong_FileDescriptor_Converter()
#include "pycore_long.h" // _PyLong_UnsignedShort_Converter()
#include "pycore_modsupport.h" // _PyArg_CheckPositional()
@ -100,7 +99,8 @@ select_poll_register(pollObject *self, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("register", nargs, 1, 2)) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
if (nargs < 2) {
@ -148,7 +148,8 @@ select_poll_modify(pollObject *self, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("modify", nargs, 2, 2)) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
if (!_PyLong_UnsignedShort_Converter(args[1], &eventmask)) {
@ -182,7 +183,8 @@ select_poll_unregister(pollObject *self, PyObject *arg)
PyObject *return_value = NULL;
int fd;
if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
fd = PyObject_AsFileDescriptor(arg);
if (fd < 0) {
goto exit;
}
return_value = select_poll_unregister_impl(self, fd);
@ -268,7 +270,8 @@ select_devpoll_register(devpollObject *self, PyObject *const *args, Py_ssize_t n
if (!_PyArg_CheckPositional("register", nargs, 1, 2)) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
if (nargs < 2) {
@ -318,7 +321,8 @@ select_devpoll_modify(devpollObject *self, PyObject *const *args, Py_ssize_t nar
if (!_PyArg_CheckPositional("modify", nargs, 1, 2)) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
if (nargs < 2) {
@ -356,7 +360,8 @@ select_devpoll_unregister(devpollObject *self, PyObject *arg)
PyObject *return_value = NULL;
int fd;
if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
fd = PyObject_AsFileDescriptor(arg);
if (fd < 0) {
goto exit;
}
return_value = select_devpoll_unregister_impl(self, fd);
@ -730,7 +735,8 @@ select_epoll_register(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t na
if (!args) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
if (!noptargs) {
@ -806,7 +812,8 @@ select_epoll_modify(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t narg
if (!args) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
eventmask = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
@ -874,7 +881,8 @@ select_epoll_unregister(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t
if (!args) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
return_value = select_epoll_unregister_impl(self, fd);
@ -1311,4 +1319,4 @@ exit:
#ifndef SELECT_KQUEUE_CONTROL_METHODDEF
#define SELECT_KQUEUE_CONTROL_METHODDEF
#endif /* !defined(SELECT_KQUEUE_CONTROL_METHODDEF) */
/*[clinic end generated code: output=4c2dcb31cb17c2c6 input=a9049054013a1b77]*/
/*[clinic end generated code: output=4fc17ae9b6cfdc86 input=a9049054013a1b77]*/

View file

@ -2,7 +2,6 @@
preserve
[clinic start generated code]*/
#include "pycore_fileutils.h" // _PyLong_FileDescriptor_Converter()
#include "pycore_modsupport.h" // _PyArg_CheckPositional()
PyDoc_STRVAR(termios_tcgetattr__doc__,
@ -30,7 +29,8 @@ termios_tcgetattr(PyObject *module, PyObject *arg)
PyObject *return_value = NULL;
int fd;
if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
fd = PyObject_AsFileDescriptor(arg);
if (fd < 0) {
goto exit;
}
return_value = termios_tcgetattr_impl(module, fd);
@ -69,7 +69,8 @@ termios_tcsetattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("tcsetattr", nargs, 3, 3)) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
when = PyLong_AsInt(args[1]);
@ -108,7 +109,8 @@ termios_tcsendbreak(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("tcsendbreak", nargs, 2, 2)) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
duration = PyLong_AsInt(args[1]);
@ -139,7 +141,8 @@ termios_tcdrain(PyObject *module, PyObject *arg)
PyObject *return_value = NULL;
int fd;
if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
fd = PyObject_AsFileDescriptor(arg);
if (fd < 0) {
goto exit;
}
return_value = termios_tcdrain_impl(module, fd);
@ -174,7 +177,8 @@ termios_tcflush(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("tcflush", nargs, 2, 2)) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
queue = PyLong_AsInt(args[1]);
@ -213,7 +217,8 @@ termios_tcflow(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("tcflow", nargs, 2, 2)) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
action = PyLong_AsInt(args[1]);
@ -246,7 +251,8 @@ termios_tcgetwinsize(PyObject *module, PyObject *arg)
PyObject *return_value = NULL;
int fd;
if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
fd = PyObject_AsFileDescriptor(arg);
if (fd < 0) {
goto exit;
}
return_value = termios_tcgetwinsize_impl(module, fd);
@ -280,7 +286,8 @@ termios_tcsetwinsize(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("tcsetwinsize", nargs, 2, 2)) {
goto exit;
}
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
fd = PyObject_AsFileDescriptor(args[0]);
if (fd < 0) {
goto exit;
}
winsz = args[1];
@ -289,4 +296,4 @@ termios_tcsetwinsize(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
exit:
return return_value;
}
/*[clinic end generated code: output=f31382658135c774 input=a9049054013a1b77]*/
/*[clinic end generated code: output=7327a2085972bf59 input=a9049054013a1b77]*/

View file

@ -3832,16 +3832,13 @@ def use_converter(self) -> None:
'_PyLong_FileDescriptor_Converter()')
def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
if limited_capi:
return self.format_code("""
{paramname} = PyObject_AsFileDescriptor({argname});
if ({paramname} < 0) {{{{
goto exit;
}}}}
""",
argname=argname)
else:
return super().parse_arg(argname, displayname, limited_capi=limited_capi)
return self.format_code("""
{paramname} = PyObject_AsFileDescriptor({argname});
if ({paramname} < 0) {{{{
goto exit;
}}}}
""",
argname=argname)
class float_converter(CConverter):