changeset 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 8802f28da1a8
children 2fb043738725
files lisp/ChangeLog lisp/imenu.el
diffstat 2 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Mon Jan 11 18:26:28 2010 +0100
+++ b/lisp/ChangeLog	Mon Jan 11 15:53:23 2010 -0500
@@ -1,3 +1,8 @@
+2010-01-11  Sam Steingold  <sds@gnu.org>
+
+	* imenu.el (imenu-default-create-index-function): Detect infinite
+	loops caused by imenu-prev-index-position-function.
+
 2010-01-11  Juanma Barranquero  <lekktu@gmail.com>
 
 	* htmlfontify.el (htmlfontify-load-rgb-file)
--- 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)))