summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorAntoine Pitrou <antoine@python.org>2019-05-29 20:12:38 (GMT)
committerGitHub <noreply@github.com>2019-05-29 20:12:38 (GMT)
commitada319bb6d0ebcc68d3e0ef2b4279ea061877ac8 (patch)
treee908340371be04bce6b7676fd5f034aff3591a4a /Objects
parent43fdbd2729cb7cdbb5afb5d16352f6604859e564 (diff)
downloadcpython-ada319bb6d0ebcc68d3e0ef2b4279ea061877ac8.zip
cpython-ada319bb6d0ebcc68d3e0ef2b4279ea061877ac8.tar.gz
cpython-ada319bb6d0ebcc68d3e0ef2b4279ea061877ac8.tar.bz2
bpo-32388: Remove cross-version binary compatibility requirement in tp_flags (GH-4944)
It is now allowed to add new fields at the end of the PyTypeObject struct without having to allocate a dedicated compatibility flag in tp_flags. This will reduce the risk of running out of bits in the 32-bit tp_flags value.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/genobject.c9
-rw-r--r--Objects/object.c5
-rw-r--r--Objects/typeobject.c11
3 files changed, 8 insertions, 17 deletions
diff --git a/Objects/genobject.c b/Objects/genobject.c
index e2def38..0d0a02d 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -742,8 +742,7 @@ PyTypeObject PyGen_Type = {
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
- Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
0, /* tp_doc */
(traverseproc)gen_traverse, /* tp_traverse */
0, /* tp_clear */
@@ -997,8 +996,7 @@ PyTypeObject PyCoro_Type = {
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
- Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
0, /* tp_doc */
(traverseproc)gen_traverse, /* tp_traverse */
0, /* tp_clear */
@@ -1394,8 +1392,7 @@ PyTypeObject PyAsyncGen_Type = {
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
- Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
0, /* tp_doc */
(traverseproc)async_gen_traverse, /* tp_traverse */
0, /* tp_clear */
diff --git a/Objects/object.c b/Objects/object.c
index 87dba98..f9c75b7 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -298,10 +298,7 @@ PyObject_CallFinalizer(PyObject *self)
{
PyTypeObject *tp = Py_TYPE(self);
- /* The former could happen on heaptypes created from the C API, e.g.
- PyType_FromSpec(). */
- if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_FINALIZE) ||
- tp->tp_finalize == NULL)
+ if (tp->tp_finalize == NULL)
return;
/* tp_finalize should only be called once. */
if (PyType_IS_GC(tp) && _PyGC_FINALIZED(self))
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index c14cbad..071ff27 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -248,8 +248,8 @@ PyType_Modified(PyTypeObject *type)
Invariants:
- Py_TPFLAGS_VALID_VERSION_TAG is never set if
- Py_TPFLAGS_HAVE_VERSION_TAG is not set (e.g. on type
- objects coming from non-recompiled extension modules)
+ Py_TPFLAGS_HAVE_VERSION_TAG is not set (in case of a
+ bizarre MRO, see type_mro_modified()).
- before Py_TPFLAGS_VALID_VERSION_TAG can be set on a type,
it must first be set on all super types.
@@ -2571,7 +2571,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
/* Initialize tp_flags */
type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
- Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_FINALIZE;
+ Py_TPFLAGS_BASETYPE;
if (base->tp_flags & Py_TPFLAGS_HAVE_GC)
type->tp_flags |= Py_TPFLAGS_HAVE_GC;
@@ -5179,10 +5179,7 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base)
COPYSLOT(tp_init);
COPYSLOT(tp_alloc);
COPYSLOT(tp_is_gc);
- if ((type->tp_flags & Py_TPFLAGS_HAVE_FINALIZE) &&
- (base->tp_flags & Py_TPFLAGS_HAVE_FINALIZE)) {
- COPYSLOT(tp_finalize);
- }
+ COPYSLOT(tp_finalize);
if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) ==
(base->tp_flags & Py_TPFLAGS_HAVE_GC)) {
/* They agree about gc. */