From: Mark Shannon Date: Wed, 27 Oct 2021 14:26:22 +0000 (+0100) Subject: Don't make a call at the C level when calling bound-methods from Python code. (GH... X-Git-Tag: v3.11.0a2~78 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4776b07d178b2800374f5c15da182f1215756205;p=thirdparty%2FPython%2Fcpython.git Don't make a call at the C level when calling bound-methods from Python code. (GH-29238) --- diff --git a/Python/ceval.c b/Python/ceval.c index a0f4c801e8f8..bd01e8159c8e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4607,8 +4607,21 @@ check_eval_breaker: kwnames = NULL; postcall_shrink = 1; call_function: - // Check if the call can be inlined or not function = PEEK(oparg + 1); + if (Py_TYPE(function) == &PyMethod_Type) { + PyObject *meth = ((PyMethodObject *)function)->im_func; + PyObject *self = ((PyMethodObject *)function)->im_self; + Py_INCREF(meth); + Py_INCREF(self); + PEEK(oparg + 1) = self; + Py_DECREF(function); + function = meth; + oparg++; + nargs++; + assert(postcall_shrink >= 1); + postcall_shrink--; + } + // Check if the call can be inlined or not if (Py_TYPE(function) == &PyFunction_Type && tstate->interp->eval_frame == NULL) { int code_flags = ((PyCodeObject*)PyFunction_GET_CODE(function))->co_flags; int is_generator = code_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR);