Don't make a call at the C level when calling bound-methods from Python code. (GH-29238)

This commit is contained in:
Mark Shannon 2021-10-27 15:26:22 +01:00 committed by GitHub
parent bcee6aa315
commit 4776b07d17
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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);