/* Consumes references to key and value */
static int
-setitem_take2_lock_held(PyDictObject *mp, PyObject *key, PyObject *value)
+anydict_setitem_take2(PyDictObject *mp, PyObject *key, PyObject *value)
{
- ASSERT_DICT_LOCKED(mp);
-
assert(key);
assert(value);
assert(PyAnyDict_Check(mp));
return insertdict(mp, key, hash, value);
}
+/* Consumes references to key and value */
+static int
+setitem_take2_lock_held(PyDictObject *mp, PyObject *key, PyObject *value)
+{
+ ASSERT_DICT_LOCKED(mp);
+ return anydict_setitem_take2(mp, key, value);
+}
+
int
_PyDict_SetItem_Take2(PyDictObject *mp, PyObject *key, PyObject *value)
{
return NULL;
- if (PyAnyDict_CheckExact(d)) {
- if (PyAnyDict_CheckExact(iterable)) {
+ if (PyDict_CheckExact(d)) {
+ if (PyDict_CheckExact(iterable)) {
PyDictObject *mp = (PyDictObject *)d;
Py_BEGIN_CRITICAL_SECTION2(d, iterable);
Py_END_CRITICAL_SECTION2();
return d;
}
+ else if (PyFrozenDict_CheckExact(iterable)) {
+ PyDictObject *mp = (PyDictObject *)d;
+
+ Py_BEGIN_CRITICAL_SECTION(d);
+ d = (PyObject *)dict_dict_fromkeys(mp, iterable, value);
+ Py_END_CRITICAL_SECTION();
+ return d;
+ }
else if (PyAnySet_CheckExact(iterable)) {
PyDictObject *mp = (PyDictObject *)d;
return d;
}
}
+ else if (PyFrozenDict_CheckExact(d)) {
+ if (PyDict_CheckExact(iterable)) {
+ PyDictObject *mp = (PyDictObject *)d;
+
+ Py_BEGIN_CRITICAL_SECTION(iterable);
+ d = (PyObject *)dict_dict_fromkeys(mp, iterable, value);
+ Py_END_CRITICAL_SECTION();
+ return d;
+ }
+ else if (PyFrozenDict_CheckExact(iterable)) {
+ PyDictObject *mp = (PyDictObject *)d;
+ d = (PyObject *)dict_dict_fromkeys(mp, iterable, value);
+ return d;
+ }
+ else if (PyAnySet_CheckExact(iterable)) {
+ PyDictObject *mp = (PyDictObject *)d;
+
+ Py_BEGIN_CRITICAL_SECTION(iterable);
+ d = (PyObject *)dict_set_fromkeys(mp, iterable, value);
+ Py_END_CRITICAL_SECTION();
+ return d;
+ }
+ }
it = PyObject_GetIter(iterable);
if (it == NULL){
return NULL;
}
- if (PyAnyDict_CheckExact(d)) {
+ if (PyDict_CheckExact(d)) {
Py_BEGIN_CRITICAL_SECTION(d);
while ((key = PyIter_Next(it)) != NULL) {
status = setitem_lock_held((PyDictObject *)d, key, value);
}
dict_iter_exit:;
Py_END_CRITICAL_SECTION();
- } else {
+ }
+ else if (PyFrozenDict_CheckExact(d)) {
+ while ((key = PyIter_Next(it)) != NULL) {
+ // anydict_setitem_take2 consumes a reference to key
+ status = anydict_setitem_take2((PyDictObject *)d,
+ key, Py_NewRef(value));
+ if (status < 0) {
+ assert(PyErr_Occurred());
+ goto Fail;
+ }
+ }
+ }
+ else {
while ((key = PyIter_Next(it)) != NULL) {
status = PyObject_SetItem(d, key, value);
Py_DECREF(key);