bpo-37547: add _PyObject_CallMethodOneArg (GH-14685)

This commit is contained in:
Jeroen Demeyer 2019-07-11 10:59:05 +02:00 committed by Inada Naoki
parent 2a3d4d9c53
commit 59ad110d7a
23 changed files with 104 additions and 93 deletions

View file

@ -375,6 +375,18 @@ Object Protocol
.. versionadded:: 3.9 .. versionadded:: 3.9
.. c:function:: PyObject* _PyObject_CallMethodOneArg(PyObject *obj, PyObject *name, PyObject *arg)
Call a method of the Python object *obj* with a single positional argument
*arg*, where the name of the method is given as a Python string object in
*name*.
Return the result of the call on success, or raise an exception and return
*NULL* on failure.
.. versionadded:: 3.9
.. c:function:: PyObject* _PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) .. c:function:: PyObject* _PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames)
Call a callable Python object *callable*, using Call a callable Python object *callable*, using

View file

@ -163,6 +163,15 @@ _PyObject_CallMethodNoArgs(PyObject *self, PyObject *name)
1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
} }
static inline PyObject *
_PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg)
{
assert(arg != NULL);
PyObject *args[2] = {self, arg};
return _PyObject_VectorcallMethod(name, args,
2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
}
/* Like PyObject_CallMethod(), but expect a _Py_Identifier* /* Like PyObject_CallMethod(), but expect a _Py_Identifier*
as the method name. */ as the method name. */
PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *obj, PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *obj,
@ -198,6 +207,15 @@ _PyObject_CallMethodIdNoArgs(PyObject *self, _Py_Identifier *name)
1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
} }
static inline PyObject *
_PyObject_CallMethodIdOneArg(PyObject *self, _Py_Identifier *name, PyObject *arg)
{
assert(arg != NULL);
PyObject *args[2] = {self, arg};
return _PyObject_VectorcallMethodId(name, args,
2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
}
PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o); PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o);
/* Guess the size of object 'o' using len(o) or o.__length_hint__(). /* Guess the size of object 'o' using len(o) or o.__length_hint__().

View file

@ -1,2 +1,2 @@
Add fast functions for calling methods: :c:func:`_PyObject_VectorcallMethod` Add fast functions for calling methods: :c:func:`_PyObject_VectorcallMethod`,
and :c:func:`_PyObject_CallMethodNoArgs` :c:func:`_PyObject_CallMethodNoArgs` and :c:func:`_PyObject_CallMethodOneArg`.

View file

@ -480,7 +480,6 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self,
/*[clinic end generated code: output=b8b5148f63b6b56f input=a4f4525679261084]*/ /*[clinic end generated code: output=b8b5148f63b6b56f input=a4f4525679261084]*/
{ {
PyObject *subtype, *result = NULL, *subclass = NULL; PyObject *subtype, *result = NULL, *subclass = NULL;
PyObject *margs[2];
_abc_data *impl = _get_impl(self); _abc_data *impl = _get_impl(self);
if (impl == NULL) { if (impl == NULL) {
return NULL; return NULL;
@ -515,16 +514,12 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self,
} }
} }
/* Fall back to the subclass check. */ /* Fall back to the subclass check. */
margs[0] = self; result = _PyObject_CallMethodIdOneArg(self, &PyId___subclasscheck__,
margs[1] = subclass; subclass);
result = _PyObject_VectorcallMethodId(&PyId___subclasscheck__, margs,
2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
goto end; goto end;
} }
margs[0] = self; result = _PyObject_CallMethodIdOneArg(self, &PyId___subclasscheck__,
margs[1] = subclass; subclass);
result = _PyObject_VectorcallMethodId(&PyId___subclasscheck__, margs,
2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
if (result == NULL) { if (result == NULL) {
goto end; goto end;
} }
@ -536,10 +531,8 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self,
break; break;
case 0: case 0:
Py_DECREF(result); Py_DECREF(result);
margs[0] = self; result = _PyObject_CallMethodIdOneArg(self, &PyId___subclasscheck__,
margs[1] = subtype; subtype);
result = _PyObject_VectorcallMethodId(&PyId___subclasscheck__, margs,
2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
break; break;
case 1: // Nothing to do. case 1: // Nothing to do.
break; break;
@ -620,8 +613,8 @@ _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self,
} }
/* 3. Check the subclass hook. */ /* 3. Check the subclass hook. */
ok = _PyObject_CallMethodIdObjArgs((PyObject *)self, &PyId___subclasshook__, ok = _PyObject_CallMethodIdOneArg((PyObject *)self, &PyId___subclasshook__,
subclass, NULL); subclass);
if (ok == NULL) { if (ok == NULL) {
goto end; goto end;
} }

