]> code.delx.au - gnu-emacs/commitdiff
Further optimise the handling of large macros.
authorAlan Mackenzie <acm@muc.de>
Fri, 16 Mar 2012 14:10:54 +0000 (14:10 +0000)
committerAlan Mackenzie <acm@muc.de>
Fri, 16 Mar 2012 14:10:54 +0000 (14:10 +0000)
lisp/ChangeLog
lisp/progmodes/cc-engine.el
lisp/progmodes/cc-mode.el

index 67ab591b7ea61a7450152bc02296572d12144d5a..867ca2dacde4c61c5a4b8a13b3cf1b2008c8c73c 100644 (file)
@@ -1,3 +1,20 @@
+2012-03-16  Alan Mackenzie  <acm@muc.de>
+
+       Further optimise the handling of large macros.
+
+       * progmodes/cc-engine.el (c-crosses-statement-barrier-p): Use a
+       limit to a call of `c-literal-limits'.
+       (c-determine-+ve-limit): New function.
+       (c-at-macro-vsemi-p): Move `c-in-literal' to the bottom of an
+       `and'.
+       (c-guess-basic-syntax): In macros, restrict a search limit to
+       2000.
+       In CASE 5B, restrict a search limit to 500.
+       (c-just-after-func-arglist-p): Obviouly wrong `or' -> `and'.
+
+       * progmodes/cc-mode.el (c-neutralize-syntax-in-and-mark-CPP):
+       Restrict macro bounds to +-500 from after-change's BEG END.
+
 2012-03-16  Leo Liu  <sdl.web@gmail.com>
 
        * font-lock.el (lisp-font-lock-keywords-2): Add letrec.
index f392971e7d156008404608a6ebdf10a17eb401c6..cf38001c123afa451d88f265bf2b348e6f5c7b82 100644 (file)
@@ -1246,7 +1246,7 @@ comment at the start of cc-engine.el for more info."
                       (c-at-vsemi-p))))
              (throw 'done vsemi-pos))
             ;; In a string/comment?
-            ((setq lit-range (c-literal-limits))
+            ((setq lit-range (c-literal-limits from))
              (goto-char (cdr lit-range)))
             ((eq (char-after) ?:)
              (forward-char)
@@ -3250,8 +3250,7 @@ comment at the start of cc-engine.el for more info."
              (if scan-forward-p
                  (progn (narrow-to-region (point-min) here)
                         (c-append-to-state-cache good-pos))
-
-               (c-get-cache-scan-pos good-pos))))
+               good-pos)))
 
        (t ; (eq strategy 'IN-LIT)
        (setq c-state-cache nil
@@ -4563,6 +4562,38 @@ comment at the start of cc-engine.el for more info."
        (point-min))
        (t
        (c-determine-limit (- how-far-back count) base try-size))))))
