emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r107261: Fix infinite loop with long


From: Alan Mackenzie
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r107261: Fix infinite loop with long macros.
Date: Sun, 12 Feb 2012 11:06:42 +0000
User-agent: Bazaar (2.3.1)

------------------------------------------------------------
revno: 107261
committer: Alan Mackenzie <address@hidden>
branch nick: cc-mode
timestamp: Sun 2012-02-12 11:06:42 +0000
message:
  Fix infinite loop with long macros.
modified:
  lisp/ChangeLog
  lisp/progmodes/cc-engine.el
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2012-02-12 05:10:30 +0000
+++ b/lisp/ChangeLog    2012-02-12 11:06:42 +0000
@@ -1,3 +1,8 @@
+2012-02-12  Alan Mackenzie  <address@hidden>
+
+       Fix infinite loop with long macros.
+       * cc-engine.el (c-state-safe-place): Handle macros properly.
+
 2012-02-12  Chong Yidong  <address@hidden>
 
        * window.el (display-buffer): Doc fix (Bug#10785).

=== modified file 'lisp/progmodes/cc-engine.el'
--- a/lisp/progmodes/cc-engine.el       2012-02-07 15:19:52 +0000
+++ b/lisp/progmodes/cc-engine.el       2012-02-12 11:06:42 +0000
@@ -2129,7 +2129,7 @@
     (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 @@
            ;; 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))))
-
-         (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)))
+              (or (null lit)
+                  (prog1 (<= (cdr lit) here)
+                    (setq npos (cdr lit)))))
+
+            ;; 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))


reply via email to

[Prev in Thread] Current Thread [Next in Thread]