File tree Expand file tree Collapse file tree 4 files changed +56
-0
lines changed Expand file tree Collapse file tree 4 files changed +56
-0
lines changed Original file line number Diff line number Diff line change @@ -340,6 +340,7 @@ def set_trace(self, frame=None):
340340 self .botframe = frame
341341 frame = frame .f_back
342342 self .set_step ()
343+ self .enterframe = None
343344 sys .settrace (self .trace_dispatch )
344345
345346 def set_continue (self ):
@@ -356,6 +357,7 @@ def set_continue(self):
356357 while frame and frame is not self .botframe :
357358 del frame .f_trace
358359 frame = frame .f_back
360+ self .enterframe = None
359361
360362 def set_quit (self ):
361363 """Set quitting attribute to True.
Original file line number Diff line number Diff line change @@ -281,6 +281,7 @@ def forget(self):
281281 if hasattr (self , 'curframe' ) and self .curframe :
282282 self .curframe .f_globals .pop ('__pdb_convenience_variables' , None )
283283 self .curframe = None
284+ self .curframe_locals = {}
284285 self .tb_lineno .clear ()
285286
286287 def setup (self , f , tb ):
Original file line number Diff line number Diff line change @@ -1981,6 +1981,58 @@ def test_pdb_ambiguous_statements():
19811981 (Pdb) continue
19821982 """
19831983
1984+ def test_pdb_frame_refleak ():
1985+ """
1986+ pdb should not leak reference to frames
1987+
1988+ >>> def frame_leaker(container):
1989+ ... import sys
1990+ ... container.append(sys._getframe())
1991+ ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
1992+ ... pass
1993+
1994+ >>> def test_function():
1995+ ... import gc
1996+ ... container = []
1997+ ... frame_leaker(container) # c
1998+ ... print(len(gc.get_referrers(container[0])))
1999+ ... container = []
2000+ ... frame_leaker(container) # n c
2001+ ... print(len(gc.get_referrers(container[0])))
2002+ ... container = []
2003+ ... frame_leaker(container) # r c
2004+ ... print(len(gc.get_referrers(container[0])))
2005+
2006+ >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE
2007+ ... 'continue',
2008+ ... 'next',
2009+ ... 'continue',
2010+ ... 'return',
2011+ ... 'continue',
2012+ ... ]):
2013+ ... test_function()
2014+ > <doctest test.test_pdb.test_pdb_frame_refleak[0]>(5)frame_leaker()
2015+ -> pass
2016+ (Pdb) continue
2017+ 1
2018+ > <doctest test.test_pdb.test_pdb_frame_refleak[0]>(5)frame_leaker()
2019+ -> pass
2020+ (Pdb) next
2021+ --Return--
2022+ > <doctest test.test_pdb.test_pdb_frame_refleak[0]>(5)frame_leaker()->None
2023+ -> pass
2024+ (Pdb) continue
2025+ 1
2026+ > <doctest test.test_pdb.test_pdb_frame_refleak[0]>(5)frame_leaker()
2027+ -> pass
2028+ (Pdb) return
2029+ --Return--
2030+ > <doctest test.test_pdb.test_pdb_frame_refleak[0]>(5)frame_leaker()->None
2031+ -> pass
2032+ (Pdb) continue
2033+ 1
2034+ """
2035+
19842036def test_pdb_issue_gh_65052 ():
19852037 """See GH-65052
19862038
Original file line number Diff line number Diff line change 1+ Fixed a frame reference leak in :mod: `bdb `.
You can’t perform that action at this time.
0 commit comments