changeset 100776:3d5ce6a8b477

(follow-calculate-first-window-start-from-below): Avoid looping forever if vertical-motion returns an unexpected value.
author Chong Yidong <cyd@stupidchicken.com>
date Tue, 30 Dec 2008 15:09:35 +0000
parents e3c9285f6d49
children b816bc48d9b2
files lisp/follow.el
diffstat 1 files changed, 9 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/follow.el	Tue Dec 30 15:09:13 2008 +0000
+++ b/lisp/follow.el	Tue Dec 30 15:09:35 2008 +0000
@@ -1208,22 +1208,25 @@
   (setq win (or win (selected-window)))
   (setq start (or start (window-start win)))
   (save-excursion
-    (let ((done nil)
-	  win-start
-	  res)
+    (let (done win-start res opoint)
       ;; Always calculate what happens when no line is displayed in the first
       ;; window. (The `previous' res is needed below!)
       (goto-char guess)
       (vertical-motion 0 (car windows))
       (setq res (point))
       (while (not done)
+	(setq opoint (point))
 	(if (not (= (vertical-motion -1 (car windows)) -1))
 	    ;; Hit roof!
 	    (setq done t res (point-min))
 	  (setq win-start (follow-calc-win-start windows (point) win))
-	  (cond ((= win-start start)	; Perfect match, use this value
-		 (setq done t)
-		 (setq res (point)))
+	  (cond ((>= (point) opoint)
+		 ;; In some pathological cases, vertical-motion may
+		 ;; return -1 even though point has not decreased.  In
+		 ;; that case, avoid looping forever.
+		 (setq done t res (point)))
+		((= win-start start)	; Perfect match, use this value
+		 (setq done t res (point)))
 		((< win-start start)	; Walked to far, use preious result
 		 (setq done t))
 		(t			; Store result for next iteration