mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Don't make a call at the C level when calling bound-methods from Python code. (GH-29238)
This commit is contained in:
parent
bcee6aa315
commit
4776b07d17
1 changed files with 14 additions and 1 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue