From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.devel Subject: Re: bug-reference-prog-mode slows down CC Mode's scrolling by ~7% Date: Thu, 2 Sep 2021 21:08:18 +0000 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="2708"; mail-complaints-to="usenet@ciao.gmane.io" Cc: emacs-devel@gnu.org To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Thu Sep 02 23:09:16 2021 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mLtxU-0000Ue-3c for ged-emacs-devel@m.gmane-mx.org; Thu, 02 Sep 2021 23:09:16 +0200 Original-Received: from localhost ([::1]:39384 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mLtxS-0004rz-9i for ged-emacs-devel@m.gmane-mx.org; Thu, 02 Sep 2021 17:09:14 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:50500) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mLtwi-0003X6-4D for emacs-devel@gnu.org; Thu, 02 Sep 2021 17:08:28 -0400 Original-Received: from colin.muc.de ([193.149.48.1]:11719 helo=mail.muc.de) by eggs.gnu.org with smtp (Exim 4.90_1) (envelope-from ) id 1mLtwc-00024g-TH for emacs-devel@gnu.org; Thu, 02 Sep 2021 17:08:27 -0400 Original-Received: (qmail 9444 invoked by uid 3782); 2 Sep 2021 21:08:19 -0000 Original-Received: from acm.muc.de (p4fe15b97.dip0.t-ipconnect.de [79.225.91.151]) (using STARTTLS) by colin.muc.de (tmda-ofmipd) with ESMTP; Thu, 02 Sep 2021 23:08:18 +0200 Original-Received: (qmail 8566 invoked by uid 1000); 2 Sep 2021 21:08:18 -0000 Content-Disposition: inline In-Reply-To: X-Submission-Agent: TMDA/1.3.x (Ph3nix) X-Primary-Address: acm@muc.de Received-SPF: pass client-ip=193.149.48.1; envelope-from=acm@muc.de; helo=mail.muc.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:273731 Archived-At: 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).