unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#13438: /srv/bzr/emacs/emacs-24 r111196: * imenu.el (imenu-default-create-index-function): Remove useless
       [not found] <E1Ty8dP-0000cA-TK@vcs.savannah.gnu.org>
@ 2013-01-24 18:01 ` Glenn Morris
  2013-01-24 18:30   ` Stefan Monnier
  0 siblings, 1 reply; 5+ messages in thread
From: Glenn Morris @ 2013-01-24 18:01 UTC (permalink / raw)
  To: Fabián Ezequiel Gallina; +Cc: 13438


>   * imenu.el (imenu-default-create-index-function): Remove useless
>   infinite loop check.
[...]
> --- a/lisp/imenu.el	2013-01-01 09:11:05 +0000
> +++ b/lisp/imenu.el	2013-01-23 21:55:46 +0000
> @@ -683,8 +683,6 @@
>  	   (goto-char (point-max))
>  	   ;; 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))
>  	     (save-excursion
>  	       (setq name (funcall imenu-extract-index-name-function)))


I'm not keen on removing an infinite loop check from emacs-24 at this
stage. Why is this issue (apparently) only seen in Python mode, and why
isn't there a Python-specific solution (which seems like it would be
just making imenu-prev-index-position-function return nil when
appropriate)?

Related discussion:
http://lists.gnu.org/archive/html/emacs-devel/2013-01/msg00536.html





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#13438: /srv/bzr/emacs/emacs-24 r111196: * imenu.el (imenu-default-create-index-function): Remove useless
  2013-01-24 18:01 ` bug#13438: /srv/bzr/emacs/emacs-24 r111196: * imenu.el (imenu-default-create-index-function): Remove useless Glenn Morris
@ 2013-01-24 18:30   ` Stefan Monnier
  2013-01-25  8:34     ` Glenn Morris
  0 siblings, 1 reply; 5+ messages in thread
From: Stefan Monnier @ 2013-01-24 18:30 UTC (permalink / raw)
  To: Glenn Morris; +Cc: Fabián Ezequiel Gallina, 13438

> I'm not keen on removing an infinite loop check from emacs-24 at this
> stage.

The patch is "safe" in the sense that it will only introduce
an inf-loop in those cases where the user used to get an error.
[ Unless of course, the calling context catches those errors.  ]

> Why is this issue (apparently) only seen in Python mode, and why
> isn't there a Python-specific solution (which seems like it would be
> just making imenu-prev-index-position-function return nil when
> appropriate)?

If we can change python.el to work around the problem, we could install
that workaround in emacs-24 and keep the "remove the inf-loop check" for
the trunk, indeed.


        Stefan





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#13438: /srv/bzr/emacs/emacs-24 r111196: * imenu.el (imenu-default-create-index-function): Remove useless
  2013-01-24 18:30   ` Stefan Monnier
@ 2013-01-25  8:34     ` Glenn Morris
  2013-01-25 13:55       ` Fabián Ezequiel Gallina
  0 siblings, 1 reply; 5+ messages in thread
From: Glenn Morris @ 2013-01-25  8:34 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Fabián Ezequiel Gallina, 13438


>> Why is this issue (apparently) only seen in Python mode

Answering my own question, it happens in any mode that sets
imenu-prev-index-position-function and
imenu-extract-index-name-function, but there are very few of those.

Eg prolog mode. With buffer contents:

------
fac(0,1).
fac(N,F) :- N > 0, M is N - 1,
       fac(M,Fm), F is N * Fm.
------

and point at point-min, switching to prolog-mode causes the same issue.

How about taking the more cautious approach with:

