Skip to content

Commit b51b1aa

Browse files
committed
fix
1 parent f056fa6 commit b51b1aa

1 file changed

Lines changed: 22 additions & 4 deletions

File tree

Objects/dictobject.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2671,10 +2671,8 @@ _PyDict_LoadBuiltinsFromGlobals(PyObject *globals)
26712671

26722672
/* Consumes references to key and value */
26732673
static 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+
26962702
int
26972703
_PyDict_SetItem_Take2(PyDictObject *mp, PyObject *key, PyObject *value)
26982704
{
@@ -3352,7 +3358,19 @@ _PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
33523358
}
33533359
dict_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

Comments
 (0)