@@ -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+
10641070static PyObject *
10651071mappingproxy_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
10761093static PyObject *
0 commit comments