10000 bpo-45020: Identify which frozen modules are actually aliases. by ericsnowcurrently · Pull Request #28655 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

bpo-45020: Identify which frozen modules are actually aliases. #28655

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 our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Prev Previous commit
Next Next commit
Use SimpleNamespace for spec.loader_state.
  • Loading branch information
ericsnowcurrently committed Oct 5, 2021
commit f1adc603c9d4b96fcb801056ce28789dc3244d74
6 changes: 4 additions & 2 deletions Lib/importlib/_bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,9 @@ def find_spec(cls, fullname, path=None, target=None):
spec = spec_from_loader(fullname, cls,
origin=cls._ORIGIN,
is_package=ispkg)
spec.loader_state = data
spec.loader_state = type(sys.implementation)(
data=data,
)
return spec

@classmethod
Expand All @@ -857,7 +859,7 @@ def exec_module(module):
spec = module.__spec__
name = spec.name
try:
data = spec.loader_state
data = spec.loader_state.data
except AttributeError:
if not _imp.is_frozen(name):
raise ImportError('{!r} is not a frozen module'.format(name),
Expand Down
30 changes: 19 additions & 11 deletions Lib/test/test_importlib/frozen/test_finder.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,24 @@ def check_basic(self, spec, name, ispkg=False):
self.assertIsNone(spec.submodule_search_locations)
self.assertIsNotNone(spec.loader_state)

def check_data(self, spec):
def check_loader_state(self, spec):
actual = dict(vars(spec.loader_state))

# Check the code object used to import the frozen module.
# We can't compare the marshaled data directly because
# marshal.dumps() would mark "expected" (below) as a ref,
# which slightly changes the output.
# (See https://bugs.python.org/issue34093.)
data = actual.pop('data')
with import_helper.frozen_modules():
expected = _imp.get_frozen_object(spec.name)
data = spec.loader_state
# We can't compare the marshaled data directly because
# marshal.dumps() would mark "expected" as a ref, which slightly
# changes the output. (See https://bugs.python.org/issue34093.)
code = marshal.loads(data)
self.assertEqual(code, expected)

# Check the rest of spec.loader_state.
expected = dict()
self.assertDictEqual(actual, expected)

def check_search_locations(self, spec):
# Frozen packages do not have any path entries.
# (See https://bugs.python.org/issue21736.)
Expand All @@ -58,7 +66,7 @@ def test_module(self):
with self.subTest(f'{name} -> {name}'):
spec = self.find(name)
self.check_basic(spec, name)
self.check_data(spec)
self.check_loader_state(spec)
modules = {
'__hello_alias__': '__hello__',
'_frozen_importlib': 'importlib._bootstrap',
Expand All @@ -67,7 +75,7 @@ def test_module(self):
with self.subTest(f'{name} -> {origname}'):
spec = self.find(name)
self.check_basic(spec, name)
self.check_data(spec)
self.check_loader_state(spec)
modules = [
'__phello__.__init__',
'__phello__.ham.__init__',
Expand All @@ -77,7 +85,7 @@ def test_module(self):
with self.subTest(f'{name} -> {origname}'):
spec = self.find(name)
self.check_basic(spec, name)
self.check_data(spec)
self.check_loader_state(spec)
modules = {
'__hello_only__': ('Tools', 'freeze', 'flag.py'),
}
Expand All @@ -86,7 +94,7 @@ def test_module(self):
with self.subTest(f'{name} -> {filename}'):
spec = self.find(name)
self.check_basic(spec, name)
self.check_data(spec)
self.check_loader_state(spec)

def test_package(self):
packages = [
Expand All @@ -97,7 +105,7 @@ def test_package(self):
with self.subTest(f'{name} -> {name}'):
spec = self.find(name)
self.check_basic(spec, name, ispkg=True)
self.check_data(spec)
self.check_loader_state(spec)
self.check_search_locations(spec)
packages = {
'__phello_alias__': '__hello__',
Expand All @@ -106,7 +114,7 @@ def test_package(self):
with self.subTest(f'{name} -> {origname}'):
spec = self.find(name)
self.check_basic(spec, name, ispkg=True)
self.check_data(spec)
self.check_loader_state(spec)
self.check_search_locations(spec)

# These are covered by test_module() and test_package().
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_importlib/frozen/test_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def exec_module(self, name):
self.machinery.FrozenImporter,
origin='frozen',
is_package=is_package,
loader_state=data,
loader_state=types.SimpleNamespace(data=data),
)
module = types.ModuleType(name)
module.__spec__ = spec
Expand Down
0