summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_builtin.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-12-14 12:24:24 (GMT)
committerGitHub <noreply@github.com>2023-12-14 12:24:24 (GMT)
commit1161c14e8c68296fc465cd48970b32be9bee012e (patch)
tree369e0252cf2cb96bedefb0c891b7fbe3b0120152 /Lib/test/test_builtin.py
parent12f0bbd6e08bcc1e7165f2641716f7685c1db35c (diff)
downloadcpython-1161c14e8c68296fc465cd48970b32be9bee012e.zip
cpython-1161c14e8c68296fc465cd48970b32be9bee012e.tar.gz
cpython-1161c14e8c68296fc465cd48970b32be9bee012e.tar.bz2
gh-112716: Fix SystemError when __builtins__ is not a dict (GH-112770)
It was raised in two cases: * in the import statement when looking up __import__ * in pickling some builtin type when looking up built-ins iter, getattr, etc.
Diffstat (limited to 'Lib/test/test_builtin.py')
-rw-r--r--Lib/test/test_builtin.py26
1 files changed, 26 insertions, 0 deletions
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index 5e66d58..e154927 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -837,6 +837,32 @@ class BuiltinTest(unittest.TestCase):
self.assertRaisesRegex(NameError, "name 'superglobal' is not defined",
exec, code, {'__builtins__': customdict()})
+ def test_eval_builtins_mapping(self):
+ code = compile("superglobal", "test", "eval")
+ # works correctly
+ ns = {'__builtins__': types.MappingProxyType({'superglobal': 1})}
+ self.assertEqual(eval(code, ns), 1)
+ # custom builtins mapping is missing key
+ ns = {'__builtins__': types.MappingProxyType({})}
+ self.assertRaisesRegex(NameError, "name 'superglobal' is not defined",
+ eval, code, ns)
+
+ def test_exec_builtins_mapping_import(self):
+ code = compile("import foo.bar", "test", "exec")
+ ns = {'__builtins__': types.MappingProxyType({})}
+ self.assertRaisesRegex(ImportError, "__import__ not found", exec, code, ns)
+ ns = {'__builtins__': types.MappingProxyType({'__import__': lambda *args: args})}
+ exec(code, ns)
+ self.assertEqual(ns['foo'], ('foo.bar', ns, ns, None, 0))
+
+ def test_eval_builtins_mapping_reduce(self):
+ # list_iterator.__reduce__() calls _PyEval_GetBuiltin("iter")
+ code = compile("x.__reduce__()", "test", "eval")
+ ns = {'__builtins__': types.MappingProxyType({}), 'x': iter([1, 2])}
+ self.assertRaisesRegex(AttributeError, "iter", eval, code, ns)
+ ns = {'__builtins__': types.MappingProxyType({'iter': iter}), 'x': iter([1, 2])}
+ self.assertEqual(eval(code, ns), (iter, ([1, 2],), 0))
+
def test_exec_redirected(self):
savestdout = sys.stdout
sys.stdout = None # Whatever that cannot flush()