diff options
author | Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> | 2022-04-19 17:41:36 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-19 17:41:36 (GMT) |
commit | ab0d35d70dfe0b4c11583f8f735a8cc49b58c58b (patch) | |
tree | ed1f726c61787498c0d7fa9890c932d6945ee881 /Tools/scripts | |
parent | 3c4380651301f255ef8149b638a1fae205ede575 (diff) | |
download | cpython-ab0d35d70dfe0b4c11583f8f735a8cc49b58c58b.zip cpython-ab0d35d70dfe0b4c11583f8f735a8cc49b58c58b.tar.gz cpython-ab0d35d70dfe0b4c11583f8f735a8cc49b58c58b.tar.bz2 |
bpo-46712: share more global strings in deepfreeze (gh-32152)
(for gh-90868)
Diffstat (limited to 'Tools/scripts')
-rw-r--r-- | Tools/scripts/deepfreeze.py | 4 | ||||
-rw-r--r-- | Tools/scripts/generate_global_objects.py | 19 |
2 files changed, 9 insertions, 14 deletions
diff --git a/Tools/scripts/deepfreeze.py b/Tools/scripts/deepfreeze.py index dfa4b3a..3c48bac 100644 --- a/Tools/scripts/deepfreeze.py +++ b/Tools/scripts/deepfreeze.py @@ -18,7 +18,7 @@ import umarshal from generate_global_objects import get_identifiers_and_strings verbose = False -identifiers = get_identifiers_and_strings()[0] +identifiers, strings = get_identifiers_and_strings() def isprintable(b: bytes) -> bool: return all(0x20 <= c < 0x7f for c in b) @@ -168,6 +168,8 @@ class Printer: return f"& {name}.ob_base.ob_base" def generate_unicode(self, name: str, s: str) -> str: + if s in strings: + return f"&_Py_STR({strings[s]})" if s in identifiers: return f"&_Py_ID({s})" if re.match(r'\A[A-Za-z0-9_]+\Z', s): diff --git a/Tools/scripts/generate_global_objects.py b/Tools/scripts/generate_global_objects.py index 826f4c4..2180acd 100644 --- a/Tools/scripts/generate_global_objects.py +++ b/Tools/scripts/generate_global_objects.py @@ -1,20 +1,13 @@ import contextlib -import glob import io import os.path import re -import sys - __file__ = os.path.abspath(__file__) ROOT = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) INTERNAL = os.path.join(ROOT, 'Include', 'internal') -STRING_LITERALS = { - 'empty': '', - 'dot': '.', -} IGNORED = { 'ACTION', # Python/_warnings.c 'ATTR', # Python/_warnings.c and Objects/funcobject.c @@ -211,7 +204,7 @@ def generate_global_strings(identifiers, strings): printer.write(START) with printer.block('struct _Py_global_strings', ';'): with printer.block('struct', ' literals;'): - for name, literal in sorted(strings.items()): + for literal, name in sorted(strings.items(), key=lambda x: x[1]): printer.write(f'STRUCT_FOR_STR({name}, "{literal}")') outfile.write('\n') with printer.block('struct', ' identifiers;'): @@ -276,7 +269,7 @@ def generate_runtime_init(identifiers, strings): # Global strings. with printer.block('.strings =', ','): with printer.block('.literals =', ','): - for name, literal in sorted(strings.items()): + for literal, name in sorted(strings.items(), key=lambda x: x[1]): printer.write(f'INIT_STR({name}, "{literal}"),') with printer.block('.identifiers =', ','): for name in sorted(identifiers): @@ -297,15 +290,15 @@ def generate_runtime_init(identifiers, strings): def get_identifiers_and_strings() -> 'tuple[set[str], dict[str, str]]': identifiers = set(IDENTIFIERS) - strings = dict(STRING_LITERALS) + strings = {} for name, string, *_ in iter_global_strings(): if string is None: if name not in IGNORED: identifiers.add(name) else: - if name not in strings: - strings[name] = string - elif string != strings[name]: + if string not in strings: + strings[string] = name + elif name != strings[string]: raise ValueError(f'string mismatch for {name!r} ({string!r} != {strings[name]!r}') return identifiers, strings |