Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
GH-95245: Move weakreflist into the pre-header. #95657
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
GH-95245: Move weakreflist into the pre-header. #95657
Changes from all commits
16746d9
bcf23ce
File filter
Filter by extension
Conversations
Jump to
There are no files selected for viewing
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could
Py_TPFLAGS_MANAGED_DICT
be set even if wasn't set on line 3089? In other words, could the flag have been set beforetype_new_descriptors()
was called?If so, that implies that
Py_TPFLAGS_MANAGED_DICT
also implies a managed weaklist, which I'm not sure is correct.Otherwise the assert on line 3088 should probably move up to before line 3082.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Further, if it's always either both-are-managed or neither then it would be helpful if the flag were more clear (e.g.
Py_TPFLAGS_MANAGED_DICT_AND_WEAKLIST
).If either can be managed separately then there should probably be a separate
Py_TPFLAGS_MANAGED_WEAKLIST
flag.That might be necessary anyway since
Py_TPFLAGS_MANAGED_DICT
is already part of 3.11.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We want both to be managed, or neither, but our hand might be forced in the case of multiple inheritance.
One base might have a managed dict, and the other an explicit weakreflist.
I expect this case to be rare.
Currently
Py_TPFLAGS_MANAGED_DICT
is internal, it is set by the VM, but shouldn't be set by third-party code.When we make it public, as we should do for 3.12, then it would make sense to add
Py_TPFLAGS_MANAGED_WEAKLIST
.I'd like some sort of decision on #95589 first, though.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thinking about this a bit more, we can ensure both are explicit or both managed.
If one is explicit, the we make both explicit.
Moving from an explicitly declare offset to a managed one is unsafe, so we can't do that.
But we can do it the other way around.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here it only matters in the context of
type_new_descriptors()
. If we can guarantee the both-or-neither aspect in this "limited" context then that is sufficient for this PR (assuming we leave a comment to that effect).There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Regardless, my original question stands: could
Py_TPFLAGS_MANAGED_DICT
already be set whentype_new_descriptors()
is called? If so, the branch on 3095 is now problematic, no?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the pre-header layout documented, either in a comment, the docs, or an adjacent .txt file? Either way, I don't see the weaklist's place in the pre-header added to such documentation in this PR. That information would be super helpful, since I can only guess what
-4 * sizeof(PyObject *)
means. A short comment here pointing to that documentation would be nice too.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Documenting the object layout is on the to-do list.
Early draft here: https://github.com/faster-cpython/cpython/blob/document-object-layout/Objects/object_layout.md
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What? No SVG?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Likewise about
Py_TPFLAGS_MANAGED_DICT
implying something it didn't before (but only if the flag could possibly be set beforetype_new_descriptors()
gets called).