cl-macs `loop' fix for bug#7492.

* lisp/emacs-lisp/cl-macs.el (cl-parse-loop-clause):
Avoid infinite loop over windows.
This commit is contained in:
Glenn Morris 2010-12-02 09:36:45 -08:00
parent bd77c2effa
commit 05907bb3aa
2 changed files with 14 additions and 2 deletions

View file

@ -965,16 +965,25 @@ Valid clauses are:
((memq word '(window windows))
(let ((scr (and (memq (car loop-args) '(in of)) (cl-pop2 loop-args)))
(temp (make-symbol "--cl-var--")))
(temp (make-symbol "--cl-var--"))
(minip (make-symbol "--cl-minip--")))
(push (list var (if scr
(list 'frame-selected-window scr)
'(selected-window)))
loop-for-bindings)
;; If we started in the minibuffer, we need to
;; ensure that next-window will bring us back there
;; at some point. (Bug#7492).
;; (Consider using walk-windows instead of loop if
;; you care about such things.)
(push (list minip `(minibufferp (window-buffer ,var)))
loop-for-bindings)
(push (list temp nil) loop-for-bindings)
(push (list 'prog1 (list 'not (list 'eq var temp))
(list 'or temp (list 'setq temp var)))
loop-body)
(push (list var (list 'next-window var)) loop-for-steps)))
(push (list var (list 'next-window var minip))
loop-for-steps)))
(t
(let ((handler (and (symbolp word)