4 new commits in cc-mode:
https://bitbucket.org/xemacs/cc-mode/changeset/8dbdc285ad39/
changeset: 8dbdc285ad39
user: acm
date: 2012-03-05 15:14:34
summary: Optimise c-state-safe-place
affected #: 1 file
diff -r 0966dd523d17f3f03847def27b95a0b0e5c25281 -r
8dbdc285ad39c20db54cfa7624b541f218961e0e cc-engine.el
--- a/cc-engine.el
+++ b/cc-engine.el
@@ -2130,43 +2130,45 @@
(widen)
(save-excursion
(let ((c c-state-nonlit-pos-cache)
- pos npos lit macro-beg macro-end)
+ pos npos high-pos lit macro-beg macro-end)
;; Trim the cache to take account of buffer changes.
(while (and c (> (car c) c-state-nonlit-pos-cache-limit))
(setq c (cdr c)))
(setq c-state-nonlit-pos-cache c)
(while (and c (> (car c) here))
+ (setq high-pos (car c))
(setq c (cdr c)))
(setq pos (or (car c) (point-min)))
- (while
- ;; Add an element to `c-state-nonlit-pos-cache' each iteration.
- (and
- (<= (setq npos (+ pos c-state-nonlit-pos-interval)) here)
-
- ;; Test for being in a literal.
- (progn
- (setq lit (car (cddr (c-state-pp-to-literal pos npos))))
- (or (null lit)
- (prog1 (<= (cdr lit) here)
- (setq npos (cdr lit)))))
-
- ;; Test for being in a macro.
- (progn
- (goto-char npos)
- (setq macro-beg
- (and (c-beginning-of-macro) (/= (point) npos) (point)))
- (when macro-beg
- (c-syntactic-end-of-macro)
- (or (eobp) (forward-char))
- (setq macro-end (point)))
- (or (null macro-beg)
- (prog1 (<= macro-end here)
- (setq npos macro-end)))))
-
- (setq pos npos)
- (setq c-state-nonlit-pos-cache (cons pos c-state-nonlit-pos-cache)))
+ (unless high-pos
+ (while
+ ;; Add an element to `c-state-nonlit-pos-cache' each iteration.
+ (and
+ (<= (setq npos (+ pos c-state-nonlit-pos-interval)) here)
+
+ ;; Test for being in a literal. If so, go to after it.
+ (progn
+ (setq lit (car (cddr (c-state-pp-to-literal pos npos))))
+ (or (null lit)
+ (prog1 (<= (cdr lit) here)
+ (setq npos (cdr lit)))))
+
+ ;; Test for being in a macro. If so, go to after it.
+ (progn
+ (goto-char npos)
+ (setq macro-beg
+ (and (c-beginning-of-macro) (/= (point) npos) (point)))
+ (when macro-beg
+ (c-syntactic-end-of-macro)
+ (or (eobp) (forward-char))
+ (setq macro-end (point)))
+ (or (null macro-beg)
+ (prog1 (<= macro-end here)
+ (setq npos macro-end)))))
+
+ (setq pos npos)
+ (setq c-state-nonlit-pos-cache (cons pos c-state-nonlit-pos-cache))))
(if (> pos c-state-nonlit-pos-cache-limit)
(setq c-state-nonlit-pos-cache-limit pos))
https://bitbucket.org/xemacs/cc-mode/changeset/1301ab06c9fa/
changeset: 1301ab06c9fa
user: acm
date: 2012-03-05 15:15:44
summary: Merge
affected #: 3 files
diff -r 8dbdc285ad39c20db54cfa7624b541f218961e0e -r
1301ab06c9fac5010f17a064b773f64911f48b94 .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -83,3 +83,4 @@
d9e2f6a5fc7f15598c443cc92ff7593d4a4caa18 cc-mode-1_48
965402f1148652d2f746460a4886d3089a160d94 cc-mode-1_49
c98d6d26469325e40ca583a4405d121fa0d44ca8 cc-mode-1_50
+3eb9de826afe87ee4f9f5a718373c616a00d1c40 cc-mode-1_51
diff -r 8dbdc285ad39c20db54cfa7624b541f218961e0e -r
1301ab06c9fac5010f17a064b773f64911f48b94 ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2012-02-14 Norbert Koch <viteno(a)xemacs.org>
+
+ * Makefile (VERSION): XEmacs package 1.51 released.
+
2012-02-09 Norbert Koch <viteno(a)xemacs.org>
* Makefile (VERSION): XEmacs package 1.50 released.
diff -r 8dbdc285ad39c20db54cfa7624b541f218961e0e -r
1301ab06c9fac5010f17a064b773f64911f48b94 Makefile
--- a/Makefile
+++ b/Makefile
@@ -17,7 +17,7 @@
# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
-VERSION = 1.50
+VERSION = 1.51
AUTHOR_VERSION = 5.32.2
MAINTAINER = Alan Mackenzie <bug-cc-mode(a)gnu.org>
PACKAGE = cc-mode
https://bitbucket.org/xemacs/cc-mode/changeset/90a496f451d4/
changeset: 90a496f451d4
user: acm
date: 2012-03-05 15:20:21
summary: Optimise macro handling with a 1 element cache of beginning and end.
affected #: 4 files
diff -r 1301ab06c9fac5010f17a064b773f64911f48b94 -r
90a496f451d448a75b99ae38cd79b8ff0fd13ac6 cc-engine.el
--- a/cc-engine.el
+++ b/cc-engine.el
@@ -222,6 +222,38 @@
(point))))
c-macro-start))
+;; One element macro cache to cope with continual movement within very large
+;; CPP macros.
+(defvar c-macro-cache nil)
+(make-variable-buffer-local 'c-macro-cache)
+;; Nil or cons of the bounds of the most recent CPP form probed by
+;; `c-beginning-of-macro', `c-end-of-macro' or `c-syntactic-end-of-macro'.
+;; The cdr will be nil if we know only the start of the CPP form.
+(defvar c-macro-cache-start-pos nil)
+(make-variable-buffer-local 'c-macro-cache-start-pos)
+;; The starting position from where we determined `c-macro-cache'.
+(defvar c-macro-cache-syntactic nil)
+(make-variable-buffer-local 'c-macro-cache-syntactic)
+;; non-nil iff `c-macro-cache' has both elements set AND the cdr is at a
+;; syntactic end of macro, not merely an apparent one.
+
+(defun c-invalidate-macro-cache (beg end)
+ ;; Called from a before-change function. If the change region is before or
+ ;; in the macro characterised by `c-macro-cache' etc., nullify it
+ ;; appropriately. BEG and END are the standard before-change-functions
+ ;; parameters. END isn't used.
+ (cond
+ ((null c-macro-cache))
+ ((< beg (car c-macro-cache))
+ (setq c-macro-cache nil
+ c-macro-cache-start-pos nil
+ c-macro-cache-syntactic nil))
+ ((and (cdr c-macro-cache)
+ (< beg (cdr c-macro-cache)))
+ (setcdr c-macro-cache nil)
+ (setq c-macro-cache-start-pos beg
+ c-macro-cache-syntactic nil))))
+
(defun c-beginning-of-macro (&optional lim)
"Go to the beginning of a preprocessor directive.
Leave point at the beginning of the directive and return t if in one,
@@ -229,19 +261,36 @@
Note that this function might do hidden buffer changes. See the
comment at the start of cc-engine.el for more info."
- (when c-opt-cpp-prefix
- (let ((here (point)))
- (save-restriction
- (if lim (narrow-to-region lim (point-max)))
- (beginning-of-line)
- (while (eq (char-before (1- (point))) ?\\)
- (forward-line -1))
- (back-to-indentation)
- (if (and (<= (point) here)
- (looking-at c-opt-cpp-start))
- t
- (goto-char here)
- nil)))))
+ (let ((here (point)))
+ (when c-opt-cpp-prefix
+ (if (and (car c-macro-cache)
+ (>= (point) (car c-macro-cache))
+ (or (and (cdr c-macro-cache)
+ (<= (point) (cdr c-macro-cache)))
+ (<= (point) c-macro-cache-start-pos)))
+ (unless (< (car c-macro-cache) (or lim (point-min)))
+ (progn (goto-char (max (or lim (point-min)) (car c-macro-cache)))
+ (setq c-macro-cache-start-pos
+ (max c-macro-cache-start-pos here))
+ t))
+ (setq c-macro-cache nil
+ c-macro-cache-start-pos nil
+ c-macro-cache-syntactic nil)
+
+ (save-restriction
+ (if lim (narrow-to-region lim (point-max)))
+ (beginning-of-line)
+ (while (eq (char-before (1- (point))) ?\\)
+ (forward-line -1))
+ (back-to-indentation)
+ (if (and (<= (point) here)
+ (looking-at c-opt-cpp-start))
+ (progn
+ (setq c-macro-cache (cons (point) nil)
+ c-macro-cache-start-pos here)
+ t)
+ (goto-char here)
+ nil))))))
(defun c-end-of-macro ()
"Go to the end of a preprocessor directive.
@@ -251,12 +300,24 @@
Note that this function might do hidden buffer changes. See the
comment at the start of cc-engine.el for more info."
- (while (progn
- (end-of-line)
- (when (and (eq (char-before) ?\\)
- (not (eobp)))
- (forward-char)
- t))))
+ (if (and (cdr c-macro-cache)
+ (<= (point) (cdr c-macro-cache))
+ (>= (point) (car c-macro-cache)))
+ (goto-char (cdr c-macro-cache))
+ (unless (and (car c-macro-cache)
+ (<= (point) c-macro-cache-start-pos)
+ (>= (point) (car c-macro-cache)))
+ (setq c-macro-cache nil
+ c-macro-cache-start-pos nil
+ c-macro-cache-syntactic nil))
+ (while (progn
+ (end-of-line)
+ (when (and (eq (char-before) ?\\)
+ (not (eobp)))
+ (forward-char)
+ t)))
+ (when (car c-macro-cache)
+ (setcdr c-macro-cache (point)))))
(defun c-syntactic-end-of-macro ()
;; Go to the end of a CPP directive, or a "safe" pos just before.
@@ -271,12 +332,15 @@
;; at the start of cc-engine.el for more info.
(let* ((here (point))
(there (progn (c-end-of-macro) (point)))
- (s (parse-partial-sexp here there)))
- (while (and (or (nth 3 s) ; in a string
- (nth 4 s)) ; in a comment (maybe at end of line comment)
- (> there here)) ; No infinite loops, please.
- (setq there (1- (nth 8 s)))
- (setq s (parse-partial-sexp here there)))
+ s)
+ (unless c-macro-cache-syntactic
+ (setq s (parse-partial-sexp here there))
+ (while (and (or (nth 3 s) ; in a string
+ (nth 4 s)) ; in a comment (maybe at end of line comment)
+ (> there here)) ; No infinite loops, please.
+ (setq there (1- (nth 8 s)))
+ (setq s (parse-partial-sexp here there)))
+ (setq c-macro-cache-syntactic (car c-macro-cache)))
(point)))
(defun c-forward-over-cpp-define-id ()
diff -r 1301ab06c9fac5010f17a064b773f64911f48b94 -r
90a496f451d448a75b99ae38cd79b8ff0fd13ac6 cc-fonts.el
--- a/cc-fonts.el
+++ b/cc-fonts.el
@@ -409,7 +409,8 @@
(cc-eval-when-compile
(boundp 'parse-sexp-lookup-properties)))
(BOD-limit
- (c-determine-limit 1000)))
+ (c-determine-limit 500 ;; 1000
+ )))
(goto-char
(let ((here (point)))
(if (eq (car (c-beginning-of-decl-1 BOD-limit)) 'same)
diff -r 1301ab06c9fac5010f17a064b773f64911f48b94 -r
90a496f451d448a75b99ae38cd79b8ff0fd13ac6 cc-langs.el
--- a/cc-langs.el
+++ b/cc-langs.el
@@ -444,8 +444,10 @@
;; For documentation see the following c-lang-defvar of the same name.
;; The value here may be a list of functions or a single function.
t nil
- c++ '(c-extend-region-for-CPP c-before-change-check-<>-operators)
- (c objc) 'c-extend-region-for-CPP
+ c++ '(c-extend-region-for-CPP
+ c-before-change-check-<>-operators
+ c-invalidate-macro-cache)
+ (c objc) '(c-extend-region-for-CPP c-invalidate-macro-cache)
;; java 'c-before-change-check-<>-operators
awk 'c-awk-record-region-clear-NL)
(c-lang-defvar c-get-state-before-change-functions
diff -r 1301ab06c9fac5010f17a064b773f64911f48b94 -r
90a496f451d448a75b99ae38cd79b8ff0fd13ac6 cc-vars.el
--- a/cc-vars.el
+++ b/cc-vars.el
@@ -1653,7 +1653,8 @@
c-macro-names-with-semicolon))))))
(defvar c-macro-names-with-semicolon
- '("Q_OBJECT" "Q_PROPERTY" "Q_DECLARE"
"Q_ENUMS")
+; '("Q_OBJECT" "Q_PROPERTY" "Q_DECLARE"
"Q_ENUMS")
+ nil
"List of #defined symbols whose expansion ends with a semicolon.
Alternatively it can be a string, a regular expression which
matches all such symbols.
https://bitbucket.org/xemacs/cc-mode/changeset/72c17e2c12a5/
changeset: 72c17e2c12a5
user: acm
date: 2012-03-05 15:25:59
summary: Depessimize the handling of very large macros.
affected #: 3 files
diff -r 90a496f451d448a75b99ae38cd79b8ff0fd13ac6 -r
72c17e2c12a5cd58f7e46f3d8a8a322d840ac564 cc-engine.el
--- a/cc-engine.el
+++ b/cc-engine.el
@@ -2154,6 +2154,18 @@
;; reduced by buffer changes, and increased by invocations of
;; `c-state-literal-at'.
+(defvar c-state-semi-nonlit-pos-cache nil)
+(make-variable-buffer-local 'c-state-semi-nonlit-pos-cache)
+;; A list of buffer positions which are known not to be in a literal. This is
+;; ordered with higher positions at the front of the list. Only those which
+;; are less than `c-state-semi-nonlit-pos-cache-limit' are valid.
+
+(defvar c-state-semi-nonlit-pos-cache-limit 1)
+(make-variable-buffer-local 'c-state-semi-nonlit-pos-cache-limit)
+;; An upper limit on valid entries in `c-state-semi-nonlit-pos-cache'. This is
+;; reduced by buffer changes, and increased by invocations of
+;; `c-state-literal-at'. FIMXE!!!
+
(defsubst c-state-pp-to-literal (from to)
;; Do a parse-partial-sexp from FROM to TO, returning either
;; (STATE TYPE (BEG . END)) if TO is in a literal; or
@@ -2232,12 +2244,55 @@
(setq npos macro-end)))))
(setq pos npos)
- (setq c-state-nonlit-pos-cache (cons pos c-state-nonlit-pos-cache))))
+ (setq c-state-nonlit-pos-cache (cons pos c-state-nonlit-pos-cache)))
+ ;; Add one extra element above HERE so as to to avoid the previous
+ ;; expensive calculation when the next call is close to the current
+ ;; one. This is especially useful when inside a large macro.
+ (setq c-state-nonlit-pos-cache (cons npos c-state-nonlit-pos-cache)))
(if (> pos c-state-nonlit-pos-cache-limit)
(setq c-state-nonlit-pos-cache-limit pos))
pos))))
+(defun c-state-semi-safe-place (here)
+ ;; Return a buffer position before HERE which is "safe", i.e. outside any
+ ;; string or comment. It may be in a macro.
+ (save-restriction
+ (widen)
+ (save-excursion
+ (let ((c c-state-semi-nonlit-pos-cache)
+ pos npos high-pos lit macro-beg macro-end)
+ ;; Trim the cache to take account of buffer changes.
+ (while (and c (> (car c) c-state-semi-nonlit-pos-cache-limit))
+ (setq c (cdr c)))
+ (setq c-state-semi-nonlit-pos-cache c)
+
+ (while (and c (> (car c) here))
+ (setq high-pos (car c))
+ (setq c (cdr c)))
+ (setq pos (or (car c) (point-min)))
+
+ (unless high-pos
+ (while
+ ;; Add an element to `c-state-semi-nonlit-pos-cache' each iteration.
+ (and
+ (<= (setq npos (+ pos c-state-nonlit-pos-interval)) here)
+
+ ;; Test for being in a literal. If so, go to after it.
+ (progn
+ (setq lit (car (cddr (c-state-pp-to-literal pos npos))))
+ (or (null lit)
+ (prog1 (<= (cdr lit) here)
+ (setq npos (cdr lit))))))
+
+ (setq pos npos)
+ (setq c-state-semi-nonlit-pos-cache
+ (cons pos c-state-semi-nonlit-pos-cache))))
+
+ (if (> pos c-state-semi-nonlit-pos-cache-limit)
+ (setq c-state-semi-nonlit-pos-cache-limit pos))
+ pos))))
+
(defun c-state-literal-at (here)
;; If position HERE is inside a literal, return (START . END), the
;; boundaries of the literal (which may be outside the accessible bit of the
@@ -3056,9 +3111,11 @@
;;
;; This function is called from c-after-change.
- ;; The cache of non-literals:
+ ;; The caches of non-literals:
(if (< here c-state-nonlit-pos-cache-limit)
(setq c-state-nonlit-pos-cache-limit here))
+ (if (< here c-state-semi-nonlit-pos-cache-limit)
+ (setq c-state-semi-nonlit-pos-cache-limit here))
;; `c-state-cache':
;; Case 1: if `here' is in a literal containing point-min, everything
@@ -4310,7 +4367,7 @@
comment at the start of cc-engine.el for more info."
(save-restriction
(widen)
- (let* ((safe-place (c-state-safe-place (point)))
+ (let* ((safe-place (c-state-semi-safe-place (point)))
(lit (c-state-pp-to-literal safe-place (point))))
(or (cadr lit)
(and detect-cpp
@@ -4334,7 +4391,7 @@
(save-excursion
(let* ((pos (point))
- (lim (or lim (c-state-safe-place pos)))
+ (lim (or lim (c-state-semi-safe-place pos)))
(pp-to-lit (save-restriction
(widen)
(c-state-pp-to-literal lim pos)))
@@ -4452,7 +4509,7 @@
;; Get a "safe place" approximately TRY-SIZE characters before START.
;; This doesn't preserve point.
(let* ((pos (max (- start try-size) (point-min)))
- (base (c-state-safe-place pos))
+ (base (c-state-semi-safe-place pos))
(s (parse-partial-sexp base pos)))
(if (or (nth 4 s) (nth 3 s)) ; comment or string
(nth 8 s)
diff -r 90a496f451d448a75b99ae38cd79b8ff0fd13ac6 -r
72c17e2c12a5cd58f7e46f3d8a8a322d840ac564 cc-fonts.el
--- a/cc-fonts.el
+++ b/cc-fonts.el
@@ -409,8 +409,7 @@
(cc-eval-when-compile
(boundp 'parse-sexp-lookup-properties)))
(BOD-limit
- (c-determine-limit 500 ;; 1000
- )))
+ (c-determine-limit 1000)))
(goto-char
(let ((here (point)))
(if (eq (car (c-beginning-of-decl-1 BOD-limit)) 'same)
diff -r 90a496f451d448a75b99ae38cd79b8ff0fd13ac6 -r
72c17e2c12a5cd58f7e46f3d8a8a322d840ac564 cc-vars.el
--- a/cc-vars.el
+++ b/cc-vars.el
@@ -1653,8 +1653,7 @@
c-macro-names-with-semicolon))))))
(defvar c-macro-names-with-semicolon
-; '("Q_OBJECT" "Q_PROPERTY" "Q_DECLARE"
"Q_ENUMS")
- nil
+ '("Q_OBJECT" "Q_PROPERTY" "Q_DECLARE"
"Q_ENUMS")
"List of #defined symbols whose expansion ends with a semicolon.
Alternatively it can be a string, a regular expression which
matches all such symbols.
Repository URL:
https://bitbucket.org/xemacs/cc-mode/
--
This is a commit notification from
bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
_______________________________________________
XEmacs-Patches mailing list
XEmacs-Patches(a)xemacs.org
http://lists.xemacs.org/mailman/listinfo/xemacs-patches