@@ -837,6 +837,32 @@ class customdict(dict): # this one should not do anything fancy
837
837
self .assertRaisesRegex (NameError , "name 'superglobal' is not defined" ,
838
838
exec , code , {'__builtins__' : customdict ()})
839
839
840
+ def test_eval_builtins_mapping (self ):
841
+ code = compile ("superglobal" , "test" , "eval" )
842
+ # works correctly
843
+ ns = {'__builtins__' : types .MappingProxyType ({'superglobal' : 1 })}
844
+ self .assertEqual (eval (code , ns ), 1 )
845
+ # custom builtins mapping is missing key
846
+ ns = {'__builtins__' : types .MappingProxyType ({})}
847
+ self .assertRaisesRegex (NameError , "name 'superglobal' is not defined" ,
848
+ eval , code , ns )
849
+
850
+ def test_exec_builtins_mapping_import (self ):
851
+ code = compile ("import foo.bar" , "test" , "exec" )
852
+ ns = {'__builtins__' : types .MappingProxyType ({})}
853
+ self .assertRaisesRegex (ImportError , "__import__ not found" , exec , code , ns )
854
+ ns = {'__builtins__' : types .MappingProxyType ({'__import__' : lambda * args : args })}
855
+ exec (code , ns )
856
+ self .assertEqual (ns ['foo' ], ('foo.bar' , ns , ns , None , 0 ))
857
+
858
+ def test_eval_builtins_mapping_reduce (self ):
859
+ # list_iterator.__reduce__() calls _PyEval_GetBuiltin("iter")
860
+ code = compile ("x.__reduce__()" , "test" , "eval" )
861
+ ns = {'__builtins__' : types .MappingProxyType ({}), 'x' : iter ([1 , 2 ])}
862
+ self .assertRaisesRegex (AttributeError , "iter" , eval , code , ns )
863
+ ns = {'__builtins__' : types .MappingProxyType ({'iter' : iter }), 'x' : iter ([1 , 2 ])}
864
+ self .assertEqual (eval (code , ns ), (iter , ([1 , 2 ],), 0 ))
865
+
840
866
def test_exec_redirected (self ):
841
867
savestdout = sys .stdout
842
868
sys .stdout = None # Whatever that cannot flush()
0 commit comments