(when (and (= pos (point))
           (not (bobp)))
   (error "Infinite loop... ))

(IIUC, this was actually the suggestion in
http://lists.gnu.org/archive/html/emacs-devel/2013-01/msg00510.html ?)





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#13438: /srv/bzr/emacs/emacs-24 r111196: * imenu.el (imenu-default-create-index-function): Remove useless
  2013-01-25  8:34     ` Glenn Morris
@ 2013-01-25 13:55       ` Fabián Ezequiel Gallina
  2013-01-27  2:12         ` Glenn Morris
  0 siblings, 1 reply; 5+ messages in thread
From: Fabián Ezequiel Gallina @ 2013-01-25 13:55 UTC (permalink / raw)
  To: Glenn Morris; +Cc: 13438

[-- Attachment #1: Type: text/plain, Size: 1927 bytes --]

On 01/25/2013 05:34 AM, Glenn Morris wrote:
>>> Why is this issue (apparently) only seen in Python mode
> Answering my own question, it happens in any mode that sets
> imenu-prev-index-position-function and
> imenu-extract-index-name-function, but there are very few of those.
>
> Eg prolog mode. With buffer contents:
>
> ------
> fac(0,1).
> fac(N,F) :- N > 0, M is N - 1,
>         fac(M,Fm), F is N * Fm.
> ------
>
> and point at point-min, switching to prolog-mode causes the same issue.
>
> How about taking the more cautious approach with:
>
> (when (and (= pos (point))
>             (not (bobp)))
>     (error "Infinite loop... ))
>
> (IIUC, this was actually the suggestion in
> http://lists.gnu.org/archive/html/emacs-devel/2013-01/msg00510.html ?)
I ran into the same thing, and checking bobp is not enough, try adding a 
newline at the beginning of file to the recipe and call imenu with point 
at beginning of defun and you'll see the infinite error check will trigger.

I proposed the following patch that works:

=== modified file 'lisp/imenu.el'
--- lisp/imenu.el       2013-01-01 09:11:05 +0000
+++ lisp/imenu.el       2013-01-22 18:24:45 +0000
@@ -683,7 +683,14 @@
            (goto-char (point-max))
            ;; Search for the function
            (while (funcall imenu-prev-index-position-function)
-             (when (= pos (point))
+             (when (and (= pos (point))
+                        (= pos
+                           (save-excursion
+                             ;; The infinite loop is true if there's
+                             ;; another index position but point keeps
+                             ;; itself in the same place. bug#13438
+                             (if (funcall imenu-prev-index-position-
function)
+                                 (point) 0))))

But finally after some mails with Stefan we decided the best thing will 
be to remove this check altogether.


[-- Attachment #2: Type: text/html, Size: 3440 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#13438: /srv/bzr/emacs/emacs-24 r111196: * imenu.el (imenu-default-create-index-function): Remove useless
  2013-01-25 13:55       ` Fabián Ezequiel Gallina
@ 2013-01-27  2:12         ` Glenn Morris
  0 siblings, 0 replies; 5+ messages in thread
From: Glenn Morris @ 2013-01-27  2:12 UTC (permalink / raw)
  To: Fabián Ezequiel Gallina; +Cc: 13438


Oh, so the actual issue is: if you call
imenu-default-create-index-function with point at the start of the last
defun in the buffer. It goes to point-max, then back to the start of the
defun, and mistakenly thinks it is inflooping.

How about the following, which only signals an error if
imenu-prev-index-position-function returns non-nil twice in a row
without moving point.

BTW, neither python-nav-beginning-of-defun or
python-imenu-prev-index-position will move past the start of the first
defun in a buffer, if the defun begins past point-min (ie, if there are
blank lines before the first defun, it does not move over them to
point-min). I don't know if this matters, but it is inconsistent with eg
Prolog and Emacs Lisp modes.


*** lisp/imenu.el	2013-01-23 21:55:46 +0000
--- lisp/imenu.el	2013-01-27 02:02:39 +0000
***************
*** 678,688 ****
    ;; 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 '()) (pos (point))
  	       name)
  	   (goto-char (point-max))
  	   ;; Search for the function
  	   (while (funcall imenu-prev-index-position-function)
               (setq pos (point))
  	     (save-excursion
  	       (setq name (funcall imenu-extract-index-name-function)))
--- 678,690 ----
    ;; 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 '()) (pos -1)
  	       name)
  	   (goto-char (point-max))
  	   ;; 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))
  	     (save-excursion
  	       (setq name (funcall imenu-extract-index-name-function)))






^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-01-27  2:12 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <E1Ty8dP-0000cA-TK@vcs.savannah.gnu.org>
2013-01-24 18:01 ` bug#13438: /srv/bzr/emacs/emacs-24 r111196: * imenu.el (imenu-default-create-index-function): Remove useless Glenn Morris
2013-01-24 18:30   ` Stefan Monnier
2013-01-25  8:34     ` Glenn Morris
2013-01-25 13:55       ` Fabián Ezequiel Gallina
2013-01-27  2:12         ` Glenn Morris

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).