From: Alan Mackenzie Date: Sun, 24 Oct 2010 15:27:37 +0000 (+0000) Subject: progmodes/cc-fonts.el (c-font-lock-declarations): Cache the result of X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~438^2~45^2~488 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=10f5e3e60c1d7c79ecc31176e3c16d0336627d32;p=emacs.git 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 --git a/lisp/ChangeLog b/lisp/ChangeLog index dcf17693216..ce7d83d55a6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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 --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el index a99876a6bfc..39501f7f9bc 100644 --- a/lisp/progmodes/cc-fonts.el +++ b/lisp/progmodes/cc-fonts.el @@ -1045,6 +1045,9 @@ casts and declarations are fontified. Used on level 2 and higher." ;; 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 @@ casts and declarations are fontified. Used on level 2 and higher." 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 "{"?