mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
Two fixes for extended call syntax:
If a non-tuple sequence is passed as the *arg, convert it to a tuple before checking its length. If named keyword arguments are used in combination with **kwargs, make a copy of kwargs before inserting the new keys.
This commit is contained in:
parent
aaf0ab26ed
commit
074c3e62d1
3 changed files with 69 additions and 12 deletions
|
@ -1635,7 +1635,18 @@ eval_code2(co, globals, locals,
|
|||
x = NULL;
|
||||
break;
|
||||
}
|
||||
nstar = PySequence_Length(stararg);
|
||||
/* Convert abstract sequence to concrete tuple */
|
||||
if (!PyTuple_Check(stararg)) {
|
||||
PyObject *t = NULL;
|
||||
t = PySequence_Tuple(stararg);
|
||||
if (t == NULL) {
|
||||
x = NULL;
|
||||
break;
|
||||
}
|
||||
Py_DECREF(stararg);
|
||||
stararg = t;
|
||||
}
|
||||
nstar = PyTuple_GET_SIZE(stararg);
|
||||
if (nstar < 0) {
|
||||
x = NULL;
|
||||
break;
|
||||
|
@ -1649,6 +1660,15 @@ eval_code2(co, globals, locals,
|
|||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
PyObject *d = PyDict_Copy(kwdict);
|
||||
if (d == NULL) {
|
||||
x = NULL;
|
||||
break;
|
||||
}
|
||||
Py_DECREF(kwdict);
|
||||
kwdict = d;
|
||||
}
|
||||
err = 0;
|
||||
while (--nk >= 0) {
|
||||
PyObject *value = POP();
|
||||
|
@ -1678,18 +1698,7 @@ eval_code2(co, globals, locals,
|
|||
break;
|
||||
}
|
||||
if (stararg) {
|
||||
PyObject *t = NULL;
|
||||
int i;
|
||||
if (!PyTuple_Check(stararg)) {
|
||||
/* must be sequence to pass earlier test */
|
||||
t = PySequence_Tuple(stararg);
|
||||
if (t == NULL) {
|
||||
x = NULL;
|
||||
break;
|
||||
}
|
||||
Py_DECREF(stararg);
|
||||
stararg = t;
|
||||
}
|
||||
for (i = 0; i < nstar; i++) {
|
||||
PyObject *a = PyTuple_GET_ITEM(stararg, i);
|
||||
Py_INCREF(a);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue