@@ -2367,9 +2367,9 @@ _PyObject_Call_Prepend(PyObject *func,
23672367}
23682368
23692369PyObject *
2370- _PyStack_AsDict (PyObject * * values , PyObject * kwnames )
2370+ _PyStack_AsDict (PyObject * * values , Py_ssize_t nkwargs , PyObject * kwnames ,
2371+ PyObject * func )
23712372{
2372- Py_ssize_t nkwargs = PyTuple_GET_SIZE (kwnames );
23732373 PyObject * kwdict ;
23742374 Py_ssize_t i ;
23752375
@@ -2378,12 +2378,24 @@ _PyStack_AsDict(PyObject **values, PyObject *kwnames)
23782378 return NULL ;
23792379 }
23802380
2381- for (i = 0 ; i < nkwargs ; i ++ ) {
2381+ for (i = 0 ; i < nkwargs ; i ++ ) {
2382+ int err ;
23822383 PyObject * key = PyTuple_GET_ITEM (kwnames , i );
23832384 PyObject * value = * values ++ ;
2384- assert (PyUnicode_CheckExact (key ));
2385- assert (PyDict_GetItem (kwdict , key ) == NULL );
2386- if (PyDict_SetItem (kwdict , key , value )) {
2385+
2386+ if (PyDict_GetItem (kwdict , key ) != NULL ) {
2387+ PyErr_Format (PyExc_TypeError ,
2388+ "%.200s%s got multiple values "
2389+ "for keyword argument '%U'" ,
2390+ PyEval_GetFuncName (func ),
2391+ PyEval_GetFuncDesc (func ),
2392+ key );
2393+ Py_DECREF (kwdict );
2394+ return NULL ;
2395+ }
2396+
2397+ err = PyDict_SetItem (kwdict , key , value );
2398+ if (err ) {
23872399 Py_DECREF (kwdict );
23882400 return NULL ;
23892401 }
@@ -2467,7 +2479,7 @@ _PyObject_FastCallKeywords(PyObject *func, PyObject **stack, Py_ssize_t nargs,
24672479 }
24682480
24692481 if (nkwargs > 0 ) {
2470- kwdict = _PyStack_AsDict (stack + nargs , kwnames );
2482+ kwdict = _PyStack_AsDict (stack + nargs , nkwargs , kwnames , func );
24712483 if (kwdict == NULL ) {
24722484 return NULL ;
24732485 }
0 commit comments