Skip to content

Commit fd3be29

Browse files
committed
gh-141510: Optimize {frozen}dict.fromkeys for frozendict
1 parent 6ef2578 commit fd3be29

1 file changed

Lines changed: 33 additions & 2 deletions

File tree

Objects/dictobject.c

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3285,14 +3285,22 @@ _PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
32853285

32863286

32873287
if (PyAnyDict_CheckExact(d)) {
3288-
if (PyAnyDict_CheckExact(iterable)) {
3288+
if (PyDict_CheckExact(iterable)) {
32893289
PyDictObject *mp = (PyDictObject *)d;
32903290

32913291
Py_BEGIN_CRITICAL_SECTION2(d, iterable);
32923292
d = (PyObject *)dict_dict_fromkeys(mp, iterable, value);
32933293
Py_END_CRITICAL_SECTION2();
32943294
return d;
32953295
}
3296+
else if (PyFrozenDict_CheckExact(iterable)) {
3297+
PyDictObject *mp = (PyDictObject *)d;
3298+
3299+
Py_BEGIN_CRITICAL_SECTION(d);
3300+
d = (PyObject *)dict_dict_fromkeys(mp, iterable, value);
3301+
Py_END_CRITICAL_SECTION();
3302+
return d;
3303+
}
32963304
else if (PyAnySet_CheckExact(iterable)) {
32973305
PyDictObject *mp = (PyDictObject *)d;
32983306

@@ -3302,14 +3310,37 @@ _PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
33023310
return d;
33033311
}
33043312
}
3313+
else if (PyFrozenDict_CheckExact(d)) {
3314+
if (PyDict_CheckExact(iterable)) {
3315+
PyDictObject *mp = (PyDictObject *)d;
3316+
3317+
Py_BEGIN_CRITICAL_SECTION(iterable);
3318+
d = (PyObject *)dict_dict_fromkeys(mp, iterable, value);
3319+
Py_END_CRITICAL_SECTION();
3320+
return d;
3321+
}
3322+
else if (PyFrozenDict_CheckExact(iterable)) {
3323+
PyDictObject *mp = (PyDictObject *)d;
3324+
d = (PyObject *)dict_dict_fromkeys(mp, iterable, value);
3325+
return d;
3326+
}
3327+
else if (PyAnySet_CheckExact(iterable)) {
3328+
PyDictObject *mp = (PyDictObject *)d;
3329+
3330+
Py_BEGIN_CRITICAL_SECTION(iterable);
3331+
d = (PyObject *)dict_set_fromkeys(mp, iterable, value);
3332+
Py_END_CRITICAL_SECTION();
3333+
return d;
3334+
}
3335+
}
33053336

33063337
it = PyObject_GetIter(iterable);
33073338
if (it == NULL){
33083339
Py_DECREF(d);
33093340
return NULL;
33103341
}
33113342

3312-
if (PyAnyDict_CheckExact(d)) {
3343+
if (PyDict_CheckExact(d)) {
33133344
Py_BEGIN_CRITICAL_SECTION(d);
33143345
while ((key = PyIter_Next(it)) != NULL) {
33153346
status = setitem_lock_held((PyDictObject *)d, key, value);

0 commit comments

Comments
 (0)