summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-02-24-07-50-43.bpo-46712.pw7vQV.rst1
-rw-r--r--Tools/scripts/deepfreeze.py5
-rw-r--r--Tools/scripts/generate_global_objects.py14
3 files changed, 14 insertions, 6 deletions
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 0000000..9dbf7e0
--- /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 b62be37..8ea232f 100644
--- a/Tools/scripts/deepfreeze.py
+++ b/Tools/scripts/deepfreeze.py
@@ -15,9 +15,10 @@ import types
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 @@ class Printer:
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 bad7865..506aa86 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)