diff options
author | Alan Mackenzie <acm@muc.de> | 2022-08-06 21:11:18 +0000 |
---|---|---|
committer | Alan Mackenzie <acm@muc.de> | 2022-08-06 21:11:18 +0000 |
commit | e43fa98a71d228475877a4b8d44b96e10c507ffa (patch) | |
tree | 3f1af6b0cf45e270bf771075884c694c060d3583 /lisp/progmodes/cc-fonts.el | |
parent | b459e275c3824226c260ebe59641f87bb4d26403 (diff) | |
download | emacs-e43fa98a71d228475877a4b8d44b96e10c507ffa.tar.gz emacs-e43fa98a71d228475877a4b8d44b96e10c507ffa.tar.bz2 emacs-e43fa98a71d228475877a4b8d44b96e10c507ffa.zip |
CC Mode: Optimize font-locking stanzas for long raw strings.
Also replace some regexp searches which had caused regexp engine stack
overflows with simple end-of-line calls.
* lisp/progmodes/cc-fonts.el (c-make-syntactic-matcher)
(c-make-font-lock-search-form): Start the generated functions with a skipping
of comments and strings.
(c-make-font-lock-BO-decl-search-function): Start the generated function with
a (fast) movement to the start of any literal.
* lisp/progmodes/cc-mode.el (c-before-change-check-unbalanced-strings)
(c-after-change-mark-abnormal-strings): Replace complicated regexp searches
for end of logical line with basic Lisp functions.
Diffstat (limited to 'lisp/progmodes/cc-fonts.el')
-rw-r--r-- | lisp/progmodes/cc-fonts.el | 77 |
1 files changed, 41 insertions, 36 deletions
diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el index 625010b04b2..2495d21a10f 100644 --- a/lisp/progmodes/cc-fonts.el +++ b/lisp/progmodes/cc-fonts.el @@ -285,6 +285,7 @@ (byte-compile `(lambda (limit) (let (res) + (c-skip-comments-and-strings limit) (while (and (setq res (re-search-forward ,regexp limit t)) (progn (goto-char (match-beginning 0)) @@ -300,43 +301,45 @@ ;; with HIGHLIGHTS, a list of highlighters as specified on page ;; "Search-based Fontification" in the elisp manual. If CHECK-POINT ;; is non-nil, we will check (< (point) limit) in the main loop. - `(while - ,(if check-point - `(and (< (point) limit) - (re-search-forward ,regexp limit t)) - `(re-search-forward ,regexp limit t)) - (unless (progn - (goto-char (match-beginning 0)) - (c-skip-comments-and-strings limit)) - (goto-char (match-end 0)) - ,@(mapcar - (lambda (highlight) - (if (integerp (car highlight)) - ;; e.g. highlight is (1 font-lock-type-face t) - (progn - (unless (eq (nth 2 highlight) t) - (error - "The override flag must currently be t in %s" - highlight)) - (when (nth 3 highlight) - (error - "The laxmatch flag may currently not be set in %s" - highlight)) - `(save-match-data - (c-put-font-lock-face - (match-beginning ,(car highlight)) - (match-end ,(car highlight)) - ,(elt highlight 1)))) - ;; highlight is an "ANCHORED HIGHLIGHTER" of the form - ;; (ANCHORED-MATCHER PRE-FORM POST-FORM SUBEXP-HIGHLIGHTERS...) - (when (nth 3 highlight) - (error "Match highlights currently not supported in %s" + `(progn + (c-skip-comments-and-strings limit) + (while + ,(if check-point + `(and (< (point) limit) + (re-search-forward ,regexp limit t)) + `(re-search-forward ,regexp limit t)) + (unless (progn + (goto-char (match-beginning 0)) + (c-skip-comments-and-strings limit)) + (goto-char (match-end 0)) + ,@(mapcar + (lambda (highlight) + (if (integerp (car highlight)) + ;; e.g. highlight is (1 font-lock-type-face t) + (progn + (unless (eq (nth 2 highlight) t) + (error + "The override flag must currently be t in %s" + highlight)) + (when (nth 3 highlight) + (error + "The laxmatch flag may currently not be set in %s" highlight)) - `(progn - ,(nth 1 highlight) - (save-match-data ,(car highlight)) - ,(nth 2 highlight)))) - highlights)))) + `(save-match-data + (c-put-font-lock-face + (match-beginning ,(car highlight)) + (match-end ,(car highlight)) + ,(elt highlight 1)))) + ;; highlight is an "ANCHORED HIGHLIGHTER" of the form + ;; (ANCHORED-MATCHER PRE-FORM POST-FORM SUBEXP-HIGHLIGHTERS...) + (when (nth 3 highlight) + (error "Match highlights currently not supported in %s" + highlight)) + `(progn + ,(nth 1 highlight) + (save-match-data ,(car highlight)) + ,(nth 2 highlight)))) + highlights))))) (defun c-make-font-lock-search-function (regexp &rest highlights) ;; This function makes a byte compiled function that works much like @@ -416,6 +419,8 @@ ;; lambda more easily. (byte-compile `(lambda (limit) + (let ((lit-start (c-literal-start))) + (when lit-start (goto-char lit-start))) (let ( ;; The font-lock package in Emacs is known to clobber ;; `parse-sexp-lookup-properties' (when it exists). (parse-sexp-lookup-properties |