GNU bug report logs - #14029
24.2.50; [PATCH] imenu problems with special elements

Previous Next

Package: emacs;

Reported by: Andreas Politz <politza <at> fh-trier.de>

Date: Fri, 22 Mar 2013 01:27:02 UTC

Severity: normal

Tags: patch

Found in version 24.2.50

Fixed in version 24.4

Done: Dmitry Gutov <dgutov <at> yandex.ru>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: help-debbugs <at> gnu.org (GNU bug Tracking System)
To: Dmitry Gutov <dgutov <at> yandex.ru>
Cc: tracker <at> debbugs.gnu.org
Subject: bug#14029: closed (24.2.50; [PATCH] imenu problems with special
 elements )
Date: Fri, 29 Nov 2013 03:45:02 +0000
[Message part 1 (text/plain, inline)]
Your message dated Fri, 29 Nov 2013 05:43:57 +0200
with message-id <52980D7D.2060902 <at> yandex.ru>
and subject line Re: bug#14029: 24.2.50; [PATCH] imenu problems with special elements
has caused the debbugs.gnu.org bug report #14029,
regarding 24.2.50; [PATCH] imenu problems with special elements 
to be marked as done.

(If you believe you have received this mail in error, please contact
help-debbugs <at> gnu.org.)


-- 
14029: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=14029
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
From: Andreas Politz <politza <at> fh-trier.de>
To: bug-gnu-emacs <at> gnu.org
Subject: 24.2.50; [PATCH] imenu problems with special elements 
Date: Fri, 22 Mar 2013 02:24:33 +0100
,----[ (info "(elisp) Imenu") ]
| Special elements look like this:
| 
|           (INDEX-NAME INDEX-POSITION FUNCTION ARGUMENTS...)
| 
|      Selecting a special element performs:
| 
|           (funcall FUNCTION
|                    INDEX-NAME INDEX-POSITION ARGUMENTS...)
`----

1. At least one function does not recognize these elements, resulting
in an error.

2. The advertised calling convention is different from the actual one in
`imenu'.

3. The `imenu--subalist-p' predicate is unsafe and incomplete.

Andreas

diff -c -L /home/politza/src/emacs/trunk/lisp/imenu.el -L \#\<buffer\ imenu.el\> /home/politza/src/emacs/trunk/lisp/imenu.el /tmp/buffer-content-3095O-q
*** /home/politza/src/emacs/trunk/lisp/imenu.el
--- #<buffer imenu.el>
***************
*** 286,293 ****
  
  
  (defun imenu--subalist-p (item)
!   (and (consp (cdr item)) (listp (cadr item))
!        (not (eq (car (cadr item)) 'lambda))))
  
  (defmacro imenu-progress-message (_prevpos &optional _relpos _reverse)
    "Macro to display a progress message.
--- 286,295 ----
  
  
  (defun imenu--subalist-p (item)
!   (and (consp item)
!        (consp (cdr item))
!        (listp (cadr item))
!        (not (functionp (cadr item)))))
  
  (defmacro imenu-progress-message (_prevpos &optional _relpos _reverse)
    "Macro to display a progress message.
***************
*** 641,647 ****
        ;; We are only interested in the bottom-level elements, so we need to
        ;; recurse if TAIL is a list.
        (cond ((listp tail)
! 	     (if (setq res (imenu--in-alist str tail))
  		 (setq alist nil)))
  	    ((if imenu-name-lookup-function
                   (funcall imenu-name-lookup-function str head)
--- 643,650 ----
        ;; We are only interested in the bottom-level elements, so we need to
        ;; recurse if TAIL is a list.
        (cond ((listp tail)
! 	     (if (and (imenu--subalist-p elt)
!                       (setq res (imenu--in-alist str tail)))
  		 (setq alist nil)))
  	    ((if imenu-name-lookup-function
                   (funcall imenu-name-lookup-function str head)
***************
*** 1024,1030 ****
  		(nth 2 index-item) imenu-default-goto-function))
  	   (position (if is-special-item
  			 (cadr index-item) (cdr index-item)))
! 	   (rest (if is-special-item (cddr index-item))))
        (apply function (car index-item) position rest))
      (run-hooks 'imenu-after-jump-hook)))
  
--- 1027,1033 ----
  		(nth 2 index-item) imenu-default-goto-function))
  	   (position (if is-special-item
  			 (cadr index-item) (cdr index-item)))
! 	   (rest (if is-special-item (cdddr index-item))))
        (apply function (car index-item) position rest))
      (run-hooks 'imenu-after-jump-hook)))
  

Diff finished.  Fri Mar 22 02:15:09 2013


[Message part 3 (message/rfc822, inline)]
From: Dmitry Gutov <dgutov <at> yandex.ru>
To: Andreas Politz <politza <at> hochschule-trier.de>
Cc: 14029-done <at> debbugs.gnu.org
Subject: Re: bug#14029: 24.2.50; [PATCH] imenu problems with special elements
Date: Fri, 29 Nov 2013 05:43:57 +0200
Version: 24.4

Thanks, that's clearer. Installed in revision 115279.

One note:

>> Is it possible for (cadr item) to be a list and also be `functionp' 
and yet not
>> have its car be `lambda'?  Dunno.  I was under the impression that 
it was
>> impossible, but I could be wrong.  If it is possible, is it better 
to test
>> `functionp' here?  Dunno.
>
> If the documentation states FUNCTION, then it should be a function.

The documentation allows FUNCTION in the third element, but 
`imenu--subalist-p' is checking whether the second element is a function.

AFAICT, it's checking against malformed items. Your change makes it also 
guard against lexically-bound lambdas (their car is `closure'), so 
that's good, I guess.


This bug report was last modified 11 years and 181 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.