Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork34k
gh-139103: Use borrowed references for positional args in _PyStack_UnpackDict#144407
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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:main
Are you sure you want to change the base?
Conversation
…ack_UnpackDictThe positional arguments passed to _PyStack_UnpackDict are alreadykept alive by the caller, so we can avoid the extra reference countoperations by using borrowed references instead of creating new ones.This reduces reference count contention in the free-threaded buildwhen calling functions with keyword arguments. In particular, thisavoids contention on the type argument to `__new__` when instantiatingnamedtuples with keyword arguments.
vstinner left a comment
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.
LGTM.
The positional arguments are borrowed references from the input array
(which must be kept alive by the caller). The keyword argument values
are new references.
IMO it's a reasonable assumption. If there are bugs, the caller should be modified to hold a strong reference to its arguments.
_PyStack_UnpackDict() callers:
- _PyObject_VectorcallDictTstate():
PyObject *const *args - _PyVectorcall_Call():
PyObject *tuple - _PyEvalFramePushAndInit_Ex():
PyObject *callargs(tuple)
_PyObject_VectorcallDictTstate() callers:
- PyObject_VectorcallDict():
PyObject *const *args - PyEval_CallObjectWithKeywords(): pass
NULLforargs - _PyObject_Call_Prepend():
PyObject *args(tuple)
Most calls take their positional arguments from a tuple (safe). The most risky code path are calls to PyObject_VectorcallDict(): the change makes the assumption that this function is only called with strong references.
colesbury commentedFeb 2, 2026
FWIW, Lines 133 to 136 in29acc08
|
Uh oh!
There was an error while loading.Please reload this page.
The positional arguments passed to _PyStack_UnpackDict are already kept alive by the caller, so we can avoid the extra reference count operations by using borrowed references instead of creating new ones.
This reduces reference count contention in the free-threaded build when calling functions with keyword arguments. In particular, this avoids contention on the type argument to
__new__when instantiating namedtuples with keyword arguments.