diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-24-07-50-43.bpo-46712.pw7vQV.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-24-07-50-43.bpo-46712.pw7vQV.rst new file mode 100644 index 00000000000..9dbf7e074dc --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-02-24-07-50-43.bpo-46712.pw7vQV.rst @@ -0,0 +1 @@ +Share global string identifiers in deep-frozen modules. diff --git a/Tools/scripts/deepfreeze.py b/Tools/scripts/deepfreeze.py index b62be3713fe..8ea232fc466 100644 --- a/Tools/scripts/deepfreeze.py +++ b/Tools/scripts/deepfreeze.py @@ -15,9 +15,10 @@ from typing import Dict, FrozenSet, TextIO, Tuple import umarshal +from generate_global_objects import get_identifiers_and_strings verbose = False - +identifiers = get_identifiers_and_strings()[0] def isprintable(b: bytes) -> bool: return all(0x20 <= c < 0x7f for c in b) @@ -167,6 +168,8 @@ def generate_bytes(self, name: str, b: bytes) -> str: return f"& {name}.ob_base.ob_base" def generate_unicode(self, name: str, s: str) -> str: + if s in identifiers: + return f"&_Py_ID({s})" kind, ascii = analyze_character_width(s) if kind == PyUnicode_1BYTE_KIND: datatype = "uint8_t" diff --git a/Tools/scripts/generate_global_objects.py b/Tools/scripts/generate_global_objects.py index bad7865f1ff..506aa86575c 100644 --- a/Tools/scripts/generate_global_objects.py +++ b/Tools/scripts/generate_global_objects.py @@ -256,13 +256,10 @@ def generate_runtime_init(identifiers, strings): printer.write(after) -####################################### -# the script - -def main() -> None: +def get_identifiers_and_strings() -> tuple[set[str], dict[str, str]]: identifiers = set(IDENTIFIERS) strings = dict(STRING_LITERALS) - for name, string, filename, lno, _ in iter_global_strings(): + for name, string, *_ in iter_global_strings(): if string is None: if name not in IGNORED: identifiers.add(name) @@ -271,6 +268,13 @@ def main() -> None: strings[name] = string elif string != strings[name]: raise ValueError(f'string mismatch for {name!r} ({string!r} != {strings[name]!r}') + return identifiers, strings + +####################################### +# the script + +def main() -> None: + identifiers, strings = get_identifiers_and_strings() generate_global_strings(identifiers, strings) generate_runtime_init(identifiers, strings)