diff options
author | Chong Yidong <cyd@stupidchicken.com> | 2008-07-31 22:15:45 +0000 |
---|---|---|
committer | Chong Yidong <cyd@stupidchicken.com> | 2008-07-31 22:15:45 +0000 |
commit | f46a36427c209de792a5625bee22b2829a7ba56e (patch) | |
tree | 0e8ef9b80d9afbca470f98a2b0e1d66918826bcc /lisp/button.el | |
parent | 60f4c0c8bab711e474a63f763d227248b35c2df4 (diff) | |
download | emacs-f46a36427c209de792a5625bee22b2829a7ba56e.tar.gz |
(forward-button): Avoid infloop.
Diffstat (limited to 'lisp/button.el')
-rw-r--r-- | lisp/button.el | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/lisp/button.el b/lisp/button.el index 6a558af445a..b474a74da9c 100644 --- a/lisp/button.el +++ b/lisp/button.el @@ -437,15 +437,22 @@ Returns the button found." (goto-char (button-start button))) ;; Move to Nth next button (let ((iterator (if (> n 0) #'next-button #'previous-button)) - (wrap-start (if (> n 0) (point-min) (point-max)))) + (wrap-start (if (> n 0) (point-min) (point-max))) + opoint fail) (setq n (abs n)) (setq button t) ; just to start the loop - (while (and (> n 0) button) + (while (and (null fail) (> n 0) button) (setq button (funcall iterator (point))) (when (and (not button) wrap) (setq button (funcall iterator wrap-start t))) (when button (goto-char (button-start button)) + ;; Avoid looping forever (e.g., if all the buttons have + ;; the `skip' property). + (cond ((null opoint) + (setq opoint (point))) + ((= opoint (point)) + (setq fail t))) (unless (button-get button 'skip) (setq n (1- n))))))) (if (null button) |