@@ -837,6 +837,32 @@ class customdict(dict): # this one should not do anything fancy
837837 self .assertRaisesRegex (NameError , "name 'superglobal' is not defined" ,
838838 exec , code , {'__builtins__' : customdict ()})
839839
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+
840866 def test_exec_redirected (self ):
841867 savestdout = sys .stdout
842868 sys .stdout = None # Whatever that cannot flush()
0 commit comments