[3.11] gh-94808: Cover LOAD_GLOBAL for custom dict subtypes (GH-96767) (GH-99091)

This commit is contained in:
Miss Islington (bot) 2022-11-04 04:12:42 -07:00 committed by GitHub
parent 2ef2eaac15
commit 2b79f4e469
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -737,6 +737,7 @@ class BuiltinTest(unittest.TestCase):
self.assertRaises(TypeError,
exec, code, {'__builtins__': 123})
def test_exec_globals_frozen(self):
class frozendict_error(Exception):
pass
@ -768,6 +769,36 @@ class BuiltinTest(unittest.TestCase):
self.assertRaises(frozendict_error,
exec, code, namespace)
def test_exec_globals_error_on_get(self):
# custom `globals` or `builtins` can raise errors on item access
class setonlyerror(Exception):
pass
class setonlydict(dict):
def __getitem__(self, key):
raise setonlyerror
# globals' `__getitem__` raises
code = compile("globalname", "test", "exec")
self.assertRaises(setonlyerror,
exec, code, setonlydict({'globalname': 1}))
# builtins' `__getitem__` raises
code = compile("superglobal", "test", "exec")
self.assertRaises(setonlyerror, exec, code,
{'__builtins__': setonlydict({'superglobal': 1})})
def test_exec_globals_dict_subclass(self):
class customdict(dict): # this one should not do anything fancy
pass
code = compile("superglobal", "test", "exec")
# works correctly
exec(code, {'__builtins__': customdict({'superglobal': 1})})
# custom builtins dict subclass is missing key
self.assertRaisesRegex(NameError, "name 'superglobal' is not defined",
exec, code, {'__builtins__': customdict()})
def test_exec_redirected(self):
savestdout = sys.stdout
sys.stdout = None # Whatever that cannot flush()