diff --git a/Python/ceval.c b/Python/ceval.c index adc7b536247b2e..5ee68d08eafc27 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4635,8 +4635,21 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr 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);