summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorGlenn Morris <rgm@gnu.org>2010-12-02 09:36:45 -0800
committerGlenn Morris <rgm@gnu.org>2010-12-02 09:36:45 -0800
commit05907bb3aa0e68c594a0a06c5adaa75fe9817fbf (patch)
treea18453af2d715dc254afaba8b61002f27a0da7f0 /lisp
parentbd77c2effa8ad5a557200b932a23244624dc524b (diff)
downloademacs-05907bb3aa0e68c594a0a06c5adaa75fe9817fbf.tar.gz
emacs-05907bb3aa0e68c594a0a06c5adaa75fe9817fbf.tar.bz2
emacs-05907bb3aa0e68c594a0a06c5adaa75fe9817fbf.zip
cl-macs `loop' fix for bug#7492.
* lisp/emacs-lisp/cl-macs.el (cl-parse-loop-clause): Avoid infinite loop over windows.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog3
-rw-r--r--lisp/emacs-lisp/cl-macs.el13
2 files changed, 14 insertions, 2 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 135cfe952c7..502a6c65f42 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,5 +1,8 @@
2010-12-02 Glenn Morris <rgm@gnu.org>
+ * emacs-lisp/cl-macs.el (cl-parse-loop-clause):
+ Avoid infinite loop over windows. (Bug#7492)
+
* progmodes/flymake.el (flymake-check-file-limit):
Allow nil to mean "no limit".
(flymake-check-patch-master-file-buffer): Update for above change.
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index 76f677c6198..725b98354af 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -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)