# HG changeset patch # User Alan Mackenzie # Date 1287934057 0 # Node ID d383b5e03a3d6d94db3c978218f287a0ebd903ca # Parent 11259a64bfc07b5adde12271ad75f2091505c2e5 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). diff -r 11259a64bfc0 -r d383b5e03a3d lisp/ChangeLog --- 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 + + * 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 * epg-config.el (epg-gpg-program): Try to use "gpg2" if "gpg" diff -r 11259a64bfc0 -r d383b5e03a3d lisp/progmodes/cc-fonts.el --- 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 "{"?