Mercurial > emacs
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 "{"?