emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-28 1b77362771: Avoid hangs in python-mode with debug-on-error set


From: Lars Ingebrigtsen
Subject: emacs-28 1b77362771: Avoid hangs in python-mode with debug-on-error set
Date: Mon, 18 Apr 2022 07:20:26 -0400 (EDT)

branch: emacs-28
commit 1b7736277114bf91012b817a4e2557625b7340a5
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Avoid hangs in python-mode with debug-on-error set
    
    * lisp/progmodes/python.el (python-nav-end-of-statement): Avoid
    using cl-assert here, because this is called from the font-lock
    machinery, and if debug-on-error is set here, we'll hang Emacs
    (bug#54996).
    
    Do not merge to master.
---
 lisp/progmodes/python.el | 31 ++++++++++++++-----------------
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index e6e8a37ad5..70828cb223 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -1620,23 +1620,20 @@ of the statement."
                        ;; are somehow out of whack.  This has been
                        ;; observed when using `syntax-ppss' during
                        ;; narrowing.
-                       (cl-assert (>= string-start last-string-end)
-                                  :show-args
-                                  "\
-Overlapping strings detected (start=%d, last-end=%d)")
-                       (goto-char string-start)
-                       (if (python-syntax-context 'paren)
-                           ;; Ended up inside a paren, roll again.
-                           (python-nav-end-of-statement t)
-                         ;; This is not inside a paren, move to the
-                         ;; end of this string.
-                         (goto-char (+ (point)
-                                       (python-syntax-count-quotes
-                                        (char-after (point)) (point))))
-                         (setq last-string-end
-                               (or (re-search-forward
-                                    (rx (syntax string-delimiter)) nil t)
-                                   (goto-char (point-max))))))
+                       (when (>= string-start last-string-end)
+                         (goto-char string-start)
+                         (if (python-syntax-context 'paren)
+                             ;; Ended up inside a paren, roll again.
+                             (python-nav-end-of-statement t)
+                           ;; This is not inside a paren, move to the
+                           ;; end of this string.
+                           (goto-char (+ (point)
+                                         (python-syntax-count-quotes
+                                          (char-after (point)) (point))))
+                           (setq last-string-end
+                                 (or (re-search-forward
+                                      (rx (syntax string-delimiter)) nil t)
+                                     (goto-char (point-max)))))))
                       ((python-syntax-context 'paren)
                        ;; The statement won't end before we've escaped
                        ;; at least one level of parenthesis.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]