From: Alan Mackenzie <acm@muc.de>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: bug-reference-prog-mode slows down CC Mode's scrolling by ~7%
Date: Thu, 2 Sep 2021 21:08:18 +0000 [thread overview]
Message-ID: <YTE9QhBXIwPPZ/OZ@ACM> (raw)
In-Reply-To: <YTElA9YrwCy6po+l@ACM>
Hello, Stefan.
On Thu, Sep 02, 2021 at 19:24:51 +0000, Alan Mackenzie wrote:
[ .... ]
> In words (;-), only the first function on jit-lock-functions should be
> able to expand the region which gets `fontified' text properties. This
> expanded region will then be supplied to the subsequent functions.
> Given how little used the `jit-lock-bounds' mechanism is (there is one
> function in Emacs, font-lock-default-fontify-region, which uses it, and
> a web search revealed only a single other instance, in lsp-mode on
> git-hub), this shouldn't cause problems. In fact, I'm not sure the
> lsp-mode use of it is even correct.
OK, here's some code. There's actually two versions of
jit-lock--run-functions here. The second is a bit longer, but avoids
all the contrivances of using pcase-let*, and may be easier to read and
change. They both fontify xdisp.c without the 7% penalty for the second
jit-lock-functions function, and are equally fast.
diff --git a/lisp/jit-lock.el b/lisp/jit-lock.el
index a1287926eb..bc45eb4e73 100644
--- a/lisp/jit-lock.el
+++ b/lisp/jit-lock.el
@@ -377,6 +377,7 @@ jit-lock-function
(min (point-max) (+ start jit-lock-chunk-size)))
'fontified 'defer)))))
+;;;; NEW STOUGH, 2021-09-02
(defun jit-lock--run-functions (beg end)
(let ((tight-beg nil) (tight-end nil)
(loose-beg beg) (loose-end end))
@@ -384,23 +385,54 @@ jit-lock--run-functions
'jit-lock-functions
(lambda (fun)
(pcase-let*
- ((res (funcall fun beg end))
+ ;; The first function in `jit-lock-functions' can expand
+ ;; the region in `tight-beg' and `tight-end'. This
+ ;; expanded region is passed to the subsequent functions.
+ ;; The union of all the regions the functions mark for
+ ;; fontification is stored in `loose-beg' and `loose-end'.
+ ((res (funcall fun (or tight-beg beg) (or tight-end end)))
(`(,this-beg . ,this-end)
(if (eq (car-safe res) 'jit-lock-bounds)
(cdr res) (cons beg end))))
- ;; If all functions don't fontify the same region, we currently
- ;; just try to "still be correct". But we could go further and for
- ;; the chunks of text that was fontified by some functions but not
- ;; all, we could add text-properties indicating which functions were
- ;; already run to avoid running them redundantly when we get to
- ;; those chunks.
- (setq tight-beg (max (or tight-beg (point-min)) this-beg))
- (setq tight-end (min (or tight-end (point-max)) this-end))
+ (setq tight-beg (or tight-beg (min this-beg beg)))
+ (setq tight-end (or tight-end (max this-end end)))
(setq loose-beg (min loose-beg this-beg))
(setq loose-end (max loose-end this-end))
nil)))
`(,(min tight-beg beg) ,(max tight-end end) ,loose-beg ,loose-end)))
+;;;; NEWER STOUGH, 2021-09-02
+(defun jit-lock--run-functions (beg end)
+ (let ((loose-beg beg) (loose-end end)
+ tight-beg tight-end res)
+ (run-hook-wrapped
+ 'jit-lock-functions
+ (lambda (fun)
+ (if (null tight-beg)
+ ;; The first function in `jit-lock-functions' can expand
+ ;; the fontified region, storing this in `tight-beg' and
+ ;; `tight-end'.
+ (progn
+ (setq res (funcall fun beg end))
+ (if (eq (car-safe res) 'jit-lock-bounds)
+ (setq tight-beg (cadr res)
+ tight-end (cddr res))
+ (setq tight-beg beg
+ tight-end end)))
+ ;; The subsequent functions in `jit-lock-functions' take the
+ ;; possibly expanded region as arguments.
+ (setq res (funcall fun tight-beg tight-end)))
+
+ ;; The union of all the regions the functions mark for
+ ;; fontification is stored in `loose-beg' and `loose-end'.
+ (if (eq (car-safe res) 'jit-lock-bounds)
+ (setq loose-beg (min loose-beg (cadr res))
+ loose-end (max loose-end (cddr res))))
+ nil)) ; prevent termination of `run-hook-wrapped'.
+
+ (list (or tight-beg beg) (or tight-end end) loose-beg loose-end)))
+;;;; END OF NEWER STOUGH
+
(defun jit-lock-fontify-now (&optional start end)
"Fontify current buffer from START to END.
Defaults to the whole buffer. END can be out of bounds."
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2021-09-02 21:08 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-01 17:33 bug-reference-prog-mode slows down CC Mode's scrolling by ~7% Alan Mackenzie
2021-09-01 17:44 ` Eli Zaretskii
2021-09-01 17:55 ` Alan Mackenzie
2021-09-01 18:01 ` Eli Zaretskii
2021-09-01 18:20 ` Alan Mackenzie
2021-09-01 18:28 ` Eli Zaretskii
2021-09-01 19:19 ` Alan Mackenzie
2021-09-01 20:59 ` Stefan Monnier
2021-09-02 6:26 ` Eli Zaretskii
2021-09-02 16:57 ` Alan Mackenzie
2021-09-02 18:46 ` Stefan Monnier
2021-09-02 19:24 ` Alan Mackenzie
2021-09-02 21:08 ` Alan Mackenzie [this message]
2021-09-03 6:16 ` Eli Zaretskii
2021-09-03 12:30 ` Stefan Monnier
2021-09-03 12:38 ` Eli Zaretskii
2021-09-03 22:25 ` Stefan Monnier
2021-09-04 6:13 ` Eli Zaretskii
2021-09-04 13:36 ` Stefan Monnier
2021-09-04 13:55 ` Eli Zaretskii
2021-09-04 14:44 ` Stefan Monnier
2021-09-04 14:56 ` Eli Zaretskii
2021-09-04 15:55 ` Stefan Monnier
2021-09-04 16:12 ` Eli Zaretskii
2021-09-04 16:24 ` Stefan Monnier
2021-09-04 16:28 ` Eli Zaretskii
2021-09-04 16:40 ` Stefan Monnier
2021-09-03 6:10 ` Eli Zaretskii
2021-09-03 10:47 ` Alan Mackenzie
2021-09-03 11:24 ` Eli Zaretskii
2021-09-03 16:15 ` Alan Mackenzie
2021-09-03 12:27 ` Stefan Monnier
2021-09-03 12:19 ` Stefan Monnier
2021-09-03 12:35 ` Eli Zaretskii
2021-09-03 16:52 ` Alan Mackenzie
2021-09-03 20:51 ` Alan Mackenzie
2021-09-04 6:09 ` Eli Zaretskii
2021-09-04 14:50 ` Alan Mackenzie
2021-09-04 15:00 ` Stefan Monnier
2021-09-04 15:32 ` Alan Mackenzie
2021-09-04 15:36 ` Eli Zaretskii
2021-09-04 15:43 ` Alan Mackenzie
2021-09-04 15:48 ` Eli Zaretskii
2021-09-04 16:05 ` Alan Mackenzie
2021-09-04 16:15 ` Eli Zaretskii
2021-09-06 10:46 ` Alan Mackenzie
2021-09-06 11:10 ` Eli Zaretskii
2021-09-06 19:08 ` Alan Mackenzie
2021-09-06 19:23 ` Eli Zaretskii
2021-09-18 11:37 ` Alan Mackenzie
2021-09-18 11:59 ` Eli Zaretskii
2021-09-06 21:59 ` andrés ramírez
2021-09-07 19:47 ` Alan Mackenzie
2021-09-07 17:57 ` andrés ramírez
2021-09-06 13:24 ` Stefan Monnier
2021-09-04 16:06 ` Stefan Monnier
2021-09-04 16:23 ` Eli Zaretskii
2021-09-04 16:39 ` Stefan Monnier
2021-09-04 17:19 ` Eli Zaretskii
2021-09-04 17:47 ` Stefan Monnier
2021-09-04 18:10 ` Eli Zaretskii
2021-09-04 18:40 ` Stefan Monnier
2021-09-11 12:49 ` Eli Zaretskii
2021-09-11 17:04 ` Stefan Monnier
2021-09-11 17:17 ` Eli Zaretskii
2021-09-11 18:00 ` Stefan Monnier
2021-09-11 18:16 ` Eli Zaretskii
2021-09-11 19:55 ` Stefan Monnier
2021-09-12 3:51 ` Eli Zaretskii
2021-09-12 16:41 ` Stefan Monnier
2021-09-12 16:53 ` Eli Zaretskii
2021-09-12 17:41 ` Stefan Monnier
2021-09-12 17:55 ` Eli Zaretskii
2021-09-12 21:11 ` Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YTE9QhBXIwPPZ/OZ@ACM \
--to=acm@muc.de \
--cc=emacs-devel@gnu.org \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.