Skip to content

Commit

Permalink
pythongh-94808: Cover LOAD_GLOBAL for custom dict subtypes (pythonG…
Browse files Browse the repository at this point in the history
  • Loading branch information
sobolevn authored Nov 4, 2022
1 parent 016c7d3 commit 044bcc1
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions Lib/test/test_builtin.py
Original file line number Diff line number Diff line change
Expand Up @@ -736,6 +736,7 @@ def test_exec_globals(self):
self.assertRaises(TypeError,
exec, code, {'__builtins__': 123})

def test_exec_globals_frozen(self):
class frozendict_error(Exception):
pass

Expand Down Expand Up @@ -767,6 +768,36 @@ def __setitem__(self, key, value):
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()
Expand Down

0 comments on commit 044bcc1

Please sign in to comment.