From: Tom Gillespie Date: Wed, 29 Jun 2022 02:28:05 +0000 (-0700) Subject: lisp/progmodes/python.el (python-nav-end-of-block): prevent infinite loop X-Git-Tag: emacs-29.0.90~1447^2~1393 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=bf1dbdd87bb87eb9f18f7677d6d254b249b4c251;p=emacs.git lisp/progmodes/python.el (python-nav-end-of-block): prevent infinite loop lisp/progmodes/python.el (python-nav-end-of-block): Fix a bad assumption that python-nav-end-of-statement always makes forward progress by testing that it actually does. If this check is not made then it is possible for python-nav-end-of-block to enter an infinite loop. (bug#56271) --- diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index e0c937d7ce5..16cdf58611a 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -1636,11 +1636,15 @@ of the statement." (while (and (or noend (goto-char (line-end-position))) (not (eobp)) (cond ((setq string-start (python-syntax-context 'string)) - ;; The assertion can only fail if syntax table + ;; The condition can be nil if syntax table ;; text properties and the `syntax-ppss' cache ;; are somehow out of whack. This has been ;; observed when using `syntax-ppss' during ;; narrowing. + ;; It can also fail in cases where the buffer is in + ;; the process of being modified, e.g. when creating + ;; a string with `electric-pair-mode' disabled such + ;; that there can be an unmatched single quote (when (>= string-start last-string-end) (goto-char string-start) (if (python-syntax-context 'paren) @@ -1723,7 +1727,10 @@ backward to previous statement." (while (and (forward-line 1) (not (eobp)) (or (and (> (current-indentation) block-indentation) - (or (python-nav-end-of-statement) t)) + (let ((start (point))) + (python-nav-end-of-statement) + ;; must move forward otherwise infinite loop + (> (point) start))) (python-info-current-line-comment-p) (python-info-current-line-empty-p)))) (python-util-forward-comment -1)