From 61bdb0d31924ec5fd12aa8dbe197002c57dfbf82 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 9 Dec 2016 15:39:28 +0100 Subject: [PATCH] Use _PyObject_CallMethodIdObjArgs() in _io Issue #28915: Replace _PyObject_CallMethodId() with _PyObject_CallMethodIdObjArgs() when the format string was only made of "O" formats, PyObject* arguments. _PyObject_CallMethodIdObjArgs() avoids the creation of a temporary tuple and doesn't have to parse a format string. --- Modules/_io/bufferedio.c | 3 ++- Modules/_io/fileio.c | 4 ++-- Modules/_io/iobase.c | 3 ++- Modules/_io/textio.c | 8 +++++--- Modules/_io/winconsoleio.c | 6 +++--- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 2b43fd859c5..cb4173e5981 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -454,7 +454,8 @@ buffered_dealloc_warn(buffered *self, PyObject *source) { if (self->ok && self->raw) { PyObject *r; - r = _PyObject_CallMethodId(self->raw, &PyId__dealloc_warn, "O", source); + r = _PyObject_CallMethodIdObjArgs(self->raw, &PyId__dealloc_warn, + source, NULL); if (r) Py_DECREF(r); else diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 54cfb7fa7d6..69e35180d75 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -150,8 +150,8 @@ _io_FileIO_close_impl(fileio *self) PyObject *exc, *val, *tb; int rc; _Py_IDENTIFIER(close); - res = _PyObject_CallMethodId((PyObject*)&PyRawIOBase_Type, - &PyId_close, "O", self); + res = _PyObject_CallMethodIdObjArgs((PyObject*)&PyRawIOBase_Type, + &PyId_close, self, NULL); if (!self->closefd) { self->fd = -1; return res; diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 472ef3b97cd..ee6ad474b59 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -661,7 +661,8 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) to remove the bytecode interpretation overhead, but it could probably be removed here. */ _Py_IDENTIFIER(extend); - PyObject *ret = _PyObject_CallMethodId(result, &PyId_extend, "O", self); + PyObject *ret = _PyObject_CallMethodIdObjArgs(result, &PyId_extend, + self, NULL); if (ret == NULL) { Py_DECREF(result); diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index d28f6139507..0a6dfe1b337 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -899,8 +899,8 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, PyObject *locale_module = _PyIO_get_locale_module(state); if (locale_module == NULL) goto catch_ImportError; - self->encoding = _PyObject_CallMethodId( - locale_module, &PyId_getpreferredencoding, "O", Py_False); + self->encoding = _PyObject_CallMethodIdObjArgs( + locale_module, &PyId_getpreferredencoding, Py_False, NULL); Py_DECREF(locale_module); if (self->encoding == NULL) { catch_ImportError: @@ -2644,7 +2644,9 @@ _io_TextIOWrapper_close_impl(textio *self) else { PyObject *exc = NULL, *val, *tb; if (self->finalizing) { - res = _PyObject_CallMethodId(self->buffer, &PyId__dealloc_warn, "O", self); + res = _PyObject_CallMethodIdObjArgs(self->buffer, + &PyId__dealloc_warn, + self, NULL); if (res) Py_DECREF(res); else diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index 7b00a9eb6d6..d8e43394bc6 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -85,7 +85,7 @@ char _PyIO_get_console_type(PyObject *path_or_fd) { Py_CLEAR(decoded); return '\0'; } - decoded_upper = PyObject_CallMethod(decoded, "upper", ""); + decoded_upper = PyObject_CallMethod(decoded, "upper", NULL); Py_CLEAR(decoded); if (!decoded_upper) { PyErr_Clear(); @@ -181,8 +181,8 @@ _io__WindowsConsoleIO_close_impl(winconsoleio *self) PyObject *exc, *val, *tb; int rc; _Py_IDENTIFIER(close); - res = _PyObject_CallMethodId((PyObject*)&PyRawIOBase_Type, - &PyId_close, "O", self); + res = _PyObject_CallMethodIdObjArgs((PyObject*)&PyRawIOBase_Type, + &PyId_close, self, NULL); if (!self->closehandle) { self->handle = INVALID_HANDLE_VALUE; return res;