diff lisp/imenu.el @ 106796:9479a9da9b8c

(imenu-default-create-index-function): Detect infinite loops caused by imenu-prev-index-position-function.
author Sam Steingold <sds@gnu.org>
date Mon, 11 Jan 2010 15:53:23 -0500
parents c220a29e75fd
children 1d1d5d9bd884
line wrap: on
line diff
--- a/lisp/imenu.el	Mon Jan 11 18:26:28 2010 +0100
+++ b/lisp/imenu.el	Mon Jan 11 15:53:23 2010 -0500
@@ -596,7 +596,7 @@
 ;;; Find all markers in alist and makes
 ;;; them point nowhere.
 ;;; The top-level call uses nil as the argument;
-;;; non-nil arguments are in recursivecalls.
+;;; non-nil arguments are in recursive calls.
 (defvar imenu--cleanup-seen)
 
 (defun imenu--cleanup (&optional alist)
@@ -684,12 +684,15 @@
   ;; in these major modes.  But save that change for later.
   (cond ((and imenu-prev-index-position-function
 	      imenu-extract-index-name-function)
-	 (let ((index-alist '())
+	 (let ((index-alist '()) (pos (point))
 	       prev-pos name)
 	   (goto-char (point-max))
 	   (imenu-progress-message prev-pos 0 t)
 	   ;; Search for the function
 	   (while (funcall imenu-prev-index-position-function)
+             (when (= pos (point))
+               (error "Infinite loop at %s:%d: imenu-prev-index-position-function does not move point" (buffer-name) pos))
+             (setq pos (point))
 	     (imenu-progress-message prev-pos nil t)
 	     (save-excursion
 	       (setq name (funcall imenu-extract-index-name-function)))