View file

@ -1842,8 +1842,8 @@ register_task(PyObject *task)
{ {
_Py_IDENTIFIER(add); _Py_IDENTIFIER(add);
PyObject *res = _PyObject_CallMethodIdObjArgs( PyObject *res = _PyObject_CallMethodIdOneArg(all_tasks,
all_tasks, &PyId_add, task, NULL); &PyId_add, task);
if (res == NULL) { if (res == NULL) {
return -1; return -1;
} }
@ -1857,8 +1857,8 @@ unregister_task(PyObject *task)
{ {
_Py_IDENTIFIER(discard); _Py_IDENTIFIER(discard);
PyObject *res = _PyObject_CallMethodIdObjArgs( PyObject *res = _PyObject_CallMethodIdOneArg(all_tasks,
all_tasks, &PyId_discard, task, NULL); &PyId_discard, task);
if (res == NULL) { if (res == NULL) {
return -1; return -1;
} }
@ -2611,13 +2611,11 @@ task_step_impl(TaskObj *task, PyObject *exc)
result = _PyGen_Send((PyGenObject*)coro, Py_None); result = _PyGen_Send((PyGenObject*)coro, Py_None);
} }
else { else {
result = _PyObject_CallMethodIdObjArgs(coro, &PyId_send, result = _PyObject_CallMethodIdOneArg(coro, &PyId_send, Py_None);
Py_None, NULL);
} }
} }
else { else {
result = _PyObject_CallMethodIdObjArgs(coro, &PyId_throw, result = _PyObject_CallMethodIdOneArg(coro, &PyId_throw, exc);
exc, NULL);
if (clear_exc) { if (clear_exc) {
/* We created 'exc' during this call */ /* We created 'exc' during this call */
Py_DECREF(exc); Py_DECREF(exc);

View file

@ -1699,7 +1699,7 @@ unpickle(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "OO!", &typ, &PyTuple_Type, &state)) if (!PyArg_ParseTuple(args, "OO!", &typ, &PyTuple_Type, &state))
return NULL; return NULL;
obj = _PyObject_CallMethodIdObjArgs(typ, &PyId___new__, typ, NULL); obj = _PyObject_CallMethodIdOneArg(typ, &PyId___new__, typ);
if (obj == NULL) if (obj == NULL)
return NULL; return NULL;

View file

@ -1237,8 +1237,7 @@ call_tzname(PyObject *tzinfo, PyObject *tzinfoarg)
if (tzinfo == Py_None) if (tzinfo == Py_None)
Py_RETURN_NONE; Py_RETURN_NONE;
result = _PyObject_CallMethodIdObjArgs(tzinfo, &PyId_tzname, result = _PyObject_CallMethodIdOneArg(tzinfo, &PyId_tzname, tzinfoarg);
tzinfoarg, NULL);
if (result == NULL || result == Py_None) if (result == NULL || result == Py_None)
return result; return result;
@ -1693,8 +1692,7 @@ build_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag)
return NULL; return NULL;
} }
result = _PyObject_CallMethodIdObjArgs(time, &PyId_struct_time, result = _PyObject_CallMethodIdOneArg(time, &PyId_struct_time, args);
args, NULL);
Py_DECREF(time); Py_DECREF(time);
Py_DECREF(args); Py_DECREF(args);
return result; return result;
@ -2894,8 +2892,7 @@ date_today(PyObject *cls, PyObject *dummy)
* time.time() delivers; if someone were gonzo about optimization, * time.time() delivers; if someone were gonzo about optimization,
* date.today() could get away with plain C time(). * date.today() could get away with plain C time().
*/ */
result = _PyObject_CallMethodIdObjArgs(cls, &PyId_fromtimestamp, result = _PyObject_CallMethodIdOneArg(cls, &PyId_fromtimestamp, time);
time, NULL);
Py_DECREF(time); Py_DECREF(time);
return result; return result;
} }
@ -3209,8 +3206,8 @@ date_format(PyDateTime_Date *self, PyObject *args)
if (PyUnicode_GetLength(format) == 0) if (PyUnicode_GetLength(format) == 0)
return PyObject_Str((PyObject *)self); return PyObject_Str((PyObject *)self);
return _PyObject_CallMethodIdObjArgs((PyObject *)self, &PyId_strftime, return _PyObject_CallMethodIdOneArg((PyObject *)self, &PyId_strftime,
format, NULL); format);
} }
/* ISO methods. */ /* ISO methods. */
@ -5960,7 +5957,7 @@ datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
temp = (PyObject *)result; temp = (PyObject *)result;
result = (PyDateTime_DateTime *) result = (PyDateTime_DateTime *)
_PyObject_CallMethodIdObjArgs(tzinfo, &PyId_fromutc, temp, NULL); _PyObject_CallMethodIdOneArg(tzinfo, &PyId_fromutc, temp);
Py_DECREF(temp); Py_DECREF(temp);
return result; return result;

