@@ -64,6 +64,8 @@ static void format_exc_unbound(PyCodeObject *co, int oparg);
64
64
static PyObject * unicode_concatenate (PyObject * , PyObject * ,
65
65
PyFrameObject * , const _Py_CODEUNIT * );
66
66
static PyObject * special_lookup (PyObject * , _Py_Identifier * );
67
+ static int check_args_iterable (PyObject * func , PyObject * vararg );
68
+ static void format_kwargs_mapping_error (PyObject * func , PyObject * kwargs );
67
69
68
70
#define NAME_ERROR_MSG \
69
71
"name '%.200s' is not defined"
@@ -2578,14 +2580,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
2578
2580
none_val = _PyList_Extend ((PyListObject * )sum , PEEK (i ));
2579
2581
if (none_val == NULL ) {
2580
2582
if (opcode == BUILD_TUPLE_UNPACK_WITH_CALL &&
2581
- PyErr_ExceptionMatches (PyExc_TypeError )) {
2582
- PyObject * func = PEEK (1 + oparg );
2583
- PyErr_Format (PyExc_TypeError ,
2584
- "%.200s%.200s argument after * "
2585
- "must be an iterable, not %.200s" ,
2586
- PyEval_GetFuncName (func ),
2587
- PyEval_GetFuncDesc (func ),
2588
- PEEK (i )-> ob_type -> tp_name );
2583
+ PyErr_ExceptionMatches (PyExc_TypeError ))
2584
+ {
2585
+ check_args_iterable (PEEK (1 + oparg ), PEEK (i ));
2589
2586
}
2590
2587
Py_DECREF (sum );
2591
2588
goto error ;
@@ -2798,12 +2795,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
2798
2795
if (_PyDict_MergeEx (sum , arg , 2 ) < 0 ) {
2799
2796
PyObject * func = PEEK (2 + oparg );
2800
2797
if (PyErr_ExceptionMatches (PyExc_AttributeError )) {
2801
- PyErr_Format (PyExc_TypeError ,
2802
- "%.200s%.200s argument after ** "
2803
- "must be a mapping, not %.200s" ,
2804
- PyEval_GetFuncName (func ),
2805
- PyEval_GetFuncDesc (func ),
2806
- arg -> ob_type -> tp_name );
2798
+ format_kwargs_mapping_error (func , arg );
2807
2799
}
2808
2800
else if (PyErr_ExceptionMatches (PyExc_KeyError )) {
2809
2801
PyObject * exc , * val , * tb ;
@@ -3370,13 +3362,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
3370
3362
* is not a mapping.
3371
3363
*/
3372
3364
if (PyErr_ExceptionMatches (PyExc_AttributeError )) {
3373
- func = SECOND ();
3374
- PyErr_Format (PyExc_TypeError ,
3375
- "%.200s%.200s argument after ** "
3376
- "must be a mapping, not %.200s" ,
3377
- PyEval_GetFuncName (func ),
3378
- PyEval_GetFuncDesc (func ),
3379
- kwargs -> ob_type -> tp_name );
3365
+ format_kwargs_mapping_error (SECOND (), kwargs );
3380
3366
}
3381
3367
Py_DECREF (kwargs );
3382
3368
goto error ;
@@ -3389,14 +3375,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
3389
3375
callargs = POP ();
3390
3376
func = TOP ();
3391
3377
if (!PyTuple_CheckExact (callargs )) {
3392
- if (Py_TYPE (callargs )-> tp_iter == NULL &&
3393
- !PySequence_Check (callargs )) {
3394
- PyErr_Format (PyExc_TypeError ,
3395
- "%.200s%.200s argument after * "
3396
- "must be an iterable, not %.200s" ,
3397
- PyEval_GetFuncName (func ),
3398
- PyEval_GetFuncDesc (func ),
3399
- callargs -> ob_type -> tp_name );
3378
+ if (check_args_iterable (func , callargs ) < 0 ) {
3400
3379
Py_DECREF (callargs );
3401
3380
goto error ;
3402
3381
}
@@ -5351,6 +5330,32 @@ import_all_from(PyObject *locals, PyObject *v)
5351
5330
return err ;
5352
5331
}
5353
5332
5333
+ static int
5334
+ check_args_iterable (PyObject * func , PyObject * args )
5335
+ {
5336
+ if (args -> ob_type -> tp_iter == NULL && !PySequence_Check (args )) {
5337
+ PyErr_Format (PyExc_TypeError ,
5338
+ "%.200s%.200s argument after * "
5339
+ "must be an iterable, not %.200s" ,
5340
+ PyEval_GetFuncName (func ),
5341
+ PyEval_GetFuncDesc (func ),
5342
+ args -> ob_type -> tp_name );
5343
+ return -1 ;
5344
+ }
5345
+ return 0 ;
5346
+ }
5347
+
5348
+ static void
5349
+ format_kwargs_mapping_error (PyObject * func , PyObject * kwargs )
5350
+ {
5351
+ PyErr_Format (PyExc_TypeError ,
5352
+ "%.200s%.200s argument after ** "
5353
+ "must be a mapping, not %.200s" ,
5354
+ PyEval_GetFuncName (func ),
5355
+ PyEval_GetFuncDesc (func ),
5356
+ kwargs -> ob_type -> tp_name );
5357
+ }
5358
+
5354
5359
static void
5355
5360
format_exc_check_arg (PyObject * exc , const char * format_str , PyObject * obj )
5356
5361
{
0 commit comments