summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier de Gaye <xdegaye@users.sourceforge.net>2016-10-12 18:16:05 (GMT)
committerXavier de Gaye <xdegaye@users.sourceforge.net>2016-10-12 18:16:05 (GMT)
commit291417da7fc141e4ede93b804b6532460f2cc528 (patch)
treef3a549756e13db2ec60b6bf9bcecd85ea2fa202e
parentebe17e0347944b01a771eae4cee7f2a38cc82e42 (diff)
parent10e54aeaa234f2806b367c66e3fb4ac6568b39f6 (diff)
downloadcpython-291417da7fc141e4ede93b804b6532460f2cc528.zip
cpython-291417da7fc141e4ede93b804b6532460f2cc528.tar.gz
cpython-291417da7fc141e4ede93b804b6532460f2cc528.tar.bz2
Issue #20766: Merge with 3.5.
-rwxr-xr-xLib/pdb.py10
-rw-r--r--Lib/test/test_pdb.py23
-rw-r--r--Misc/NEWS3
3 files changed, 33 insertions, 3 deletions
diff --git a/Lib/pdb.py b/Lib/pdb.py
index 7eb78b9..97618b0 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -135,6 +135,8 @@ line_prefix = '\n-> ' # Probably a better default
class Pdb(bdb.Bdb, cmd.Cmd):
+ _previous_sigint_handler = None
+
def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
nosigint=False, readrc=True):
bdb.Bdb.__init__(self, skip=skip)
@@ -189,8 +191,6 @@ class Pdb(bdb.Bdb, cmd.Cmd):
self.message("\nProgram interrupted. (Use 'cont' to resume).")
self.set_step()
self.set_trace(frame)
- # restore previous signal handler
- signal.signal(signal.SIGINT, self._previous_sigint_handler)
def reset(self):
bdb.Bdb.reset(self)
@@ -339,6 +339,10 @@ class Pdb(bdb.Bdb, cmd.Cmd):
(expr, newvalue, oldvalue))
def interaction(self, frame, traceback):
+ # Restore the previous signal handler at the Pdb prompt.
+ if Pdb._previous_sigint_handler:
+ signal.signal(signal.SIGINT, Pdb._previous_sigint_handler)
+ Pdb._previous_sigint_handler = None
if self.setup(frame, traceback):
# no interaction desired at this time (happens if .pdbrc contains
# a command like "continue")
@@ -1039,7 +1043,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
"""
if not self.nosigint:
try:
- self._previous_sigint_handler = \
+ Pdb._previous_sigint_handler = \
signal.signal(signal.SIGINT, self.sigint_handler)
except ValueError:
# ValueError happens when do_continue() is invoked from
diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
index 994e088..0ea2af5 100644
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -911,6 +911,29 @@ def test_pdb_next_command_subiterator():
(Pdb) continue
"""
+def test_pdb_issue_20766():
+ """Test for reference leaks when the SIGINT handler is set.
+
+ >>> def test_function():
+ ... i = 1
+ ... while i <= 2:
+ ... sess = pdb.Pdb()
+ ... sess.set_trace(sys._getframe())
+ ... print('pdb %d: %s' % (i, sess._previous_sigint_handler))
+ ... i += 1
+
+ >>> with PdbTestInput(['continue',
+ ... 'continue']):
+ ... test_function()
+ > <doctest test.test_pdb.test_pdb_issue_20766[0]>(6)test_function()
+ -> print('pdb %d: %s' % (i, sess._previous_sigint_handler))
+ (Pdb) continue
+ pdb 1: <built-in function default_int_handler>
+ > <doctest test.test_pdb.test_pdb_issue_20766[0]>(5)test_function()
+ -> sess.set_trace(sys._getframe())
+ (Pdb) continue
+ pdb 2: <built-in function default_int_handler>
+ """
class PdbTestCase(unittest.TestCase):
diff --git a/Misc/NEWS b/Misc/NEWS
index b9589e7..667bff5 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,9 @@ Core and Builtins
Library
-------
+- Issue #20766: Fix references leaked by pdb in the handling of SIGINT
+ handlers.
+
Build
-----