View file

@ -2679,7 +2679,7 @@ treebuilder_add_subelement(PyObject *element, PyObject *child)
} }
else { else {
PyObject *res; PyObject *res;
res = _PyObject_CallMethodIdObjArgs(element, &PyId_append, child, NULL); res = _PyObject_CallMethodIdOneArg(element, &PyId_append, child);
if (res == NULL) if (res == NULL)
return -1; return -1;
Py_DECREF(res); Py_DECREF(res);

View file

@ -439,8 +439,8 @@ buffered_dealloc_warn(buffered *self, PyObject *source)
{ {
if (self->ok && self->raw) { if (self->ok && self->raw) {
PyObject *r; PyObject *r;
r = _PyObject_CallMethodIdObjArgs(self->raw, &PyId__dealloc_warn, r = _PyObject_CallMethodIdOneArg(self->raw, &PyId__dealloc_warn,
source, NULL); source);
if (r) if (r)
Py_DECREF(r); Py_DECREF(r);
else else
@ -1323,7 +1323,7 @@ _io__Buffered_truncate_impl(buffered *self, PyObject *pos)
goto end; goto end;
Py_CLEAR(res); Py_CLEAR(res);
} }
res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_truncate, pos, NULL); res = _PyObject_CallMethodOneArg(self->raw, _PyIO_str_truncate, pos);
if (res == NULL) if (res == NULL)
goto end; goto end;
/* Reset cached position */ /* Reset cached position */
@ -1467,7 +1467,7 @@ _bufferedreader_raw_read(buffered *self, char *start, Py_ssize_t len)
raised (see issue #10956). raised (see issue #10956).
*/ */
do { do {
res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_readinto, memobj, NULL); res = _PyObject_CallMethodOneArg(self->raw, _PyIO_str_readinto, memobj);
} while (res == NULL && _PyIO_trap_eintr()); } while (res == NULL && _PyIO_trap_eintr());
Py_DECREF(memobj); Py_DECREF(memobj);
if (res == NULL) if (res == NULL)
@ -1815,7 +1815,7 @@ _bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len)
*/ */
do { do {
errno = 0; errno = 0;
res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_write, memobj, NULL); res = _PyObject_CallMethodOneArg(self->raw, _PyIO_str_write, memobj);
errnum = errno; errnum = errno;
} while (res == NULL && _PyIO_trap_eintr()); } while (res == NULL && _PyIO_trap_eintr());
Py_DECREF(memobj); Py_DECREF(memobj);

View file

@ -145,8 +145,8 @@ _io_FileIO_close_impl(fileio *self)
PyObject *exc, *val, *tb; PyObject *exc, *val, *tb;
int rc; int rc;
_Py_IDENTIFIER(close); _Py_IDENTIFIER(close);
res = _PyObject_CallMethodIdObjArgs((PyObject*)&PyRawIOBase_Type, res = _PyObject_CallMethodIdOneArg((PyObject*)&PyRawIOBase_Type,
&PyId_close, self, NULL); &PyId_close, (PyObject *)self);
if (!self->closefd) { if (!self->closefd) {
self->fd = -1; self->fd = -1;
return res; return res;

View file

@ -977,8 +977,8 @@ _textiowrapper_fix_encoder_state(textio *self)
if (cmp == 0) { if (cmp == 0) {
self->encoding_start_of_stream = 0; self->encoding_start_of_stream = 0;
PyObject *res = PyObject_CallMethodObjArgs( PyObject *res = _PyObject_CallMethodOneArg(
self->encoder, _PyIO_str_setstate, _PyLong_Zero, NULL); self->encoder, _PyIO_str_setstate, _PyLong_Zero);
if (res == NULL) { if (res == NULL) {
return -1; return -1;
} }
@ -1155,8 +1155,8 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer,
PyObject *locale_module = _PyIO_get_locale_module(state); PyObject *locale_module = _PyIO_get_locale_module(state);
if (locale_module == NULL) if (locale_module == NULL)
goto catch_ImportError; goto catch_ImportError;
self->encoding = _PyObject_CallMethodIdObjArgs( self->encoding = _PyObject_CallMethodIdOneArg(
locale_module, &PyId_getpreferredencoding, Py_False, NULL); locale_module, &PyId_getpreferredencoding, Py_False);
Py_DECREF(locale_module); Py_DECREF(locale_module);
if (self->encoding == NULL) { if (self->encoding == NULL) {
catch_ImportError: catch_ImportError:
@ -1597,8 +1597,7 @@ _textiowrapper_writeflush(textio *self)
PyObject *ret; PyObject *ret;
do { do {
ret = PyObject_CallMethodObjArgs(self->buffer, ret = _PyObject_CallMethodOneArg(self->buffer, _PyIO_str_write, b);
_PyIO_str_write, b, NULL);
} while (ret == NULL && _PyIO_trap_eintr()); } while (ret == NULL && _PyIO_trap_eintr());
Py_DECREF(b); Py_DECREF(b);
if (ret == NULL) if (ret == NULL)
@ -1668,8 +1667,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text)
self->encoding_start_of_stream = 0; self->encoding_start_of_stream = 0;
} }
else else
b = PyObject_CallMethodObjArgs(self->encoder, b = _PyObject_CallMethodOneArg(self->encoder, _PyIO_str_encode, text);
_PyIO_str_encode, text, NULL);
Py_DECREF(text); Py_DECREF(text);
if (b == NULL) if (b == NULL)
@ -1851,9 +1849,9 @@ textiowrapper_read_chunk(textio *self, Py_ssize_t size_hint)
if (chunk_size == NULL) if (chunk_size == NULL)
goto fail; goto fail;
input_chunk = PyObject_CallMethodObjArgs(self->buffer, input_chunk = _PyObject_CallMethodOneArg(self->buffer,
(self->has_read1 ? _PyIO_str_read1: _PyIO_str_read), (self->has_read1 ? _PyIO_str_read1: _PyIO_str_read),
chunk_size, NULL); chunk_size);
Py_DECREF(chunk_size); Py_DECREF(chunk_size);
if (input_chunk == NULL) if (input_chunk == NULL)
goto fail; goto fail;
@ -2414,8 +2412,8 @@ _textiowrapper_encoder_reset(textio *self, int start_of_stream)
self->encoding_start_of_stream = 1; self->encoding_start_of_stream = 1;
} }
else { else {
res = PyObject_CallMethodObjArgs(self->encoder, _PyIO_str_setstate, res = _PyObject_CallMethodOneArg(self->encoder, _PyIO_str_setstate,
_PyLong_Zero, NULL); _PyLong_Zero);
self->encoding_start_of_stream = 0; self->encoding_start_of_stream = 0;
} }
if (res == NULL) if (res == NULL)
@ -2554,8 +2552,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence)
posobj = PyLong_FromOff_t(cookie.start_pos); posobj = PyLong_FromOff_t(cookie.start_pos);
if (posobj == NULL) if (posobj == NULL)
goto fail; goto fail;
res = PyObject_CallMethodObjArgs(self->buffer, res = _PyObject_CallMethodOneArg(self->buffer, _PyIO_str_seek, posobj);
_PyIO_str_seek, posobj, NULL);
Py_DECREF(posobj); Py_DECREF(posobj);
if (res == NULL) if (res == NULL)
goto fail; goto fail;
@ -2837,7 +2834,7 @@ _io_TextIOWrapper_tell_impl(textio *self)
} }
finally: finally:
res = _PyObject_CallMethodIdObjArgs(self->decoder, &PyId_setstate, saved_state, NULL); res = _PyObject_CallMethodIdOneArg(self->decoder, &PyId_setstate, saved_state);
Py_DECREF(saved_state); Py_DECREF(saved_state);
if (res == NULL) if (res == NULL)
return NULL; return NULL;
@ -2851,7 +2848,7 @@ fail:
if (saved_state) { if (saved_state) {
PyObject *type, *value, *traceback; PyObject *type, *value, *traceback;
PyErr_Fetch(&type, &value, &traceback); PyErr_Fetch(&type, &value, &traceback);
res = _PyObject_CallMethodIdObjArgs(self->decoder, &PyId_setstate, saved_state, NULL); res = _PyObject_CallMethodIdOneArg(self->decoder, &PyId_setstate, saved_state);
_PyErr_ChainExceptions(type, value, traceback); _PyErr_ChainExceptions(type, value, traceback);
Py_DECREF(saved_state); Py_DECREF(saved_state);
Py_XDECREF(res); Py_XDECREF(res);
@ -2878,7 +2875,7 @@ _io_TextIOWrapper_truncate_impl(textio *self, PyObject *pos)
return NULL; return NULL;
Py_DECREF(res); Py_DECREF(res);
return PyObject_CallMethodObjArgs(self->buffer, _PyIO_str_truncate, pos, NULL); return _PyObject_CallMethodOneArg(self->buffer, _PyIO_str_truncate, pos);
} }
static PyObject * static PyObject *
@ -3055,9 +3052,9 @@ _io_TextIOWrapper_close_impl(textio *self)
else { else {
PyObject *exc = NULL, *val, *tb; PyObject *exc = NULL, *val, *tb;
if (self->finalizing) { if (self->finalizing) {
res = _PyObject_CallMethodIdObjArgs(self->buffer, res = _PyObject_CallMethodIdOneArg(self->buffer,
&PyId__dealloc_warn, &PyId__dealloc_warn,
self, NULL); (PyObject *)self);
if (res) if (res)
Py_DECREF(res); Py_DECREF(res);
else else

View file

@ -204,8 +204,8 @@ _io__WindowsConsoleIO_close_impl(winconsoleio *self)
PyObject *exc, *val, *tb; PyObject *exc, *val, *tb;
int rc; int rc;
_Py_IDENTIFIER(close); _Py_IDENTIFIER(close);
res = _PyObject_CallMethodIdObjArgs((PyObject*)&PyRawIOBase_Type, res = _PyObject_CallMethodIdOneArg((PyObject*)&PyRawIOBase_Type,
&PyId_close, self, NULL); &PyId_close, self);
if (!self->closehandle) { if (!self->closehandle) {
self->handle = INVALID_HANDLE_VALUE; self->handle = INVALID_HANDLE_VALUE;
return res; return res;

View file

@ -5773,7 +5773,7 @@ instantiate(PyObject *cls, PyObject *args)
return NULL; return NULL;
} }
if (func == NULL) { if (func == NULL) {
return _PyObject_CallMethodIdObjArgs(cls, &PyId___new__, cls, NULL); return _PyObject_CallMethodIdOneArg(cls, &PyId___new__, cls);
} }
Py_DECREF(func); Py_DECREF(func);
} }

View file

@ -1185,9 +1185,9 @@ pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* iso
return -1; return -1;
} }
uppercase_level = _PyObject_CallMethodIdObjArgs( uppercase_level = _PyObject_CallMethodIdOneArg(
(PyObject *)&PyUnicode_Type, &PyId_upper, (PyObject *)&PyUnicode_Type, &PyId_upper,
isolation_level, NULL); isolation_level);
if (!uppercase_level) { if (!uppercase_level) {
return -1; return -1;
} }
@ -1648,8 +1648,8 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
goto finally; goto finally;
} }
uppercase_name = _PyObject_CallMethodIdObjArgs((PyObject *)&PyUnicode_Type, uppercase_name = _PyObject_CallMethodIdOneArg((PyObject *)&PyUnicode_Type,
&PyId_upper, name, NULL); &PyId_upper, name);
if (!uppercase_name) { if (!uppercase_name) {
goto finally; goto finally;
} }

