@@ -70,7 +70,7 @@ static PyObject * unicode_concatenate(PyObject *, PyObject *,
70
70
PyFrameObject * , const _Py_CODEUNIT * );
71
71
static PyObject * special_lookup (PyObject * , _Py_Identifier * );
72
72
static int check_args_iterable (PyObject * func , PyObject * vararg );
73
- static void format_kwargs_mapping_error (PyObject * func , PyObject * kwargs );
73
+ static void format_kwargs_error (PyObject * func , PyObject * kwargs );
74
74
static void format_awaitable_error (PyTypeObject * , int );
75
75
76
76
#define NAME_ERROR_MSG \
@@ -2660,37 +2660,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
2660
2660
for (i = oparg ; i > 0 ; i -- ) {
2661
2661
PyObject * arg = PEEK (i );
2662
2662
if (_PyDict_MergeEx (sum , arg , 2 ) < 0 ) {
2663
- PyObject * func = PEEK (2 + oparg );
2664
- if (PyErr_ExceptionMatches (PyExc_AttributeError )) {
2665
- format_kwargs_mapping_error (func , arg );
2666
- }
2667
- else if (PyErr_ExceptionMatches (PyExc_KeyError )) {
2668
- PyObject * exc , * val , * tb ;
2669
- PyErr_Fetch (& exc , & val , & tb );
2670
- if (val && PyTuple_Check (val ) && PyTuple_GET_SIZE (val ) == 1 ) {
2671
- PyObject * key = PyTuple_GET_ITEM (val , 0 );
2672
- if (!PyUnicode_Check (key )) {
2673
- PyErr_Format (PyExc_TypeError ,
2674
- "%.200s%.200s keywords must be strings" ,
2675
- PyEval_GetFuncName (func ),
2676
- PyEval_GetFuncDesc (func ));
2677
- } else {
2678
- PyErr_Format (PyExc_TypeError ,
2679
- "%.200s%.200s got multiple "
2680
- "values for keyword argument '%U'" ,
2681
- PyEval_GetFuncName (func ),
2682
- PyEval_GetFuncDesc (func ),
2683
- key );
2684
- }
2685
- Py_XDECREF (exc );
2686
- Py_XDECREF (val );
2687
- Py_XDECREF (tb );
2688
- }
2689
- else {
2690
- PyErr_Restore (exc , val , tb );
2691
- }
2692
- }
2693
2663
Py_DECREF (sum );
2664
+ format_kwargs_error (PEEK (2 + oparg ), arg );
2694
2665
goto error ;
2695
2666
}
2696
2667
}
@@ -3286,17 +3257,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
3286
3257
PyObject * d = PyDict_New ();
3287
3258
if (d == NULL )
3288
3259
goto error ;
3289
- if (PyDict_Update (d , kwargs ) != 0 ) {
3260
+ if (_PyDict_MergeEx (d , kwargs , 2 ) < 0 ) {
3290
3261
Py_DECREF (d );
3291
- /* PyDict_Update raises attribute
3292
- * error (percolated from an attempt
3293
- * to get 'keys' attribute) instead of
3294
- * a type error if its second argument
3295
- * is not a mapping.
3296
- */
3297
- if (PyErr_ExceptionMatches (PyExc_AttributeError )) {
3298
- format_kwargs_mapping_error (SECOND (), kwargs );
3299
- }
3262
+ format_kwargs_error (SECOND (), kwargs );
3300
3263
Py_DECREF (kwargs );
3301
3264
goto error ;
3302
3265
}
@@ -5063,14 +5026,48 @@ check_args_iterable(PyObject *func, PyObject *args)
5063
5026
}
5064
5027
5065
5028
static void
5066
- format_kwargs_mapping_error (PyObject * func , PyObject * kwargs )
5029
+ format_kwargs_error (PyObject * func , PyObject * kwargs )
5067
5030
{
5068
- PyErr_Format (PyExc_TypeError ,
5069
- "%.200s%.200s argument after ** "
5070
- "must be a mapping, not %.200s" ,
5071
- PyEval_GetFuncName (func ),
5072
- PyEval_GetFuncDesc (func ),
5073
- kwargs -> ob_type -> tp_name );
5031
+ /* _PyDict_MergeEx raises attribute
5032
+ * error (percolated from an attempt
5033
+ * to get 'keys' attribute) instead of
5034
+ * a type error if its second argument
5035
+ * is not a mapping.
5036
+ */
5037
+ if (PyErr_ExceptionMatches (PyExc_AttributeError )) {
5038
+ PyErr_Format (PyExc_TypeError ,
5039
+ "%.200s%.200s argument after ** "
5040
+ "must be a mapping, not %.200s" ,
5041
+ PyEval_GetFuncName (func ),
5042
+ PyEval_GetFuncDesc (func ),
5043
+ kwargs -> ob_type -> tp_name );
5044
+ }
5045
+ else if (PyErr_ExceptionMatches (PyExc_KeyError )) {
5046
+ PyObject * exc , * val , * tb ;
5047
+ PyErr_Fetch (& exc , & val , & tb );
5048
+ if (val && PyTuple_Check (val ) && PyTuple_GET_SIZE (val ) == 1 ) {
5049
+ PyObject * key = PyTuple_GET_ITEM (val , 0 );
5050
+ if (!PyUnicode_Check (key )) {
5051
+ PyErr_Format (PyExc_TypeError ,
5052
+ "%.200s%.200s keywords must be strings" ,
5053
+ PyEval_GetFuncName (func ),
5054
+ PyEval_GetFuncDesc (func ));
5055
+ } else {
5056
+ PyErr_Format (PyExc_TypeError ,
5057
+ "%.200s%.200s got multiple "
5058
+ "values for keyword argument '%U'" ,
5059
+ PyEval_GetFuncName (func ),
5060
+ PyEval_GetFuncDesc (func ),
5061
+ key );
5062
+ }
5063
+ Py_XDECREF (exc );
5064
+ Py_XDECREF (val );
5065
+ Py_XDECREF (tb );
5066
+ }
5067
+ else {
5068
+ PyErr_Restore (exc , val , tb );
5069
+ }
5070
+ }
5074
5071
}
5075
5072
5076
5073
static void
0 commit comments