@@ -2710,65 +2710,75 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
27102710 DISPATCH ();
27112711 }
27122712
2713- TARGET (BUILD_MAP_UNPACK_WITH_CALL )
27142713 TARGET (BUILD_MAP_UNPACK ) {
2715- int with_call = opcode == BUILD_MAP_UNPACK_WITH_CALL ;
27162714 Py_ssize_t i ;
27172715 PyObject * sum = PyDict_New ();
27182716 if (sum == NULL )
27192717 goto error ;
27202718
27212719 for (i = oparg ; i > 0 ; i -- ) {
27222720 PyObject * arg = PEEK (i );
2723- if (with_call && PyDict_Size (sum )) {
2724- PyObject * intersection = _PyDictView_Intersect (sum , arg );
2725-
2726- if (intersection == NULL ) {
2727- if (PyErr_ExceptionMatches (PyExc_AttributeError )) {
2728- PyObject * func = PEEK (2 + oparg );
2729- PyErr_Format (PyExc_TypeError ,
2730- "%.200s%.200s argument after ** "
2731- "must be a mapping, not %.200s" ,
2732- PyEval_GetFuncName (func ),
2733- PyEval_GetFuncDesc (func ),
2734- arg -> ob_type -> tp_name );
2735- }
2736- Py_DECREF (sum );
2737- goto error ;
2738- }
2739-
2740- if (PySet_GET_SIZE (intersection )) {
2741- Py_ssize_t idx = 0 ;
2742- PyObject * key ;
2743- PyObject * func = PEEK (2 + oparg );
2744- Py_hash_t hash ;
2745- _PySet_NextEntry (intersection , & idx , & key , & hash );
2746- if (!PyUnicode_Check (key )) {
2747- PyErr_Format (PyExc_TypeError ,
2748- "%.200s%.200s keywords must be strings" ,
2749- PyEval_GetFuncName (func ),
2750- PyEval_GetFuncDesc (func ));
2751- } else {
2752- PyErr_Format (PyExc_TypeError ,
2753- "%.200s%.200s got multiple "
2754- "values for keyword argument '%U'" ,
2755- PyEval_GetFuncName (func ),
2756- PyEval_GetFuncDesc (func ),
2757- key );
2758- }
2759- Py_DECREF (intersection );
2760- Py_DECREF (sum );
2761- goto error ;
2721+ if (PyDict_Update (sum , arg ) < 0 ) {
2722+ if (PyErr_ExceptionMatches (PyExc_AttributeError )) {
2723+ PyErr_Format (PyExc_TypeError ,
2724+ "'%.200s' object is not a mapping1" ,
2725+ arg -> ob_type -> tp_name );
27622726 }
2763- Py_DECREF (intersection );
2727+ Py_DECREF (sum );
2728+ goto error ;
27642729 }
2730+ }
27652731
2766- if (PyDict_Update (sum , arg ) < 0 ) {
2732+ while (oparg -- )
2733+ Py_DECREF (POP ());
2734+ PUSH (sum );
2735+ DISPATCH ();
2736+ }
2737+
2738+ TARGET (BUILD_MAP_UNPACK_WITH_CALL ) {
2739+ Py_ssize_t i ;
2740+ PyObject * sum = PyDict_New ();
2741+ if (sum == NULL )
2742+ goto error ;
2743+
2744+ for (i = oparg ; i > 0 ; i -- ) {
2745+ PyObject * arg = PEEK (i );
2746+ if (_PyDict_MergeEx (sum , arg , 2 ) < 0 ) {
2747+ PyObject * func = PEEK (2 + oparg );
27672748 if (PyErr_ExceptionMatches (PyExc_AttributeError )) {
27682749 PyErr_Format (PyExc_TypeError ,
2769- "'%.200s' object is not a mapping" ,
2750+ "%.200s%.200s argument after ** "
2751+ "must be a mapping, not %.200s" ,
2752+ PyEval_GetFuncName (func ),
2753+ PyEval_GetFuncDesc (func ),
27702754 arg -> ob_type -> tp_name );
27712755 }
2756+ else if (PyErr_ExceptionMatches (PyExc_KeyError )) {
2757+ PyObject * exc , * val , * tb ;
2758+ PyErr_Fetch (& exc , & val , & tb );
2759+ if (val && PyTuple_Check (val ) && PyTuple_GET_SIZE (val ) == 1 ) {
2760+ PyObject * key = PyTuple_GET_ITEM (val , 0 );
2761+ if (!PyUnicode_Check (key )) {
2762+ PyErr_Format (PyExc_TypeError ,
2763+ "%.200s%.200s keywords must be strings" ,
2764+ PyEval_GetFuncName (func ),
2765+ PyEval_GetFuncDesc (func ));
2766+ } else {
2767+ PyErr_Format (PyExc_TypeError ,
2768+ "%.200s%.200s got multiple "
2769+ "values for keyword argument '%U'" ,
2770+ PyEval_GetFuncName (func ),
2771+ PyEval_GetFuncDesc (func ),
2772+ key );
2773+ }
2774+ Py_XDECREF (exc );
2775+ Py_XDECREF (val );
2776+ Py_XDECREF (tb );
2777+ }
2778+ else {
2779+ PyErr_Restore (exc , val , tb );
2780+ }
2781+ }
27722782 Py_DECREF (sum );
27732783 goto error ;
27742784 }
0 commit comments