@@ -2671,10 +2671,8 @@ _PyDict_LoadBuiltinsFromGlobals(PyObject *globals)
26712671
26722672/* Consumes references to key and value */
26732673static int
2674- setitem_take2_lock_held (PyDictObject * mp , PyObject * key , PyObject * value )
2674+ anydict_setitem_take2 (PyDictObject * mp , PyObject * key , PyObject * value )
26752675{
2676- ASSERT_DICT_LOCKED (mp );
2677-
26782676 assert (key );
26792677 assert (value );
26802678 assert (PyAnyDict_Check (mp ));
@@ -2693,6 +2691,14 @@ setitem_take2_lock_held(PyDictObject *mp, PyObject *key, PyObject *value)
26932691 return insertdict (mp , key , hash , value );
26942692}
26952693
2694+ /* Consumes references to key and value */
2695+ static int
2696+ setitem_take2_lock_held (PyDictObject * mp , PyObject * key , PyObject * value )
2697+ {
2698+ ASSERT_DICT_LOCKED (mp );
2699+ return anydict_setitem_take2 (mp , key , value );
2700+ }
2701+
26962702int
26972703_PyDict_SetItem_Take2 (PyDictObject * mp , PyObject * key , PyObject * value )
26982704{
@@ -3352,7 +3358,19 @@ _PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
33523358 }
33533359dict_iter_exit :;
33543360 Py_END_CRITICAL_SECTION ();
3355- } else {
3361+ }
3362+ else if (PyFrozenDict_CheckExact (d )) {
3363+ while ((key = PyIter_Next (it )) != NULL ) {
3364+ status = anydict_setitem_take2 ((PyDictObject * )d ,
3365+ Py_NewRef (key ), Py_NewRef (value ));
3366+ Py_DECREF (key );
3367+ if (status < 0 ) {
3368+ assert (PyErr_Occurred ());
3369+ goto Fail ;
3370+ }
3371+ }
3372+ }
3373+ else {
33563374 while ((key = PyIter_Next (it )) != NULL ) {
33573375 status = PyObject_SetItem (d , key , value );
33583376 Py_DECREF (key );
0 commit comments