mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Issue #13052: Fix IDLE crashing when replace string in Search/Replace dialog ended with '\'.
Patch by Roger Serwy.
This commit is contained in:
commit
fa556bd75c
2 changed files with 29 additions and 5 deletions
|
@ -2,6 +2,8 @@ from tkinter import *
|
||||||
|
|
||||||
from idlelib import SearchEngine
|
from idlelib import SearchEngine
|
||||||
from idlelib.SearchDialogBase import SearchDialogBase
|
from idlelib.SearchDialogBase import SearchDialogBase
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
def replace(text):
|
def replace(text):
|
||||||
root = text._root()
|
root = text._root()
|
||||||
|
@ -11,6 +13,7 @@ def replace(text):
|
||||||
dialog = engine._replacedialog
|
dialog = engine._replacedialog
|
||||||
dialog.open(text)
|
dialog.open(text)
|
||||||
|
|
||||||
|
|
||||||
class ReplaceDialog(SearchDialogBase):
|
class ReplaceDialog(SearchDialogBase):
|
||||||
|
|
||||||
title = "Replace Dialog"
|
title = "Replace Dialog"
|
||||||
|
@ -55,9 +58,24 @@ class ReplaceDialog(SearchDialogBase):
|
||||||
|
|
||||||
def default_command(self, event=None):
|
def default_command(self, event=None):
|
||||||
if self.do_find(self.ok):
|
if self.do_find(self.ok):
|
||||||
self.do_replace()
|
if self.do_replace(): # Only find next match if replace succeeded.
|
||||||
|
# A bad re can cause a it to fail.
|
||||||
self.do_find(0)
|
self.do_find(0)
|
||||||
|
|
||||||
|
def _replace_expand(self, m, repl):
|
||||||
|
""" Helper function for expanding a regular expression
|
||||||
|
in the replace field, if needed. """
|
||||||
|
if self.engine.isre():
|
||||||
|
try:
|
||||||
|
new = m.expand(repl)
|
||||||
|
except re.error:
|
||||||
|
self.engine.report_error(repl, 'Invalid Replace Expression')
|
||||||
|
new = None
|
||||||
|
else:
|
||||||
|
new = repl
|
||||||
|
|
||||||
|
return new
|
||||||
|
|
||||||
def replace_all(self, event=None):
|
def replace_all(self, event=None):
|
||||||
prog = self.engine.getprog()
|
prog = self.engine.getprog()
|
||||||
if not prog:
|
if not prog:
|
||||||
|
@ -86,7 +104,9 @@ class ReplaceDialog(SearchDialogBase):
|
||||||
line, m = res
|
line, m = res
|
||||||
chars = text.get("%d.0" % line, "%d.0" % (line+1))
|
chars = text.get("%d.0" % line, "%d.0" % (line+1))
|
||||||
orig = m.group()
|
orig = m.group()
|
||||||
new = m.expand(repl)
|
new = self._replace_expand(m, repl)
|
||||||
|
if new is None:
|
||||||
|
break
|
||||||
i, j = m.span()
|
i, j = m.span()
|
||||||
first = "%d.%d" % (line, i)
|
first = "%d.%d" % (line, i)
|
||||||
last = "%d.%d" % (line, j)
|
last = "%d.%d" % (line, j)
|
||||||
|
@ -103,7 +123,6 @@ class ReplaceDialog(SearchDialogBase):
|
||||||
text.undo_block_stop()
|
text.undo_block_stop()
|
||||||
if first and last:
|
if first and last:
|
||||||
self.show_hit(first, last)
|
self.show_hit(first, last)
|
||||||
self.close()
|
|
||||||
|
|
||||||
def do_find(self, ok=0):
|
def do_find(self, ok=0):
|
||||||
if not self.engine.getprog():
|
if not self.engine.getprog():
|
||||||
|
@ -138,7 +157,9 @@ class ReplaceDialog(SearchDialogBase):
|
||||||
m = prog.match(chars, col)
|
m = prog.match(chars, col)
|
||||||
if not prog:
|
if not prog:
|
||||||
return False
|
return False
|
||||||
new = m.expand(self.replvar.get())
|
new = self._replace_expand(m, self.replvar.get())
|
||||||
|
if new is None:
|
||||||
|
return False
|
||||||
text.mark_set("insert", first)
|
text.mark_set("insert", first)
|
||||||
text.undo_block_start()
|
text.undo_block_start()
|
||||||
if m.group():
|
if m.group():
|
||||||
|
|
|
@ -77,6 +77,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #13052: Fix IDLE crashing when replace string in Search/Replace dialog
|
||||||
|
ended with '\'. Patch by Roger Serwy.
|
||||||
|
|
||||||
- Issue #12655: Instead of requiring a custom type, os.sched_getaffinity and
|
- Issue #12655: Instead of requiring a custom type, os.sched_getaffinity and
|
||||||
os.sched_setaffinity now use regular sets of integers to represent the CPUs
|
os.sched_setaffinity now use regular sets of integers to represent the CPUs
|
||||||
a process is restricted to.
|
a process is restricted to.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue