@@ -66,6 +66,8 @@ static void format_exc_unbound(PyCodeObject *co, int oparg);
66
66
static PyObject * unicode_concatenate (PyObject * , PyObject * ,
67
67
PyFrameObject * , const _Py_CODEUNIT * );
68
68
static PyObject * special_lookup (PyObject * , _Py_Identifier * );
69
+ static int check_args_iterable (PyObject * func , PyObject * vararg );
70
+ static void format_kwargs_mapping_error (PyObject * func , PyObject * kwargs );
69
71
70
72
#define NAME_ERROR_MSG \
71
73
"name '%.200s' is not defined"
@@ -2512,14 +2514,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
2512
2514
none_val = _PyList_Extend ((PyListObject * )sum , PEEK (i ));
2513
2515
if (none_val == NULL ) {
2514
2516
if (opcode == BUILD_TUPLE_UNPACK_WITH_CALL &&
2515
- PyErr_ExceptionMatches (PyExc_TypeError )) {
2516
- PyObject * func = PEEK (1 + oparg );
2517
- PyErr_Format (PyExc_TypeError ,
2518
- "%.200s%.200s argument after * "
2519
- "must be an iterable, not %.200s" ,
2520
- PyEval_GetFuncName (func ),
2521
- PyEval_GetFuncDesc (func ),
2522
- PEEK (i )-> ob_type -> tp_name );
2517
+ PyErr_ExceptionMatches (PyExc_TypeError ))
2518
+ {
2519
+ check_args_iterable (PEEK (1 + oparg ), PEEK (i ));
2523
2520
}
2524
2521
Py_DECREF (sum );
2525
2522
goto error ;
@@ -2732,12 +2729,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
2732
2729
if (_PyDict_MergeEx (sum , arg , 2 ) < 0 ) {
2733
2730
PyObject * func = PEEK (2 + oparg );
2734
2731
if (PyErr_ExceptionMatches (PyExc_AttributeError )) {
2735
- PyErr_Format (PyExc_TypeError ,
2736
- "%.200s%.200s argument after ** "
2737
- "must be a mapping, not %.200s" ,
2738
- PyEval_GetFuncName (func ),
2739
- PyEval_GetFuncDesc (func ),
2740
- arg -> ob_type -> tp_name );
2732
+ format_kwargs_mapping_error (func , arg );
2741
2733
}
2742
2734
else if (PyErr_ExceptionMatches (PyExc_KeyError )) {
2743
2735
PyObject * exc , * val , * tb ;
@@ -3390,13 +3382,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
3390
3382
* is not a mapping.
3391
3383
*/
3392
3384
if (PyErr_ExceptionMatches (PyExc_AttributeError )) {
3393
- func = SECOND ();
3394
- PyErr_Format (PyExc_TypeError ,
3395
- "%.200s%.200s argument after ** "
3396
- "must be a mapping, not %.200s" ,
3397
- PyEval_GetFuncName (func ),
3398
- PyEval_GetFuncDesc (func ),
3399
- kwargs -> ob_type -> tp_name );
3385
+ format_kwargs_mapping_error (SECOND (), kwargs );
3400
3386
}
3401
3387
Py_DECREF (kwargs );
3402
3388
goto error ;
@@ -3409,14 +3395,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
3409
3395
callargs = POP ();
3410
3396
func = TOP ();
3411
3397
if (!PyTuple_CheckExact (callargs )) {
3412
- if (Py_TYPE (callargs )-> tp_iter == NULL &&
3413
- !PySequence_Check (callargs )) {
3414
- PyErr_Format (PyExc_TypeError ,
3415
- "%.200s%.200s argument after * "
3416
- "must be an iterable, not %.200s" ,
3417
- PyEval_GetFuncName (func ),
3418
- PyEval_GetFuncDesc (func ),
3419
- callargs -> ob_type -> tp_name );
3398
+ if (check_args_iterable (func , callargs ) < 0 ) {
3420
3399
Py_DECREF (callargs );
3421
3400
goto error ;
3422
3401
}
@@ -5179,6 +5158,32 @@ import_all_from(PyObject *locals, PyObject *v)
5179
5158
return err ;
5180
5159
}
5181
5160
5161
+ static int
5162
+ check_args_iterable (PyObject * func , PyObject * args )
5163
+ {
5164
+ if (args -> ob_type -> tp_iter == NULL && !PySequence_Check (args )) {
5165
+ PyErr_Format (PyExc_TypeError ,
5166
+ "%.200s%.200s argument after * "
5167
+ "must be an iterable, not %.200s" ,
5168
+ PyEval_GetFuncName (func ),
5169
+ PyEval_GetFuncDesc (func ),
5170
+ args -> ob_type -> tp_name );
5171
+ return -1 ;
5172
+ }
5173
+ return 0 ;
5174
+ }
5175
+
5176
+ static void
5177
+ format_kwargs_mapping_error (PyObject * func , PyObject * kwargs )
5178
+ {
5179
+ PyErr_Format (PyExc_TypeError ,
5180
+ "%.200s%.200s argument after ** "
5181
+ "must be a mapping, not %.200s" ,
5182
+ PyEval_GetFuncName (func ),
5183
+ PyEval_GetFuncDesc (func ),
5184
+ kwargs -> ob_type -> tp_name );
5185
+ }
5186
+
5182
5187
static void
5183
5188
format_exc_check_arg (PyObject * exc , const char * format_str , PyObject * obj )
5184
5189
{
0 commit comments