-
-
Notifications
You must be signed in to change notification settings - Fork 31.8k
bpo-32388: Remove cross-version binary compatibility requirement in tp_flags #4944
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
You write "Starting with 3.7, binary compatibility of C extensions accross feature releases of Python is not supported anymore" but has such binary compatibility ever been supported? This PR seems to imply that it was, but PEP 384 explicitly says that the layout of PS: typo |
d49cf6f
to
f7b494c
Compare
…p_flags It is now allowed to add new fields at the end of the PyTypeObject struct (and even in the middle, if we are so inclined) in feature releases 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.
57ea6a3
to
19770ae
Compare
I updated this PR against master and addressed the review comments. |
@zooba Is there a way to retry an Azure job which failed because it couldn't "provision the agent"? |
It would be good to get this done before the first 3.8 beta. @scoder: is there any chance that you could finish the "core review"? |
Not "in the middle" as that would break the typical code of the form PyTypeObject PyCFunction_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"builtin_function_or_method",
sizeof(PyCFunctionObject),
0,
(destructor)meth_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_reserved */
(reprfunc)meth_repr, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
(hashfunc)meth_hash, /* tp_hash */
PyCFunction_Call, /* tp_call */
0, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
0, /* tp_doc */
(traverseproc)meth_traverse, /* tp_traverse */
0, /* tp_clear */
meth_richcompare, /* tp_richcompare */
offsetof(PyCFunctionObject, m_weakreflist), /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
meth_methods, /* tp_methods */
meth_members, /* tp_members */
meth_getsets, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
}; With C99, there are better ways to write the above, but we should still support that. |
One thing that keeps bugging me when I see this diff: Do we really have to change the value of |
cc @encukou |
Can we keep the bit for backwards compatibility? Pedantically, something like |
What value do you suggest |
The same value that it always had. |
Ok. Unless someone opposes, I'll merge this once CI is green. |
Thank you! |
Nice, happy to see that this was merged. |
…p_flags (pythonGH-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.
Starting with 3.8, it is now allowed to add new fields at the end of the
PyTypeObject
struct in feature releases without having to allocate a dedicated compatibility flag intp_flags
. This will reduce the risk of running out of bits in the 32-bittp_flags
value.https://bugs.python.org/issue32388