GNU bug report logs - #10792
24.0.93; emacs goes comatose opening C header

Previous Next

Packages: cc-mode, emacs;

Reported by: John Yates <john <at> yates-sheets.org>

Date: Sat, 11 Feb 2012 19:40:05 UTC

Severity: normal

Merged with 10716, 10750

Found in version 24.0.93

Done: Chong Yidong <cyd <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


Message #29 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: John Yates <john <at> yates-sheets.org>
Cc: Eli Zaretskii <eliz <at> gnu.org>, bug-gnu-emacs <at> gnu.org
Subject: Re: 24.0.93; emacs goes comatose opening C header
Date: Sat, 11 Feb 2012 22:39:23 +0000
Hi, John

On Sat, Feb 11, 2012 at 12:26:36PM -0500, John Yates wrote:
> When I attemt to visit the following header emacs locks up.  If
> I make the contents of the macro significantly shorted emacs is
> able to open and fontlock it successfully.  To me this suggests
> some form of n-squared processing.

> #define PARSE_TYPE_LIST \
> _EMIT_(PT_ZERO,            "*ZERO*"            ) _DELIM_ \
> _EMIT_(PT_CHAR1,           "CHAR"              ) _DELIM_ \
> _EMIT_(PTN_CHAR1,          "CHAR"              ) _DELIM_ \
  ..... ..... ..... ..... .....
> _EMIT_(PT_SYNTH1,          "SYNTH1"            ) _DELIM_ \
> _EMIT_(PT_SYNTH2,          "SYNTH2"            ) _DELIM_ \
> _EMIT_(PT_SYNTH4,          "SYNTH4"            ) _DELIM_ \
> _EMIT_(PT_END,             "*END*"             )

Would you try this patch, please, and let me know how it goes.
Thanks for the bug report.



*** orig/cc-engine.el	2012-02-11 20:16:13.000000000 +0000
--- cc-engine.el	2012-02-11 22:30:58.000000000 +0000
***************
*** 2130,2136 ****
      (widen)
      (save-excursion
        (let ((c c-state-nonlit-pos-cache)
! 	    pos npos lit macro-beg)
  	;; Trim the cache to take account of buffer changes.
  	(while (and c (> (car c) c-state-nonlit-pos-cache-limit))
  	  (setq c (cdr c)))
--- 2130,2136 ----
      (widen)
      (save-excursion
        (let ((c c-state-nonlit-pos-cache)
! 	    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)))
***************
*** 2144,2171 ****
  	    ;; Add an element to `c-state-nonlit-pos-cache' each iteration.
  	    (and
  	     (<= (setq npos (+ pos c-state-nonlit-pos-interval)) here)
  	     (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)))
  
  	(if (> pos c-state-nonlit-pos-cache-limit)
  	    (setq c-state-nonlit-pos-cache-limit pos))
--- 2144,2182 ----
  	    ;; 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)
  		 t)
  		((<= (cdr lit) here)
! 		 (setq npos (cdr lit))
! 		 t)
! 		(t
! 		 nil)))
! 
! 	     ;; 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)))
! 	       (cond
! 		((null macro-beg)
! 		 t)
! 		((<= macro-end here)
! 		 (setq npos macro-end)
  		 t)
  		(t
  		 nil))))
  
! 	  (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))



-- 
Alan Mackenzie (Nuremberg, Germany).




This bug report was last modified 13 years and 158 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.