From 0bc5886acef4632e2ffeefda032e6651170b14d3 Mon Sep 17 00:00:00 2001 From: Alan Mackenzie Date: Sun, 12 Feb 2012 11:06:42 +0000 Subject: [PATCH] Fix infinite loop with long macros. --- lisp/ChangeLog | 5 +++++ lisp/progmodes/cc-engine.el | 41 +++++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2f830b7447b..5cee6b4d5c2 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2012-02-12 Alan Mackenzie + + Fix infinite loop with long macros. + * cc-engine.el (c-state-safe-place): Handle macros properly. + 2012-02-12 Chong Yidong * window.el (display-buffer): Doc fix (Bug#10785). diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index be0f86ddd7e..95b43e763d5 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -2129,7 +2129,7 @@ comment at the start of cc-engine.el for more info." (widen) (save-excursion (let ((c c-state-nonlit-pos-cache) - pos npos lit macro-beg) + pos npos lit macro-beg macro-end) ;; Trim the cache to take account of buffer changes. (while (and c (> (car c) c-state-nonlit-pos-cache-limit)) (setq c (cdr c))) @@ -2143,28 +2143,29 @@ comment at the start of cc-engine.el for more info." ;; Add an element to `c-state-nonlit-pos-cache' each iteration. (and (<= (setq npos (+ pos c-state-nonlit-pos-interval)) here) + + ;; Test for being in a literal. (progn (setq lit (car (cddr (c-state-pp-to-literal pos npos)))) - (cond - ((null lit) - (setq pos npos) - t) - ((<= (cdr lit) here) - (setq pos (cdr lit)) - t) - (t - (setq pos (car lit)) - nil)))) + (or (null lit) + (prog1 (<= (cdr lit) here) + (setq npos (cdr lit))))) - (goto-char pos) - (when (and (c-beginning-of-macro) (/= (point) pos)) - (setq macro-beg (point)) - (c-syntactic-end-of-macro) - (or (eobp) (forward-char)) - (setq pos (if (<= (point) here) - (point) - macro-beg))) - (setq c-state-nonlit-pos-cache (cons pos c-state-nonlit-pos-cache))) + ;; Test for being in a macro. + (progn + (goto-char npos) + (setq macro-beg + (and (c-beginning-of-macro) (/= (point) npos) (point))) + (when macro-beg + (c-syntactic-end-of-macro) + (or (eobp) (forward-char)) + (setq macro-end (point))) + (or (null macro-beg) + (prog1 (<= macro-end here) + (setq npos macro-end))))) + + (setq pos npos) + (setq c-state-nonlit-pos-cache (cons pos c-state-nonlit-pos-cache))) (if (> pos c-state-nonlit-pos-cache-limit) (setq c-state-nonlit-pos-cache-limit pos)) -- 2.11.4.GIT