From: Stefan Monnier Date: Thu, 23 Feb 2012 04:38:29 +0000 (-0500) Subject: * lisp/minibuffer.el (completion-table-with-context): Fix inf-loop. X-Git-Tag: emacs-pretest-24.0.94~56 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b291b57241a4e46013db0989991635364fb4beb2;p=emacs.git * lisp/minibuffer.el (completion-table-with-context): Fix inf-loop. Reported by Aaron S. Hawley . --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4be77a90c6c..ee3c486d5ff 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2012-02-23 Stefan Monnier + + * minibuffer.el (completion-table-with-context): Fix inf-loop. + Reported by Aaron S. Hawley . + 2012-02-23 Glenn Morris * emacs-lisp/authors.el (authors-aliases, authors-fixed-case) diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 8564cc2009b..2414baf8e3c 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -226,30 +226,31 @@ case sensitive instead." (defun completion-table-with-context (prefix table string pred action) ;; TODO: add `suffix' maybe? - ;; Notice that `pred' may not be a function in some abusive cases. - (when (functionp pred) - (setq pred - ;; Predicates are called differently depending on the nature of - ;; the completion table :-( - (cond - ((vectorp table) ;Obarray. - (lambda (sym) (funcall pred (concat prefix (symbol-name sym))))) - ((hash-table-p table) - (lambda (s _v) (funcall pred (concat prefix s)))) - ((functionp table) - (lambda (s) (funcall pred (concat prefix s)))) - (t ;Lists and alists. - (lambda (s) - (funcall pred (concat prefix (if (consp s) (car s) s)))))))) - (if (eq (car-safe action) 'boundaries) - (let* ((len (length prefix)) - (bound (completion-boundaries string table pred (cdr action)))) - (list* 'boundaries (+ (car bound) len) (cdr bound))) - (let ((comp (complete-with-action action table string pred))) - (cond - ;; In case of try-completion, add the prefix. - ((stringp comp) (concat prefix comp)) - (t comp))))) + (let ((pred + (if (not (functionp pred)) + ;; Notice that `pred' may not be a function in some abusive cases. + pred + ;; Predicates are called differently depending on the nature of + ;; the completion table :-( + (cond + ((vectorp table) ;Obarray. + (lambda (sym) (funcall pred (concat prefix (symbol-name sym))))) + ((hash-table-p table) + (lambda (s _v) (funcall pred (concat prefix s)))) + ((functionp table) + (lambda (s) (funcall pred (concat prefix s)))) + (t ;Lists and alists. + (lambda (s) + (funcall pred (concat prefix (if (consp s) (car s) s))))))))) + (if (eq (car-safe action) 'boundaries) + (let* ((len (length prefix)) + (bound (completion-boundaries string table pred (cdr action)))) + (list* 'boundaries (+ (car bound) len) (cdr bound))) + (let ((comp (complete-with-action action table string pred))) + (cond + ;; In case of try-completion, add the prefix. + ((stringp comp) (concat prefix comp)) + (t comp)))))) (defun completion-table-with-terminator (terminator table string pred action) "Construct a completion table like TABLE but with an extra TERMINATOR.