mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
bpo-23544: Disable IDLE Stack Viewer when running user code (GH-17163)
Starting stack viewer when user code is running, including when Debugger is active, hangs or crashes IDLE. Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
This commit is contained in:
parent
64fc105b2d
commit
23a567c11c
6 changed files with 37 additions and 5 deletions
|
@ -3,6 +3,9 @@ Released on 2021-10-04?
|
||||||
======================================
|
======================================
|
||||||
|
|
||||||
|
|
||||||
|
bpo-23544: Disable Debug=>Stack Viewer when user code is running or
|
||||||
|
Debugger is active, to prevent hang or crash. Patch by Zackery Spytz.
|
||||||
|
|
||||||
bpo-43008: Make IDLE invoke :func:`sys.excepthook` in normal,
|
bpo-43008: Make IDLE invoke :func:`sys.excepthook` in normal,
|
||||||
2-process mode.
|
2-process mode.
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ class CodeContext:
|
||||||
self.text.after_cancel(self.t1)
|
self.text.after_cancel(self.t1)
|
||||||
self._reset()
|
self._reset()
|
||||||
menu_status = 'Show'
|
menu_status = 'Show'
|
||||||
self.editwin.update_menu_label(menu='options', index='* Code Context',
|
self.editwin.update_menu_label(menu='options', index='*ode*ontext',
|
||||||
label=f'{menu_status} Code Context')
|
label=f'{menu_status} Code Context')
|
||||||
return "break"
|
return "break"
|
||||||
|
|
||||||
|
|
|
@ -339,7 +339,7 @@ class EditorWindow:
|
||||||
text.bind("<<toggle-code-context>>",
|
text.bind("<<toggle-code-context>>",
|
||||||
self.code_context.toggle_code_context_event)
|
self.code_context.toggle_code_context_event)
|
||||||
else:
|
else:
|
||||||
self.update_menu_state('options', '*Code Context', 'disabled')
|
self.update_menu_state('options', '*ode*ontext', 'disabled')
|
||||||
if self.allow_line_numbers:
|
if self.allow_line_numbers:
|
||||||
self.line_numbers = self.LineNumbers(self)
|
self.line_numbers = self.LineNumbers(self)
|
||||||
if idleConf.GetOption('main', 'EditorWindow',
|
if idleConf.GetOption('main', 'EditorWindow',
|
||||||
|
@ -347,7 +347,7 @@ class EditorWindow:
|
||||||
self.toggle_line_numbers_event()
|
self.toggle_line_numbers_event()
|
||||||
text.bind("<<toggle-line-numbers>>", self.toggle_line_numbers_event)
|
text.bind("<<toggle-line-numbers>>", self.toggle_line_numbers_event)
|
||||||
else:
|
else:
|
||||||
self.update_menu_state('options', '*Line Numbers', 'disabled')
|
self.update_menu_state('options', '*ine*umbers', 'disabled')
|
||||||
|
|
||||||
def handle_winconfig(self, event=None):
|
def handle_winconfig(self, event=None):
|
||||||
self.set_width()
|
self.set_width()
|
||||||
|
@ -450,7 +450,9 @@ class EditorWindow:
|
||||||
self.menudict = menudict = {}
|
self.menudict = menudict = {}
|
||||||
for name, label in self.menu_specs:
|
for name, label in self.menu_specs:
|
||||||
underline, label = prepstr(label)
|
underline, label = prepstr(label)
|
||||||
menudict[name] = menu = Menu(mbar, name=name, tearoff=0)
|
postcommand = getattr(self, f'{name}_menu_postcommand', None)
|
||||||
|
menudict[name] = menu = Menu(mbar, name=name, tearoff=0,
|
||||||
|
postcommand=postcommand)
|
||||||
mbar.add_cascade(label=label, menu=menu, underline=underline)
|
mbar.add_cascade(label=label, menu=menu, underline=underline)
|
||||||
if macosx.isCarbonTk():
|
if macosx.isCarbonTk():
|
||||||
# Insert the application menu
|
# Insert the application menu
|
||||||
|
@ -1527,7 +1529,7 @@ class EditorWindow:
|
||||||
else:
|
else:
|
||||||
self.line_numbers.show_sidebar()
|
self.line_numbers.show_sidebar()
|
||||||
menu_label = "Hide"
|
menu_label = "Hide"
|
||||||
self.update_menu_label(menu='options', index='*Line Numbers',
|
self.update_menu_label(menu='options', index='*ine*umbers',
|
||||||
label=f'{menu_label} Line Numbers')
|
label=f'{menu_label} Line Numbers')
|
||||||
|
|
||||||
# "line.col" -> line, as an int
|
# "line.col" -> line, as an int
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
# Reported as 88%; mocking turtledemo absence would have no point.
|
# Reported as 88%; mocking turtledemo absence would have no point.
|
||||||
|
|
||||||
from idlelib import mainmenu
|
from idlelib import mainmenu
|
||||||
|
import re
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,6 +17,26 @@ class MainMenuTest(unittest.TestCase):
|
||||||
def test_default_keydefs(self):
|
def test_default_keydefs(self):
|
||||||
self.assertGreaterEqual(len(mainmenu.default_keydefs), 50)
|
self.assertGreaterEqual(len(mainmenu.default_keydefs), 50)
|
||||||
|
|
||||||
|
def test_tcl_indexes(self):
|
||||||
|
# Test tcl patterns used to find menuitem to alter.
|
||||||
|
# On failure, change pattern here and in function(s).
|
||||||
|
# Patterns here have '.*' for re instead of '*' for tcl.
|
||||||
|
for menu, pattern in (
|
||||||
|
('debug', '.*tack.*iewer'), # PyShell.debug_menu_postcommand
|
||||||
|
('options', '.*ode.*ontext'), # EW.__init__, CodeContext.toggle...
|
||||||
|
('options', '.*ine.*umbers'), # EW.__init__, EW.toggle...event.
|
||||||
|
):
|
||||||
|
with self.subTest(menu=menu, pattern=pattern):
|
||||||
|
for menutup in mainmenu.menudefs:
|
||||||
|
if menutup[0] == menu:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
self.assertTrue(0, f"{menu} not in menudefs")
|
||||||
|
self.assertTrue(any(re.search(pattern, menuitem[0])
|
||||||
|
for menuitem in menutup[1]
|
||||||
|
if menuitem is not None), # Separator.
|
||||||
|
f"{pattern} not in {menu}")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main(verbosity=2)
|
unittest.main(verbosity=2)
|
||||||
|
|
|
@ -989,6 +989,10 @@ class PyShell(OutputWindow):
|
||||||
self.showprompt()
|
self.showprompt()
|
||||||
self.set_debugger_indicator()
|
self.set_debugger_indicator()
|
||||||
|
|
||||||
|
def debug_menu_postcommand(self):
|
||||||
|
state = 'disabled' if self.executing else 'normal'
|
||||||
|
self.update_menu_state('debug', '*tack*iewer', state)
|
||||||
|
|
||||||
def beginexecuting(self):
|
def beginexecuting(self):
|
||||||
"Helper for ModifiedInterpreter"
|
"Helper for ModifiedInterpreter"
|
||||||
self.resetoutput()
|
self.resetoutput()
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Disable Debug=>Stack Viewer when user code is running or Debugger
|
||||||
|
is active, to prevent hang or crash. Patch by Zackery Spytz.
|
Loading…
Add table
Add a link
Reference in a new issue