Skip to content

Commit 6cdf9a0

Browse files
committed
Fix mappingproxy "or" too
1 parent ed44817 commit 6cdf9a0

1 file changed

Lines changed: 22 additions & 5 deletions

File tree

Objects/descrobject.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,16 +1061,33 @@ static PyMappingMethods mappingproxy_as_mapping = {
10611061
0, /* mp_ass_subscript */
10621062
};
10631063

1064+
static int is_known_dict_subclass_or(PyObject *o) {
1065+
return (PyAnyDict_CheckExact(o) || PyODict_CheckExact(o) ||
1066+
(PyAnyDict_Check(o) && Py_TYPE(o)->tp_as_number->nb_or == PyDict_Type.tp_as_number->nb_or)) ||
1067+
(PyODict_Check(o) && Py_TYPE(o)->tp_as_number->nb_or == PyODict_Type.tp_as_number->nb_or);
1068+
}
1069+
10641070
static PyObject *
10651071
mappingproxy_or(PyObject *left, PyObject *right)
10661072
{
10671073
if (PyObject_TypeCheck(left, &PyDictProxy_Type)) {
1068-
left = ((mappingproxyobject*)left)->mapping;
1069-
}
1070-
if (PyObject_TypeCheck(right, &PyDictProxy_Type)) {
1071-
right = ((mappingproxyobject*)right)->mapping;
1074+
if (PyObject_TypeCheck(right, &PyDictProxy_Type)) {
1075+
right = ((mappingproxyobject*)right)->mapping;
1076+
}
1077+
PyObject *left_mapping = ((mappingproxyobject*)left)->mapping;
1078+
if (is_known_dict_subclass_or(right) || PyFrozenDict_CheckExact(left_mapping)) {
1079+
return PyNumber_Or(left_mapping, right);
1080+
}
1081+
} else {
1082+
assert(PyObject_TypeCheck(right, &PyDictProxy_Type));
1083+
PyObject *right_mapping = ((mappingproxyobject*)right)->mapping;
1084+
if (is_known_dict_subclass_or(left) || PyFrozenDict_CheckExact(right_mapping)) {
1085+
return PyNumber_Or(left, right_mapping);
1086+
}
10721087
}
1073-
return PyNumber_Or(left, right);
1088+
1089+
// The non-mappingproxy "or" will have to deal with a mappingproxy.
1090+
Py_RETURN_NOTIMPLEMENTED;
10741091
}
10751092

10761093
static PyObject *

0 commit comments

Comments
 (0)