summaryrefslogtreecommitdiffstats
path: root/Modules/_abc.c
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2021-05-02 23:38:22 (GMT)
committerGitHub <noreply@github.com>2021-05-02 23:38:22 (GMT)
commit33ec88ac81f23668293d101b83367b086c795e5e (patch)
treeba5203f9375440ef1f63ceffe55f423d3b28195b /Modules/_abc.c
parent9387fac100db359cbb6ec2a76f8a5eba8f9d7b65 (diff)
downloadcpython-33ec88ac81f23668293d101b83367b086c795e5e.zip
cpython-33ec88ac81f23668293d101b83367b086c795e5e.tar.gz
cpython-33ec88ac81f23668293d101b83367b086c795e5e.tar.bz2
bpo-43977: Make sure that tp_flags for pattern matching are inherited correctly. (GH-25813)
Diffstat (limited to 'Modules/_abc.c')
-rw-r--r--Modules/_abc.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/Modules/_abc.c b/Modules/_abc.c
index 39261dd..7720d40 100644
--- a/Modules/_abc.c
+++ b/Modules/_abc.c
@@ -467,6 +467,10 @@ _abc__abc_init(PyObject *module, PyObject *self)
if (val == -1 && PyErr_Occurred()) {
return NULL;
}
+ if ((val & COLLECTION_FLAGS) == COLLECTION_FLAGS) {
+ PyErr_SetString(PyExc_TypeError, "__abc_tpflags__ cannot be both Py_TPFLAGS_SEQUENCE and Py_TPFLAGS_MAPPING");
+ return NULL;
+ }
((PyTypeObject *)self)->tp_flags |= (val & COLLECTION_FLAGS);
}
if (_PyDict_DelItemId(cls->tp_dict, &PyId___abc_tpflags__) < 0) {
@@ -527,9 +531,12 @@ _abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass)
/* Invalidate negative cache */
get_abc_state(module)->abc_invalidation_counter++;
- if (PyType_Check(subclass) && PyType_Check(self) &&
- !PyType_HasFeature((PyTypeObject *)subclass, Py_TPFLAGS_IMMUTABLETYPE))
+ /* Set Py_TPFLAGS_SEQUENCE or Py_TPFLAGS_MAPPING flag */
+ if (PyType_Check(self) &&
+ !PyType_HasFeature((PyTypeObject *)subclass, Py_TPFLAGS_IMMUTABLETYPE) &&
+ ((PyTypeObject *)self)->tp_flags & COLLECTION_FLAGS)
{
+ ((PyTypeObject *)subclass)->tp_flags &= ~COLLECTION_FLAGS;
((PyTypeObject *)subclass)->tp_flags |= (((PyTypeObject *)self)->tp_flags & COLLECTION_FLAGS);
}
Py_INCREF(subclass);