Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

[3.12] gh-113993: Make interned strings mortal (GH-120520, GH-121364, GH-121903, GH-122303)#123065

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

Merged
Yhg1s merged 14 commits intopython:3.12fromencukou:mortal-interns-3.12
Sep 27, 2024

Conversation

encukou
Copy link
Member

@encukouencukou commentedAug 16, 2024
edited
Loading

This backports several PRs forgh-113993, making interned strings mortal so they can be garbage-collected when no longer needed.

  • Allow interned strings to be mortal, and fix related issues (gh-113993: Allow interned strings to be mortal, and fix related issues #120520)

    • Add an InternalDocs file describing how interning should work and how to use it.

    • Add internal functions toexplicitly request what kind of interning is done:

      • _PyUnicode_InternMortal
      • _PyUnicode_InternImmortal
      • _PyUnicode_InternStatic
    • Switch uses ofPyUnicode_InternInPlace to those.

    • Disallow using_Py_SetImmortal on strings directly.
      You should use_PyUnicode_InternImmortal instead:

      • Strings should be interned before immortalization, otherwise you're possibly
        interning a immortalizing copy.
      • _Py_SetImmortal doesn't handle theSSTATE_INTERNED_MORTAL to
        SSTATE_INTERNED_IMMORTAL update, and those flags can't be changed in
        backports, as they are now part of public API and version-specific ABI.
    • Add private_only_immortal argument forsys.getunicodeinternedsize, used in refleak test machinery.

    Make sure the statically allocated string singletons are unique. This means these sets are now disjoint:

    • _Py_ID
    • _Py_STR (including the empty string)
    • one-character latin-1 singletons

    Now, when you intern a singleton, that exact singleton will be interned.

    • Add a_Py_LATIN1_CHR macro, use it instead of_Py_ID/_Py_STR for one-character latin-1 singletons everywhere (including Clinic).

    • Intern_Py_STR singletons at startup.

    • Beef up the tests. Cover internal details (marked with@cpython_only).

    • Add lots of assertions

  • Don't immortalize in PyUnicode_InternInPlace; keep immortalizing in other API (gh-113993: Don't immortalize in PyUnicode_InternInPlace; keep immortalizing in other API #121364)

    • Switch PyUnicode_InternInPlace to _PyUnicode_InternMortal, clarify docs

    • Document immortality in some functions that takeconst char *

    This is PyUnicode_InternFromString;
    PyDict_SetItemString, PyObject_SetAttrString;
    PyObject_DelAttrString; PyUnicode_InternFromString;
    and the PyModule_Add convenience functions.

    Always point out a non-immortalizing alternative.

    • Don't immortalize user-provided attr names in _ctypes
  • Immortalize names in code objects to avoid crash (gh-121863: Immortalize names in code objects to avoid crash #121903)

  • Intern latin-1 one-byte strings at startup (gh-122291: Intern latin-1 one-byte strings at startup #122303)

There are some 3.12-specific changes, mainly to allow statically allocated strings in deepfreeze. (In 3.13, deepfreeze switched to the general_Py_ID/_Py_STR.)

Co-authored-by: Eric Snowericsnowcurrently@gmail.com


📚 Documentation preview 📚:https://cpython-previews--123065.org.readthedocs.build/

Issue:#113993

encukouand others added7 commitsAugust 16, 2024 13:36
…related issues (pythonGH-120520)* Add an InternalDocs file describing how interning should work and how to use it.* Add internal functions to *explicitly* request what kind of interning is done:  - `_PyUnicode_InternMortal`  - `_PyUnicode_InternImmortal`  - `_PyUnicode_InternStatic`* Switch uses of `PyUnicode_InternInPlace` to those.* Disallow using `_Py_SetImmortal` on strings directly.  You should use `_PyUnicode_InternImmortal` instead:  - Strings should be interned before immortalization, otherwise you're possibly    interning a immortalizing copy.  - `_Py_SetImmortal` doesn't handle the `SSTATE_INTERNED_MORTAL` to    `SSTATE_INTERNED_IMMORTAL` update, and those flags can't be changed in    backports, as they are now part of public API and version-specific ABI.* Add private `_only_immortal` argument for `sys.getunicodeinternedsize`, used in refleak test machinery.* Make sure the statically allocated string singletons are unique. This means these sets are now disjoint:  - `_Py_ID`  - `_Py_STR` (including the empty string)  - one-character latin-1 singletons  Now, when you intern a singleton, that exact singleton will be interned.* Add a `_Py_LATIN1_CHR` macro, use it instead of `_Py_ID`/`_Py_STR` for one-character latin-1 singletons everywhere (including Clinic).* Intern `_Py_STR` singletons at startup.* Beef up the tests. Cover internal details (marked with `@cpython_only`).* Add lots of assertionsCo-authored-by: Eric Snow <ericsnowcurrently@gmail.com>
… keep immortalizing in other API (pythonGH-121364)* Switch PyUnicode_InternInPlace to _PyUnicode_InternMortal, clarify docs* Document immortality in some functions that take `const char *`This is PyUnicode_InternFromString;PyDict_SetItemString, PyObject_SetAttrString;PyObject_DelAttrString; PyUnicode_InternFromString;and the PyModule_Add convenience functions.Always point out a non-immortalizing alternative.* Don't immortalize user-provided attr names in _ctypes(cherry picked from commitb4aedb2)
@encukouencukou added the 🔨 test-with-buildbotsTest PR w/ buildbots; report in status section labelAug 21, 2024
@bedevere-bot
Copy link

🤖 New build scheduled with the buildbot fleet by@encukou for commit2640dc8 🤖

If you want to schedule another build, you need to add the🔨 test-with-buildbots label again.

@bedevere-botbedevere-bot removed the 🔨 test-with-buildbotsTest PR w/ buildbots; report in status section labelAug 21, 2024
@encukou
Copy link
MemberAuthor

The buildbot failures look unrelated.

@encukou
Copy link
MemberAuthor

@Yhg1s, please review this backport. Sorry about the size!

@Yhg1sYhg1s merged commit49f6beb intopython:3.12Sep 27, 2024
29 checks passed
@encukouencukou deleted the mortal-interns-3.12 branchSeptember 27, 2024 23:31
@mgorny
Copy link
Contributor

FYI, this is at least missing a backport of281ffb6, and therefore causing Rust packages to crash on assertions. I've filed#124887.

Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers

@JelleZijlstraJelleZijlstraJelleZijlstra left review comments

@berkerpeksagberkerpeksagAwaiting requested review from berkerpeksagberkerpeksag is a code owner

@erlend-aaslanderlend-aaslandAwaiting requested review from erlend-aaslanderlend-aasland is a code owner

@pablogsalpablogsalAwaiting requested review from pablogsalpablogsal is a code owner

@lysnikolaoulysnikolaouAwaiting requested review from lysnikolaoulysnikolaou is a code owner

@tirantiranAwaiting requested review from tirantiran is a code owner

@isidenticalisidenticalAwaiting requested review from isidenticalisidentical is a code owner

@markshannonmarkshannonAwaiting requested review from markshannonmarkshannon is a code owner

@iritkatrieliritkatrielAwaiting requested review from iritkatrieliritkatriel is a code owner

@methanemethaneAwaiting requested review from methanemethane is a code owner

Assignees
No one assigned
Labels
None yet
Projects
None yet
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

5 participants
@encukou@bedevere-bot@mgorny@JelleZijlstra@Yhg1s

[8]ページ先頭

©2009-2025 Movatter.jp