@@ -732,8 +732,8 @@ def custom_import(name, globals=None, locals=None, fromlist=None,
732732 return real_import(name, globals, locals, fromlist, level)
733733
734734 def check():
735- proxy = globals()["primary"]
736- globals()["secondary"] = proxy
735+ exec('secondary = globals()["primary"]', globals())
736+ proxy = globals()["secondary"]
737737
738738 resolved = proxy.resolve()
739739 assert globals()["primary"] is resolved
@@ -752,6 +752,54 @@ def check():
752752 """ )
753753 assert_python_ok ("-c" , code )
754754
755+ @support .requires_subprocess ()
756+ def test_reentrant_store_resolution_clears_pending_owner (self ):
757+ code = textwrap .dedent ("""
758+ import builtins
759+ import types
760+
761+ real_import = builtins.__import__
762+ calls = []
763+ errors = []
764+ proxies = []
765+
766+ def custom_import(name, globals=None, locals=None, fromlist=None,
767+ level=0):
768+ if name == "target_module":
769+ calls.append(name)
770+ resolved = types.ModuleType(name)
771+ resolved.VALUE = "resolved"
772+ return resolved
773+ return real_import(name, globals, locals, fromlist, level)
774+
775+ class Reenter:
776+ def __del__(self):
777+ try:
778+ proxies.append(globals()["target"])
779+ assert target.VALUE == "resolved"
780+ except BaseException as exc:
781+ errors.append((type(exc).__name__, str(exc)))
782+
783+ builtins.__import__ = custom_import
784+ target = Reenter()
785+ lazy import target_module as target
786+
787+ try:
788+ assert not errors, errors
789+ assert len(proxies) == 1, proxies
790+ resolved = globals()["target"]
791+ proxy = proxies[0]
792+ assert resolved.VALUE == "resolved"
793+
794+ globals()["target"] = proxy
795+ assert proxy.resolve() is resolved
796+ assert globals()["target"] is proxy
797+ assert len(calls) == 1, calls
798+ finally:
799+ builtins.__import__ = real_import
800+ """ )
801+ assert_python_ok ("-c" , code )
802+
755803
756804class SyntaxRestrictionTests (LazyImportTestCase ):
757805 """Tests for syntax restrictions on lazy imports."""
0 commit comments