Commits

Alan Mackenzie committed 2e447ee

Fix infinite loop with long macros.
cc-engine.el (c-state-safe-place): Handle macros properly.

  • Participants
  • Parent commits f917eef

Comments (0)

Files changed (1)

File cc-engine.el

     (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)))
 	    ;; 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))