changeset 111139:d383b5e03a3d

progmodes/cc-fonts.el (c-font-lock-declarations): Cache the result of `c-beginning-of-decl-1' between invocations of a lambda function (Bug #7265).
author Alan Mackenzie <acm@muc.de>
date Sun, 24 Oct 2010 15:27:37 +0000
parents 11259a64bfc0
children 7aab0512e690
files lisp/ChangeLog lisp/progmodes/cc-fonts.el
diffstat 2 files changed, 29 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sun Oct 24 09:55:56 2010 +0000
+++ b/lisp/ChangeLog	Sun Oct 24 15:27:37 2010 +0000
@@ -1,3 +1,9 @@
+2010-10-24  Alan Mackenzie  <acm@muc.de>
+
+	* progmodes/cc-fonts.el (c-font-lock-declarations): Cache the
+	result of `c-beginning-of-decl-1' between invocations of a lambda
+	function (Bug #7265).
+
 2010-10-24  Daiki Ueno  <ueno@unixuser.org>
 
 	* epg-config.el (epg-gpg-program): Try to use "gpg2" if "gpg"
--- a/lisp/progmodes/cc-fonts.el	Sun Oct 24 09:55:56 2010 +0000
+++ b/lisp/progmodes/cc-fonts.el	Sun Oct 24 15:27:37 2010 +0000
@@ -1045,6 +1045,9 @@
 	  ;; The position of the next token after the closing paren of
 	  ;; the last detected cast.
 	  last-cast-end
+	  ;; Start of containing declaration (if any); limit for searching
+	  ;; backwards for it.
+	  decl-start decl-search-lim
 	  ;; The result from `c-forward-decl-or-cast-1'.
 	  decl-or-cast
 	  ;; The maximum of the end positions of all the checked type
@@ -1184,20 +1187,29 @@
 				match-pos context last-cast-end))
 
 	    (if (not decl-or-cast)
-		;; Are we at a declarator?
-		;; Try to go back to the declaration to check this.
-		(let (paren-state bod-res lim encl-pos is-typedef)
+		;; Are we at a declarator?  Try to go back to the declaration
+		;; to check this.  Note that `c-beginning-of-decl-1' is slow,
+		;; so we cache its result between calls.
+		(let (paren-state bod-res encl-pos is-typedef)
 		  (goto-char start-pos)
 		  (save-excursion
-		    (setq lim (and (c-syntactic-skip-backward "^;" nil t)
-				   (point))))
+		    (unless (and decl-search-lim
+				 (eq decl-search-lim
+				     (save-excursion
+				       (c-syntactic-skip-backward "^;" nil t)
+				       (point))))
+		      (setq decl-search-lim
+			    (and (c-syntactic-skip-backward "^;" nil t) (point)))
+		      (setq bod-res (car (c-beginning-of-decl-1 decl-search-lim)))
+		      (if (and (eq bod-res 'same)
+			       (progn
+				 (c-backward-syntactic-ws)
+				 (eq (char-before) ?\})))
+			  (c-beginning-of-decl-1 decl-search-lim))
+		      (setq decl-start (point))))
+
 		  (save-excursion
-		    (setq bod-res (car (c-beginning-of-decl-1 lim)))
-		    (if (and (eq bod-res 'same)
-			     (progn
-			       (c-backward-syntactic-ws)
-			       (eq (char-before) ?\})))
-			(c-beginning-of-decl-1 lim))
+		    (goto-char decl-start)
 		    ;; We're now putatively at the declaration.
 		    (setq paren-state (c-parse-state))
 		    ;; At top level or inside a "{"?