diff options
author | Mark Shannon <mark@hotpy.org> | 2021-05-02 23:38:22 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-02 23:38:22 (GMT) |
commit | 33ec88ac81f23668293d101b83367b086c795e5e (patch) | |
tree | ba5203f9375440ef1f63ceffe55f423d3b28195b /Modules/_abc.c | |
parent | 9387fac100db359cbb6ec2a76f8a5eba8f9d7b65 (diff) | |
download | cpython-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.c | 11 |
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); |