mirror of https://github.com/python/cpython
Optimize _PyFunction_FastCallDict() when kwargs is {}
Issue #28839: Optimize _PyFunction_FastCallDict() when kwargs is an empty dictionary, avoid the creation of an useless empty tuple.
This commit is contained in:
parent
6f7c0ae46d
commit
865a0f621f
|
@ -5040,9 +5040,9 @@ _PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kwargs != NULL) {
|
nk = (kwargs != NULL) ? PyDict_GET_SIZE(kwargs) : 0;
|
||||||
|
if (nk != 0) {
|
||||||
Py_ssize_t pos, i;
|
Py_ssize_t pos, i;
|
||||||
nk = PyDict_GET_SIZE(kwargs);
|
|
||||||
|
|
||||||
kwtuple = PyTuple_New(2 * nk);
|
kwtuple = PyTuple_New(2 * nk);
|
||||||
if (kwtuple == NULL) {
|
if (kwtuple == NULL) {
|
||||||
|
@ -5052,6 +5052,9 @@ _PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs,
|
||||||
k = &PyTuple_GET_ITEM(kwtuple, 0);
|
k = &PyTuple_GET_ITEM(kwtuple, 0);
|
||||||
pos = i = 0;
|
pos = i = 0;
|
||||||
while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
|
while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
|
||||||
|
/* We must hold strong references because keyword arguments can be
|
||||||
|
indirectly modified while the function is called:
|
||||||
|
see issue #2016 and test_extcall */
|
||||||
Py_INCREF(k[i]);
|
Py_INCREF(k[i]);
|
||||||
Py_INCREF(k[i+1]);
|
Py_INCREF(k[i+1]);
|
||||||
i += 2;
|
i += 2;
|
||||||
|
@ -5061,7 +5064,6 @@ _PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs,
|
||||||
else {
|
else {
|
||||||
kwtuple = NULL;
|
kwtuple = NULL;
|
||||||
k = NULL;
|
k = NULL;
|
||||||
nk = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kwdefs = PyFunction_GET_KW_DEFAULTS(func);
|
kwdefs = PyFunction_GET_KW_DEFAULTS(func);
|
||||||
|
|
Loading…
Reference in New Issue