summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2015-09-09 15:14:52 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2015-09-09 15:14:52 -0400
commitab21f61a552f038485d40218dfd94a16b843eb52 (patch)
tree876a849cbfffc86a355480c17f93589fab012f82 /lisp/emacs-lisp
parent74baea086d1ea606bae99bfc8c9195c21d5530fc (diff)
downloademacs-ab21f61a552f038485d40218dfd94a16b843eb52.tar.gz
emacs-ab21f61a552f038485d40218dfd94a16b843eb52.tar.bz2
emacs-ab21f61a552f038485d40218dfd94a16b843eb52.zip
Make syntax.c call syntax-propertize on demand
* lisp/emacs-lisp/syntax.el (syntax--jit-propertize): New function. (parse-sexp-propertize-function): Use it. (syntax-propertize): Disable parse-sexp-propertize-function. * src/syntax.c (parse_sexp_propertize, update_syntax_table_forward): New functions. (syms_of_syntax): New vars `parse-sexp-propertize-done' and `parse-sexp-propertize-function'. * src/syntax.h (struct gl_state_s): Add `e_property_truncated' field. (UPDATE_SYNTAX_TABLE_FORWARD): Use update_syntax_table_forward. (SETUP_BUFFER_SYNTAX_TABLE): Set e_property_truncated. * lisp/progmodes/elisp-mode.el (elisp-byte-code-syntax-propertize): Don't assume `point' is set.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r--lisp/emacs-lisp/syntax.el15
1 files changed, 15 insertions, 0 deletions
diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el
index 05dd7d57503..6c9cba3e563 100644
--- a/lisp/emacs-lisp/syntax.el
+++ b/lisp/emacs-lisp/syntax.el
@@ -297,7 +297,10 @@ The return value is a function suitable for `syntax-propertize-function'."
(set (make-local-variable 'parse-sexp-lookup-properties) t)
(save-excursion
(with-silent-modifications
+ (make-local-variable 'parse-sexp-propertize-done) ;Just in case!
(let* ((start (max syntax-propertize--done (point-min)))
+ ;; Avoid recursion!
+ (parse-sexp-propertize-done most-positive-fixnum)
(end (max pos
(min (point-max)
(+ start syntax-propertize-chunk-size))))
@@ -324,6 +327,18 @@ The return value is a function suitable for `syntax-propertize-function'."
'(syntax-table nil syntax-multiline nil))
(funcall syntax-propertize-function start end))))))
+;;; Link syntax-propertize with the new parse-sexp-propertize.
+
+(setq-default parse-sexp-propertize-function #'syntax--jit-propertize)
+(defun syntax--jit-propertize (charpos)
+ (if (not syntax-propertize-function)
+ (setq parse-sexp-propertize-done (1+ (point-max)))
+ (syntax-propertize charpos)
+ (setq parse-sexp-propertize-done
+ (if (= (point-max) syntax-propertize--done)
+ (1+ (point-max))
+ syntax-propertize--done))))
+
;;; Incrementally compute and memoize parser state.
(defsubst syntax-ppss-depth (ppss)