@@ -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