@@ -651,6 +651,21 @@ def test_compile_filename(self):
651651                compile ('pass' , filename , 'exec' )
652652        self .assertRaises (TypeError , compile , 'pass' , list (b'file.py' ), 'exec' )
653653
654+     def  test_compile_filename_refleak (self ):
655+         # Regression tests for reference leak in PyUnicode_FSDecoder. 
656+         # See https://github.com/python/cpython/issues/139748. 
657+         mortal_str  =  'this is a mortal string' 
658+         # check error path when 'mode' AC conversion failed 
659+         self .assertRaises (TypeError , compile , b'' , mortal_str , mode = 1234 )
660+         # check error path when 'optimize' AC conversion failed 
661+         self .assertRaises (OverflowError , compile , b'' , mortal_str ,
662+                           'exec' , optimize = 1  <<  1000 )
663+         # check error path when 'dont_inherit' AC conversion failed 
664+         class  EvilBool :
665+             def  __bool__ (self ): raise  ValueError 
666+         self .assertRaises (ValueError , compile , b'' , mortal_str ,
667+                           'exec' , dont_inherit = EvilBool ())
668+ 
654669    @support .cpython_only  
655670    def  test_same_filename_used (self ):
656671        s  =  """def f(): pass\n def g(): pass""" 
0 commit comments