bpo-46541: Replace core use of _Py_IDENTIFIER() with statically initialized global objects.#30928
Uh oh!
There was an error while loading. Please reload this page.
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.
In this PR we're no longer using
_Py_IDENTIFIER()(or_Py_static_string()) in any core CPython code. It is still used in a number of non-builtin stdlib modules.The replacement is:
PyUnicodeObject(not pointer) fields under_PyRuntimeState, statically initialized as part of_PyRuntime. A new_Py_GET_GLOBAL_IDENTIFIER()macro facilitates lookup of the fields (along with_Py_GET_GLOBAL_STRING()for non-identifier strings).https://bugs.python.org/issue46541#msg411799 explains the rationale for this change.
The core of the change is in:
_PyRuntimeStateI've also added a
--checkflag to generate_global_objects.py (along withmake check-global-objects) to check for unused global strings. That check is added to the PR CI config.The remainder of the PR updates the core code to use
_Py_GET_GLOBAL_IDENTIFIER()instead of_Py_IDENTIFIER()and the related_Py*Idfunctions (likewise for_Py_GET_GLOBAL_STRING()instead of_Py_static_string()). This includes adding a few functions where there wasn't already an alternative to_Py*Id(), replacing the_Py_Identifier *parameter withPyObject *.I'm planning on addressing the following separately:
_Py_IDENTIFIER()in the stdlib modules_Py_IDENTIFIER(), etc. entirely -- this may not be doable as at least one package on PyPI using this (private) APIhttps://bugs.python.org/issue46541