View file

@ -1507,7 +1507,7 @@ array_array_tofile(arrayobject *self, PyObject *f)
bytes = PyBytes_FromStringAndSize(ptr, size); bytes = PyBytes_FromStringAndSize(ptr, size);
if (bytes == NULL) if (bytes == NULL)
return NULL; return NULL;
res = _PyObject_CallMethodIdObjArgs(f, &PyId_write, bytes, NULL); res = _PyObject_CallMethodIdOneArg(f, &PyId_write, bytes);
Py_DECREF(bytes); Py_DECREF(bytes);
if (res == NULL) if (res == NULL)
return NULL; return NULL;

View file

@ -1776,7 +1776,7 @@ mbstreamwriter_iwrite(MultibyteStreamWriterObject *self,
if (str == NULL) if (str == NULL)
return -1; return -1;
wr = _PyObject_CallMethodIdObjArgs(self->stream, &PyId_write, str, NULL); wr = _PyObject_CallMethodIdOneArg(self->stream, &PyId_write, str);
Py_DECREF(str); Py_DECREF(str);
if (wr == NULL) if (wr == NULL)
return -1; return -1;
@ -1870,7 +1870,7 @@ _multibytecodec_MultibyteStreamWriter_reset_impl(MultibyteStreamWriterObject *se
if (PyBytes_Size(pwrt) > 0) { if (PyBytes_Size(pwrt) > 0) {
PyObject *wr; PyObject *wr;
wr = _PyObject_CallMethodIdObjArgs(self->stream, &PyId_write, pwrt); wr = _PyObject_CallMethodIdOneArg(self->stream, &PyId_write, pwrt);
if (wr == NULL) { if (wr == NULL) {
Py_DECREF(pwrt); Py_DECREF(pwrt);
return NULL; return NULL;

View file

@ -4159,7 +4159,7 @@ dictviews_sub(PyObject* self, PyObject *other)
if (result == NULL) if (result == NULL)
return NULL; return NULL;
tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL); tmp = _PyObject_CallMethodIdOneArg(result, &PyId_difference_update, other);
if (tmp == NULL) { if (tmp == NULL) {
Py_DECREF(result); Py_DECREF(result);
return NULL; return NULL;
@ -4179,7 +4179,7 @@ _PyDictView_Intersect(PyObject* self, PyObject *other)
if (result == NULL) if (result == NULL)
return NULL; return NULL;
tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL); tmp = _PyObject_CallMethodIdOneArg(result, &PyId_intersection_update, other);
if (tmp == NULL) { if (tmp == NULL) {
Py_DECREF(result); Py_DECREF(result);
return NULL; return NULL;
@ -4199,7 +4199,7 @@ dictviews_or(PyObject* self, PyObject *other)
if (result == NULL) if (result == NULL)
return NULL; return NULL;
tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL); tmp = _PyObject_CallMethodIdOneArg(result, &PyId_update, other);
if (tmp == NULL) { if (tmp == NULL) {
Py_DECREF(result); Py_DECREF(result);
return NULL; return NULL;
@ -4219,7 +4219,7 @@ dictviews_xor(PyObject* self, PyObject *other)
if (result == NULL) if (result == NULL)
return NULL; return NULL;
tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL); tmp = _PyObject_CallMethodIdOneArg(result, &PyId_symmetric_difference_update, other);
if (tmp == NULL) { if (tmp == NULL) {
Py_DECREF(result); Py_DECREF(result);
return NULL; return NULL;

View file

@ -4145,8 +4145,8 @@ _PyType_GetSlotNames(PyTypeObject *cls)
/* Use _slotnames function from the copyreg module to find the slots /* Use _slotnames function from the copyreg module to find the slots
by this class and its bases. This function will cache the result by this class and its bases. This function will cache the result
in __slotnames__. */ in __slotnames__. */
slotnames = _PyObject_CallMethodIdObjArgs(copyreg, &PyId__slotnames, slotnames = _PyObject_CallMethodIdOneArg(copyreg, &PyId__slotnames,
cls, NULL); (PyObject *)cls);
Py_DECREF(copyreg); Py_DECREF(copyreg);
if (slotnames == NULL) if (slotnames == NULL)
return NULL; return NULL;

View file

@ -164,7 +164,7 @@ check_matched(PyObject *obj, PyObject *arg)
} }
/* Otherwise assume a regex filter and call its match() method */ /* Otherwise assume a regex filter and call its match() method */
result = _PyObject_CallMethodIdObjArgs(obj, &PyId_match, arg, NULL); result = _PyObject_CallMethodIdOneArg(obj, &PyId_match, arg);
if (result == NULL) if (result == NULL)
return -1; return -1;

View file

@ -2052,7 +2052,7 @@ main_loop:
if (v == Py_None) if (v == Py_None)
retval = Py_TYPE(receiver)->tp_iternext(receiver); retval = Py_TYPE(receiver)->tp_iternext(receiver);
else else
retval = _PyObject_CallMethodIdObjArgs(receiver, &PyId_send, v, NULL); retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v);
} }
Py_DECREF(v); Py_DECREF(v);
if (retval == NULL) { if (retval == NULL) {

View file

@ -962,9 +962,8 @@ PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co,
external= PyObject_GetAttrString(interp->importlib, external= PyObject_GetAttrString(interp->importlib,
"_bootstrap_external"); "_bootstrap_external");
if (external != NULL) { if (external != NULL) {
pathobj = _PyObject_CallMethodIdObjArgs(external, pathobj = _PyObject_CallMethodIdOneArg(
&PyId__get_sourcefile, cpathobj, external, &PyId__get_sourcefile, cpathobj);
NULL);
Py_DECREF(external); Py_DECREF(external);
} }
if (pathobj == NULL) if (pathobj == NULL)
@ -1827,9 +1826,8 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
*/ */
spec = _PyObject_GetAttrId(mod, &PyId___spec__); spec = _PyObject_GetAttrId(mod, &PyId___spec__);
if (_PyModuleSpec_IsInitializing(spec)) { if (_PyModuleSpec_IsInitializing(spec)) {
PyObject *value = _PyObject_CallMethodIdObjArgs(interp->importlib, PyObject *value = _PyObject_CallMethodIdOneArg(
&PyId__lock_unlock_module, abs_name, interp->importlib, &PyId__lock_unlock_module, abs_name);
NULL);
if (value == NULL) { if (value == NULL) {
Py_DECREF(spec); Py_DECREF(spec);
goto error; goto error;
@ -1968,7 +1966,7 @@ PyImport_ReloadModule(PyObject *m)
} }
} }
reloaded_module = _PyObject_CallMethodIdObjArgs(imp, &PyId_reload, m, NULL); reloaded_module = _PyObject_CallMethodIdOneArg(imp, &PyId_reload, m);
Py_DECREF(imp); Py_DECREF(imp);
return reloaded_module; return reloaded_module;
} }

View file

@ -1653,7 +1653,7 @@ marshal_dump_impl(PyObject *module, PyObject *value, PyObject *file,
s = PyMarshal_WriteObjectToString(value, version); s = PyMarshal_WriteObjectToString(value, version);
if (s == NULL) if (s == NULL)
return NULL; return NULL;
res = _PyObject_CallMethodIdObjArgs(file, &PyId_write, s, NULL); res = _PyObject_CallMethodIdOneArg(file, &PyId_write, s);
Py_DECREF(s); Py_DECREF(s);
return res; return res;
} }

View file

@ -581,7 +581,7 @@ sys_displayhook_unencodable(PyThreadState *tstate, PyObject *outf, PyObject *o)
buffer = _PyObject_GetAttrId(outf, &PyId_buffer); buffer = _PyObject_GetAttrId(outf, &PyId_buffer);
if (buffer) { if (buffer) {
result = _PyObject_CallMethodIdObjArgs(buffer, &PyId_write, encoded, NULL); result = _PyObject_CallMethodIdOneArg(buffer, &PyId_write, encoded);
Py_DECREF(buffer); Py_DECREF(buffer);
Py_DECREF(encoded); Py_DECREF(encoded);
if (result == NULL) if (result == NULL)
@ -3114,9 +3114,7 @@ sys_pyfile_write_unicode(PyObject *unicode, PyObject *file)
if (file == NULL) if (file == NULL)
return -1; return -1;
assert(unicode != NULL); assert(unicode != NULL);
PyObject *margs[2] = {file, unicode}; PyObject *result = _PyObject_CallMethodIdOneArg(file, &PyId_write, unicode);
PyObject *result = _PyObject_VectorcallMethodId(&PyId_write, margs,
2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
if (result == NULL) { if (result == NULL) {
return -1; return -1;
} }