diff options
author | Chong Yidong <cyd@stupidchicken.com> | 2009-01-31 16:19:46 +0000 |
---|---|---|
committer | Chong Yidong <cyd@stupidchicken.com> | 2009-01-31 16:19:46 +0000 |
commit | 45545d6875b5aabef18b62dac9fe7f87cd70528a (patch) | |
tree | 595b84cd5736c1cf2955f72c34e2142667860ceb /lisp/emacs-lisp | |
parent | a1f062078e9e69390d006a75555200a537a0dc05 (diff) | |
download | emacs-45545d6875b5aabef18b62dac9fe7f87cd70528a.tar.gz emacs-45545d6875b5aabef18b62dac9fe7f87cd70528a.tar.bz2 emacs-45545d6875b5aabef18b62dac9fe7f87cd70528a.zip |
(end-of-defun): Protect against infloops (Bug#2106).
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r-- | lisp/emacs-lisp/lisp.el | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el index beb0d85d74a..76141c56274 100644 --- a/lisp/emacs-lisp/lisp.el +++ b/lisp/emacs-lisp/lisp.el @@ -342,7 +342,8 @@ is called as a function to find the defun's end." (push-mark)) (if (or (null arg) (= arg 0)) (setq arg 1)) (while (> arg 0) - (let ((pos (point))) + (let ((pos (point)) + retry-point) (end-of-line 1) (beginning-of-defun-raw 1) (while (unless (eobp) @@ -350,28 +351,37 @@ is called as a function to find the defun's end." (skip-chars-forward " \t") (if (looking-at "\\s<\\|\n") (forward-line 1)) - ;; If we started after the end of the previous function, then - ;; try again with the next one. - (when (<= (point) pos) - (or (bobp) (forward-char -1)) - (beginning-of-defun-raw -1) - 'try-again)))) + ;; If we started after the end of the previous + ;; function, try again with the next one. + (unless (or (> (point) pos) + (eq (point) retry-point)) + (or (bobp) (forward-char -1)) + (beginning-of-defun-raw -1) + (setq retry-point (point))))) + ;; Ensure that we move forward. + (when (< (point) pos) + (goto-char pos))) (setq arg (1- arg))) (while (< arg 0) (let ((pos (point))) (while (unless (bobp) (beginning-of-line 1) (beginning-of-defun-raw 1) - (let ((beg (point))) + (let ((beg (point)) + retry-point) (funcall end-of-defun-function) (skip-chars-forward " \t") (if (looking-at "\\s<\\|\n") (forward-line 1)) - ;; If we started from within the function just found, then + ;; If we started from within the function just found, ;; try again with the previous one. - (when (>= (point) pos) + (unless (or (< (point) pos) + (eq (point) retry-point)) (goto-char beg) - 'try-again))))) + (setq retry-point (point)))))) + ;; Ensure that we move backward. + (when (> (point) pos) + (goto-char pos))) (setq arg (1+ arg)))) (defun mark-defun (&optional allow-extend) |