+
+(defun c-determine-+ve-limit (how-far &optional start-pos)
+  ;; Return a buffer position about HOW-FAR non-literal characters forward
+  ;; from START-POS (default point), which must not be inside a literal.
+  (save-excursion
+    (let ((pos (or start-pos (point)))
+         (count how-far)
+         (s (parse-partial-sexp (point) (point)))) ; null state
+      (while (and (not (eobp))
+                 (> count 0))
+       ;; Scan over counted characters.
+       (setq s (parse-partial-sexp
+                pos
+                (min (+ pos count) (point-max))
+                nil                    ; target-depth
+                nil                    ; stop-before
+                s                      ; state
+                'syntax-table))        ; stop-comment
+       (setq count (- count (- (point) pos) 1)
+             pos (point))
+       ;; Scan over literal characters.
+       (if (nth 8 s)
+           (setq s (parse-partial-sexp
+                    pos
+                    (point-max)
+                    nil                ; target-depth
+                    nil                ; stop-before
+                    s                  ; state
+                    'syntax-table)     ; stop-comment
+                 pos (point))))
+      (point))))
+
 \f
 ;; `c-find-decl-spots' and accompanying stuff.
 
@@ -7670,8 +7701,8 @@ comment at the start of cc-engine.el for more info."
     (and
      (eq (c-beginning-of-statement-1 lim) 'same)
 
-     (not (or (c-major-mode-is 'objc-mode)
-             (c-forward-objc-directive)))
+     (not (and (c-major-mode-is 'objc-mode)
+              (c-forward-objc-directive)))
 
      (setq id-start
           (car-safe (c-forward-decl-or-cast-1 (c-point 'bosws) nil nil)))
@@ -8635,7 +8666,6 @@ comment at the start of cc-engine.el for more info."
        (setq pos (point)))
       (and
        c-macro-with-semi-re
-       (not (c-in-literal))
        (eq (skip-chars-backward " \t") 0)
 
        ;; Check we've got nothing after this except comments and empty lines
@@ -8666,7 +8696,9 @@ comment at the start of cc-engine.el for more info."
             (c-backward-syntactic-ws)
             t))
        (c-simple-skip-symbol-backward)
-       (looking-at c-macro-with-semi-re)))))
+       (looking-at c-macro-with-semi-re)
+       (goto-char pos)
+       (not (c-in-literal))))))                ; The most expensive check last. 
 
 (defun c-macro-vsemi-status-unknown-p () t) ; See cc-defs.el.
 
@@ -9207,6 +9239,10 @@ comment at the start of cc-engine.el for more info."
                          containing-sexp nil)))
              (setq lim (1+ containing-sexp))))
        (setq lim (point-min)))
+      (when (c-beginning-of-macro)
+       (goto-char indent-point)
+       (let ((lim1 (c-determine-limit 2000)))
+         (setq lim (max lim lim1))))
 
       ;; If we're in a parenthesis list then ',' delimits the
       ;; "statements" rather than being an operator (with the
@@ -9571,7 +9607,8 @@ comment at the start of cc-engine.el for more info."
         ;; CASE 5B: After a function header but before the body (or
         ;; the ending semicolon if there's no body).
         ((save-excursion
-           (when (setq placeholder (c-just-after-func-arglist-p lim))
+           (when (setq placeholder (c-just-after-func-arglist-p
+                                    (max lim (c-determine-limit 500))))
              (setq tmp-pos (point))))
          (cond
 
@@ -9779,7 +9816,7 @@ comment at the start of cc-engine.el for more info."
           ;; top level construct.  Or, perhaps, an unrecognized construct.
           (t
            (while (and (setq placeholder (point))
-                       (eq (car (c-beginning-of-decl-1 containing-sexp))
+                       (eq (car (c-beginning-of-decl-1 containing-sexp)) ; Can't use `lim' here.
                            'same)
                        (save-excursion
                          (c-backward-syntactic-ws)
@@ -9882,7 +9919,7 @@ comment at the start of cc-engine.el for more info."
                              (eq (cdar c-state-cache) (point)))
                         ;; Speed up the backward search a bit.
                         (goto-char (caar c-state-cache)))
-                    (c-beginning-of-decl-1 containing-sexp)
+                    (c-beginning-of-decl-1 containing-sexp) ; Can't use `lim' here.
                     (setq placeholder (point))
                     (if (= start (point))
                         ;; The '}' is unbalanced.
index 985214db1dc5b739a4068a2cda01b97eb5947d86..7c018feefbb631ba7c85c178e904f072ad285f2d 100644 (file)
@@ -925,8 +925,8 @@ Note that the style variables are always made local to the buffer."
     ;; inside a string, comment, or macro.
     (setq new-bounds (c-extend-font-lock-region-for-macros
                      c-new-BEG c-new-END old-len))
-    (setq c-new-BEG (car new-bounds)
-         c-new-END (cdr new-bounds))
+    (setq c-new-BEG (max (car new-bounds) (c-determine-limit 500 begg))
+         c-new-END (min (cdr new-bounds) (c-determine-+ve-limit 500 endd)))
     ;; Clear all old relevant properties.
     (c-clear-char-property-with-value c-new-BEG c-new-END 'syntax-table '(1))
     (c-clear-char-property-with-value c-new-BEG c-new-END 'category 'c-cpp-delimiter)