@@ -3009,6 +3009,57 @@ def test_pdb_f_trace_lines():
30093009 (Pdb) continue
30103010 """
30113011
3012+ def test_pdb_frame_refleak ():
3013+ """
3014+ pdb should not leak reference to frames
3015+
3016+ >>> def frame_leaker(container):
3017+ ... import sys
3018+ ... container.append(sys._getframe())
3019+ ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
3020+ ... pass
3021+
3022+ >>> def test_function():
3023+ ... import gc
3024+ ... container = []
3025+ ... frame_leaker(container) # c
3026+ ... print(len(gc.get_referrers(container[0])))
3027+ ... container = []
3028+ ... frame_leaker(container) # n c
3029+ ... print(len(gc.get_referrers(container[0])))
3030+ ... container = []
3031+ ... frame_leaker(container) # r c
3032+ ... print(len(gc.get_referrers(container[0])))
3033+
3034+ >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE
3035+ ... 'continue',
3036+ ... 'next',
3037+ ... 'continue',
3038+ ... 'return',
3039+ ... 'continue',
3040+ ... ]):
3041+ ... test_function()
3042+ > <doctest test.test_pdb.test_pdb_frame_refleak[0]>(4)frame_leaker()
3043+ -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
3044+ (Pdb) continue
3045+ 1
3046+ > <doctest test.test_pdb.test_pdb_frame_refleak[0]>(4)frame_leaker()
3047+ -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
3048+ (Pdb) next
3049+ > <doctest test.test_pdb.test_pdb_frame_refleak[0]>(5)frame_leaker()
3050+ -> pass
3051+ (Pdb) continue
3052+ 1
3053+ > <doctest test.test_pdb.test_pdb_frame_refleak[0]>(4)frame_leaker()
3054+ -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
3055+ (Pdb) return
3056+ --Return--
3057+ > <doctest test.test_pdb.test_pdb_frame_refleak[0]>(5)frame_leaker()->None
3058+ -> pass
3059+ (Pdb) continue
3060+ 1
3061+ """
3062+
30123063def test_pdb_function_break ():
30133064 """Testing the line number of break on function
30143065
0 commit comments