GNU bug report logs - #41200
Displaying a tooltip with x-show-tip gets very slow as more faces are defined

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: Clément Pit-Claudel <cpitclaudel@HIDDEN>; merged with #41267; dated Tue, 12 May 2020 04:31:01 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 24 May 2020 22:10:26 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun May 24 18:10:26 2020
Received: from localhost ([127.0.0.1]:38991 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jcyp8-0000AK-Cr
	for submit <at> debbugs.gnu.org; Sun, 24 May 2020 18:10:26 -0400
Received: from relay5-d.mail.gandi.net ([217.70.183.197]:57419)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <juri@HIDDEN>) id 1jcyp3-00009Z-3H
 for 41200 <at> debbugs.gnu.org; Sun, 24 May 2020 18:10:21 -0400
X-Originating-IP: 91.129.108.6
Received: from mail.gandi.net (m91-129-108-6.cust.tele2.ee [91.129.108.6])
 (Authenticated sender: juri@HIDDEN)
 by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id A075F1C0005;
 Sun, 24 May 2020 22:10:14 +0000 (UTC)
From: Juri Linkov <juri@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow
 as more faces are defined
Organization: LINKOV.NET
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN>
 <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN>
 <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN>
 <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN>
 <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 <87367z324f.fsf@HIDDEN>
 <3fc34671-54ba-e83d-9514-11e0906c2ac0@HIDDEN>
 <87lflqkznj.fsf@HIDDEN>
 <b9ca866c-4a41-0e33-581e-2991a2d6e97f@HIDDEN>
 <87zha3d29k.fsf@HIDDEN> <83a71z135p.fsf@HIDDEN>
 <87r1vas1z3.fsf@HIDDEN> <83lflixdsw.fsf@HIDDEN>
Date: Mon, 25 May 2020 00:50:14 +0300
In-Reply-To: <83lflixdsw.fsf@HIDDEN> (Eli Zaretskii's message of "Sun, 24 May
 2020 05:33:03 +0300")
Message-ID: <87sgfpuhnt.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (x86_64-pc-linux-gnu)
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
Cc: cpitclaudel@HIDDEN, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

>> Or may I suggest to preload tab-line.el in emacs-27?
>
> Doesn't sound justified to me.  I don't expect this feature to be so
> popular as to always have it available.

Agreed, better to move deffaces to faces.el.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 24 May 2020 02:33:05 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat May 23 22:33:05 2020
Received: from localhost ([127.0.0.1]:36108 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jcgRl-0004ju-3p
	for submit <at> debbugs.gnu.org; Sat, 23 May 2020 22:33:05 -0400
Received: from eggs.gnu.org ([209.51.188.92]:48602)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1jcgRj-0004jQ-MY
 for 41200 <at> debbugs.gnu.org; Sat, 23 May 2020 22:33:04 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:53833)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jcgRd-00058K-9J; Sat, 23 May 2020 22:32:57 -0400
Received: from [176.228.60.248] (port=4255 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jcgRc-00010w-99; Sat, 23 May 2020 22:32:56 -0400
Date: Sun, 24 May 2020 05:33:03 +0300
Message-Id: <83lflixdsw.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Juri Linkov <juri@HIDDEN>
In-Reply-To: <87r1vas1z3.fsf@HIDDEN> (message from Juri Linkov on
 Sun, 24 May 2020 01:47:28 +0300)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow
 as more faces are defined
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN>
 <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN>
 <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN>
 <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN>
 <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 <87367z324f.fsf@HIDDEN>
 <3fc34671-54ba-e83d-9514-11e0906c2ac0@HIDDEN>
 <87lflqkznj.fsf@HIDDEN>
 <b9ca866c-4a41-0e33-581e-2991a2d6e97f@HIDDEN>
 <87zha3d29k.fsf@HIDDEN> <83a71z135p.fsf@HIDDEN>
 <87r1vas1z3.fsf@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: cpitclaudel@HIDDEN, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Juri Linkov <juri@HIDDEN>
> Cc: cpitclaudel@HIDDEN,  41200 <at> debbugs.gnu.org
> Date: Sun, 24 May 2020 01:47:28 +0300
> 
> > Actually, the problem with the tab-line face will probably need to be
> > fixed on emacs-27.
> 
> I don't recommend using the trick with nconc in emacs-27.  It would be
> less risky if Clément will just move tab faces to faces.el in emacs-27.

Agreed.

> Or may I suggest to preload tab-line.el in emacs-27?

Doesn't sound justified to me.  I don't expect this feature to be so
popular as to always have it available.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 23 May 2020 22:56:42 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat May 23 18:56:42 2020
Received: from localhost ([127.0.0.1]:36007 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jcd4L-00088p-OD
	for submit <at> debbugs.gnu.org; Sat, 23 May 2020 18:56:42 -0400
Received: from relay7-d.mail.gandi.net ([217.70.183.200]:33025)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <juri@HIDDEN>) id 1jcd4I-00088T-RL
 for 41200 <at> debbugs.gnu.org; Sat, 23 May 2020 18:56:39 -0400
X-Originating-IP: 91.129.97.200
Received: from mail.gandi.net (m91-129-97-200.cust.tele2.ee [91.129.97.200])
 (Authenticated sender: juri@HIDDEN)
 by relay7-d.mail.gandi.net (Postfix) with ESMTPSA id AB07420003;
 Sat, 23 May 2020 22:56:31 +0000 (UTC)
From: Juri Linkov <juri@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow
 as more faces are defined
Organization: LINKOV.NET
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN>
 <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN>
 <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN>
 <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN>
 <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 <87367z324f.fsf@HIDDEN>
 <3fc34671-54ba-e83d-9514-11e0906c2ac0@HIDDEN>
 <87lflqkznj.fsf@HIDDEN>
 <b9ca866c-4a41-0e33-581e-2991a2d6e97f@HIDDEN>
 <87zha3d29k.fsf@HIDDEN> <83a71z135p.fsf@HIDDEN>
Date: Sun, 24 May 2020 01:47:28 +0300
In-Reply-To: <83a71z135p.fsf@HIDDEN> (Eli Zaretskii's message of "Sat, 23 May
 2020 11:11:46 +0300")
Message-ID: <87r1vas1z3.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (x86_64-pc-linux-gnu)
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
Cc: cpitclaudel@HIDDEN, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

>> >> Could these faces belong to both groups?
>> >> 
>> >>   :group 'basic-faces
>> >>   :group 'tab-bar-faces
>> >
>> > Yup, but that won't work well if the face is customized before the
>> > group is defined, right?  Maybe the trick would be to add the group to
>> > the face when tab-bar.el and tab-line.el are loaded?
>> 
>> Actually since tab-bar.el is pre-loaded this problem exists only for
>> tab-line.el.
>> 
>> Then adding something like
>> 
>>   (nconc (get 'tab-line-faces 'custom-group) '((tab-line custom-face) ...))
>> 
>> to tab-line.el will add faces when tab-line.el are loaded.
>
> Could you guys please finalize these issues?  I'd like to install
> these changes on master, for which I'd need a patch that covers both
> the changes in the face storage and the fix for the tab-line face.
>
> Actually, the problem with the tab-line face will probably need to be
> fixed on emacs-27.

I don't recommend using the trick with nconc in emacs-27.  It would be
less risky if Clément will just move tab faces to faces.el in emacs-27.

Or may I suggest to preload tab-line.el in emacs-27?
That will solve the problem as well.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 23 May 2020 08:11:49 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat May 23 04:11:49 2020
Received: from localhost ([127.0.0.1]:33349 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jcPG1-0002ch-89
	for submit <at> debbugs.gnu.org; Sat, 23 May 2020 04:11:49 -0400
Received: from eggs.gnu.org ([209.51.188.92]:55438)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1jcPFy-0002cS-T5
 for 41200 <at> debbugs.gnu.org; Sat, 23 May 2020 04:11:47 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:40267)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jcPFs-0003tL-3t; Sat, 23 May 2020 04:11:40 -0400
Received: from [176.228.60.248] (port=3308 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jcPFr-0001xf-CA; Sat, 23 May 2020 04:11:39 -0400
Date: Sat, 23 May 2020 11:11:46 +0300
Message-Id: <83a71z135p.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Juri Linkov <juri@HIDDEN>
In-Reply-To: <87zha3d29k.fsf@HIDDEN> (message from Juri Linkov on
 Wed, 20 May 2020 00:48:55 +0300)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow
 as more faces are defined
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN>
 <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN>
 <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN>
 <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN>
 <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 <87367z324f.fsf@HIDDEN>
 <3fc34671-54ba-e83d-9514-11e0906c2ac0@HIDDEN>
 <87lflqkznj.fsf@HIDDEN>
 <b9ca866c-4a41-0e33-581e-2991a2d6e97f@HIDDEN>
 <87zha3d29k.fsf@HIDDEN>
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: cpitclaudel@HIDDEN, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Juri Linkov <juri@HIDDEN>
> Cc: Eli Zaretskii <eliz@HIDDEN>,  41200 <at> debbugs.gnu.org
> Date: Wed, 20 May 2020 00:48:55 +0300
> 
> >>> +  :group 'basic-faces)
> >>> +
> >>> +  :group 'basic-faces)
> >>>
> >>> -  :group 'tab-bar-faces)
> >>> -
> >>> -  :group 'tab-line-faces)
> >> 
> >> Could these faces belong to both groups?
> >> 
> >>   :group 'basic-faces
> >>   :group 'tab-bar-faces
> >
> > Yup, but that won't work well if the face is customized before the
> > group is defined, right?  Maybe the trick would be to add the group to
> > the face when tab-bar.el and tab-line.el are loaded?
> 
> Actually since tab-bar.el is pre-loaded this problem exists only for
> tab-line.el.
> 
> Then adding something like
> 
>   (nconc (get 'tab-line-faces 'custom-group) '((tab-line custom-face) ...))
> 
> to tab-line.el will add faces when tab-line.el are loaded.

Could you guys please finalize these issues?  I'd like to install
these changes on master, for which I'd need a patch that covers both
the changes in the face storage and the fix for the tab-line face.

Actually, the problem with the tab-line face will probably need to be
fixed on emacs-27.

Thanks.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 19 May 2020 22:25:16 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 19 18:25:16 2020
Received: from localhost ([127.0.0.1]:51340 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jbAfj-0003qh-Rp
	for submit <at> debbugs.gnu.org; Tue, 19 May 2020 18:25:16 -0400
Received: from relay7-d.mail.gandi.net ([217.70.183.200]:57859)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <juri@HIDDEN>) id 1jbAfh-0003qR-JA
 for 41200 <at> debbugs.gnu.org; Tue, 19 May 2020 18:25:13 -0400
X-Originating-IP: 91.129.97.200
Received: from mail.gandi.net (m91-129-97-200.cust.tele2.ee [91.129.97.200])
 (Authenticated sender: juri@HIDDEN)
 by relay7-d.mail.gandi.net (Postfix) with ESMTPSA id 47F3B20003;
 Tue, 19 May 2020 22:25:05 +0000 (UTC)
From: Juri Linkov <juri@HIDDEN>
To: =?iso-8859-1?Q?Cl=E9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow
 as more faces are defined
Organization: LINKOV.NET
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN>
 <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN>
 <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN>
 <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN>
 <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 <87367z324f.fsf@HIDDEN>
 <3fc34671-54ba-e83d-9514-11e0906c2ac0@HIDDEN>
 <87lflqkznj.fsf@HIDDEN>
 <b9ca866c-4a41-0e33-581e-2991a2d6e97f@HIDDEN>
Date: Wed, 20 May 2020 00:48:55 +0300
In-Reply-To: <b9ca866c-4a41-0e33-581e-2991a2d6e97f@HIDDEN>
 (=?iso-8859-1?Q?=22Cl=E9ment?=
 Pit-Claudel"'s message of "Sun, 17 May 2020 21:19:50 -0400")
Message-ID: <87zha3d29k.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (x86_64-pc-linux-gnu)
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
Cc: Eli Zaretskii <eliz@HIDDEN>, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

>>> +  :group 'basic-faces)
>>> +
>>> +  :group 'basic-faces)
>>>
>>> -  :group 'tab-bar-faces)
>>> -
>>> -  :group 'tab-line-faces)
>> 
>> Could these faces belong to both groups?
>> 
>>   :group 'basic-faces
>>   :group 'tab-bar-faces
>
> Yup, but that won't work well if the face is customized before the
> group is defined, right?  Maybe the trick would be to add the group to
> the face when tab-bar.el and tab-line.el are loaded?

Actually since tab-bar.el is pre-loaded this problem exists only for
tab-line.el.

Then adding something like

  (nconc (get 'tab-line-faces 'custom-group) '((tab-line custom-face) ...))

to tab-line.el will add faces when tab-line.el are loaded.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 18 May 2020 01:20:01 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun May 17 21:20:01 2020
Received: from localhost ([127.0.0.1]:45199 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jaURk-0004Cy-Ow
	for submit <at> debbugs.gnu.org; Sun, 17 May 2020 21:20:01 -0400
Received: from mail-qt1-f170.google.com ([209.85.160.170]:38410)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jaURj-0004Cn-Qg
 for 41200 <at> debbugs.gnu.org; Sun, 17 May 2020 21:20:00 -0400
Received: by mail-qt1-f170.google.com with SMTP id i68so6857104qtb.5
 for <41200 <at> debbugs.gnu.org>; Sun, 17 May 2020 18:19:59 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:cc:references:from:message-id:date:user-agent
 :mime-version:in-reply-to:content-language:content-transfer-encoding;
 bh=QWX30+Rn9CYOJcLK293bPCWfqq+ODSYF5ar3V10NYoo=;
 b=KIfPhhe17zaZ54l/BvRAKpOWcNygPdF0xjXdCW48A3Qx3r7kzt1UmkT+1+kDyibmhC
 qggT2415kvw+dc1JlNbAqmuUhrub0dbZjKHVIyrR0GH5ht44zelhCqFLLcPaBJZZa1N8
 eTfC+RE45YNceWQbsfO8QWv4pMRzJNukB3CiKk5t0MNxwkkPgSPQDuhocRBwzk6zW3vv
 U4NrnzRv09zhqcT8A8eO4vkCR/snnEI+UFQbo8R5zkZBxhQ4pDqpXmFQ+ICLqV8tlv/K
 gMOzMLHQvSe67XK715ZzFLh3OxUxnmmy9syTuEwO+YH+qBtu8UQOVHRn1lB3istL7tvj
 SkAA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:cc:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language
 :content-transfer-encoding;
 bh=QWX30+Rn9CYOJcLK293bPCWfqq+ODSYF5ar3V10NYoo=;
 b=Lnxi7SmA3XjucXwdLfQQZp9CtJvkzk6bbnCerup1NY0aht+vf0KHFblSdKhIrafIXU
 D8RpuPG+1E6mDgSgJN9BDFUArJ+LUPNoNZxhhx4+cQUYzH3X5XYO8MRSRB4MG5DMRD7l
 MRQpqU6tiqJa1bpncxgwCxKSLMC//J5e8IT+U/Z8BGvzCUIaYwzRAqYW4XJwvJvLevVX
 0JA5LDkAlSSjp9CNHFhFzudzQPhtBZGs+T4oHdc8UtFq09jFvmo1MfXAEi4M6jIhNQhC
 XAfoKjpxabti7SR8LUuaZo2Pr7Mol6FS9s/VV1QuO/juz02BwzKeUuAejqjr08FsPGyR
 rbxQ==
X-Gm-Message-State: AOAM531+L6FFoX/hH2mvWdCWAD6rd1QsfDIWpuinn0MJTVE3xbAd3j3W
 GcO3ibZAAjASsRtreN0m6PKZnjlb
X-Google-Smtp-Source: ABdhPJzrvyqAPAh4NLBTla5M+0hWIgUayiTUsf67ftGCZQ9lfnItJ4ibKV9bvEkRODBw4agMOp9/Bw==
X-Received: by 2002:aed:2d23:: with SMTP id h32mr13829086qtd.389.1589764794188; 
 Sun, 17 May 2020 18:19:54 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:bda5:ac5c:1de0:b677?
 ([2601:184:4180:66e7:bda5:ac5c:1de0:b677])
 by smtp.googlemail.com with ESMTPSA id i20sm4688595qtv.90.2020.05.17.18.19.52
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Sun, 17 May 2020 18:19:53 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: Juri Linkov <juri@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN> <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN> <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN> <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 <87367z324f.fsf@HIDDEN>
 <3fc34671-54ba-e83d-9514-11e0906c2ac0@HIDDEN>
 <87lflqkznj.fsf@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <b9ca866c-4a41-0e33-581e-2991a2d6e97f@HIDDEN>
Date: Sun, 17 May 2020 21:19:50 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <87lflqkznj.fsf@HIDDEN>
Content-Type: text/plain; charset=utf-8
Content-Language: en-GB
Content-Transfer-Encoding: 7bit
X-Spam-Score: -0.0 (/)
X-Debbugs-Envelope-To: 41200
Cc: Eli Zaretskii <eliz@HIDDEN>, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

On 17/05/2020 17.59, Juri Linkov wrote:
>> +  :group 'basic-faces)
>> +
>> +  :group 'basic-faces)
>>
>> -  :group 'tab-bar-faces)
>> -
>> -  :group 'tab-line-faces)
> 
> Could these faces belong to both groups?
> 
>   :group 'basic-faces
>   :group 'tab-bar-faces

Yup, but that won't work well if the face is customized before the group is defined, right? Maybe the trick would be to add the group to the face when tab-bar.el and tab-bar-line.el are loaded?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 17 May 2020 22:14:41 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun May 17 18:14:41 2020
Received: from localhost ([127.0.0.1]:44987 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jaRYP-0005vn-7f
	for submit <at> debbugs.gnu.org; Sun, 17 May 2020 18:14:41 -0400
Received: from relay5-d.mail.gandi.net ([217.70.183.197]:33051)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <juri@HIDDEN>) id 1jaRYO-0005va-00
 for 41200 <at> debbugs.gnu.org; Sun, 17 May 2020 18:14:40 -0400
X-Originating-IP: 91.129.104.245
Received: from mail.gandi.net (m91-129-104-245.cust.tele2.ee [91.129.104.245])
 (Authenticated sender: juri@HIDDEN)
 by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id 8B2C91C0003;
 Sun, 17 May 2020 22:14:23 +0000 (UTC)
From: Juri Linkov <juri@HIDDEN>
To: =?iso-8859-1?Q?Cl=E9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow
 as more faces are defined
Organization: LINKOV.NET
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN>
 <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN>
 <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN>
 <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN>
 <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 <87367z324f.fsf@HIDDEN>
 <3fc34671-54ba-e83d-9514-11e0906c2ac0@HIDDEN>
Date: Mon, 18 May 2020 00:59:20 +0300
In-Reply-To: <3fc34671-54ba-e83d-9514-11e0906c2ac0@HIDDEN>
 (=?iso-8859-1?Q?=22Cl=E9ment?=
 Pit-Claudel"'s message of "Sat, 16 May 2020 19:43:07 -0400")
Message-ID: <87lflqkznj.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (x86_64-pc-linux-gnu)
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
Cc: Eli Zaretskii <eliz@HIDDEN>, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

> +  :group 'basic-faces)
> +
> +  :group 'basic-faces)
>
> -  :group 'tab-bar-faces)
> -
> -  :group 'tab-line-faces)

Could these faces belong to both groups?

  :group 'basic-faces
  :group 'tab-bar-faces




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 16 May 2020 23:43:17 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat May 16 19:43:17 2020
Received: from localhost ([127.0.0.1]:41924 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ja6Sa-0001UW-Ui
	for submit <at> debbugs.gnu.org; Sat, 16 May 2020 19:43:17 -0400
Received: from mail-qt1-f179.google.com ([209.85.160.179]:46174)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1ja6SZ-0001UH-MV
 for 41200 <at> debbugs.gnu.org; Sat, 16 May 2020 19:43:16 -0400
Received: by mail-qt1-f179.google.com with SMTP id p12so5199745qtn.13
 for <41200 <at> debbugs.gnu.org>; Sat, 16 May 2020 16:43:15 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:cc:references:from:message-id:date:user-agent
 :mime-version:in-reply-to:content-language;
 bh=spHTQQBqOaeqOPrEyi4PtSaUaOq+GwH1XSEyzmQ9l/A=;
 b=IorSVA/lQah/0puPVmNLzBnwOPq4/s1CXzDDoYmOP+TZ1FMSSQOfBgVVFqgYrVKS8W
 Oa7I2ZTEbeH9xNBQ+rs4Iqo3VU/1S5+h424Nvzqqjy4IzBFv2SfxWeXNuUxMRDsLLTs0
 fATOby1C73XctFgmN8UAwYLv7Ax39pWZm8+ovc3B1xjKqrCFi0X4oDE8ZlgS/CduKKnc
 /gOisKYy/G7576LHXr361AJ6akHhOeCUAXq6NTSC8+JCeO9xgSVC876/j/WtHhJiJIDR
 MvfzsuFdvMVVCeZUfsNMUEdj/ei0SMIyJU5M7pO1gzH2z7XDeLqxjSo8TM7dJkKEsWd6
 cYnw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:cc:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language;
 bh=spHTQQBqOaeqOPrEyi4PtSaUaOq+GwH1XSEyzmQ9l/A=;
 b=LMuti+5j/vYgc9G0Sx4I322xECp1KS4nVpc09RjO4p4Btmjd+PgsqUrRjQRFJQkElz
 hmk6KUIzY5IRYK7n2wYUd9SDLVazp0GvOzE9ZeEy20x+Zf60I71spDle28lNs9iP4TUs
 UXsv/qJ2eMGp/1o/Py1H+zy8ODzuZ8uLC+eubg8JLuVCTHqKTYIpLqBLVV4VH6sH3wEq
 NfaSJQWzPgDv6PWI8yCwvAAJtMl9DBcP1O3oGqhRMGWolhIMojr6KEQC8j63xhUyOSnG
 YUwpjt2vPA5f4zIOM8Z8e4kxUM0B406Nw/scFn3TVwblCV/GjzYAaD0pDAwLo5MNkzd3
 hq+g==
X-Gm-Message-State: AOAM530eeVHXyGrRzUzSMLr5VAtJdoKExvx40oNrfx0yV9nuJbOw8WNE
 /sIhjq8jkNjPawdVUenjELH+ozHf
X-Google-Smtp-Source: ABdhPJxoSGi9sGKqPqIYcb5zLCsjt1prCP2vWsWpXM9ZTo3fCbUWeLTCIKFitEfIlV1L4mBgbT3Q1w==
X-Received: by 2002:ac8:3292:: with SMTP id z18mr9529370qta.32.1589672589782; 
 Sat, 16 May 2020 16:43:09 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id n20sm5420300qtk.89.2020.05.16.16.43.08
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Sat, 16 May 2020 16:43:09 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: Juri Linkov <juri@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN> <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN> <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN> <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 <87367z324f.fsf@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <3fc34671-54ba-e83d-9514-11e0906c2ac0@HIDDEN>
Date: Sat, 16 May 2020 19:43:07 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <87367z324f.fsf@HIDDEN>
Content-Type: multipart/mixed; boundary="------------3E979902F5EF3AC0752E533E"
Content-Language: en-GB
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
Cc: Eli Zaretskii <eliz@HIDDEN>, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

This is a multi-part message in MIME format.
--------------3E979902F5EF3AC0752E533E
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit

On 16/05/2020 19.03, Juri Linkov wrote:
>>>>> I think the problem is that tab-line is declared a basic face, but its
>>>>> defface form is not in faces.el.
>>>>
>>>> Ah, good catch.  Current there's a defface for tab-bar in lisp/tab-bar, and since that's preloaded it works, but the defface for tab-line is in lisp/tab-line.el and so isn't preloaded.
>>>> Should I move both to faces.el?
>>>>
>>> Yes, I think so.
>>
>> Thanks.  I will ask Juri to confirm before moving them, because I realize now that they have a custom group.
>> Juri (CC'd; hi Juri!), was there a reason to make tab-bar and tab-line basic faces?  I see they are both in their own files and groups, instead of being in faces.el.
> 
> Actually, no reason other than consistency of faces belonging to the
> same file where they are used.  But if it will fix the technical problem,
> please move them to faces.el, especially given the fact that their
> counterpart tool-bar face is already defined in faces.el.

Thanks a lot.  The attached patch does that.

--------------3E979902F5EF3AC0752E533E
Content-Type: text/x-patch; charset=UTF-8;
 name="0001-Move-tab-bar-and-tab-line-to-faces.el-part-of-bug-41.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0001-Move-tab-bar-and-tab-line-to-faces.el-part-of-bug-41.pa";
 filename*1="tch"

From 4d3349d83791a57cdc01374c82792fff6e1b8a94 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Pit-Claudel?= <clement.pitclaudel@HIDDEN>
Date: Sat, 16 May 2020 19:36:43 -0400
Subject: [PATCH] Move tab-bar and tab-line to faces.el (part of bug#41200)

These are basic faces, so they need to be defined in
faces.el (otherwise (get 'tab-line 'face) returns 0).

* lisp/tab-bar.el (tab-bar):
* lisp/tab-line.el (tab-line): Move from here...
* lisp/faces.el (menu): ...to here.
---
 lisp/faces.el    | 27 +++++++++++++++++++++++++++
 lisp/tab-bar.el  | 13 -------------
 lisp/tab-line.el | 14 --------------
 3 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/lisp/faces.el b/lisp/faces.el
index bb51797a38..b495fb6e87 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -2755,6 +2755,33 @@ tool-bar
   :version "21.1"
   :group 'basic-faces)
 
+(defface tab-line
+  '((((class color) (min-colors 88))
+     :inherit variable-pitch
+     :height 0.9
+     :background "grey85"
+     :foreground "black")
+    (((class mono))
+     :background "grey")
+    (t
+     :inverse-video t))
+  "Tab line face."
+  :version "27.1"
+  :group 'basic-faces)
+
+(defface tab-bar
+  '((((class color) (min-colors 88))
+     :inherit variable-pitch
+     :background "grey85"
+     :foreground "black")
+    (((class mono))
+     :background "grey")
+    (t
+     :inverse-video t))
+  "Tab bar face."
+  :version "27.1"
+  :group 'basic-faces)
+
 (defface menu
   '((((type tty))
      :inverse-video t)
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index ce6d8c33dd..689481b28b 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -50,19 +50,6 @@ tab-bar-faces
   :group 'faces
   :version "27.1")
 
-(defface tab-bar
-  '((((class color) (min-colors 88))
-     :inherit variable-pitch
-     :background "grey85"
-     :foreground "black")
-    (((class mono))
-     :background "grey")
-    (t
-     :inverse-video t))
-  "Tab bar face."
-  :version "27.1"
-  :group 'tab-bar-faces)
-
 (defface tab-bar-tab
   '((default
       :inherit tab-bar)
diff --git a/lisp/tab-line.el b/lisp/tab-line.el
index 7a2bdc0b72..50ec40bacf 100644
--- a/lisp/tab-line.el
+++ b/lisp/tab-line.el
@@ -41,20 +41,6 @@ tab-line-faces
   :group 'faces
   :version "27.1")
 
-(defface tab-line
-  '((((class color) (min-colors 88))
-     :inherit variable-pitch
-     :height 0.9
-     :background "grey85"
-     :foreground "black")
-    (((class mono))
-     :background "grey")
-    (t
-     :inverse-video t))
-  "Tab line face."
-  :version "27.1"
-  :group 'tab-line-faces)
-
 (defface tab-line-tab
   '((default
       :inherit tab-line)
-- 
2.17.1


--------------3E979902F5EF3AC0752E533E--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 16 May 2020 23:24:54 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat May 16 19:24:54 2020
Received: from localhost ([127.0.0.1]:41912 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ja6Ao-00011T-4q
	for submit <at> debbugs.gnu.org; Sat, 16 May 2020 19:24:54 -0400
Received: from relay1-d.mail.gandi.net ([217.70.183.193]:7463)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <juri@HIDDEN>) id 1ja6Am-00010r-3j
 for 41200 <at> debbugs.gnu.org; Sat, 16 May 2020 19:24:52 -0400
X-Originating-IP: 91.129.104.245
Received: from mail.gandi.net (m91-129-104-245.cust.tele2.ee [91.129.104.245])
 (Authenticated sender: juri@HIDDEN)
 by relay1-d.mail.gandi.net (Postfix) with ESMTPSA id 6B1A2240002;
 Sat, 16 May 2020 23:24:45 +0000 (UTC)
From: Juri Linkov <juri@HIDDEN>
To: =?iso-8859-1?Q?Cl=E9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow
 as more faces are defined
Organization: LINKOV.NET
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN>
 <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN>
 <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN>
 <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN>
 <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
Date: Sun, 17 May 2020 02:03:04 +0300
In-Reply-To: <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 (=?iso-8859-1?Q?=22Cl=E9ment?=
 Pit-Claudel"'s message of "Fri, 15 May 2020 14:50:17 -0400")
Message-ID: <87367z324f.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (x86_64-pc-linux-gnu)
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
Cc: Eli Zaretskii <eliz@HIDDEN>, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

>>>> I think the problem is that tab-line is declared a basic face, but its
>>>> defface form is not in faces.el.
>>>
>>> Ah, good catch.  Current there's a defface for tab-bar in lisp/tab-bar, and since that's preloaded it works, but the defface for tab-line is in lisp/tab-line.el and so isn't preloaded.
>>> Should I move both to faces.el?
>>>
>> Yes, I think so.
>
> Thanks.  I will ask Juri to confirm before moving them, because I realize now that they have a custom group.
> Juri (CC'd; hi Juri!), was there a reason to make tab-bar and tab-line basic faces?  I see they are both in their own files and groups, instead of being in faces.el.

Actually, no reason other than consistency of faces belonging to the
same file where they are used.  But if it will fix the technical problem,
please move them to faces.el, especially given the fact that their
counterpart tool-bar face is already defined in faces.el.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 16 May 2020 08:45:37 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat May 16 04:45:37 2020
Received: from localhost ([127.0.0.1]:39755 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZsRt-0003lq-B5
	for submit <at> debbugs.gnu.org; Sat, 16 May 2020 04:45:37 -0400
Received: from mout.gmx.net ([212.227.15.19]:51021)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rudalics@HIDDEN>) id 1jZsRr-0003lf-HC
 for 41200 <at> debbugs.gnu.org; Sat, 16 May 2020 04:45:35 -0400
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net;
 s=badeba3b8450; t=1589618726;
 bh=6UKAaiS6vLRzu+8NtajyshNJCAHTaxgzhdKEZ3VYwlA=;
 h=X-UI-Sender-Class:Subject:To:Cc:References:From:Date:In-Reply-To;
 b=VadBjhilUo0JHRE5hvRLSrO8Ke9B5Rq263x4Kou6zC8Z3JeAJO1gydo59RwX8SXtv
 z5vRjKi8/rCoriN/xPglI32+9XtGTfKXKzFUZ7rLgu9DJfomd3OlVCex8AJ2IrIpFo
 QGmZNTSEzlE6yuwGRQiAjgKlcbC62crQYZXMKBwo=
X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c
Received: from [192.168.1.101] ([212.95.5.16]) by mail.gmx.com (mrgmx005
 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MPog5-1jmLC91bRz-00Ms56; Sat, 16
 May 2020 10:45:26 +0200
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: Stefan Monnier <monnier@HIDDEN>,
 =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
References: <jwvlfltl3qa.fsf-monnier+emacs@HIDDEN>
 <9c487146-1fad-0301-fe1a-8d98d560c6ea@HIDDEN>
 <jwvlflshpah.fsf-monnier+emacs@HIDDEN>
From: martin rudalics <rudalics@HIDDEN>
Message-ID: <13eef332-5c47-bc19-d62f-236e54740268@HIDDEN>
Date: Sat, 16 May 2020 10:45:25 +0200
MIME-Version: 1.0
In-Reply-To: <jwvlflshpah.fsf-monnier+emacs@HIDDEN>
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Language: en-US
Content-Transfer-Encoding: 7bit
X-Provags-ID: V03:K1:AZO9oMLyP5C3pq8XeVCub00MNk3MKkd2vQ/29woBn8fwDubzzoW
 gf1Atkl8AfwdhgzJbH7djKsL8M8/F2Dr63JlI9xV5U4Zme17ibGUI9MOBby+FPw32vXM14W
 XAIgr7u3ww6FbKxllBoqjx+l+dyyGLtLuvCpbNJ2METfy5WPbIMzPvDeDw88zhP99qTgQtK
 Pkearpk2P5itO5arunBSQ==
X-Spam-Flag: NO
X-UI-Out-Filterresults: notjunk:1;V03:K0:lxGF36Y5Mx0=:DTaTZ27F4uOtoPQKOVRKe5
 GC/CculUP+tdQp9qUNGkjN4AbQSMrvFQiKHeMHR9dZ6T3kNdJBP/8rwHv8uRXyWY/j0QoM5Bc
 ZeFpND9cNriyFMnnSAsX/NaMmUK2lw2jlpeA9hJsyqyGRm+eflp5vdjit6tv7DOWHHVPo6e/E
 gFkUGoazCm/1+dPrAvdkXSRZumbsSR4Fw48RZcCMIXp9KoclHTIxIKMgvCXDmQJtx4RYgaVjD
 uurCmD5GBZa5GiqpL2tZumcVUPm7FtpR0Llx5oY7fnyG8P0IPxoAOgfG8b6tpI9yizVQe3pMG
 LNV1nx6DXOqIXsY7ypLZI1PIHS1Z5yWM3sE0Nwi7I/38ViaBlS4m7+kbsDVjCSD2OAdDpnl23
 Mp97mJUrZjl7+w2SzerM13kC5D4n646mxgC5g14IBLvV4OpDvIkPOAeijw7VBWxMKrMu5xB5+
 Ta0WwSqyWWYpp0VQTwN2eQLmy0Qyx2UsUdYXxso+DmEANeW8C6lguaVwLegSZ967X6Qpwiuwd
 qrXXve8oem+jiodj0kep3svQl6cwP6cL9SydxoOd6ztTnIakyw0zEsy0EbW4rag+YC9bflDBR
 5YZkO5DYIDLqGyh5lNdttIqFBPKDisEk1vDwnbUg4m1qDQbf8f0AqV2I6M0ve7F8vJo0qLu7V
 kgclu/shl/MAzMj4Ne2ofLDEP5M4/0vO+yaH0ucUi1wAjDCjDCA5WFGMJV1lBTiuqOQ6KrMpe
 VutOVQ6hGCNAu9YAU5fuYAMRtJ4FwlNwKciu0oI8J+Qyz6irvBzj4P74FPIsjjCLEJIXZd3gH
 QMiR2qmdSLbRdXwLBLbi0vlUoeZ0NGFb96mSjGd0WJdWxfnfvwWG9Je83UKK64hcGKt4XdUH3
 PtRFgvQLIj4lrj0ax0uNh1Eke4Sn4bU4FW+J8iM2GVj+7+y8utJpWqMgMoJnoOjoMHjxQbO9B
 pGOgJnkpzYsquKmtnXvgYLy4XYheU9bOD66/vu1v2uGU9mzeesvQ505DBtYn+RSOyjwdr1vZd
 8cXlQgEZ4j/E3Z4L3qCLrRr25//zkfYbCOkUBmjiJXgmu3cfPfShOb1/QhlxZJxMRpkUtnUw9
 mmBf5B5pC3czf3vkXUfObo8Tk6e1+eM7Y6S9+GdV+4djhO1Kw3Rwek4ihaH27N+y4dbKSj9Hn
 6SIaeEcemWzjsiNDXusZ5Qy0ye/s+KyvTSLTS1iX9Q3qRHLqo13NdnceVPUP7Zd/axwHGpxlI
 ICIB5uorDWwZxbiwr
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

 > I was thinking also of the case where no face specs have changed and the
 > frame is "normal" (same frame properties as others, basically) so we
 > could re-use the faces from another frame.

That's my hope as well.  For years now I'm making frames temporarily
invisible in order to avoid setting up faces for a new frame.

 > [ After all, my Emacs sessions typically have dozens of frames, and only
 >    one of them (a minibuffer-only frame) has faces setup differently
 >    because it's configured to use a slightly larger font.  ]

In my setup the minibuffer-only frame doesn't even do that.

martin




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 21:23:27 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 17:23:27 2020
Received: from localhost ([127.0.0.1]:38968 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZhnj-0001ba-0e
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 17:23:27 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:11999)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <monnier@HIDDEN>) id 1jZhnh-0001bO-Q1
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 17:23:26 -0400
Received: from pmg3.iro.umontreal.ca (localhost [127.0.0.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id 36BFB440293;
 Fri, 15 May 2020 17:23:20 -0400 (EDT)
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id A805A440280;
 Fri, 15 May 2020 17:23:18 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1589577798;
 bh=ttpvBgq7+c46NHvLuc4VR2oMwVjgC+Iy63lh6sOzryc=;
 h=From:To:Cc:Subject:References:Date:In-Reply-To:From;
 b=nBmAfG9LQJnsIVkd1vEXF8mdspAvDe35ASYW5rsNII1Cd2EOJDhS1ql9moVwvvvVp
 2ALunoakUnJsNXgFg5VTGWPeYFjJIw6W7rcnD3eCnADnCOMO9K0QZ4kIHaNl/Pm7EL
 /9B6pLLt6p2F+8Vf/o0sl/NadiCFUFa+AzSRy4joAhXB6UoC3xeX7YKCwcq1dp1VN3
 7Fo1nxZ36znLvAcYWAGztEBv3vtEZzsVox7XzlUExEZanNNHyA0GCbl9yxY4lsxaSf
 OBheK5iRBXOnXqwIL58q8hFSV4pL2HXSX/qDsTsUakrK7varjj0qTYmOfHtnwJQps6
 kecU/t1Toh/vQ==
Received: from alfajor (unknown [216.154.3.202])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id 6EA9612024A;
 Fri, 15 May 2020 17:23:18 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: =?windows-1252?Q?Cl=E9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow
 as more faces are defined
Message-ID: <jwvlflshpah.fsf-monnier+emacs@HIDDEN>
References: <jwvlfltl3qa.fsf-monnier+emacs@HIDDEN>
 <9c487146-1fad-0301-fe1a-8d98d560c6ea@HIDDEN>
Date: Fri, 15 May 2020 17:23:17 -0400
In-Reply-To: <9c487146-1fad-0301-fe1a-8d98d560c6ea@HIDDEN>
 (=?windows-1252?Q?=22Cl=E9ment?=
 Pit-Claudel"'s message of "Fri, 15 May 2020 15:10:46 -0400")
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL -0.088 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: Eli Zaretskii <eliz@HIDDEN>, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Interesting.  I also wonder whether we could fast-track the case where the
> face spec is a vector full of 'undefined, since that seems to be the
> common case.

I was thinking also of the case where no face specs have changed and the
frame is "normal" (same frame properties as others, basically) so we
could re-use the faces from another frame.

[ After all, my Emacs sessions typically have dozens of frames, and only
  one of them (a minibuffer-only frame) has faces setup differently
  because it's configured to use a slightly larger font.  ]


        Stefan





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 19:52:37 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 15:52:37 2020
Received: from localhost ([127.0.0.1]:38831 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZgNo-0007rY-Kb
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 15:52:37 -0400
Received: from mail-qt1-f181.google.com ([209.85.160.181]:46991)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jZgNm-0007rM-Qk
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 15:52:35 -0400
Received: by mail-qt1-f181.google.com with SMTP id p12so3004947qtn.13
 for <41200 <at> debbugs.gnu.org>; Fri, 15 May 2020 12:52:34 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:cc:references:from:message-id:date:user-agent
 :mime-version:in-reply-to:content-language;
 bh=7saN1umCHv+8twkK2Auh4lh05Tm4mURRlktsEUqOgDc=;
 b=SQW1CwsWLSIACk/VWx5Z+6Fin03yzO4Rqaltw/BZONKmH1FsBSDj1eqALQiz3V0il2
 HVcRCkxQxLmWQD4p4hhG2zt4OOdXdpRtcGBezTXZdIydpb/FSo3tD6Q3vsD/dVaN9gPO
 Y3dAz96/XkT6cQ6oeTbehOiE5KeONNncDlzS40CCcSRERRV9Qse68TaHfc9jR7eSUyj1
 zqxSLdhil7YYw/z8oK/5SU4xRJoId0CDtLkHMVYYcnDCrGy204D/uuUUckcra3HWuKaO
 FMARLyLR87xYq4+MXtu37/MlUfbHf8nOvQAei6Dej7Yc0AxTDHTyF/EjSbEPNU3HVV4i
 nbpg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:cc:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language;
 bh=7saN1umCHv+8twkK2Auh4lh05Tm4mURRlktsEUqOgDc=;
 b=fMQXTluob8MeBZF35rCXxHowMPMuAKwqxBclEB1MQ6/eNsuN98ZqrYHvW3HfNASdPa
 1jEwQVs5rdxMCQ5eJDr9ULkwvXSMuGVe3R/OVnoDt8q89xIIOdADDG3g61LOp2MSYA8M
 1joIGkWKvdh6H4eRO6V8DEK88ltoZC1qarkc/Ez5fm9T3zzrZ4VSgkq/f/ps3CnfYXCo
 vmnuG3iTaXDfsUY4dDMYxCm4UsTJqCRYUAyG2kVPJe820UKtGufsT79xdkTtqJcELTTr
 /j7uzQnuDiR9ZKFCQtd4Q27Ov9GwuxSbzBnmugbcbk3iz/eYmrqaRcgDagfVXgozWCVM
 zNDA==
X-Gm-Message-State: AOAM530+NG8XukSXl5S6jQuUv/x40vHHI3pNNhXKBMMyclESDHljmvOl
 6AEEFso7Z5IegNM8aaM/bhY=
X-Google-Smtp-Source: ABdhPJwGiaS/ewviudj+Bj6S1bJoJonEPQem0wo5gggmVtgWrtGkb11bI7JCI9bWDv8Nm5kjukTnOQ==
X-Received: by 2002:aed:3c0d:: with SMTP id t13mr5353648qte.137.1589572349054; 
 Fri, 15 May 2020 12:52:29 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id
 l184sm2259101qke.115.2020.05.15.12.52.27
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Fri, 15 May 2020 12:52:28 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: Eli Zaretskii <eliz@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN> <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN> <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN> <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 <83blmpuige.fsf@HIDDEN> <6a828c8b-2856-7f71-811b-086600d8417e@HIDDEN>
 <838shtugya.fsf@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <3a2c9175-474b-38e7-b22c-0ead63134761@HIDDEN>
Date: Fri, 15 May 2020 15:52:26 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <838shtugya.fsf@HIDDEN>
Content-Type: multipart/mixed; boundary="------------027433C9F25EFCB999EF8297"
Content-Language: en-GB
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org, juri@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

This is a multi-part message in MIME format.
--------------027433C9F25EFCB999EF8297
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

On 15/05/2020 15.38, Eli Zaretskii wrote:
>> Cc: 41200 <at> debbugs.gnu.org, juri@HIDDEN
>> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
>> Date: Fri, 15 May 2020 15:23:00 -0400
>>
>>>>> What is the default size of a hash-table?
>>>>
>>>> 65 entries, I think.
>>>
>>> The number of basic faces is just 18.  Is 65 a good initial size for
>>> that?
>>
>> I think that map stores more than just the basic faces: in fact, $ emacs -Q --batch --eval '(print (length (frame-face-alist)))' prints 100, so maybe I should even make the map larger by default?
> 
> We are miscommunicating.  I was talking about the size before loadup,
> i.e. in temacs when it starts up.

Ah, yes.  I think I mas mixing up the face_hash_table of each frame and Vface_new_frame_defaults.  Attached is a patch that makes Vface_new_frame_defaults 33-entries large.  Should I also change the default size for face_hash_table in struct frame?

> Later, when we load preloaded packages, the size should grow, but the
> hash-table takes care of that by itself, doesn't it?
Yes, definitely.


--------------027433C9F25EFCB999EF8297
Content-Type: text/x-patch; charset=UTF-8;
 name="0001-Store-frame-faces-in-hash-tables-instead-of-alists.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0001-Store-frame-faces-in-hash-tables-instead-of-alists.patc";
 filename*1="h"

From 0d28f687046c721c4734aa57d8ae1ba5f23dd5b3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Pit-Claudel?= <clement.pitclaudel@HIDDEN>
Date: Tue, 12 May 2020 21:48:32 -0400
Subject: [PATCH] Store frame faces in hash tables instead of alists

* src/frame.h (struct frame): Add face_hash_table, remove face_alist.
(fset_face_hash_table): New function.
(fset_face_alist): Remove.
* src/frame.c (make_frame): Initialize f->face_hash_table.
(Fmake_terminal_frame): Update to work with hash tables instead of
alists.
* src/xfaces.c (lface_from_face_name_no_resolve):
(Finternal_make_lisp_face):
(update_face_from_frame_parameter): Update to work with hash tables
instead of alists.
(Fframe_face_hash_table): New function.
(Fframe_face_alist): Move to faces.el as frame-face-alist.
(syms_of_xfaces): Add frame_face_hash_table.

* lisp/emacs-lisp/edebug.el (edebug-eval-defun):
* lisp/progmodes/elisp-mode.el (elisp--eval-defun-1):
* lisp/frame.el (frame-set-background-mode): Update to work with hash
tables instead of alists.
* lisp/faces.el (face-new-frame-defaults): Mark obsolete.
(face-list): Update to use face--new-frame-defaults.
(frame-face-alist): Moved here from src/xfaces.c.
---
 lisp/custom.el               |  2 +-
 lisp/emacs-lisp/edebug.el    |  3 +-
 lisp/faces.el                | 23 ++++++++--
 lisp/frame.el                |  2 +-
 lisp/progmodes/elisp-mode.el |  3 +-
 src/frame.c                  | 20 ++++++---
 src/frame.h                  |  8 ++--
 src/xfaces.c                 | 83 +++++++++++++++++++-----------------
 8 files changed, 84 insertions(+), 60 deletions(-)

diff --git a/lisp/custom.el b/lisp/custom.el
index 885c486c5e..3ac8bac40f 100644
--- a/lisp/custom.el
+++ b/lisp/custom.el
@@ -898,7 +898,7 @@ custom-push-theme
 	  ;; the value to a fake theme, `changed'.  If the theme is
 	  ;; later disabled, we use this to bring back the old value.
 	  ;;
-	  ;; For faces, we just use `face-new-frame-defaults' to
+	  ;; For faces, we just use `face--new-frame-defaults' to
 	  ;; recompute when the theme is disabled.
 	  (when (and (eq prop 'theme-value)
 		     (boundp symbol))
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index 78461185d3..76a75c04df 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -488,8 +488,7 @@ edebug-eval-defun
 	   (set-default (nth 1 form) (eval (nth 2 form) lexical-binding)))
           ((eq (car form) 'defface)
            ;; Reset the face.
-           (setq face-new-frame-defaults
-                 (assq-delete-all (nth 1 form) face-new-frame-defaults))
+           (remhash (nth 1 form) face--new-frame-defaults)
            (put (nth 1 form) 'face-defface-spec nil)
            (put (nth 1 form) 'face-documentation (nth 3 form))
 	   ;; See comments in `eval-defun-1' for purpose of code below
diff --git a/lisp/faces.el b/lisp/faces.el
index e707f6f4b6..bb51797a38 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -176,10 +176,27 @@ face-font-registry-alternatives
 ;;; Creation, copying.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(make-obsolete-variable
+ 'face-new-frame-defaults
+ "use `face--new-frame-defaults' or `face-alist' instead."
+ "28.1")
+
+(defun frame-face-alist (&optional frame)
+  "Return an alist of frame-local faces defined on FRAME.
+This alist is a copy of the contents of `frame--face-hash-table'.
+For internal use only."
+  (declare (obsolete frame--face-hash-table "28.1"))
+  (let ((faces))
+    (maphash (lambda (face spec) (push `(,(car spec) ,face . ,(cdr spec)) faces))
+             (frame--face-hash-table frame))
+    (mapcar #'cdr (sort faces (lambda (f1 f2) (< (car f1) (car f2)))))))
 
 (defun face-list ()
   "Return a list of all defined faces."
-  (mapcar #'car face-new-frame-defaults))
+  (let ((faces))
+    (maphash (lambda (face spec) (push `(,(car spec) . ,face) faces))
+             face--new-frame-defaults)
+    (mapcar #'cdr (sort faces (lambda (f1 f2) (< (car f1) (car f2)))))))
 
 (defun make-face (face)
   "Define a new face with name FACE, a symbol.
@@ -2097,7 +2114,7 @@ x-create-frame-with-faces
 (defun face-set-after-frame-default (frame &optional parameters)
   "Initialize the frame-local faces of FRAME.
 Calculate the face definitions using the face specs, custom theme
-settings, X resources, and `face-new-frame-defaults'.
+settings, X resources, and `face--new-frame-defaults'.
 Finally, apply any relevant face attributes found amongst the
 frame parameters in PARAMETERS."
   ;; The `reverse' is so that `default' goes first.
@@ -2106,7 +2123,7 @@ face-set-after-frame-default
 	(progn
 	  ;; Initialize faces from face spec and custom theme.
 	  (face-spec-recalc face frame)
-	  ;; Apply attributes specified by face-new-frame-defaults
+	  ;; Apply attributes specified by face--new-frame-defaults
 	  (internal-merge-in-global-face face frame))
       ;; Don't let invalid specs prevent frame creation.
       (error nil)))
diff --git a/lisp/frame.el b/lisp/frame.el
index 6c2f774709..66b5c6aa8d 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -1227,7 +1227,7 @@ frame-set-background-mode
                          ;; during startup with -rv on the command
                          ;; line for the initial frame, because frames
                          ;; are not recorded in the pdump file.
-                         (assq face (frame-face-alist))
+                         (gethash face (frame--face-hash-table))
                          (face-spec-match-p face
                                             (face-user-default-spec face)
                                             ;; FIXME: why selected-frame and
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index b737134f90..75054b8818 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -1304,8 +1304,7 @@ elisp--eval-defun-1
 	((eq (car form) 'custom-declare-face)
 	 ;; Reset the face.
 	 (let ((face-symbol (eval (nth 1 form) lexical-binding)))
-	   (setq face-new-frame-defaults
-		 (assq-delete-all face-symbol face-new-frame-defaults))
+	   (remhash face--new-frame-defaults face-symbol)
 	   (put face-symbol 'face-defface-spec nil)
 	   (put face-symbol 'face-override-spec nil))
 	 form)
diff --git a/src/frame.c b/src/frame.c
index c871e4fd99..0843d53559 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -946,6 +946,10 @@ make_frame (bool mini_p)
   rw->total_lines = mini_p ? 9 : 10;
   rw->pixel_height = rw->total_lines * FRAME_LINE_HEIGHT (f);
 
+  fset_face_hash_table
+    (f, make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
+                         DEFAULT_REHASH_THRESHOLD, Qnil, false));
+
   if (mini_p)
     {
       mw->top_line = rw->total_lines;
@@ -1254,7 +1258,7 @@ DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
 {
   struct frame *f;
   struct terminal *t = NULL;
-  Lisp_Object frame, tem;
+  Lisp_Object frame;
   struct frame *sf = SELECTED_FRAME ();
 
 #ifdef MSDOS
@@ -1336,14 +1340,16 @@ DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
   store_in_alist (&parms, Qminibuffer, Qt);
   Fmodify_frame_parameters (frame, parms);
 
-  /* Make the frame face alist be frame-specific, so that each
+  /* Make the frame face hash be frame-specific, so that each
      frame could change its face definitions independently.  */
-  fset_face_alist (f, Fcopy_alist (sf->face_alist));
-  /* Simple Fcopy_alist isn't enough, because we need the contents of
-     the vectors which are the CDRs of associations in face_alist to
+  fset_face_hash_table (f, Fcopy_hash_table (sf->face_hash_table));
+  /* Simple copy_hash_table isn't enough, because we need the contents of
+     the vectors which are the values in face_hash_table to
      be copied as well.  */
-  for (tem = f->face_alist; CONSP (tem); tem = XCDR (tem))
-    XSETCDR (XCAR (tem), Fcopy_sequence (XCDR (XCAR (tem))));
+  ptrdiff_t idx = 0;
+  struct Lisp_Hash_Table *table = XHASH_TABLE (f->face_hash_table);
+  for (idx = 0; idx < table->count; ++idx)
+    set_hash_value_slot (table, idx, Fcopy_sequence (HASH_VALUE (table, idx)));
 
   f->can_set_window_size = true;
   f->after_make_frame = true;
diff --git a/src/frame.h b/src/frame.h
index 476bac67fa..9761253085 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -158,8 +158,8 @@ #define EMACS_FRAME_H
      There are four additional elements of nil at the end, to terminate.  */
   Lisp_Object menu_bar_items;
 
-  /* Alist of elements (FACE-NAME . FACE-VECTOR-DATA).  */
-  Lisp_Object face_alist;
+  /* Hash table of FACE-NAME keys and FACE-VECTOR-DATA values.  */
+  Lisp_Object face_hash_table;
 
   /* A vector that records the entire structure of this frame's menu bar.
      For the format of the data, see extensive comments in xmenu.c.
@@ -661,9 +661,9 @@ fset_condemned_scroll_bars (struct frame *f, Lisp_Object val)
   f->condemned_scroll_bars = val;
 }
 INLINE void
-fset_face_alist (struct frame *f, Lisp_Object val)
+fset_face_hash_table (struct frame *f, Lisp_Object val)
 {
-  f->face_alist = val;
+  f->face_hash_table = val;
 }
 #if defined (HAVE_WINDOW_SYSTEM)
 INLINE void
diff --git a/src/xfaces.c b/src/xfaces.c
index 7d7aff95c1..3344558a85 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -95,9 +95,10 @@ Copyright (C) 1993-1994, 1998-2020 Free Software Foundation, Inc.
    with the symbol `face' in slot 0, and a slot for each of the face
    attributes mentioned above.
 
-   There is also a global face alist `Vface_new_frame_defaults'.  Face
-   definitions from this list are used to initialize faces of newly
-   created frames.
+   There is also a global face map `Vface_new_frame_defaults',
+   containing conses of (FACE_ID . FACE_DEFINITION).  Face definitions
+   from this table are used to initialize faces of newly created
+   frames.
 
    A face doesn't have to specify all attributes.  Those not specified
    have a value of `unspecified'.  Faces specifying all attributes but
@@ -1843,13 +1844,11 @@ lface_from_face_name_no_resolve (struct frame *f, Lisp_Object face_name,
   Lisp_Object lface;
 
   if (f)
-    lface = assq_no_quit (face_name, f->face_alist);
+    lface = Fgethash (face_name, f->face_hash_table, Qnil);
   else
-    lface = assq_no_quit (face_name, Vface_new_frame_defaults);
+    lface = CDR (Fgethash (face_name, Vface_new_frame_defaults, Qnil));
 
-  if (CONSP (lface))
-    lface = XCDR (lface);
-  else if (signal_p)
+  if (signal_p && NILP (lface))
     signal_error ("Invalid face", face_name);
 
   check_lface (lface);
@@ -2734,11 +2733,6 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
   /* Add a global definition if there is none.  */
   if (NILP (global_lface))
     {
-      global_lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
-      ASET (global_lface, 0, Qface);
-      Vface_new_frame_defaults = Fcons (Fcons (face, global_lface),
-					Vface_new_frame_defaults);
-
       /* Assign the new Lisp face a unique ID.  The mapping from Lisp
 	 face id to Lisp face is given by the vector lface_id_to_name.
 	 The mapping from Lisp face to Lisp face id is given by the
@@ -2748,9 +2742,14 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
 	  xpalloc (lface_id_to_name, &lface_id_to_name_size, 1, MAX_FACE_ID,
 		   sizeof *lface_id_to_name);
 
+      Lisp_Object face_id = make_fixnum (next_lface_id);
       lface_id_to_name[next_lface_id] = face;
-      Fput (face, Qface, make_fixnum (next_lface_id));
+      Fput (face, Qface, face_id);
       ++next_lface_id;
+
+      global_lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
+      ASET (global_lface, 0, Qface);
+      Fputhash (face, Fcons (face_id, global_lface), Vface_new_frame_defaults);
     }
   else if (f == NULL)
     for (i = 1; i < LFACE_VECTOR_SIZE; ++i)
@@ -2763,7 +2762,7 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
 	{
 	  lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
 	  ASET (lface, 0, Qface);
-	  fset_face_alist (f, Fcons (Fcons (face, lface), f->face_alist));
+          Fputhash (face, lface, f->face_hash_table);
 	}
       else
 	for (i = 1; i < LFACE_VECTOR_SIZE; ++i)
@@ -2924,7 +2923,7 @@ DEFUN ("internal-set-lisp-face-attribute", Finternal_set_lisp_face_attribute,
       f = NULL;
       lface = lface_from_face_name (NULL, face, true);
 
-      /* When updating face-new-frame-defaults, we put :ignore-defface
+      /* When updating face--new-frame-defaults, we put :ignore-defface
 	 where the caller wants `unspecified'.  This forces the frame
 	 defaults to ignore the defface value.  Otherwise, the defface
 	 will take effect, which is generally not what is intended.
@@ -3508,7 +3507,7 @@ update_face_from_frame_parameter (struct frame *f, Lisp_Object param,
   /* If there are no faces yet, give up.  This is the case when called
      from Fx_create_frame, and we do the necessary things later in
      face-set-after-frame-defaults.  */
-  if (NILP (f->face_alist))
+  if (XFIXNAT (Fhash_table_count (f->face_hash_table)) == 0)
     return;
 
   if (EQ (param, Qforeground_color))
@@ -4174,14 +4173,13 @@ DEFUN ("internal-lisp-face-empty-p", Finternal_lisp_face_empty_p,
   return i == LFACE_VECTOR_SIZE ? Qt : Qnil;
 }
 
-
-DEFUN ("frame-face-alist", Fframe_face_alist, Sframe_face_alist,
+DEFUN ("frame--face-hash-table", Fframe_face_hash_table, Sframe_face_hash_table,
        0, 1, 0,
-       doc: /* Return an alist of frame-local faces defined on FRAME.
+       doc: /* Return a hash table of frame-local faces defined on FRAME.
 For internal use only.  */)
   (Lisp_Object frame)
 {
-  return decode_live_frame (frame)->face_alist;
+  return decode_live_frame (frame)->face_hash_table;
 }
 
 
@@ -6678,30 +6676,32 @@ DEFUN ("show-face-resources", Fshow_face_resources, Sshow_face_resources,
 
 #ifdef HAVE_PDUMPER
 /* All the faces defined during loadup are recorded in
-   face-new-frame-defaults, with the last face first in the list.  We
-   need to set next_lface_id to the next face ID number, so that any
-   new faces defined in this session will have face IDs different from
-   those defined during loadup.  We also need to set up the
-   lface_id_to_name[] array for the faces that were defined during
-   loadup.  */
+   face-new-frame-defaults.  We need to set next_lface_id to the next
+   face ID number, so that any new faces defined in this session will
+   have face IDs different from those defined during loadup.  We also
+   need to set up the lface_id_to_name[] array for the faces that were
+   defined during loadup.  */
 void
 init_xfaces (void)
 {
-  if (CONSP (Vface_new_frame_defaults))
+  int nfaces = XFIXNAT (Fhash_table_count (Vface_new_frame_defaults));
+  if (nfaces > 0)
     {
       /* Allocate the lface_id_to_name[] array.  */
-      lface_id_to_name_size = next_lface_id =
-	XFIXNAT (Flength (Vface_new_frame_defaults));
+      lface_id_to_name_size = next_lface_id = nfaces;
       lface_id_to_name = xnmalloc (next_lface_id, sizeof *lface_id_to_name);
 
       /* Store the faces.  */
-      Lisp_Object tail;
-      int i = next_lface_id - 1;
-      for (tail = Vface_new_frame_defaults; CONSP (tail); tail = XCDR (tail))
+      struct Lisp_Hash_Table* table = XHASH_TABLE (Vface_new_frame_defaults);
+      for (ptrdiff_t idx = 0; idx < nfaces; ++idx)
 	{
-	  Lisp_Object lface = XCAR (tail);
-	  eassert (i >= 0);
-	  lface_id_to_name[i--] = XCAR (lface);
+	  Lisp_Object lface = HASH_KEY (table, idx);
+	  Lisp_Object face_id = CAR (HASH_VALUE (table, idx));
+          if (FIXNATP (face_id)) {
+              int id = XFIXNAT (face_id);
+              eassert (id >= 0);
+              lface_id_to_name[id] = lface;
+            }
 	}
     }
   face_attr_sym[0] = Qface;
@@ -6855,7 +6855,7 @@ syms_of_xfaces (void)
   defsubr (&Sinternal_copy_lisp_face);
   defsubr (&Sinternal_merge_in_global_face);
   defsubr (&Sface_font);
-  defsubr (&Sframe_face_alist);
+  defsubr (&Sframe_face_hash_table);
   defsubr (&Sdisplay_supports_face_attributes_p);
   defsubr (&Scolor_distance);
   defsubr (&Sinternal_set_font_selection_order);
@@ -6879,9 +6879,12 @@ syms_of_xfaces (void)
 the "specifity" of a face specification and should be let-bound
 only for this purpose.  */);
 
-  DEFVAR_LISP ("face-new-frame-defaults", Vface_new_frame_defaults,
-    doc: /* List of global face definitions (for internal use only.)  */);
-  Vface_new_frame_defaults = Qnil;
+  DEFVAR_LISP ("face--new-frame-defaults", Vface_new_frame_defaults,
+    doc: /* Hash table of global face definitions (for internal use only.)  */);
+  Vface_new_frame_defaults =
+    /* 33 entries is enough to fit all basic faces */
+    make_hash_table (hashtest_eq, 33, DEFAULT_REHASH_SIZE,
+                     DEFAULT_REHASH_THRESHOLD, Qnil, false);
 
   DEFVAR_LISP ("face-default-stipple", Vface_default_stipple,
     doc: /* Default stipple pattern used on monochrome displays.
-- 
2.17.1


--------------027433C9F25EFCB999EF8297--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 19:38:43 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 15:38:43 2020
Received: from localhost ([127.0.0.1]:38799 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZgAN-0007WW-Jx
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 15:38:43 -0400
Received: from eggs.gnu.org ([209.51.188.92]:52688)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1jZgAL-0007W7-6O
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 15:38:41 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:48420)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jZgAF-0004Pd-DK; Fri, 15 May 2020 15:38:35 -0400
Received: from [176.228.60.248] (port=4068 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jZgAE-0006xh-DD; Fri, 15 May 2020 15:38:34 -0400
Date: Fri, 15 May 2020 22:38:21 +0300
Message-Id: <838shtugya.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
In-Reply-To: <6a828c8b-2856-7f71-811b-086600d8417e@HIDDEN> (message from
 =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel on Fri, 15 May 2020 15:23:00 -0400)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN> <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN> <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN> <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 <83blmpuige.fsf@HIDDEN> <6a828c8b-2856-7f71-811b-086600d8417e@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org, juri@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Cc: 41200 <at> debbugs.gnu.org, juri@HIDDEN
> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
> Date: Fri, 15 May 2020 15:23:00 -0400
> 
> >>> What is the default size of a hash-table?
> >>
> >> 65 entries, I think.
> > 
> > The number of basic faces is just 18.  Is 65 a good initial size for
> > that?
> 
> I think that map stores more than just the basic faces: in fact, $ emacs -Q --batch --eval '(print (length (frame-face-alist)))' prints 100, so maybe I should even make the map larger by default?

We are miscommunicating.  I was talking about the size before loadup,
i.e. in temacs when it starts up.  Later, when we load preloaded
packages, the size should grow, but the hash-table takes care of that
by itself, doesn't it?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 19:23:10 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 15:23:10 2020
Received: from localhost ([127.0.0.1]:38778 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZfvK-00077J-1k
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 15:23:10 -0400
Received: from mail-qk1-f173.google.com ([209.85.222.173]:40292)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jZfvI-000773-AH
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 15:23:08 -0400
Received: by mail-qk1-f173.google.com with SMTP id g185so3769570qke.7
 for <41200 <at> debbugs.gnu.org>; Fri, 15 May 2020 12:23:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:cc:references:from:message-id:date:user-agent
 :mime-version:in-reply-to:content-language:content-transfer-encoding;
 bh=84RKQUzPVEfjrg5OvonVI0GkzSY5VAJQjQaIE1uMqY0=;
 b=C1DVubQhCLR1w9LeWlK7gcq4JahYEKojjTQlroqgcT0KzbKF+LXkUnDdLDgZudBs+n
 9zJ5QgWKbwunf6u5qeE3PLjO1dJ7OWCViLirWCWJIUKN7wO9nAEMZaXfYftSTAjAl3tH
 Ua1b5bidnxKuW/wpJaqwz+owPa9FpmywI/5WqEnalYrQjcWLTViz3feWDTRHzSpxdoIu
 1r3Kx/k0KN9RqEMKm/a4VIyKGVsG/9tvBPdTTTi3EiNrZRVcvHKGjZqW12bO3GpQSPsI
 Hip187earQJEbKmhmzb7XitwyAa1JKdBuEq85hu05OM6S8b9oSp+rw5Kml1hZsEr1Jut
 n1JA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:cc:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language
 :content-transfer-encoding;
 bh=84RKQUzPVEfjrg5OvonVI0GkzSY5VAJQjQaIE1uMqY0=;
 b=NIqxcpIciTGNPNP4PWg7V71cLFOJzUsaEZrM9sN1byyroHF/S2bepmpNp3q0FizjYZ
 9rTXOKWP7q82OFVg32Dr3de16uXDQx5nTmqIIZFSXC/yXrCoTMtn9FWsgsYX8SWKPXNl
 GsGXF0uW9pfjeFybZ1INimiK/Yktllcjp2PTq62rSZ8Y2DB1EYkdVrx5SaEaY2lsYFTb
 elF9NKk4WzyJH6YctolsJr7JVPNU+cvd/CNb52N1gK/rdS5OQJObTzcVQ4xLwqvhpfFB
 HuITWtokW5b8hUyzLrys0G94AddRaMkR1zsey8AuiPegq1lQ+gDCfPNHrqgDDDYxSzo3
 9V9g==
X-Gm-Message-State: AOAM531bK30L4BLYd0rDJiKfLg2yEmD7p7eQBM9fbAknHVemYlSTmk1q
 r68gMzeE7rVYhzE4Q/VHUj0=
X-Google-Smtp-Source: ABdhPJwM/T3FeTfwtlDQ9YcQZ0ojvGRFnQSpNVRIN2I0V3Hn2Qp234mi5r2n1aImP6A7gPFOJDSVyQ==
X-Received: by 2002:a05:620a:6da:: with SMTP id
 26mr4940348qky.196.1589570582738; 
 Fri, 15 May 2020 12:23:02 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id p137sm2264570qke.60.2020.05.15.12.23.01
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Fri, 15 May 2020 12:23:01 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: Eli Zaretskii <eliz@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN> <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN> <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN> <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
 <83blmpuige.fsf@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <6a828c8b-2856-7f71-811b-086600d8417e@HIDDEN>
Date: Fri, 15 May 2020 15:23:00 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <83blmpuige.fsf@HIDDEN>
Content-Type: text/plain; charset=utf-8
Content-Language: en-GB
Content-Transfer-Encoding: 8bit
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org, juri@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

On 15/05/2020 15.05, Eli Zaretskii wrote:
>> Cc: 41200 <at> debbugs.gnu.org, Juri Linkov <juri@HIDDEN>
>> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
>> Date: Fri, 15 May 2020 14:50:17 -0400
>>
>>>>> No, I was asking why not start with it as nil and actually make a
>>>>> hash-table when we first need it.
>>>>
>>>> Oh, I thought it would be simpler to always have a hash table instead of having to sanity check every time.
>>>
>>> What is the default size of a hash-table?
>>
>> 65 entries, I think.
> 
> The number of basic faces is just 18.  Is 65 a good initial size for
> that?

I think that map stores more than just the basic faces: in fact, $ emacs -Q --batch --eval '(print (length (frame-face-alist)))' prints 100, so maybe I should even make the map larger by default?

Clément.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 19:10:55 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 15:10:55 2020
Received: from localhost ([127.0.0.1]:38762 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZfjS-0006lT-Sa
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 15:10:55 -0400
Received: from mail-qt1-f176.google.com ([209.85.160.176]:37277)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jZfjR-0006lE-EC
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 15:10:53 -0400
Received: by mail-qt1-f176.google.com with SMTP id 4so2929123qtb.4
 for <41200 <at> debbugs.gnu.org>; Fri, 15 May 2020 12:10:53 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:cc:references:from:message-id:date:user-agent
 :mime-version:in-reply-to:content-language:content-transfer-encoding;
 bh=tTb7Py8eeG3LXI4jHQF7dCD6b+Up2Nv9u+5sc/08wDQ=;
 b=Y9548F4uV6mAXVtteG8QTQsS5v6P5JCRcXK68zgWnlxKjaOGEK+zCR8GvQdEe5Pgq1
 yidaMvMCpI8Mm0khyOpSfdOkEz8hk5Y3Lap0LFIYVhenwtS7nKq0q0EbleNzfxlvMeBQ
 5W9TrJzJI1w1JKMcgHDrt47NDvXkkEYoMQeNAjz3aVZ7TMxWypREx7y5ankeWb01EXOy
 YH+5pVJoap0Jco3mkih+bX8om6bErR07vj1KqiVa/2FcnnGv6qFmGhM5aMQtCTCu2/r5
 CvLq6eIl26ZnolRVe+9d8+CzFjmE7m2iFCvqyFCRGD0RsVDvzjRNm+Kz2VQN8CsCQc8E
 Iqvg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:cc:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language
 :content-transfer-encoding;
 bh=tTb7Py8eeG3LXI4jHQF7dCD6b+Up2Nv9u+5sc/08wDQ=;
 b=p9RQWpt+PbBkyC9y/JIttAG16dylXwvxddY8EkTwVgSZf958wUxUOrvf+e/m71Vbi0
 nQM2I6r8DAQjODfO5JtSJCzeJr1onxchRDi7ynQ3SEbE2MBeFpazMC5f2xXoduIw7CRl
 Tz1dSF0XjuA5FHtdKpJB5LbMMOuH9YyRCKTDa91R/5HVPVTmyca0+QOj54b69Q1KPXSy
 7IjH3sPyFMtrgxedCcksWS1KXeGuOpg0RGMwmHhTcHusuS9wSS5NtszRcU/LT78y2snE
 AgnbygmMTNpIdcp9mxuglEgAe1XtbgkdgPjQMQ5GsRDBBzVjPfrNUCLknnRDp5j1NszP
 fmAQ==
X-Gm-Message-State: AOAM532gfaZp+p4t+bNvKHJyBrJl4hxMHZwvNjlzuslhmMJZ5quIxgQv
 8IuMp54dB9aeKXxFWM63AjtWtVfy
X-Google-Smtp-Source: ABdhPJwVsKdYjdUyQClv3rqPOIKAP37uPD/NoY+ah05yBN12KMIhOjkh+JRFRr6frJl3qZ3Htthq4A==
X-Received: by 2002:aed:3bda:: with SMTP id s26mr5209337qte.261.1589569847676; 
 Fri, 15 May 2020 12:10:47 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id 17sm2211057qkn.44.2020.05.15.12.10.46
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Fri, 15 May 2020 12:10:47 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: Stefan Monnier <monnier@HIDDEN>
References: <jwvlfltl3qa.fsf-monnier+emacs@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <9c487146-1fad-0301-fe1a-8d98d560c6ea@HIDDEN>
Date: Fri, 15 May 2020 15:10:46 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <jwvlfltl3qa.fsf-monnier+emacs@HIDDEN>
Content-Type: text/plain; charset=utf-8
Content-Language: en-GB
Content-Transfer-Encoding: 7bit
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
Cc: Eli Zaretskii <eliz@HIDDEN>, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

On 15/05/2020 10.03, Stefan Monnier wrote:
>> Indeed, you're completely right; thanks!  Replacing face_alist and
>> Vface_new_frame_defaults with hash tables makes the worst example
>> about 10 times faster, and with that change tooltips now take 30 to
>> 50ms to display instead of 500-600ms in my real-life use case (my
>> usual config).  I have attached a patch.
> 
> Oh, this is great, makes a very noticeable difference.

Thanks for testing!

> The variable's name did not say "alist", so I don't see a need to change
> it from that point of view.  But I think it deserves a "--" since it's
> supposed to be internal.

Ah, that's a good point.  At least, renaming it will make it clear that something changed and make it easy to support older and newer emacsen.

> A quick grep revealed:
> 
>     elpa/packages/context-coloring/fixtures/benchmark/faces.el:  (mapcar #'car face-new-frame-defaults))

AFAICT, this is just a copy of faces.el, used to benchmark syntax highlighting (that is, this code is not run).

>> - command-execute                                                 454  47%
> [...]
>>            - face-set-after-frame-default                         387  40%
>>             - face-spec-recalc                                    374  39%
>>              - make-face-x-resource-internal                      296  30%
>>               - set-face-attributes-from-resources                273  28%
>>                - set-face-attribute-from-resource                 219  22%
> 
> [...]
> 
>> - command-execute                                                 768  80%
> [...]
>>                       - face-set-after-frame-default              674  70%
>>                        - face-spec-recalc                         660  69%
>>                         - face-spec-set-2                         350  36%
>>                          - apply                                  348  36%
>>                           - set-face-attribute                    342  35%
>>                            - internal-set-lisp-face-attribute     342  35%
>>                             - frame-set-background-mode           331  34%
>>                              - face-spec-recalc                   284  29%
>>                               - make-face-x-resource-internal     235  24%
> 
> Both of those profiles suggest that most of the time is still spent in
> `face-spec-recalc`, so it would be worth trying harder to avoid calling
> it or to speed it up somehow (presumably with some better memozing/caching).

Interesting.  I also wonder whether we could fast-track the case where the face spec is a vector full of 'undefined, since that seems to be the common case.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 19:06:21 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 15:06:21 2020
Received: from localhost ([127.0.0.1]:38745 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZff3-0006ca-7h
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 15:06:21 -0400
Received: from eggs.gnu.org ([209.51.188.92]:48798)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1jZff2-0006cK-4F
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 15:06:20 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:47943)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jZfew-0002cU-Ag; Fri, 15 May 2020 15:06:14 -0400
Received: from [176.228.60.248] (port=2050 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jZfeo-0002Bd-IN; Fri, 15 May 2020 15:06:13 -0400
Date: Fri, 15 May 2020 22:05:53 +0300
Message-Id: <83blmpuige.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
In-Reply-To: <53252e93-085c-477f-21df-c909082dffc2@HIDDEN> (message from
 =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel on Fri, 15 May 2020 14:50:17 -0400)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN> <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN> <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN> <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org, juri@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Cc: 41200 <at> debbugs.gnu.org, Juri Linkov <juri@HIDDEN>
> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
> Date: Fri, 15 May 2020 14:50:17 -0400
> 
> >>> No, I was asking why not start with it as nil and actually make a
> >>> hash-table when we first need it.
> >>
> >> Oh, I thought it would be simpler to always have a hash table instead of having to sanity check every time.
> > 
> > What is the default size of a hash-table?
> 
> 65 entries, I think.

The number of basic faces is just 18.  Is 65 a good initial size for
that?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 18:50:30 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 14:50:30 2020
Received: from localhost ([127.0.0.1]:38730 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZfPe-00066g-47
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 14:50:30 -0400
Received: from mail-qv1-f47.google.com ([209.85.219.47]:45126)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jZfPc-00066R-Nt
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 14:50:25 -0400
Received: by mail-qv1-f47.google.com with SMTP id z9so1584290qvi.12
 for <41200 <at> debbugs.gnu.org>; Fri, 15 May 2020 11:50:24 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:cc:references:from:message-id:date:user-agent
 :mime-version:in-reply-to:content-language;
 bh=ZKChxk8dDfiR/B45KMT10NPSrZp6JyXHhv8oJUDW8Ak=;
 b=fRkvf61L4ALbptU2JIIBHvhu9bgswrg785RhoaNaImA49mkZiwWhn9zxPyPn1VdSKP
 sDxrFhUancWF5PGY65lAhVydUKYnEbYVktTL0Apz4oa8uYi65vwsLx2fneytKEF040dh
 rhdOI5rZTfo4+aDtC1reL89hVRB5WaCfvLqsbkKeuqXsyR+JcyZc8kcA33S6OjVM1UWH
 b94zU7yhqqtYd8peBb7xaYE6UB7m1I8PvIyk95xsYsB6/W7nX/KmFmgycUeGVThHL4YO
 JQH7MZdPWbQKjfqAzgKeLBHAJmBNS06XeffJuWjCb/oTY5ZdQGQplaSHSyrH5fopvn/w
 DWag==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:cc:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language;
 bh=ZKChxk8dDfiR/B45KMT10NPSrZp6JyXHhv8oJUDW8Ak=;
 b=ss2JFCSqs3w6bSSyERTfjOA+nrTSUYvsNhy0l0bNaz6NZ5r5/Y0djXQ9g5/OFSNkMI
 ZJyt6Xj0virqe6YU5RTDNh9hoXJxYShSGQa4hiRVMIRN5ICcUaOsOjs9WbHkpXyWrO0i
 qFyMIGD6kDu4OmVeJMqsUS4v1bYNq4dsw4Tg4oRLzHZuAdMURd3CffNJqdBofDBwUtBH
 Cj51YwkleqkwstdxAUnHBZQtQJdG6y4GRRcN3rDC6MKHWqWEfR6d0U9IZkYn+BWHMnts
 jjKDIalwZ2u1By28URaLzqt3zEIUR2I8RoqR3g9qjHQOK4WlOa82UBXCUGwiTO0nQsV+
 aN9g==
X-Gm-Message-State: AOAM533PUknQv++J3D7G88x9IDJ37WcyERjqJ4tTMouilKvmD5n3uzxM
 yuLMj4/DhqO+NDwlNrmj+9M=
X-Google-Smtp-Source: ABdhPJx6YtoyOjE2KvHK36ZGGveXP1MvwK+l2koOwEl2mNH4EkCaYWIZlLnjJ+/n8cOAA2nSHST5IA==
X-Received: by 2002:a0c:ec44:: with SMTP id n4mr4859433qvq.237.1589568619183; 
 Fri, 15 May 2020 11:50:19 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id e27sm2148759qkl.47.2020.05.15.11.50.17
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Fri, 15 May 2020 11:50:18 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: Eli Zaretskii <eliz@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN> <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN> <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
 <833681glas.fsf@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <53252e93-085c-477f-21df-c909082dffc2@HIDDEN>
Date: Fri, 15 May 2020 14:50:17 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <833681glas.fsf@HIDDEN>
Content-Type: multipart/mixed; boundary="------------BA64282E6E8C5FE96DAD52F3"
Content-Language: en-GB
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org, Juri Linkov <juri@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

This is a multi-part message in MIME format.
--------------BA64282E6E8C5FE96DAD52F3
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

On 15/05/2020 13.28, Eli Zaretskii wrote:
>> Cc: 41200 <at> debbugs.gnu.org, Anders Lindgren <andlind@HIDDEN>
>> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
>> Date: Fri, 15 May 2020 12:22:53 -0400
>>
>>>>> face_hash_table?
>>>>
>>>> Thanks, good idea.  I also liked Stefan's frame_face_map.
>>>
>>> "Map" is too general, IMO, it doesn't tell enough about the kind of
>>> object it is.
>>
>> Got it.  Is face_table better? (that was Stefan's other suggestion)
> 
> Is anything wrong with face_hash_table?

Nope; I've attached a new patch.

>> Btw, I have one more question: some callers of face-list seems to rely on the order of faces added to it, so it would be better to preserve that order.  Since hash-tables are not necessarily ordered, should I sort faces by face-id before returning them? 

Done in the attached patch as well.

>>> I think the problem is that tab-line is declared a basic face, but its
>>> defface form is not in faces.el.
>>
>> Ah, good catch.  Current there's a defface for tab-bar in lisp/tab-bar, and since that's preloaded it works, but the defface for tab-line is in lisp/tab-line.el and so isn't preloaded.
>> Should I move both to faces.el?
>>
> Yes, I think so.

Thanks.  I will ask Juri to confirm before moving them, because I realize now that they have a custom group.
Juri (CC'd; hi Juri!), was there a reason to make tab-bar and tab-line basic faces?  I see they are both in their own files and groups, instead of being in faces.el.

>>>>> I'm not sure I understand why do you need to look at the existing
>>>>> face's 'face' property?  The original code didn't.
>>>>
>>>> The original code iterated over face-frame-alist in the order in which entries were added to it.  If I understand correctly, iteration order isn't guaranteed on hash tables (is it?), so I had to find a different source of truth for these.
>>>
>>> Maybe we should store the ID with the face?  I think we wanted to get
>>> rid of the 'face' property of the faces at some point.
>>
>> Sounds reasonable; but where would we store it?  Right now faces are just symbols, right?
> 
> Don't hash-tables allow us to store more than one item in each slot?

They do, so I can certainly store (face-id . face-vector) in the hash table.  Done in the attached patch.  I only do this in Vface_new_frame_defaults, not in frame->face_hash_table.

>>> No, I was asking why not start with it as nil and actually make a
>>> hash-table when we first need it.
>>
>> Oh, I thought it would be simpler to always have a hash table instead of having to sanity check every time.
> 
> What is the default size of a hash-table?

65 entries, I think.


--------------BA64282E6E8C5FE96DAD52F3
Content-Type: text/x-patch; charset=UTF-8;
 name="0001-Store-frame-faces-in-hash-tables-instead-of-alists.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0001-Store-frame-faces-in-hash-tables-instead-of-alists.patc";
 filename*1="h"

From be915d6d2ea7a739026dc4a53fab64f78efab2bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Pit-Claudel?= <clement.pitclaudel@HIDDEN>
Date: Tue, 12 May 2020 21:48:32 -0400
Subject: [PATCH] Store frame faces in hash tables instead of alists

* src/frame.h (struct frame): Add face_hash_table, remove face_alist.
(fset_face_hash_table): New function.
(fset_face_alist): Remove.
* src/frame.c (make_frame): Initialize f->face_hash_table.
(Fmake_terminal_frame): Update to work with hash tables instead of
alists.
* src/xfaces.c (lface_from_face_name_no_resolve):
(Finternal_make_lisp_face):
(update_face_from_frame_parameter): Update to work with hash tables
instead of alists.
(Fframe_face_hash_table): New function.
(Fframe_face_alist): Move to faces.el as frame-face-alist.
(syms_of_xfaces): Add frame_face_hash_table.

* lisp/emacs-lisp/edebug.el (edebug-eval-defun):
* lisp/progmodes/elisp-mode.el (elisp--eval-defun-1):
* lisp/frame.el (frame-set-background-mode): Update to work with hash
tables instead of alists.
* lisp/faces.el (face-new-frame-defaults): Mark obsolete.
(face-list): Update to use face--new-frame-defaults.
(frame-face-alist): Moved here from src/xfaces.c.
---
 lisp/custom.el               |  2 +-
 lisp/emacs-lisp/edebug.el    |  3 +-
 lisp/faces.el                | 23 ++++++++--
 lisp/frame.el                |  2 +-
 lisp/progmodes/elisp-mode.el |  3 +-
 src/frame.c                  | 20 ++++++---
 src/frame.h                  |  8 ++--
 src/xfaces.c                 | 82 ++++++++++++++++++------------------
 8 files changed, 83 insertions(+), 60 deletions(-)

diff --git a/lisp/custom.el b/lisp/custom.el
index 885c486c5e..3ac8bac40f 100644
--- a/lisp/custom.el
+++ b/lisp/custom.el
@@ -898,7 +898,7 @@ custom-push-theme
 	  ;; the value to a fake theme, `changed'.  If the theme is
 	  ;; later disabled, we use this to bring back the old value.
 	  ;;
-	  ;; For faces, we just use `face-new-frame-defaults' to
+	  ;; For faces, we just use `face--new-frame-defaults' to
 	  ;; recompute when the theme is disabled.
 	  (when (and (eq prop 'theme-value)
 		     (boundp symbol))
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index 78461185d3..76a75c04df 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -488,8 +488,7 @@ edebug-eval-defun
 	   (set-default (nth 1 form) (eval (nth 2 form) lexical-binding)))
           ((eq (car form) 'defface)
            ;; Reset the face.
-           (setq face-new-frame-defaults
-                 (assq-delete-all (nth 1 form) face-new-frame-defaults))
+           (remhash (nth 1 form) face--new-frame-defaults)
            (put (nth 1 form) 'face-defface-spec nil)
            (put (nth 1 form) 'face-documentation (nth 3 form))
 	   ;; See comments in `eval-defun-1' for purpose of code below
diff --git a/lisp/faces.el b/lisp/faces.el
index e707f6f4b6..bb51797a38 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -176,10 +176,27 @@ face-font-registry-alternatives
 ;;; Creation, copying.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(make-obsolete-variable
+ 'face-new-frame-defaults
+ "use `face--new-frame-defaults' or `face-alist' instead."
+ "28.1")
+
+(defun frame-face-alist (&optional frame)
+  "Return an alist of frame-local faces defined on FRAME.
+This alist is a copy of the contents of `frame--face-hash-table'.
+For internal use only."
+  (declare (obsolete frame--face-hash-table "28.1"))
+  (let ((faces))
+    (maphash (lambda (face spec) (push `(,(car spec) ,face . ,(cdr spec)) faces))
+             (frame--face-hash-table frame))
+    (mapcar #'cdr (sort faces (lambda (f1 f2) (< (car f1) (car f2)))))))
 
 (defun face-list ()
   "Return a list of all defined faces."
-  (mapcar #'car face-new-frame-defaults))
+  (let ((faces))
+    (maphash (lambda (face spec) (push `(,(car spec) . ,face) faces))
+             face--new-frame-defaults)
+    (mapcar #'cdr (sort faces (lambda (f1 f2) (< (car f1) (car f2)))))))
 
 (defun make-face (face)
   "Define a new face with name FACE, a symbol.
@@ -2097,7 +2114,7 @@ x-create-frame-with-faces
 (defun face-set-after-frame-default (frame &optional parameters)
   "Initialize the frame-local faces of FRAME.
 Calculate the face definitions using the face specs, custom theme
-settings, X resources, and `face-new-frame-defaults'.
+settings, X resources, and `face--new-frame-defaults'.
 Finally, apply any relevant face attributes found amongst the
 frame parameters in PARAMETERS."
   ;; The `reverse' is so that `default' goes first.
@@ -2106,7 +2123,7 @@ face-set-after-frame-default
 	(progn
 	  ;; Initialize faces from face spec and custom theme.
 	  (face-spec-recalc face frame)
-	  ;; Apply attributes specified by face-new-frame-defaults
+	  ;; Apply attributes specified by face--new-frame-defaults
 	  (internal-merge-in-global-face face frame))
       ;; Don't let invalid specs prevent frame creation.
       (error nil)))
diff --git a/lisp/frame.el b/lisp/frame.el
index 6c2f774709..66b5c6aa8d 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -1227,7 +1227,7 @@ frame-set-background-mode
                          ;; during startup with -rv on the command
                          ;; line for the initial frame, because frames
                          ;; are not recorded in the pdump file.
-                         (assq face (frame-face-alist))
+                         (gethash face (frame--face-hash-table))
                          (face-spec-match-p face
                                             (face-user-default-spec face)
                                             ;; FIXME: why selected-frame and
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index b737134f90..75054b8818 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -1304,8 +1304,7 @@ elisp--eval-defun-1
 	((eq (car form) 'custom-declare-face)
 	 ;; Reset the face.
 	 (let ((face-symbol (eval (nth 1 form) lexical-binding)))
-	   (setq face-new-frame-defaults
-		 (assq-delete-all face-symbol face-new-frame-defaults))
+	   (remhash face--new-frame-defaults face-symbol)
 	   (put face-symbol 'face-defface-spec nil)
 	   (put face-symbol 'face-override-spec nil))
 	 form)
diff --git a/src/frame.c b/src/frame.c
index c871e4fd99..0843d53559 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -946,6 +946,10 @@ make_frame (bool mini_p)
   rw->total_lines = mini_p ? 9 : 10;
   rw->pixel_height = rw->total_lines * FRAME_LINE_HEIGHT (f);
 
+  fset_face_hash_table
+    (f, make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
+                         DEFAULT_REHASH_THRESHOLD, Qnil, false));
+
   if (mini_p)
     {
       mw->top_line = rw->total_lines;
@@ -1254,7 +1258,7 @@ DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
 {
   struct frame *f;
   struct terminal *t = NULL;
-  Lisp_Object frame, tem;
+  Lisp_Object frame;
   struct frame *sf = SELECTED_FRAME ();
 
 #ifdef MSDOS
@@ -1336,14 +1340,16 @@ DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
   store_in_alist (&parms, Qminibuffer, Qt);
   Fmodify_frame_parameters (frame, parms);
 
-  /* Make the frame face alist be frame-specific, so that each
+  /* Make the frame face hash be frame-specific, so that each
      frame could change its face definitions independently.  */
-  fset_face_alist (f, Fcopy_alist (sf->face_alist));
-  /* Simple Fcopy_alist isn't enough, because we need the contents of
-     the vectors which are the CDRs of associations in face_alist to
+  fset_face_hash_table (f, Fcopy_hash_table (sf->face_hash_table));
+  /* Simple copy_hash_table isn't enough, because we need the contents of
+     the vectors which are the values in face_hash_table to
      be copied as well.  */
-  for (tem = f->face_alist; CONSP (tem); tem = XCDR (tem))
-    XSETCDR (XCAR (tem), Fcopy_sequence (XCDR (XCAR (tem))));
+  ptrdiff_t idx = 0;
+  struct Lisp_Hash_Table *table = XHASH_TABLE (f->face_hash_table);
+  for (idx = 0; idx < table->count; ++idx)
+    set_hash_value_slot (table, idx, Fcopy_sequence (HASH_VALUE (table, idx)));
 
   f->can_set_window_size = true;
   f->after_make_frame = true;
diff --git a/src/frame.h b/src/frame.h
index 476bac67fa..9761253085 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -158,8 +158,8 @@ #define EMACS_FRAME_H
      There are four additional elements of nil at the end, to terminate.  */
   Lisp_Object menu_bar_items;
 
-  /* Alist of elements (FACE-NAME . FACE-VECTOR-DATA).  */
-  Lisp_Object face_alist;
+  /* Hash table of FACE-NAME keys and FACE-VECTOR-DATA values.  */
+  Lisp_Object face_hash_table;
 
   /* A vector that records the entire structure of this frame's menu bar.
      For the format of the data, see extensive comments in xmenu.c.
@@ -661,9 +661,9 @@ fset_condemned_scroll_bars (struct frame *f, Lisp_Object val)
   f->condemned_scroll_bars = val;
 }
 INLINE void
-fset_face_alist (struct frame *f, Lisp_Object val)
+fset_face_hash_table (struct frame *f, Lisp_Object val)
 {
-  f->face_alist = val;
+  f->face_hash_table = val;
 }
 #if defined (HAVE_WINDOW_SYSTEM)
 INLINE void
diff --git a/src/xfaces.c b/src/xfaces.c
index 7d7aff95c1..eae991d1c2 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -95,9 +95,10 @@ Copyright (C) 1993-1994, 1998-2020 Free Software Foundation, Inc.
    with the symbol `face' in slot 0, and a slot for each of the face
    attributes mentioned above.
 
-   There is also a global face alist `Vface_new_frame_defaults'.  Face
-   definitions from this list are used to initialize faces of newly
-   created frames.
+   There is also a global face map `Vface_new_frame_defaults',
+   containing conses of (FACE_ID . FACE_DEFINITION).  Face definitions
+   from this table are used to initialize faces of newly created
+   frames.
 
    A face doesn't have to specify all attributes.  Those not specified
    have a value of `unspecified'.  Faces specifying all attributes but
@@ -1843,13 +1844,11 @@ lface_from_face_name_no_resolve (struct frame *f, Lisp_Object face_name,
   Lisp_Object lface;
 
   if (f)
-    lface = assq_no_quit (face_name, f->face_alist);
+    lface = Fgethash (face_name, f->face_hash_table, Qnil);
   else
-    lface = assq_no_quit (face_name, Vface_new_frame_defaults);
+    lface = CDR (Fgethash (face_name, Vface_new_frame_defaults, Qnil));
 
-  if (CONSP (lface))
-    lface = XCDR (lface);
-  else if (signal_p)
+  if (signal_p && NILP (lface))
     signal_error ("Invalid face", face_name);
 
   check_lface (lface);
@@ -2734,11 +2733,6 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
   /* Add a global definition if there is none.  */
   if (NILP (global_lface))
     {
-      global_lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
-      ASET (global_lface, 0, Qface);
-      Vface_new_frame_defaults = Fcons (Fcons (face, global_lface),
-					Vface_new_frame_defaults);
-
       /* Assign the new Lisp face a unique ID.  The mapping from Lisp
 	 face id to Lisp face is given by the vector lface_id_to_name.
 	 The mapping from Lisp face to Lisp face id is given by the
@@ -2748,9 +2742,14 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
 	  xpalloc (lface_id_to_name, &lface_id_to_name_size, 1, MAX_FACE_ID,
 		   sizeof *lface_id_to_name);
 
+      Lisp_Object face_id = make_fixnum (next_lface_id);
       lface_id_to_name[next_lface_id] = face;
-      Fput (face, Qface, make_fixnum (next_lface_id));
+      Fput (face, Qface, face_id);
       ++next_lface_id;
+
+      global_lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
+      ASET (global_lface, 0, Qface);
+      Fputhash (face, Fcons (face_id, global_lface), Vface_new_frame_defaults);
     }
   else if (f == NULL)
     for (i = 1; i < LFACE_VECTOR_SIZE; ++i)
@@ -2763,7 +2762,7 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
 	{
 	  lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
 	  ASET (lface, 0, Qface);
-	  fset_face_alist (f, Fcons (Fcons (face, lface), f->face_alist));
+          Fputhash (face, lface, f->face_hash_table);
 	}
       else
 	for (i = 1; i < LFACE_VECTOR_SIZE; ++i)
@@ -2924,7 +2923,7 @@ DEFUN ("internal-set-lisp-face-attribute", Finternal_set_lisp_face_attribute,
       f = NULL;
       lface = lface_from_face_name (NULL, face, true);
 
-      /* When updating face-new-frame-defaults, we put :ignore-defface
+      /* When updating face--new-frame-defaults, we put :ignore-defface
 	 where the caller wants `unspecified'.  This forces the frame
 	 defaults to ignore the defface value.  Otherwise, the defface
 	 will take effect, which is generally not what is intended.
@@ -3508,7 +3507,7 @@ update_face_from_frame_parameter (struct frame *f, Lisp_Object param,
   /* If there are no faces yet, give up.  This is the case when called
      from Fx_create_frame, and we do the necessary things later in
      face-set-after-frame-defaults.  */
-  if (NILP (f->face_alist))
+  if (XFIXNAT (Fhash_table_count (f->face_hash_table)) == 0)
     return;
 
   if (EQ (param, Qforeground_color))
@@ -4174,14 +4173,13 @@ DEFUN ("internal-lisp-face-empty-p", Finternal_lisp_face_empty_p,
   return i == LFACE_VECTOR_SIZE ? Qt : Qnil;
 }
 
-
-DEFUN ("frame-face-alist", Fframe_face_alist, Sframe_face_alist,
+DEFUN ("frame--face-hash-table", Fframe_face_hash_table, Sframe_face_hash_table,
        0, 1, 0,
-       doc: /* Return an alist of frame-local faces defined on FRAME.
+       doc: /* Return a hash table of frame-local faces defined on FRAME.
 For internal use only.  */)
   (Lisp_Object frame)
 {
-  return decode_live_frame (frame)->face_alist;
+  return decode_live_frame (frame)->face_hash_table;
 }
 
 
@@ -6678,30 +6676,32 @@ DEFUN ("show-face-resources", Fshow_face_resources, Sshow_face_resources,
 
 #ifdef HAVE_PDUMPER
 /* All the faces defined during loadup are recorded in
-   face-new-frame-defaults, with the last face first in the list.  We
-   need to set next_lface_id to the next face ID number, so that any
-   new faces defined in this session will have face IDs different from
-   those defined during loadup.  We also need to set up the
-   lface_id_to_name[] array for the faces that were defined during
-   loadup.  */
+   face-new-frame-defaults.  We need to set next_lface_id to the next
+   face ID number, so that any new faces defined in this session will
+   have face IDs different from those defined during loadup.  We also
+   need to set up the lface_id_to_name[] array for the faces that were
+   defined during loadup.  */
 void
 init_xfaces (void)
 {
-  if (CONSP (Vface_new_frame_defaults))
+  int nfaces = XFIXNAT (Fhash_table_count (Vface_new_frame_defaults));
+  if (nfaces > 0)
     {
       /* Allocate the lface_id_to_name[] array.  */
-      lface_id_to_name_size = next_lface_id =
-	XFIXNAT (Flength (Vface_new_frame_defaults));
+      lface_id_to_name_size = next_lface_id = nfaces;
       lface_id_to_name = xnmalloc (next_lface_id, sizeof *lface_id_to_name);
 
       /* Store the faces.  */
-      Lisp_Object tail;
-      int i = next_lface_id - 1;
-      for (tail = Vface_new_frame_defaults; CONSP (tail); tail = XCDR (tail))
+      struct Lisp_Hash_Table* table = XHASH_TABLE (Vface_new_frame_defaults);
+      for (ptrdiff_t idx = 0; idx < nfaces; ++idx)
 	{
-	  Lisp_Object lface = XCAR (tail);
-	  eassert (i >= 0);
-	  lface_id_to_name[i--] = XCAR (lface);
+	  Lisp_Object lface = HASH_KEY (table, idx);
+	  Lisp_Object face_id = CAR (HASH_VALUE (table, idx));
+          if (FIXNATP (face_id)) {
+              int id = XFIXNAT (face_id);
+              eassert (id >= 0);
+              lface_id_to_name[id] = lface;
+            }
 	}
     }
   face_attr_sym[0] = Qface;
@@ -6855,7 +6855,7 @@ syms_of_xfaces (void)
   defsubr (&Sinternal_copy_lisp_face);
   defsubr (&Sinternal_merge_in_global_face);
   defsubr (&Sface_font);
-  defsubr (&Sframe_face_alist);
+  defsubr (&Sframe_face_hash_table);
   defsubr (&Sdisplay_supports_face_attributes_p);
   defsubr (&Scolor_distance);
   defsubr (&Sinternal_set_font_selection_order);
@@ -6879,9 +6879,11 @@ syms_of_xfaces (void)
 the "specifity" of a face specification and should be let-bound
 only for this purpose.  */);
 
-  DEFVAR_LISP ("face-new-frame-defaults", Vface_new_frame_defaults,
-    doc: /* List of global face definitions (for internal use only.)  */);
-  Vface_new_frame_defaults = Qnil;
+  DEFVAR_LISP ("face--new-frame-defaults", Vface_new_frame_defaults,
+    doc: /* Hash table of global face definitions (for internal use only.)  */);
+  Vface_new_frame_defaults =
+    make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
+                     DEFAULT_REHASH_THRESHOLD, Qnil, false);
 
   DEFVAR_LISP ("face-default-stipple", Vface_default_stipple,
     doc: /* Default stipple pattern used on monochrome displays.
-- 
2.17.1


--------------BA64282E6E8C5FE96DAD52F3--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 17:28:34 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 13:28:34 2020
Received: from localhost ([127.0.0.1]:38664 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZe8P-00085L-PF
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 13:28:34 -0400
Received: from eggs.gnu.org ([209.51.188.92]:37702)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1jZe8O-000855-JP
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 13:28:32 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:46307)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jZe8I-000166-AW; Fri, 15 May 2020 13:28:26 -0400
Received: from [176.228.60.248] (port=4530 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jZe8G-0006bE-UU; Fri, 15 May 2020 13:28:25 -0400
Date: Fri, 15 May 2020 20:28:11 +0300
Message-Id: <833681glas.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
In-Reply-To: <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN> (message from
 =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel on Fri, 15 May 2020 12:22:53 -0400)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN> <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN> <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org, andlind@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Cc: 41200 <at> debbugs.gnu.org, Anders Lindgren <andlind@HIDDEN>
> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
> Date: Fri, 15 May 2020 12:22:53 -0400
> 
> >>> face_hash_table?
> >>
> >> Thanks, good idea.  I also liked Stefan's frame_face_map.
> > 
> > "Map" is too general, IMO, it doesn't tell enough about the kind of
> > object it is.
> 
> Got it.  Is face_table better? (that was Stefan's other suggestion)

Is anything wrong with face_hash_table?

> > I thought about updating the alist when the hash-table is modified.
> > Since you always know whether the face is already in the hash-table,
> > you don't need to scan the alist looking for it.
> 
> Would that be done in C, or in any place where frame-new-face-defaults is modified?  (for example, edebug changes face-new-frame-defaults in one place; if we keep the alist in addition to the hash table, would it modify both or would there be a C mechanism that mirrors hash-table modifications to the alist?)

The latter was what I had in mind.

> I have a variant of the patch that keeps the alist variable, but I fear that it's worse than removing it: since changes to the alist won't be propagated to the hash table, it might be better to error out with a compilation error?

Not sure yet, it depends on how this is used.

> Btw, I have one more question: some callers of face-list seems to rely on the order of faces added to it, so it would be better to preserve that order.  Since hash-tables are not necessarily ordered, should I sort faces by face-id before returning them? 

Yes, I think so.

> > I think the problem is that tab-line is declared a basic face, but its
> > defface form is not in faces.el.
> 
> Ah, good catch.  Current there's a defface for tab-bar in lisp/tab-bar, and since that's preloaded it works, but the defface for tab-line is in lisp/tab-line.el and so isn't preloaded.
> Should I move both to faces.el?

Yes, I think so.

> >>> I'm not sure I understand why do you need to look at the existing
> >>> face's 'face' property?  The original code didn't.
> >>
> >> The original code iterated over face-frame-alist in the order in which entries were added to it.  If I understand correctly, iteration order isn't guaranteed on hash tables (is it?), so I had to find a different source of truth for these.
> > 
> > Maybe we should store the ID with the face?  I think we wanted to get
> > rid of the 'face' property of the faces at some point.
> 
> Sounds reasonable; but where would we store it?  Right now faces are just symbols, right?

Don't hash-tables allow us to store more than one item in each slot?

> > No, I was asking why not start with it as nil and actually make a
> > hash-table when we first need it.
> 
> Oh, I thought it would be simpler to always have a hash table instead of having to sanity check every time.

What is the default size of a hash-table?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 16:23:02 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 12:23:02 2020
Received: from localhost ([127.0.0.1]:38599 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZd70-0005wX-DF
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 12:23:02 -0400
Received: from mail-qv1-f44.google.com ([209.85.219.44]:42347)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jZd6y-0005vd-IW
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 12:23:00 -0400
Received: by mail-qv1-f44.google.com with SMTP id g20so1336850qvb.9
 for <41200 <at> debbugs.gnu.org>; Fri, 15 May 2020 09:23:00 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:cc:references:from:message-id:date:user-agent
 :mime-version:in-reply-to:content-language:content-transfer-encoding;
 bh=tCygyuYx99Yf8Qa20hYMvfKBiNKYY50E6TlPDpPdG6w=;
 b=LmNBtlbQ7mmrP3CkH7dVEro4trqzhC+7I37UD7wcoEFuUuUsIDz+VbzVV9bTHCIVuR
 rye2Xe2AOcebqwR547aKLwlRtwgiGnHi0xPsjzXG2yvlWAGxa3Qhh6unfEk0hro28yay
 gxe97MqcTNYS2ykc86dFLyfB6uMaKcXd7KWWLAeSK7l5a9tfmGaB6pN9I54n3g6jnNMZ
 B9EOxfGtHt8Mk7UmrlG+Od88V0oMDxs8MFfVVz3UAPx40KcdzRu7gDW2WlU2OHnnO9Sl
 DEUnb1YN7LNgAUY2ij8Th2htEDp3W2a4kPKM6wRu4DFYRA1TbcNax4dvyrwiEUWjIWqH
 BlMA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:cc:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language
 :content-transfer-encoding;
 bh=tCygyuYx99Yf8Qa20hYMvfKBiNKYY50E6TlPDpPdG6w=;
 b=E56VZQUu1ORaA7xy/YujRdyS5GzFr1N4iVrQCRhrvN7x9lXfNa+U1jPFHlmIsuodBF
 LhGa7HNrEQTHskGfZyZ1IANO1v1zw36nvxyHPWTeXNm1kO08XaU+s4wORHbaNhJYZsDg
 Y1l7wOfZTSkAm/AqQsi3dtx7x0AqFrSD0yF0m7LP26NPlvYMR6uh/hGqiSAgO4gVRkkL
 AM6hNbraKVF5RjIUtOo3wFuIboXspAZbqUpmjFs5PxMsNP/pu+kM+FA+0MSzBmUTCi5o
 hMBeXMF+hv9M7GeEF6nDgn6cMlgmU4uAIiopPhGTkfxiQ5RpPm4kGWSDvFMtaKZBfYoz
 m1sA==
X-Gm-Message-State: AOAM532FmhhTlXlopXVePyDTrfY91tPcxUFnZbFdmtmQbRUH67zNiQPQ
 fpM8gXxHFbaquEQeAYOO4/k=
X-Google-Smtp-Source: ABdhPJzI/onyMgD9nruWA+EhWsw5eLR/gzw6TwplLO2l29OlAAxXJmGbQ3ytJ7xYD19TBnkJNx4SCQ==
X-Received: by 2002:ad4:4e65:: with SMTP id ec5mr4287021qvb.204.1589559774883; 
 Fri, 15 May 2020 09:22:54 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id k25sm1813884qki.135.2020.05.15.09.22.53
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Fri, 15 May 2020 09:22:54 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: Eli Zaretskii <eliz@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN> <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <e47117f7-6f19-9ef5-39ba-8220dfd0980f@HIDDEN>
Date: Fri, 15 May 2020 12:22:53 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <835zcxgrby.fsf@HIDDEN>
Content-Type: text/plain; charset=utf-8
Content-Language: en-GB
Content-Transfer-Encoding: 8bit
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org, Anders Lindgren <andlind@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

On 15/05/2020 11.17, Eli Zaretskii wrote:
>>>> * The name face_hash isn't ideal, since there's already a distinct notion of face hashes (hash codes).  Can you think of a better name? 
>>>
>>> face_hash_table?
>>
>> Thanks, good idea.  I also liked Stefan's frame_face_map.
> 
> "Map" is too general, IMO, it doesn't tell enough about the kind of
> object it is.

Got it.  Is face_table better? (that was Stefan's other suggestion)
 
>>> And I'm not sure we should have it only in Lisp: perhaps we should
>>> maintain the alist as well, and add/remove to/from it when a face is
>>> added or removed in the hash table.  Otherwise this change of
>>> internals will have painful effect on packages that use the current
>>> APIs.
>>
>> frame-face-alist is likely less crucial than face-new-frame-defaults, because it was already a function, so the return value has to be mutated in place to modify it (it couldn't be directly assigned).  For both of these, however, how would we ensure that the alist remains in sync with the hashmap (that is, how do we catch modifications?)
> 
> I thought about updating the alist when the hash-table is modified.
> Since you always know whether the face is already in the hash-table,
> you don't need to scan the alist looking for it.

Would that be done in C, or in any place where frame-new-face-defaults is modified?  (for example, edebug changes face-new-frame-defaults in one place; if we keep the alist in addition to the hash table, would it modify both or would there be a C mechanism that mirrors hash-table modifications to the alist?)

> I'd really like to know that no one is using these before we make the
> final decision about this.

That's a fair point.  While I couldn't find uses of frame-face-alist, there are a few uses of face-new-frame-defaults-alist: https://github.com/pestctrl/emacs-config/commit/31d6bff97dacf60f71066902a23d37e59b4c1288 is from someone who uses that to speed up temporary frame creation(!), https://github.com/Lindydancer/face-explorer/blob/13bd4553bc4b09215a04d0267be1cb4ed834775c/test/face-explorer-test-faces.el is from Anders Lindgren (in CC; hi Andres! We're considering replacing face-new-frame-defaults-alist with a hash table, would that be an issue?), who uses it to remove a face, and https://github.com/Wilfred/elisp-fu/blob/92c491584f466ee729ea1b328234636e65e2c665/elisp-fu.el includes code that's the same as in eval-defun.

I have a variant of the patch that keeps the alist variable, but I fear that it's worse than removing it: since changes to the alist won't be propagated to the hash table, it might be better to error out with a compilation error?

Btw, I have one more question: some callers of face-list seems to rely on the order of faces added to it, so it would be better to preserve that order.  Since hash-tables are not necessarily ordered, should I sort faces by face-id before returning them? 

>> If so, where from?
> 
> I think the problem is that tab-line is declared a basic face, but its
> defface form is not in faces.el.

Ah, good catch.  Current there's a defface for tab-bar in lisp/tab-bar, and since that's preloaded it works, but the defface for tab-line is in lisp/tab-line.el and so isn't preloaded.
Should I move both to faces.el?
 
>>>> +          if (!FIXNATP (face_id))
>>>> +            // FIXME: I'm not sure what to do in this case
>>>
>>> I'm not sure I understand why do you need to look at the existing
>>> face's 'face' property?  The original code didn't.
>>
>> The original code iterated over face-frame-alist in the order in which entries were added to it.  If I understand correctly, iteration order isn't guaranteed on hash tables (is it?), so I had to find a different source of truth for these.
> 
> Maybe we should store the ID with the face?  I think we wanted to get
> rid of the 'face' property of the faces at some point.

Sounds reasonable; but where would we store it?  Right now faces are just symbols, right?

> No, I was asking why not start with it as nil and actually make a
> hash-table when we first need it.

Oh, I thought it would be simpler to always have a hash table instead of having to sanity check every time.

Thanks a lot,
Clément.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 15:33:50 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 11:33:50 2020
Received: from localhost ([127.0.0.1]:38513 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZcLO-0004Gp-3J
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 11:33:50 -0400
Received: from mail-qk1-f181.google.com ([209.85.222.181]:45906)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <npostavs@HIDDEN>) id 1jZcLM-0004GX-MW
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 11:33:48 -0400
Received: by mail-qk1-f181.google.com with SMTP id i5so2894808qkl.12
 for <41200 <at> debbugs.gnu.org>; Fri, 15 May 2020 08:33:48 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=from:to:cc:subject:references:date:in-reply-to:message-id
 :user-agent:mime-version;
 bh=I1X704DhotDBxU0RNGJQPN5B4RzQUQdTG/FM6WCamsM=;
 b=cjVB0XBEfMAHKKIEOM0es2TB/WwXoJkFfg9buPDvYz/+ssU2P3QAtzG3JcP+2SPiir
 iRnlvTmlMhdvJw/6TfKN3an7os3/UsnYmhWE2WRSwm2FjrUpHri3P8Zm42wdvg/bO29I
 ApT7cQX8fYOCxny4MAWVULBV32uNmGcklbeQrmjHVFEgI76iIw6bLXaNtgAxHNwyD4Qo
 FGVrEgiCm+/SNKZLW4XInQiD886OdXp6XJUwOd356xHKc/FBYx4Yvgp/u8Y/H2N0WXA/
 cgi+FHjfoXLSdo11xxWBbvjDtqwkMoDJn3X73pLJ5tvV0aCQSXmqXLYFsmOQHrPusXwl
 IZAA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to
 :message-id:user-agent:mime-version;
 bh=I1X704DhotDBxU0RNGJQPN5B4RzQUQdTG/FM6WCamsM=;
 b=FHa0y6yr0oKRnW1Ud4xlYt5mAAyUZ1n9XlE4YS5yvgv40vHoL7+GcLM1JunHkGZ+YH
 LKPU+PiPnXhQ15EZzhzt8Eol7xkdnFK71DgIUeGJQlI3EOLFqdnFKqU/lG/PI18Xtnan
 +LHfL4HjbuvX2XE31v0tGsSQW14dCgJglb2cpmiHbsZsNV67lz/V3pA2logCLwu163Mt
 z9XYu7oCYSA+Rs/gHpPVEZXwRLWPctAh48zBtZRENXsSHjR0FdR7lTjjM1w7R6v+joox
 3CNO4Q1RYw9lzsF9LBfx37i08/RISnDOjheKmaFPifXiKKBa7jMLssnk0pDjimdVQibV
 PNQg==
X-Gm-Message-State: AOAM533SRrxNWQveu2TnIODK3HuSEWvnFJhhktlGucr/qvCAnSVH5Sdq
 7eyiTjElTMEyBC4u7Wz1UcSpK05i
X-Google-Smtp-Source: ABdhPJy/bXRtSe03lQJGhhGW5QpAIMWLiu34p7/xKCYVg8egb1LnSfV1K2a89L10JSuvFt25B3LqMA==
X-Received: by 2002:a37:6384:: with SMTP id x126mr4024551qkb.355.1589556822828; 
 Fri, 15 May 2020 08:33:42 -0700 (PDT)
Received: from vhost2
 (CPE001143542e1f-CMf81d0f809fa0.cpe.net.cable.rogers.com. [99.230.38.42])
 by smtp.gmail.com with ESMTPSA id c25sm1789378qkm.119.2020.05.15.08.33.42
 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256);
 Fri, 15 May 2020 08:33:42 -0700 (PDT)
From: Noam Postavsky <npostavs@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN> <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
 <835zcxgrby.fsf@HIDDEN>
Date: Fri, 15 May 2020 11:33:40 -0400
In-Reply-To: <835zcxgrby.fsf@HIDDEN> (Eli Zaretskii's message of "Fri, 15 May
 2020 18:17:53 +0300")
Message-ID: <85wo5dfc17.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (windows-nt)
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
Cc: =?iso-8859-1?Q?Cl=E9ment?= Pit-Claudel <cpitclaudel@HIDDEN>,
 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Eli Zaretskii <eliz@HIDDEN> writes:

>> Done for frame-face-alist.  But how can one do a read-only variable?
>> Using the new variable watchers facility?
>
> At the very least mention in the doc string.  I don't think using
> watchable symbols is needed here, it sounds gross.  If there's an
> outcry that this breaks too much code out there, we could revisit
> this.

You can use make_symbol_constant to make a variable read-only.  You
could also simulate it with a variable watcher that signals an error,
but there's no sense in doing that when make_symbol_constant exists.

Neither of these makes the list object itself read-only though.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 15:18:17 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 11:18:17 2020
Received: from localhost ([127.0.0.1]:38488 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZc6L-0003o1-5g
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 11:18:17 -0400
Received: from eggs.gnu.org ([209.51.188.92]:43348)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1jZc6I-0003nl-UB
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 11:18:15 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:43269)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jZc6C-0006Kp-NJ; Fri, 15 May 2020 11:18:08 -0400
Received: from [176.228.60.248] (port=4485 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jZc6B-0007nx-3R; Fri, 15 May 2020 11:18:07 -0400
Date: Fri, 15 May 2020 18:17:53 +0300
Message-Id: <835zcxgrby.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
In-Reply-To: <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN> (message from
 =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel on Fri, 15 May 2020 10:59:36 -0400)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN> <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Cc: 41200 <at> debbugs.gnu.org
> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
> Date: Fri, 15 May 2020 10:59:36 -0400
> 
> > I'd like to keep the old face-new-frame-defaults and frame-face-alist
> > for compatibility, but mention in the doc strings that they no longer
> > return modifiable values, and perhaps deprecate them.
> 
> Done for frame-face-alist.  But how can one do a read-only variable?  Using the new variable watchers facility?

At the very least mention in the doc string.  I don't think using
watchable symbols is needed here, it sounds gross.  If there's an
outcry that this breaks too much code out there, we could revisit
this.

> >> * The name face_hash isn't ideal, since there's already a distinct notion of face hashes (hash codes).  Can you think of a better name? 
> > 
> > face_hash_table?
> 
> Thanks, good idea.  I also liked Stefan's frame_face_map.

"Map" is too general, IMO, it doesn't tell enough about the kind of
object it is.

> >> +  // QUESTION: is this where this should be initialized?
> > 
> > Yes, I think so.  But do we need to do anything when frame is deleted
> > as well?
> 
> I'm not sure (I don't know how garbage collection works on the C side in Elisp; I assumed the map would be collected).

I guess so.

> > You mean, frame-face-alist, right?  Yes, most definitely: I imagine a
> > lot of code out there uses that, and we wouldn't want to break that.
> 
> Done.
> 
> I looked around, but I didn't find many uses at all (for example, there are none in ELPA).  I think this is likely because the function is documented as "For internal use only."
> 
> There are no uses of face-new-frame-defaults in ELPA either; online, I found many copies of lisp-mode and emacs-lisp-mode, which refer it, and a few functions derived from edebug-eval-defun, which references it.

That means we will probably be able to remove it earlier than I
feared.

> > And I'm not sure we should have it only in Lisp: perhaps we should
> > maintain the alist as well, and add/remove to/from it when a face is
> > added or removed in the hash table.  Otherwise this change of
> > internals will have painful effect on packages that use the current
> > APIs.
> 
> frame-face-alist is likely less crucial than face-new-frame-defaults, because it was already a function, so the return value has to be mutated in place to modify it (it couldn't be directly assigned).  For both of these, however, how would we ensure that the alist remains in sync with the hashmap (that is, how do we catch modifications?)

I thought about updating the alist when the hash-table is modified.
Since you always know whether the face is already in the hash-table,
you don't need to scan the alist looking for it.

I'd really like to know that no one is using these before we make the
final decision about this.

> >> +	  Lisp_Object lface = HASH_KEY(table, idx);
> >> +          Lisp_Object face_id = Fget (lface, Qface);
> >> +          // FIXME why is (get 'tab-line 'face) 0?
> > 
> > A bug, I guess.
> 
> As far as I can see, these IDs are assigned by Finternal_make_lisp_face, and I *think* it is never called for tab-line?

Most probably.

> Should I make sure that it is?

Yes, I think so.

> If so, where from?

I think the problem is that tab-line is declared a basic face, but its
defface form is not in faces.el.

> >> +          if (!FIXNATP (face_id))
> >> +            // FIXME: I'm not sure what to do in this case
> > 
> > I'm not sure I understand why do you need to look at the existing
> > face's 'face' property?  The original code didn't.
> 
> The original code iterated over face-frame-alist in the order in which entries were added to it.  If I understand correctly, iteration order isn't guaranteed on hash tables (is it?), so I had to find a different source of truth for these.

Maybe we should store the ID with the face?  I think we wanted to get
rid of the 'face' property of the faces at some point.

> >>    DEFVAR_LISP ("face-new-frame-defaults", Vface_new_frame_defaults,
> >>      doc: /* List of global face definitions (for internal use only.)  */);
> >> -  Vface_new_frame_defaults = Qnil;
> >> +  Vface_new_frame_defaults =
> >> +    make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
> >> +                     DEFAULT_REHASH_THRESHOLD, Qnil, Qnil);
> > 
> > Why do we need to start with a non-default hash-table?
> 
> I wanted to use `eq' instead of `eql' as the test (is that what you were asking?)

No, I was asking why not start with it as nil and actually make a
hash-table when we first need it.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 14:59:47 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 10:59:46 2020
Received: from localhost ([127.0.0.1]:38467 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZboQ-00011x-4H
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 10:59:46 -0400
Received: from mail-qk1-f173.google.com ([209.85.222.173]:44660)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jZboO-00011g-I0
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 10:59:45 -0400
Received: by mail-qk1-f173.google.com with SMTP id b6so2774746qkh.11
 for <41200 <at> debbugs.gnu.org>; Fri, 15 May 2020 07:59:44 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:cc:references:from:message-id:date:user-agent
 :mime-version:in-reply-to:content-language;
 bh=UsMYgset5nGusdhgmMfFdgV2cZxg5QQZrABcZZzB3bI=;
 b=HVfHUsFIx6L+dKdSGKIJhAPIjtlqRh8E4G5r59F5Ki1wKX95lxChfG+Qs/PjzleQlo
 LF7FEIcBiouN6zTyBbpTH+yf5sZ/shRf5gIKpmVcseXAiuNishrNJK4tQ3DXk3q2+a+7
 2k5xXhw07BoppL9ozUOLvPe1AIFdnn/ol1+l5+WvJ+fe+fgbgcrpT1+pDDgUNZuPu99N
 lq+wlXtw4BDG/pAXudo0/WJQbIrtF7uUu5QjbrLDBjup2/srdwXh9lbGvOxEJfaP4SMd
 bMbjv691oXQBR/IbeUPCSAUb+ufGDzHzGqHwCd46vk4jq0yMOu5h6a+/oTnHtDMdwGjG
 chYg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:cc:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language;
 bh=UsMYgset5nGusdhgmMfFdgV2cZxg5QQZrABcZZzB3bI=;
 b=EyR+Qbf2BLtOmnqZknwtiDvw9bN3evziAI4/nD/Dkv12leMUNE+kqygS1Z7WmSIzQ5
 IAhNnGEf64d3Tw5hZ3PfYHCQ/5kuC6cXEcR+fAh4P1gdRyn9xeDlC7PHdr5sWYralMQw
 HpCQlytXJTyjQ6EFKM7qxmKuLBFKWi25+LExaLmOaEFNkFo+FEsJz+hmLc1I1/sYtmmN
 kG2dF/IQXOW7LGOx4/MFIb+jWn7WS0qgbOuCg1EbK3fKke6QRs4TgLZ5fGO/6hNcdZxp
 fYhKBZBxkagizqZIoLc7d5tCHYS4HFrczgqkf+eIWY8AucpGbPhrV1Ff1Yq60KRPl0HX
 sFyw==
X-Gm-Message-State: AOAM531kOxHr4ARLexsLzZ1N3viXJmVyYPqtUD7zbKTzOMiLpi3Gw99c
 4RwKiFE2MpyBMe3teCazxD9ItZWP
X-Google-Smtp-Source: ABdhPJxA9wPQgdWbw0o8XcE8Hu8rjal6RpPOraOra2aiwHwW0W5IO15PI2RL7dQvQHX4x6M1zJas/w==
X-Received: by 2002:a05:620a:4c9:: with SMTP id
 9mr2136702qks.487.1589554778632; 
 Fri, 15 May 2020 07:59:38 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id x20sm2199987qtc.3.2020.05.15.07.59.37
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Fri, 15 May 2020 07:59:37 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: Eli Zaretskii <eliz@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <837dxd31cb.fsf@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <789d786d-a07a-65c1-c0e4-433e4c18d64e@HIDDEN>
Date: Fri, 15 May 2020 10:59:36 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <837dxd31cb.fsf@HIDDEN>
Content-Type: multipart/mixed; boundary="------------BE1646C852BDDA7C590FE83E"
Content-Language: en-GB
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

This is a multi-part message in MIME format.
--------------BE1646C852BDDA7C590FE83E
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit

Hi Eli,

Thanks a lot for the review.  I have attached an updated version of the patch.

On 15/05/2020 07.05, Eli Zaretskii wrote:
> I'd like to keep the old face-new-frame-defaults and frame-face-alist
> for compatibility, but mention in the doc strings that they no longer
> return modifiable values, and perhaps deprecate them.

Done for frame-face-alist.  But how can one do a read-only variable?  Using the new variable watchers facility?

>> * The name face_hash isn't ideal, since there's already a distinct notion of face hashes (hash codes).  Can you think of a better name? 
> 
> face_hash_table?

Thanks, good idea.  I also liked Stefan's frame_face_map.

>> +  // QUESTION: is this where this should be initialized?
> 
> Yes, I think so.  But do we need to do anything when frame is deleted
> as well?

I'm not sure (I don't know how garbage collection works on the C side in Elisp; I assumed the map would be collected).

>> -DEFUN ("frame-face-alist", Fframe_face_alist, Sframe_face_alist,
>> +// QUESTION: Should I add an ELisp version of frame-face-hash?
> 
> You mean, frame-face-alist, right?  Yes, most definitely: I imagine a
> lot of code out there uses that, and we wouldn't want to break that.

Done.

I looked around, but I didn't find many uses at all (for example, there are none in ELPA).  I think this is likely because the function is documented as "For internal use only."

There are no uses of face-new-frame-defaults in ELPA either; online, I found many copies of lisp-mode and emacs-lisp-mode, which refer it, and a few functions derived from edebug-eval-defun, which references it.

> And I'm not sure we should have it only in Lisp: perhaps we should
> maintain the alist as well, and add/remove to/from it when a face is
> added or removed in the hash table.  Otherwise this change of
> internals will have painful effect on packages that use the current
> APIs.

frame-face-alist is likely less crucial than face-new-frame-defaults, because it was already a function, so the return value has to be mutated in place to modify it (it couldn't be directly assigned).  For both of these, however, how would we ensure that the alist remains in sync with the hashmap (that is, how do we catch modifications?)

>> +	  Lisp_Object lface = HASH_KEY(table, idx);
>> +          Lisp_Object face_id = Fget (lface, Qface);
>> +          // FIXME why is (get 'tab-line 'face) 0?
> 
> A bug, I guess.

As far as I can see, these IDs are assigned by Finternal_make_lisp_face, and I *think* it is never called for tab-line?  Should I make sure that it is? If so, where from?

> 
>> +          if (!FIXNATP (face_id))
>> +            // FIXME: I'm not sure what to do in this case
> 
> I'm not sure I understand why do you need to look at the existing
> face's 'face' property?  The original code didn't.

The original code iterated over face-frame-alist in the order in which entries were added to it.  If I understand correctly, iteration order isn't guaranteed on hash tables (is it?), so I had to find a different source of truth for these.

> 
>>    DEFVAR_LISP ("face-new-frame-defaults", Vface_new_frame_defaults,
>>      doc: /* List of global face definitions (for internal use only.)  */);
>> -  Vface_new_frame_defaults = Qnil;
>> +  Vface_new_frame_defaults =
>> +    make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
>> +                     DEFAULT_REHASH_THRESHOLD, Qnil, Qnil);
> 
> Why do we need to start with a non-default hash-table?

I wanted to use `eq' instead of `eql' as the test (is that what you were asking?)


--------------BE1646C852BDDA7C590FE83E
Content-Type: text/x-patch; charset=UTF-8;
 name="0001-Store-frame-faces-in-hash-tables-instead-of-alists.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0001-Store-frame-faces-in-hash-tables-instead-of-alists.patc";
 filename*1="h"

From 86ea2f96e4e3a2161f68f13b251620b98489fd35 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Pit-Claudel?= <clement.pitclaudel@HIDDEN>
Date: Tue, 12 May 2020 21:48:32 -0400
Subject: [PATCH] Store frame faces in hash tables instead of alists

* lisp/emacs-lisp/edebug.el (edebug-eval-defun):
* lisp/progmodes/elisp-mode.el (elisp--eval-defun-1):
* lisp/frame.el (frame-set-background-mode):
* lisp/faces.el (face-list): Update to work with hash
tables instead of alists.
(frame-face-alist): Reimplement using frame-face-map.

* src/frame.h (struct frame): Remove face_alist, add face_map.
(fset_face_alist): Remove.
(fset_face_map): New function.
* src/frame.c (make_frame): Initialize f->face_map.
(Fmake_terminal_frame): Update to work with hash tables instead of
alists.
* src/xfaces.c (lface_from_face_name_no_resolve):
(Finternal_make_lisp_face):
(update_face_from_frame_parameter): Update to work with hash tables
instead of alists.
* src/xfaces.c (Fframe_face_map): New function.
(Fframe_face_alist): Move to face.el.
(init_xfaces): Compute face IDs from they face property, not from
their position in face_alist.
(syms_of_xfaces): Remove frame_face_alist, add frame_face_map;
change Vface_new_frame_defaults into a hash table.
---
 lisp/emacs-lisp/edebug.el    |  3 +-
 lisp/faces.el                | 13 +++++++-
 lisp/frame.el                |  2 +-
 lisp/progmodes/elisp-mode.el |  3 +-
 src/frame.c                  | 20 +++++++----
 src/frame.h                  |  8 ++---
 src/xfaces.c                 | 65 +++++++++++++++++++-----------------
 7 files changed, 67 insertions(+), 47 deletions(-)

diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index 78461185d3..97ca964eef 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -488,8 +488,7 @@ edebug-eval-defun
 	   (set-default (nth 1 form) (eval (nth 2 form) lexical-binding)))
           ((eq (car form) 'defface)
            ;; Reset the face.
-           (setq face-new-frame-defaults
-                 (assq-delete-all (nth 1 form) face-new-frame-defaults))
+           (remhash (nth 1 form) face-new-frame-defaults)
            (put (nth 1 form) 'face-defface-spec nil)
            (put (nth 1 form) 'face-documentation (nth 3 form))
 	   ;; See comments in `eval-defun-1' for purpose of code below
diff --git a/lisp/faces.el b/lisp/faces.el
index e707f6f4b6..c45921bb48 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -176,10 +176,21 @@ face-font-registry-alternatives
 ;;; Creation, copying.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(defun frame-face-alist (&optional frame)
+  "Return an alist of frame-local faces defined on FRAME.
+This alist is a copy of the contents of `frame-face-map'.
+For internal use only."
+  (declare (obsolete frame-face-map "28.1"))
+  (let ((faces))
+    (maphash (lambda (face spec) (push (cons face spec) faces))
+             (frame-face-map frame))
+    faces))
 
 (defun face-list ()
   "Return a list of all defined faces."
-  (mapcar #'car face-new-frame-defaults))
+  (let ((faces nil))
+    (maphash (lambda (face _) (push face faces)) face-new-frame-defaults)
+    faces))
 
 (defun make-face (face)
   "Define a new face with name FACE, a symbol.
diff --git a/lisp/frame.el b/lisp/frame.el
index 6c2f774709..14c9112aad 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -1227,7 +1227,7 @@ frame-set-background-mode
                          ;; during startup with -rv on the command
                          ;; line for the initial frame, because frames
                          ;; are not recorded in the pdump file.
-                         (assq face (frame-face-alist))
+                         (gethash face (frame-face-map))
                          (face-spec-match-p face
                                             (face-user-default-spec face)
                                             ;; FIXME: why selected-frame and
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index b737134f90..dc8688c864 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -1304,8 +1304,7 @@ elisp--eval-defun-1
 	((eq (car form) 'custom-declare-face)
 	 ;; Reset the face.
 	 (let ((face-symbol (eval (nth 1 form) lexical-binding)))
-	   (setq face-new-frame-defaults
-		 (assq-delete-all face-symbol face-new-frame-defaults))
+	   (remhash face-new-frame-defaults face-symbol)
 	   (put face-symbol 'face-defface-spec nil)
 	   (put face-symbol 'face-override-spec nil))
 	 form)
diff --git a/src/frame.c b/src/frame.c
index c871e4fd99..514b390910 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -946,6 +946,10 @@ make_frame (bool mini_p)
   rw->total_lines = mini_p ? 9 : 10;
   rw->pixel_height = rw->total_lines * FRAME_LINE_HEIGHT (f);
 
+  fset_face_map
+    (f, make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
+                         DEFAULT_REHASH_THRESHOLD, Qnil, false));
+
   if (mini_p)
     {
       mw->top_line = rw->total_lines;
@@ -1254,7 +1258,7 @@ DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
 {
   struct frame *f;
   struct terminal *t = NULL;
-  Lisp_Object frame, tem;
+  Lisp_Object frame;
   struct frame *sf = SELECTED_FRAME ();
 
 #ifdef MSDOS
@@ -1336,14 +1340,16 @@ DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
   store_in_alist (&parms, Qminibuffer, Qt);
   Fmodify_frame_parameters (frame, parms);
 
-  /* Make the frame face alist be frame-specific, so that each
+  /* Make the frame face hash be frame-specific, so that each
      frame could change its face definitions independently.  */
-  fset_face_alist (f, Fcopy_alist (sf->face_alist));
-  /* Simple Fcopy_alist isn't enough, because we need the contents of
-     the vectors which are the CDRs of associations in face_alist to
+  fset_face_map (f, Fcopy_hash_table (sf->face_map));
+  /* Simple copy_hash_table isn't enough, because we need the contents of
+     the vectors which are the values in face_map to
      be copied as well.  */
-  for (tem = f->face_alist; CONSP (tem); tem = XCDR (tem))
-    XSETCDR (XCAR (tem), Fcopy_sequence (XCDR (XCAR (tem))));
+  ptrdiff_t idx = 0;
+  struct Lisp_Hash_Table *table = XHASH_TABLE (f->face_map);
+  for (idx = 0; idx < table->count; ++idx)
+    set_hash_value_slot (table, idx, Fcopy_sequence (HASH_VALUE (table, idx)));
 
   f->can_set_window_size = true;
   f->after_make_frame = true;
diff --git a/src/frame.h b/src/frame.h
index 476bac67fa..f8915b3c1a 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -158,8 +158,8 @@ #define EMACS_FRAME_H
      There are four additional elements of nil at the end, to terminate.  */
   Lisp_Object menu_bar_items;
 
-  /* Alist of elements (FACE-NAME . FACE-VECTOR-DATA).  */
-  Lisp_Object face_alist;
+  /* Hash table of FACE-NAME keys and FACE-VECTOR-DATA values.  */
+  Lisp_Object face_map;
 
   /* A vector that records the entire structure of this frame's menu bar.
      For the format of the data, see extensive comments in xmenu.c.
@@ -661,9 +661,9 @@ fset_condemned_scroll_bars (struct frame *f, Lisp_Object val)
   f->condemned_scroll_bars = val;
 }
 INLINE void
-fset_face_alist (struct frame *f, Lisp_Object val)
+fset_face_map (struct frame *f, Lisp_Object val)
 {
-  f->face_alist = val;
+  f->face_map = val;
 }
 #if defined (HAVE_WINDOW_SYSTEM)
 INLINE void
diff --git a/src/xfaces.c b/src/xfaces.c
index 7d7aff95c1..89e9a10a0a 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -1843,13 +1843,11 @@ lface_from_face_name_no_resolve (struct frame *f, Lisp_Object face_name,
   Lisp_Object lface;
 
   if (f)
-    lface = assq_no_quit (face_name, f->face_alist);
+    lface = Fgethash (face_name, f->face_map, Qnil);
   else
-    lface = assq_no_quit (face_name, Vface_new_frame_defaults);
+    lface = Fgethash (face_name, Vface_new_frame_defaults, Qnil);
 
-  if (CONSP (lface))
-    lface = XCDR (lface);
-  else if (signal_p)
+  if (signal_p && NILP (lface))
     signal_error ("Invalid face", face_name);
 
   check_lface (lface);
@@ -2736,8 +2734,7 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
     {
       global_lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
       ASET (global_lface, 0, Qface);
-      Vface_new_frame_defaults = Fcons (Fcons (face, global_lface),
-					Vface_new_frame_defaults);
+      Fputhash (face, global_lface, Vface_new_frame_defaults);
 
       /* Assign the new Lisp face a unique ID.  The mapping from Lisp
 	 face id to Lisp face is given by the vector lface_id_to_name.
@@ -2763,7 +2760,7 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
 	{
 	  lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
 	  ASET (lface, 0, Qface);
-	  fset_face_alist (f, Fcons (Fcons (face, lface), f->face_alist));
+	  Fputhash (face, lface, f->face_map);
 	}
       else
 	for (i = 1; i < LFACE_VECTOR_SIZE; ++i)
@@ -3508,7 +3505,7 @@ update_face_from_frame_parameter (struct frame *f, Lisp_Object param,
   /* If there are no faces yet, give up.  This is the case when called
      from Fx_create_frame, and we do the necessary things later in
      face-set-after-frame-defaults.  */
-  if (NILP (f->face_alist))
+  if (XFIXNAT (Fhash_table_count (f->face_map)) == 0)
     return;
 
   if (EQ (param, Qforeground_color))
@@ -4174,14 +4171,13 @@ DEFUN ("internal-lisp-face-empty-p", Finternal_lisp_face_empty_p,
   return i == LFACE_VECTOR_SIZE ? Qt : Qnil;
 }
 
-
-DEFUN ("frame-face-alist", Fframe_face_alist, Sframe_face_alist,
+DEFUN ("frame-face-map", Fframe_face_map, Sframe_face_map,
        0, 1, 0,
-       doc: /* Return an alist of frame-local faces defined on FRAME.
+       doc: /* Return a hash table of frame-local faces defined on FRAME.
 For internal use only.  */)
   (Lisp_Object frame)
 {
-  return decode_live_frame (frame)->face_alist;
+  return decode_live_frame (frame)->face_map;
 }
 
 
@@ -6678,30 +6674,37 @@ DEFUN ("show-face-resources", Fshow_face_resources, Sshow_face_resources,
 
 #ifdef HAVE_PDUMPER
 /* All the faces defined during loadup are recorded in
-   face-new-frame-defaults, with the last face first in the list.  We
-   need to set next_lface_id to the next face ID number, so that any
-   new faces defined in this session will have face IDs different from
-   those defined during loadup.  We also need to set up the
-   lface_id_to_name[] array for the faces that were defined during
-   loadup.  */
+   face-new-frame-defaults.  We need to set next_lface_id to the next
+   face ID number, so that any new faces defined in this session will
+   have face IDs different from those defined during loadup.  We also
+   need to set up the lface_id_to_name[] array for the faces that were
+   defined during loadup.  */
 void
 init_xfaces (void)
 {
-  if (CONSP (Vface_new_frame_defaults))
+  int nfaces = XFIXNAT (Fhash_table_count (Vface_new_frame_defaults));
+  if (nfaces > 0)
     {
       /* Allocate the lface_id_to_name[] array.  */
-      lface_id_to_name_size = next_lface_id =
-	XFIXNAT (Flength (Vface_new_frame_defaults));
+      lface_id_to_name_size = next_lface_id = nfaces;
       lface_id_to_name = xnmalloc (next_lface_id, sizeof *lface_id_to_name);
 
       /* Store the faces.  */
-      Lisp_Object tail;
-      int i = next_lface_id - 1;
-      for (tail = Vface_new_frame_defaults; CONSP (tail); tail = XCDR (tail))
+      struct Lisp_Hash_Table* table = XHASH_TABLE (Vface_new_frame_defaults);
+      for (ptrdiff_t idx = 0; idx < nfaces; ++idx)
 	{
-	  Lisp_Object lface = XCAR (tail);
-	  eassert (i >= 0);
-	  lface_id_to_name[i--] = XCAR (lface);
+	  Lisp_Object lface = HASH_KEY (table, idx);
+          Lisp_Object face_id = Fget (lface, Qface);
+          // FIXME why is (get 'tab-line 'face) 0?
+          if (!FIXNATP (face_id))
+            // FIXME: I'm not sure what to do in this case
+            printf ("Face %s has no id\n",  SDATA (SYMBOL_NAME (lface)));
+          else
+            {
+              int id = XFIXNAT (face_id);
+              eassert (id >= 0);
+              lface_id_to_name[id] = lface;
+            }
 	}
     }
   face_attr_sym[0] = Qface;
@@ -6855,7 +6858,7 @@ syms_of_xfaces (void)
   defsubr (&Sinternal_copy_lisp_face);
   defsubr (&Sinternal_merge_in_global_face);
   defsubr (&Sface_font);
-  defsubr (&Sframe_face_alist);
+  defsubr (&Sframe_face_map);
   defsubr (&Sdisplay_supports_face_attributes_p);
   defsubr (&Scolor_distance);
   defsubr (&Sinternal_set_font_selection_order);
@@ -6881,7 +6884,9 @@ syms_of_xfaces (void)
 
   DEFVAR_LISP ("face-new-frame-defaults", Vface_new_frame_defaults,
     doc: /* List of global face definitions (for internal use only.)  */);
-  Vface_new_frame_defaults = Qnil;
+  Vface_new_frame_defaults =
+    make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
+                     DEFAULT_REHASH_THRESHOLD, Qnil, false);
 
   DEFVAR_LISP ("face-default-stipple", Vface_default_stipple,
     doc: /* Default stipple pattern used on monochrome displays.
-- 
2.17.1


--------------BE1646C852BDDA7C590FE83E--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 14:34:45 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 10:34:45 2020
Received: from localhost ([127.0.0.1]:38438 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZbQC-0000BA-U0
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 10:34:45 -0400
Received: from eggs.gnu.org ([209.51.188.92]:34080)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1jZbQB-0000At-3R
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 10:34:43 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:42551)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jZbQ5-0007XF-NS; Fri, 15 May 2020 10:34:37 -0400
Received: from [176.228.60.248] (port=1834 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jZbQ1-00028C-VB; Fri, 15 May 2020 10:34:34 -0400
Date: Fri, 15 May 2020 17:34:22 +0300
Message-Id: <83k11d1d3l.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Stefan Monnier <monnier@HIDDEN>
In-Reply-To: <jwvlfltl3qa.fsf-monnier+emacs@HIDDEN> (message from Stefan
 Monnier on Fri, 15 May 2020 10:03:44 -0400)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
References: <jwvlfltl3qa.fsf-monnier+emacs@HIDDEN>
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: cpitclaudel@HIDDEN, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Stefan Monnier <monnier@HIDDEN>
> Cc: Eli Zaretskii <eliz@HIDDEN>, 41200 <at> debbugs.gnu.org
> Date: Fri, 15 May 2020 10:03:44 -0400
> 
> I'm hoping it can make it into Emacs-27.1, tho it is probably rather
> late for such a significant change.

It's too late.  Such a significant change on such a low level is got
to cause some issues, especially as parts of it are
backward-incompatible.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 14:04:08 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 10:04:08 2020
Received: from localhost ([127.0.0.1]:38227 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZawZ-0005Tn-Nk
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 10:04:08 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:24153)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <monnier@HIDDEN>) id 1jZawY-0005TO-Qr
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 10:04:07 -0400
Received: from pmg2.iro.umontreal.ca (localhost.localdomain [127.0.0.1])
 by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id 622558081D;
 Fri, 15 May 2020 10:04:01 -0400 (EDT)
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id 1BA87806A5;
 Fri, 15 May 2020 10:03:59 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1589551439;
 bh=9ga0gpLL3w551GG+c8W5y3aygVWhXJvr+LOlVL6HbAM=;
 h=From:To:Cc:Subject:Date:In-Reply-To:From;
 b=lcm78NmZtok75TjbTRnvee0j7OpXWQOkHai14UG1SOywV+f001u6ViEfG4oLQqQMK
 jAykrUpv0+L+2dF1qCetYax7InP3Z0Tj7BSBYf4GQOvM/RAheq5b/X/0bG36GsVlQB
 uWhmuRT3Uogv9knthKmk1SiBWCb4JYuuFEZQDNuc/nhvVZu4o0AL2viKlNlFQqAdsv
 KK6Qq0pQLBcDVaj6CFt1oSGcWJXR9H7QUmowxDSQ/z7KCvI87EeXvJuW0RnNcecWD9
 9Kp/LaZIWOO+7yDJxnzyu8nagDs5jBrcbVe3S1M+/MiTOyffq4G1mY2bKBqmmhWike
 00jtxRNO5qr1w==
Received: from alfajor (unknown [216.154.3.202])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id 4580A120736;
 Fri, 15 May 2020 10:03:58 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: =?windows-1252?Q?Cl=E9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
Subject: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
Message-ID: <jwvlfltl3qa.fsf-monnier+emacs@HIDDEN>
Date: Fri, 15 May 2020 10:03:44 -0400
In-Reply-To: nobody's message of "(unknown date)"
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL -0.085 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: Eli Zaretskii <eliz@HIDDEN>, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Indeed, you're completely right; thanks!  Replacing face_alist and
> Vface_new_frame_defaults with hash tables makes the worst example
> about 10 times faster, and with that change tooltips now take 30 to
> 50ms to display instead of 500-600ms in my real-life use case (my
> usual config).  I have attached a patch.

Oh, this is great, makes a very noticeable difference.

I'm hoping it can make it into Emacs-27.1, tho it is probably rather
late for such a significant change.

> * I removed the function frame-face-alist and changed the type of the
> variable face-new-frame-defaults.  Both were documented as internal.
> Should I add an ELisp implementation of frame-face-alist for
> compatibility?  (It wouldn't be a perfect shim, since modifying its
> return value wouldn't do the same).  For face-new-frame-defaults it's
> a bit trickier, since the variable now holds a hash table.
> Should I change its name to make the change obvious, at least?

The variable's name did not say "alist", so I don't see a need to change
it from that point of view.  But I think it deserves a "--" since it's
supposed to be internal.

A quick grep revealed:

    elpa/packages/context-coloring/fixtures/benchmark/faces.el:  (mapcar #'car face-new-frame-defaults))

That doesn't seem very serious, but I haven't grep'd the MELPA packages.
I saw no such comparable use of `frame-face-alist` in the wild.

> * The name face_hash isn't ideal, since there's already a distinct
> notion of face hashes (hash codes).  Can you think of a better name?

Yes: it's not a hash, it's a table.

I think the better names refer to the "conceptual" type rather than the
specific implementation type, so I prefer "map" or "table" to "hash",
"alist", "obarray", and whatnot.

> - command-execute                                                 454  47%
[...]
>            - face-set-after-frame-default                         387  40%
>             - face-spec-recalc                                    374  39%
>              - make-face-x-resource-internal                      296  30%
>               - set-face-attributes-from-resources                273  28%
>                - set-face-attribute-from-resource                 219  22%

[...]

> - command-execute                                                 768  80%
[...]
>                       - face-set-after-frame-default              674  70%
>                        - face-spec-recalc                         660  69%
>                         - face-spec-set-2                         350  36%
>                          - apply                                  348  36%
>                           - set-face-attribute                    342  35%
>                            - internal-set-lisp-face-attribute     342  35%
>                             - frame-set-background-mode           331  34%
>                              - face-spec-recalc                   284  29%
>                               - make-face-x-resource-internal     235  24%

Both of those profiles suggest that most of the time is still spent in
`face-spec-recalc`, so it would be worth trying harder to avoid calling
it or to speed it up somehow (presumably with some better memozing/caching).

The first profile also suggests that we spend too much time in
`make-face-x-resource-internal`.

What caught my eye in the second profile is the fact that we call
`face-spec-recalc` recursively.  I suspect that recursion is not desired.


        Stefan


PS: Maybe another way to speed this up is to do the `face-spec-recalc`
lazily (i.e. only when we encounter the face during redisplay), but
that's probably harder to do and not as good (since it will still be
slow in the case where the frame happens to display hundreds of faces).





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 15 May 2020 11:05:45 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 15 07:05:45 2020
Received: from localhost ([127.0.0.1]:35986 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jZY9w-0006wg-Pz
	for submit <at> debbugs.gnu.org; Fri, 15 May 2020 07:05:45 -0400
Received: from eggs.gnu.org ([209.51.188.92]:46580)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1jZY9v-0006wN-CX
 for 41200 <at> debbugs.gnu.org; Fri, 15 May 2020 07:05:43 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:34554)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jZY9q-0006rd-5u; Fri, 15 May 2020 07:05:38 -0400
Received: from [176.228.60.248] (port=4703 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jZY9p-0003HL-7H; Fri, 15 May 2020 07:05:38 -0400
Date: Fri, 15 May 2020 14:05:24 +0300
Message-Id: <837dxd31cb.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
In-Reply-To: <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN> (message from
 =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel on Tue, 12 May 2020 22:41:24 -0400)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Cc: 41200 <at> debbugs.gnu.org
> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
> Date: Tue, 12 May 2020 22:41:24 -0400
> 
> > So I think if we want to support such large amounts of faces, we
> > should not store them in alists, but in a more efficient data
> > structure.
> 
> Indeed, you're completely right; thanks!  Replacing face_alist and Vface_new_frame_defaults with hash tables makes the worst example about 10 times faster, and with that change tooltips now take 30 to 50ms to display instead of 500-600ms in my real-life use case (my usual config).  I have attached a patch.
> 
> I left a few questions in the code; I hope that's OK.  I have a few more questions that are not part of the code:
> 
> * I removed the function frame-face-alist and changed the type of the variable face-new-frame-defaults.  Both were documented as internal.  Should I add an ELisp implementation of frame-face-alist for compatibility?  (It wouldn't be a perfect shim, since modifying its return value wouldn't do the same).  For face-new-frame-defaults it's a bit trickier, since the variable now holds a hash table.  Should I change its name to make the change obvious, at least? 

I'd like to keep the old face-new-frame-defaults and frame-face-alist
for compatibility, but mention in the doc strings that they no longer
return modifiable values, and perhaps deprecate them.

> * The name face_hash isn't ideal, since there's already a distinct notion of face hashes (hash codes).  Can you think of a better name? 

face_hash_table?

> * I imagine that this change needs to be advertised somewhere, but I'm not sure where; NEWS?

Let's think about this after we figured out what changes are needed in
the current functions and variables.

> Lastly, do the following new profiles suggest other opportunities for improvement?

I don't think so, but if the behavior is now linear or sub-linear,
it's the best we can expect, since creating a new frame must walk over
all the faces.

> +  // QUESTION: is this where this should be initialized?

Yes, I think so.  But do we need to do anything when frame is deleted
as well?

> +  fset_face_hash
> +    (f, make_hash_table(hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
                         ^^
Our C coding conventions are to leave one space between the function's
name and the opening parenthesis (here and elsewhere in the patch).

> -DEFUN ("frame-face-alist", Fframe_face_alist, Sframe_face_alist,
> +// QUESTION: Should I add an ELisp version of frame-face-hash?

You mean, frame-face-alist, right?  Yes, most definitely: I imagine a
lot of code out there uses that, and we wouldn't want to break that.

And I'm not sure we should have it only in Lisp: perhaps we should
maintain the alist as well, and add/remove to/from it when a face is
added or removed in the hash table.  Otherwise this change of
internals will have painful effect on packages that use the current
APIs.

> +	  Lisp_Object lface = HASH_KEY(table, idx);
> +          Lisp_Object face_id = Fget (lface, Qface);
> +          // FIXME why is (get 'tab-line 'face) 0?

A bug, I guess.

> +          if (!FIXNATP (face_id))
> +            // FIXME: I'm not sure what to do in this case

I'm not sure I understand why do you need to look at the existing
face's 'face' property?  The original code didn't.

>    DEFVAR_LISP ("face-new-frame-defaults", Vface_new_frame_defaults,
>      doc: /* List of global face definitions (for internal use only.)  */);
> -  Vface_new_frame_defaults = Qnil;
> +  Vface_new_frame_defaults =
> +    make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
> +                     DEFAULT_REHASH_THRESHOLD, Qnil, Qnil);

Why do we need to start with a non-default hash-table?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.
Merged 41200 41267. Request was from Eli Zaretskii <eliz@HIDDEN> to control <at> debbugs.gnu.org. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 13 May 2020 17:43:02 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed May 13 13:43:02 2020
Received: from localhost ([127.0.0.1]:59427 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYvPJ-0000vM-S4
	for submit <at> debbugs.gnu.org; Wed, 13 May 2020 13:43:02 -0400
Received: from mout.gmx.net ([212.227.17.21]:49729)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rudalics@HIDDEN>) id 1jYvPI-0000v3-NX
 for 41200 <at> debbugs.gnu.org; Wed, 13 May 2020 13:43:01 -0400
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net;
 s=badeba3b8450; t=1589391774;
 bh=7IvaDB+yNHAT4s/vRY0ya7Q02vMUQzMgnzSUrv/R+98=;
 h=X-UI-Sender-Class:Subject:To:Cc:References:From:Date:In-Reply-To;
 b=eR3Bxh45N0AFdWVvdw4SvkacTtAaq2dho4GNCyrhRhRip8eQJa6nfb13rLRNYjhAR
 x40g5PQX/3SlYatZDFesvQFEndRekAVMv5walv3vYVNSbCXx149EMGI27+Djs4PsGs
 cgrk8l6LOI8tl4PKLQOGJMZcfNsbmu5Rhz/Yxm4g=
X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c
Received: from [192.168.1.100] ([212.95.5.37]) by mail.gmx.com (mrgmx104
 [212.227.17.168]) with ESMTPSA (Nemesis) id 1Mi2O1-1ivilb0ILp-00e8aO; Wed, 13
 May 2020 19:42:54 +0200
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>,
 Eli Zaretskii <eliz@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <a0560d39-ec5c-9a1b-3c82-5005bf4c841a@HIDDEN>
 <956a7cf7-bbf0-e15d-36d4-c82279c15f89@HIDDEN>
From: martin rudalics <rudalics@HIDDEN>
Message-ID: <6ce4613b-970d-0a18-e258-251267730c0c@HIDDEN>
Date: Wed, 13 May 2020 19:42:52 +0200
MIME-Version: 1.0
In-Reply-To: <956a7cf7-bbf0-e15d-36d4-c82279c15f89@HIDDEN>
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Language: en-US
Content-Transfer-Encoding: 7bit
X-Provags-ID: V03:K1:MA6iL47sZFT7ciFHRgKp99DQpddpY6pv50pu7imzHw81OHCh8br
 faiMC6bDQSQ6WlyD9Nlr8cXUkEqf+Z/KKiYbqT+3Y+wWKipmouqERIhujCqyAb8tE0OWfDV
 RKrd6HjVWdAWw82SLZksqWVwlyfA/cz7T77X3OfpbKBIKg4zHNcN8mtqInBTKWoZEwMlgMH
 OePLADCGosNQEWLAJVqUQ==
X-Spam-Flag: NO
X-UI-Out-Filterresults: notjunk:1;V03:K0:bSYiwnlMkho=:39cHrdC/ItgJO9MHuRc3EW
 Pd+Lw6IiHLvYJWlq/zY1utQeg01+0rfDyPAtqB/BQ/2yAOYaA7COd8/aDtHMtEcQAqyaZJC7P
 ZGrQ9uw5WErC3qRVpk71cCf+5kMoLlLdtTH9IUVX4D3PXCzq6vJqr+yyEY0MrvxBviJKNf/UU
 FWYmEimteHYF0WLVtITCexA0k2C0YZRXrQGN7C/BzvKHX5Git6V57riaMk2dih8/04CyM/hTE
 vzflbvOqjit+jr/ayDrn9dREvIm2CDb/SNKNiBKz3CW8dTT1nu4fbyG4GWnBfMHaKtbxo438K
 //mAAr8uOBQMHGajEJcURcqu5JoxBvXZUpkUMu76D69Fts6TVO16KkxfKalN2QL6TpLdgAXhd
 HLWQGcbYzQ8/3/85Bj4Fuv46hFAOWocHSqSMJAyFsKbhIuawzZqKHdyKnJOfGSi1xijlmG5Iz
 yAIP9q26sR6rHAWTfQUr7MSSc+j/uKIv8Miod/R7CjU/SOt0s6B74HzdV/IDWEIMg8exhiSdF
 KG+b3/6wBiJ6/34BMVCTwt6k/cjQeIDRw+vFq99Ym+jXAydTKRzPdF6JqskeyElnM1NSpr4Sp
 R3pV+mJl8FdXqtVXz4rSYfjPJM6iH6v/z7e6rQMyygekq+PYD7O+FKEaNlNNqccnPCganQ77z
 ehInB3lNklXWCxCOne3gdPyCFj5Q7BgUIN2aVJ8zJ5JAQi/gD1l1/scl7F+/038isfqCFv/s3
 +dQY8eydW2n1R/XMIXImuRbkhqQDWTs+quGuRcdW2yRVhOfNmnjI8jAiB1vD49oa3nhOhznSn
 ulhppqVova6cmB7B2IvKYlPqerpB0gr91cXQfus1sirW85T0pUixaW4yKS5X7RAR8NMmIE/Q3
 FfTxZr8UX/rldn/xoZnfS1ahQAl7sl6Z2ZnoXThWkVg6qDkAs0KukDMNPblf8P7dsNOlBxsth
 jLWlR4NigtKM/mLR0mHYcdJG9LTorbyWz3QeL5JFKm5AWiuMVjYdRAfdjCw3UbD9MoZhkzBB0
 X8+oWC71HIJHpcXCFPhHRe1c8PHbyOBYfqGkrCXLI25kuIm2AzlLfXlwcNwYZKBadPpRHHZRa
 9SCCCYlEJ8lvAAFy0uW4aHxKJZFCIXwg9jAA5c77UpMXpSsH7jI9Jly3ichMEk3Q3CRhw1/AC
 /AtzK+Ef3XiaOFmsTcO+Cr2aovye/+/wZBR1BQyWYFHhhffdsZgPDeCmE2xbEbQCpXTwZJDKe
 LM/CVoxECtJwaDovM
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

> Woops, thanks. I misread the signature of make_hash_table.  I've attached an updated patch.

Thanks.  Builds now and I'm running with it.

martin





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 13 May 2020 15:13:39 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed May 13 11:13:39 2020
Received: from localhost ([127.0.0.1]:59103 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYt4k-0005Ub-E1
	for submit <at> debbugs.gnu.org; Wed, 13 May 2020 11:13:39 -0400
Received: from mail-qk1-f178.google.com ([209.85.222.178]:35382)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jYt4i-0005UP-Lt
 for 41200 <at> debbugs.gnu.org; Wed, 13 May 2020 11:13:37 -0400
Received: by mail-qk1-f178.google.com with SMTP id f13so17088885qkh.2
 for <41200 <at> debbugs.gnu.org>; Wed, 13 May 2020 08:13:36 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:cc:references:from:message-id:date:user-agent
 :mime-version:in-reply-to:content-language;
 bh=yH5NH6Cfnb91IZSxOHzfp/0FujUazO3CIIyay8K0JlM=;
 b=Ao4wJyYVYv7OFrextPlfPFUoKLwu2cJIGxp6304+nNBH/93J4/iB4WkGK4lcnYk7m6
 Az14CSc70QkMr/vQMtNb2GkmgUC+Ja1HGJMK5pE5mD+GcKuWo3Q+zg+5WTjeUik0SsEe
 5lEPxxQ4fVkiBOqj0XvlgGehPeSlwLbAN6LHrzTBur2a/RLIU89wE/AiIuYomh5+txHX
 xF4e54VG22IuC+naRem0BxLnIKTK+TCPRxyjt1vAOFjZz6XCNUQ15X3kuRx6SD7W/KbC
 bjddY+2pyd091EfyMYAT9rQjM7FZAMQ2xrwbZXRljCMM9Sc2WdWNc+VPlw73epZAu3bp
 BPkA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:cc:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language;
 bh=yH5NH6Cfnb91IZSxOHzfp/0FujUazO3CIIyay8K0JlM=;
 b=Vk9vrA7mBJZ6JqyZnVQO79LjO9QRE9HpJ6rFuWoTgDiuElssyheyGBUQ8tKH3h3jB0
 yuSOjJr8/9eZstfXKQ6nkwO0eckVQzRNp5eaMD4v9fy+4zbVzRt6mjY6x3tPsoLmfcr9
 hG+W5QJCl8C0fN2euGifr0IKUoYfye6lfu6Aeso8AvvC/zyGYLOhTYLEpy5GKuXOX8my
 IViHmTPYqgJ6ePWFG0AgM47oY6M1o451ZXPaqSCPbQfqygFF4OSGWdXTuol7rGMd6QhI
 TG9aNuZFdBE4secRxo1qkdOpUmxMp0CUlM7FE84wcAIK1vXQfUBDiFlFK0P6c+bM14Hi
 oa1g==
X-Gm-Message-State: AOAM532FQyXOjkUvvUO6uJxO4yxLBmYFbzhyZGnATEqx8iR3DI12adtY
 Ye3Sh6zZsYO291+jzJRsxUXLH92QiUc=
X-Google-Smtp-Source: ABdhPJz7tIySTfFw9v4J6at1MtKkJXePmT/KYwL05UL0bmXAPlVgi9fADo1ZYLd9NXfTykOwwRPpgA==
X-Received: by 2002:a05:620a:914:: with SMTP id
 v20mr119050qkv.107.1589382809491; 
 Wed, 13 May 2020 08:13:29 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id c41sm16342255qta.96.2020.05.13.08.13.28
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Wed, 13 May 2020 08:13:28 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: martin rudalics <rudalics@HIDDEN>, Eli Zaretskii <eliz@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
 <a0560d39-ec5c-9a1b-3c82-5005bf4c841a@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <956a7cf7-bbf0-e15d-36d4-c82279c15f89@HIDDEN>
Date: Wed, 13 May 2020 11:13:27 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <a0560d39-ec5c-9a1b-3c82-5005bf4c841a@HIDDEN>
Content-Type: multipart/mixed; boundary="------------8E749A14CB345923344EA199"
Content-Language: en-GB
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

This is a multi-part message in MIME format.
--------------8E749A14CB345923344EA199
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

On 13/05/2020 10.58, martin rudalics wrote:
>> Indeed, you're completely right; thanks!  Replacing face_alist and
>> Vface_new_frame_defaults with hash tables makes the worst example
>> about 10 times faster, and with that change tooltips now take 30 to
>> 50ms to display instead of 500-600ms in my real-life use case (my
>> usual config).  I have attached a patch.
> 
> GCC throws the following error here:

Woops, thanks. I misread the signature of make_hash_table.  I've attached an updated patch.



--------------8E749A14CB345923344EA199
Content-Type: text/x-patch; charset=UTF-8;
 name="0001-Store-frame-faces-in-hash-tables-instead-of-alists.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0001-Store-frame-faces-in-hash-tables-instead-of-alists.patc";
 filename*1="h"

From 75d44050a9277c708c69afe09de334ab3c300da1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Pit-Claudel?= <clement.pitclaudel@HIDDEN>
Date: Tue, 12 May 2020 21:48:32 -0400
Subject: [PATCH] Store frame faces in hash tables instead of alists

* lisp/emacs-lisp/edebug.el (edebug-eval-defun):
* lisp/progmodes/elisp-mode.el (elisp--eval-defun-1):
* lisp/faces.el (face-list):
* lisp/frame.el (frame-set-background-mode): Update to work with hash
tables instead of alists.

* src/frame.h (struct frame): Remove face_alist, add face_hash.
(fset_face_alist): Remove.
(fset_face_hash): New function.
* src/frame.c (make_frame): Initialize f->face_hash.
(Fmake_terminal_frame): Update to work with hash tables instead of
alists.
* src/xfaces.c (lface_from_face_name_no_resolve):
(Finternal_make_lisp_face):
(update_face_from_frame_parameter): Update to work with hash tables
instead of alists.
* src/xfaces.c (Fframe_face_hash): New function.
(Fframe_face_alist): Remove.
(init_xfaces): Compute face IDs from they face property, not from
their position in face_alist.
(syms_of_xfaces): Remove frame_face_alist, add frame_face_hash;
change Vface_new_frame_defaults into a hash table.
---
 lisp/emacs-lisp/edebug.el    |  3 +-
 lisp/faces.el                |  4 ++-
 lisp/frame.el                |  2 +-
 lisp/progmodes/elisp-mode.el |  3 +-
 src/frame.c                  | 21 ++++++++----
 src/frame.h                  |  8 ++---
 src/xfaces.c                 | 64 ++++++++++++++++++++----------------
 7 files changed, 59 insertions(+), 46 deletions(-)

diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index 78461185d3..97ca964eef 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -488,8 +488,7 @@ edebug-eval-defun
 	   (set-default (nth 1 form) (eval (nth 2 form) lexical-binding)))
           ((eq (car form) 'defface)
            ;; Reset the face.
-           (setq face-new-frame-defaults
-                 (assq-delete-all (nth 1 form) face-new-frame-defaults))
+           (remhash (nth 1 form) face-new-frame-defaults)
            (put (nth 1 form) 'face-defface-spec nil)
            (put (nth 1 form) 'face-documentation (nth 3 form))
 	   ;; See comments in `eval-defun-1' for purpose of code below
diff --git a/lisp/faces.el b/lisp/faces.el
index e707f6f4b6..1764f3da75 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -179,7 +179,9 @@ face-font-registry-alternatives
 
 (defun face-list ()
   "Return a list of all defined faces."
-  (mapcar #'car face-new-frame-defaults))
+  (let ((faces nil))
+    (maphash (lambda (face _) (push face faces)) face-new-frame-defaults)
+    (nreverse faces)))
 
 (defun make-face (face)
   "Define a new face with name FACE, a symbol.
diff --git a/lisp/frame.el b/lisp/frame.el
index 6c2f774709..bab3c2a1c2 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -1227,7 +1227,7 @@ frame-set-background-mode
                          ;; during startup with -rv on the command
                          ;; line for the initial frame, because frames
                          ;; are not recorded in the pdump file.
-                         (assq face (frame-face-alist))
+                         (gethash face (frame-face-hash))
                          (face-spec-match-p face
                                             (face-user-default-spec face)
                                             ;; FIXME: why selected-frame and
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index b737134f90..dc8688c864 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -1304,8 +1304,7 @@ elisp--eval-defun-1
 	((eq (car form) 'custom-declare-face)
 	 ;; Reset the face.
 	 (let ((face-symbol (eval (nth 1 form) lexical-binding)))
-	   (setq face-new-frame-defaults
-		 (assq-delete-all face-symbol face-new-frame-defaults))
+	   (remhash face-new-frame-defaults face-symbol)
 	   (put face-symbol 'face-defface-spec nil)
 	   (put face-symbol 'face-override-spec nil))
 	 form)
diff --git a/src/frame.c b/src/frame.c
index c871e4fd99..7cd43e4fec 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -946,6 +946,11 @@ make_frame (bool mini_p)
   rw->total_lines = mini_p ? 9 : 10;
   rw->pixel_height = rw->total_lines * FRAME_LINE_HEIGHT (f);
 
+  // QUESTION: is this where this should be initialized?
+  fset_face_hash
+    (f, make_hash_table(hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
+                        DEFAULT_REHASH_THRESHOLD, Qnil, false));
+
   if (mini_p)
     {
       mw->top_line = rw->total_lines;
@@ -1254,7 +1259,7 @@ DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
 {
   struct frame *f;
   struct terminal *t = NULL;
-  Lisp_Object frame, tem;
+  Lisp_Object frame;
   struct frame *sf = SELECTED_FRAME ();
 
 #ifdef MSDOS
@@ -1336,14 +1341,16 @@ DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
   store_in_alist (&parms, Qminibuffer, Qt);
   Fmodify_frame_parameters (frame, parms);
 
-  /* Make the frame face alist be frame-specific, so that each
+  /* Make the frame face hash be frame-specific, so that each
      frame could change its face definitions independently.  */
-  fset_face_alist (f, Fcopy_alist (sf->face_alist));
-  /* Simple Fcopy_alist isn't enough, because we need the contents of
-     the vectors which are the CDRs of associations in face_alist to
+  fset_face_hash (f, Fcopy_hash_table (sf->face_hash));
+  /* Simple copy_hash_table isn't enough, because we need the contents of
+     the vectors which are the values in face_hash to
      be copied as well.  */
-  for (tem = f->face_alist; CONSP (tem); tem = XCDR (tem))
-    XSETCDR (XCAR (tem), Fcopy_sequence (XCDR (XCAR (tem))));
+  ptrdiff_t idx = 0;
+  struct Lisp_Hash_Table *table = XHASH_TABLE(f->face_hash);
+  for (idx = 0; idx < table->count; ++idx)
+    set_hash_value_slot (table, idx, Fcopy_sequence(HASH_VALUE (table, idx)));
 
   f->can_set_window_size = true;
   f->after_make_frame = true;
diff --git a/src/frame.h b/src/frame.h
index 476bac67fa..0a324414a6 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -158,8 +158,8 @@ #define EMACS_FRAME_H
      There are four additional elements of nil at the end, to terminate.  */
   Lisp_Object menu_bar_items;
 
-  /* Alist of elements (FACE-NAME . FACE-VECTOR-DATA).  */
-  Lisp_Object face_alist;
+  /* Hash table of FACE-NAME keys and FACE-VECTOR-DATA values.  */
+  Lisp_Object face_hash;
 
   /* A vector that records the entire structure of this frame's menu bar.
      For the format of the data, see extensive comments in xmenu.c.
@@ -661,9 +661,9 @@ fset_condemned_scroll_bars (struct frame *f, Lisp_Object val)
   f->condemned_scroll_bars = val;
 }
 INLINE void
-fset_face_alist (struct frame *f, Lisp_Object val)
+fset_face_hash (struct frame *f, Lisp_Object val)
 {
-  f->face_alist = val;
+  f->face_hash = val;
 }
 #if defined (HAVE_WINDOW_SYSTEM)
 INLINE void
diff --git a/src/xfaces.c b/src/xfaces.c
index 7d7aff95c1..4f97ba4971 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -1843,13 +1843,11 @@ lface_from_face_name_no_resolve (struct frame *f, Lisp_Object face_name,
   Lisp_Object lface;
 
   if (f)
-    lface = assq_no_quit (face_name, f->face_alist);
+    lface = Fgethash (face_name, f->face_hash, Qnil);
   else
-    lface = assq_no_quit (face_name, Vface_new_frame_defaults);
+    lface = Fgethash (face_name, Vface_new_frame_defaults, Qnil);
 
-  if (CONSP (lface))
-    lface = XCDR (lface);
-  else if (signal_p)
+  if (signal_p && NILP (lface))
     signal_error ("Invalid face", face_name);
 
   check_lface (lface);
@@ -2736,8 +2734,7 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
     {
       global_lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
       ASET (global_lface, 0, Qface);
-      Vface_new_frame_defaults = Fcons (Fcons (face, global_lface),
-					Vface_new_frame_defaults);
+      Fputhash(face, global_lface, Vface_new_frame_defaults);
 
       /* Assign the new Lisp face a unique ID.  The mapping from Lisp
 	 face id to Lisp face is given by the vector lface_id_to_name.
@@ -2763,7 +2760,7 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
 	{
 	  lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
 	  ASET (lface, 0, Qface);
-	  fset_face_alist (f, Fcons (Fcons (face, lface), f->face_alist));
+	  Fputhash (face, lface, f->face_hash);
 	}
       else
 	for (i = 1; i < LFACE_VECTOR_SIZE; ++i)
@@ -3508,7 +3505,7 @@ update_face_from_frame_parameter (struct frame *f, Lisp_Object param,
   /* If there are no faces yet, give up.  This is the case when called
      from Fx_create_frame, and we do the necessary things later in
      face-set-after-frame-defaults.  */
-  if (NILP (f->face_alist))
+  if (XFIXNAT(Fhash_table_count(f->face_hash)) == 0)
     return;
 
   if (EQ (param, Qforeground_color))
@@ -4174,14 +4171,14 @@ DEFUN ("internal-lisp-face-empty-p", Finternal_lisp_face_empty_p,
   return i == LFACE_VECTOR_SIZE ? Qt : Qnil;
 }
 
-
-DEFUN ("frame-face-alist", Fframe_face_alist, Sframe_face_alist,
+// QUESTION: Should I add an ELisp version of frame-face-hash?
+DEFUN ("frame-face-hash", Fframe_face_hash, Sframe_face_hash,
        0, 1, 0,
        doc: /* Return an alist of frame-local faces defined on FRAME.
 For internal use only.  */)
   (Lisp_Object frame)
 {
-  return decode_live_frame (frame)->face_alist;
+  return decode_live_frame (frame)->face_hash;
 }
 
 
@@ -6678,30 +6675,37 @@ DEFUN ("show-face-resources", Fshow_face_resources, Sshow_face_resources,
 
 #ifdef HAVE_PDUMPER
 /* All the faces defined during loadup are recorded in
-   face-new-frame-defaults, with the last face first in the list.  We
-   need to set next_lface_id to the next face ID number, so that any
-   new faces defined in this session will have face IDs different from
-   those defined during loadup.  We also need to set up the
-   lface_id_to_name[] array for the faces that were defined during
-   loadup.  */
+   face-new-frame-defaults.  We need to set next_lface_id to the next
+   face ID number, so that any new faces defined in this session will
+   have face IDs different from those defined during loadup.  We also
+   need to set up the lface_id_to_name[] array for the faces that were
+   defined during loadup.  */
 void
 init_xfaces (void)
 {
-  if (CONSP (Vface_new_frame_defaults))
+  int nfaces = XFIXNAT(Fhash_table_count (Vface_new_frame_defaults));
+  if (nfaces > 0)
     {
       /* Allocate the lface_id_to_name[] array.  */
-      lface_id_to_name_size = next_lface_id =
-	XFIXNAT (Flength (Vface_new_frame_defaults));
+      lface_id_to_name_size = next_lface_id = nfaces;
       lface_id_to_name = xnmalloc (next_lface_id, sizeof *lface_id_to_name);
 
       /* Store the faces.  */
-      Lisp_Object tail;
-      int i = next_lface_id - 1;
-      for (tail = Vface_new_frame_defaults; CONSP (tail); tail = XCDR (tail))
+      struct Lisp_Hash_Table* table = XHASH_TABLE(Vface_new_frame_defaults);
+      for (ptrdiff_t idx = 0; idx < nfaces; ++idx)
 	{
-	  Lisp_Object lface = XCAR (tail);
-	  eassert (i >= 0);
-	  lface_id_to_name[i--] = XCAR (lface);
+	  Lisp_Object lface = HASH_KEY(table, idx);
+          Lisp_Object face_id = Fget (lface, Qface);
+          // FIXME why is (get 'tab-line 'face) 0?
+          if (!FIXNATP (face_id))
+            // FIXME: I'm not sure what to do in this case
+            printf("Face %s has no id\n",  SDATA(SYMBOL_NAME (lface)));
+          else
+            {
+              int id = XFIXNAT(face_id);
+              eassert (id >= 0);
+              lface_id_to_name[id] = lface;
+            }
 	}
     }
   face_attr_sym[0] = Qface;
@@ -6855,7 +6859,7 @@ syms_of_xfaces (void)
   defsubr (&Sinternal_copy_lisp_face);
   defsubr (&Sinternal_merge_in_global_face);
   defsubr (&Sface_font);
-  defsubr (&Sframe_face_alist);
+  defsubr (&Sframe_face_hash);
   defsubr (&Sdisplay_supports_face_attributes_p);
   defsubr (&Scolor_distance);
   defsubr (&Sinternal_set_font_selection_order);
@@ -6881,7 +6885,9 @@ syms_of_xfaces (void)
 
   DEFVAR_LISP ("face-new-frame-defaults", Vface_new_frame_defaults,
     doc: /* List of global face definitions (for internal use only.)  */);
-  Vface_new_frame_defaults = Qnil;
+  Vface_new_frame_defaults =
+    make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
+                     DEFAULT_REHASH_THRESHOLD, Qnil, false);
 
   DEFVAR_LISP ("face-default-stipple", Vface_default_stipple,
     doc: /* Default stipple pattern used on monochrome displays.
-- 
2.17.1


--------------8E749A14CB345923344EA199--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 13 May 2020 14:58:59 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed May 13 10:58:59 2020
Received: from localhost ([127.0.0.1]:59075 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYsqY-00056B-S1
	for submit <at> debbugs.gnu.org; Wed, 13 May 2020 10:58:59 -0400
Received: from mout.gmx.net ([212.227.15.15]:53985)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rudalics@HIDDEN>) id 1jYsqW-00055Y-0t
 for 41200 <at> debbugs.gnu.org; Wed, 13 May 2020 10:58:57 -0400
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net;
 s=badeba3b8450; t=1589381929;
 bh=mYbDZjlUa07fi6N9njkwFd/zsnEEgJDC+nWLtGsOtZA=;
 h=X-UI-Sender-Class:Subject:To:Cc:References:From:Date:In-Reply-To;
 b=LHwYKJTeLg/t8Uu/b5ItR1P0vd0RFGFndc+rmwqxSDIIRr/cE8lZ430fjWGDdvYUz
 pQLzjVOiZRuG4i6DsZogjfVtGWVWOZcNKD4ku4j08t3oDQruh5xsMFx4G1R5lXDCa6
 GGujFary7y6x+Fm9sPWVt2tNI+GHZPnHk9mtb7EE=
X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c
Received: from [192.168.1.101] ([212.95.5.196]) by mail.gmx.com (mrgmx005
 [212.227.17.190]) with ESMTPSA (Nemesis) id 1N1wlv-1j6nAG29qz-012EBw; Wed, 13
 May 2020 16:58:49 +0200
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>,
 Eli Zaretskii <eliz@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN> <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
From: martin rudalics <rudalics@HIDDEN>
Message-ID: <a0560d39-ec5c-9a1b-3c82-5005bf4c841a@HIDDEN>
Date: Wed, 13 May 2020 16:58:48 +0200
MIME-Version: 1.0
In-Reply-To: <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Language: en-US
Content-Transfer-Encoding: quoted-printable
X-Provags-ID: V03:K1:J3tM1VFSZjTO6TB2QSQZfQ9qPKydHG7HBl+eeHDMdJdoFmZ6AdQ
 xZmr0cNeLPcA6X4ZH7uksDupDG/LT8qI6ExMsJcM2WbI7zRS6bSQ0mRDtVBdaLuFuKOoUrV
 qXDkuGXDzoJhZf+IxbXA0/s4skGqul92W3SMAloV3acx+FKJOp2Pjv2iSuKqm9sbbowavzv
 ambU2WSU5Q2nSKHO+ZbMQ==
X-Spam-Flag: NO
X-UI-Out-Filterresults: notjunk:1;V03:K0:9/Llc9diGik=:zxOtiMobh0P+Oqik13wd3r
 XGLBVnK9YiEFBI5/5IaaG/BIKDpIwz14+fzvslC8dDTszG+8dEUD9aycBZkTj19a+LLfexVmx
 tX0ITynQeGsR40CUdn0jeXND0GLRSgBQXjn/qRY4bZLgO1/5DQC87RqrGuWwCw0cXsZ6pSgn3
 6PCqN98jFB4W8h1aG36/XpmCj25GALFPHgTo7KvuowbKgnzbRCrUr854wzIRodxJZjhYM5Tl4
 HV1mo3o/Wkk9UKScnoLdzaIEUYr5tuMdIjsyLsE37px1eiav9JjYemEmVTywCTJC7wHkqpR0g
 pCydtNsX9gKx3XapFLWc5UyXhF8G43Jrbrmn2afD4J9Ow32thIv79q6t9UifpbVpp30SGRW9g
 F5m3pdyWm4GNgxhZbq+TCqpjgdtnI85n7x4e52OY1Azy4k5VNByLhwN4gqKvLzjMY9fZ+y6AJ
 s/tj8zzCXdMl+7TpICukoxpI+vuwV73mMqyl5krye47KIlwPHXqUiKX9128rdqgLttdmUFhrD
 fhDjTaBSOTPaYoQLLRZZheYeR5na1qjqh3qhMrWuVRC4mekTkxRYV0ebisEu6jDwabxyaWPUv
 1Z5jtccpTded+hq2zxp5BjznTrYRkre/PNYn/7S6znysn59w+Na0uFvW02x+Jl9d9NhhR3scF
 Gr72mifhpSnvfRNTlA26J0Niay9tsZN/avn0MX4dUcDT1tUoKH3l48U0Svn68aFFotiZJF8bT
 9oQ2k/P2YQRpQI61ozxSaVyJTKSWTlQGF5aayfErGibyPlR0CwIKEpy1d/Nv4u8SxY9eEkRAS
 +SQcW8t/sujnrD26yhh2qUk0VIaoDvsdqo2UctBOxR9LTdAn9i0UVfchiyAEd91ptbUJkJvps
 y8ie4kDdQucwogYbqSbkuAoqOD8kq/X/U2MOhvlFawB82rKG8i/hPxw4/3NPh+7o4wxwjYVbO
 gK4T9l4rdlMAU9ud5IOJpMqjMLdEioi7g6jcWrU+G0dNQxhhqRuJ0av1Zhl2w3u961I6jV1N0
 cjbweEiuitPQMpELKQf4hQzcxuWppvgfU7+5YDGpgrpCfBtfG4Cp66aw21jLlJfqp4zXkhXe+
 +BI5tnKgTipaYeigtq+Q0cwR2zEgaM60WBQ3hdEjjgam+bX0HJHYOZlM22FAqJwUmFv+XaGmr
 HVPUAX6W0lYCswr5ukZvVDbO4WoXgfSyhi859+XmpXcQmJdv+Kgvc0QR4EKSycYrNb+pgSfkm
 iyxeX31iHSj2hEwsU
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

 > Indeed, you're completely right; thanks!  Replacing face_alist and
 > Vface_new_frame_defaults with hash tables makes the worst example
 > about 10 times faster, and with that change tooltips now take 30 to
 > 50ms to display instead of 500-600ms in my real-life use case (my
 > usual config).  I have attached a patch.

GCC throws the following error here:

   CC       frame.o
In file included from ../../src/lisp.h:954,
                  from ../../src/frame.c:29:
=2E./../src/frame.c: In function =E2=80=98make_frame=E2=80=99:
=2E/globals.h:6365:14: error: incompatible type for argument 6 of =E2=80=98=
make_hash_table=E2=80=99
  #define Qnil builtin_lisp_symbol (0)
               ^~~~~~~~~~~~~~~~~~~~~~~
=2E./../src/frame.c:952:57: note: in expansion of macro =E2=80=98Qnil=E2=80=
=99
                          DEFAULT_REHASH_THRESHOLD, Qnil, Qnil));
                                                          ^~~~
In file included from ../../src/conf_post.h:39,
                  from ./config.h:2270,
                  from ../../src/frame.c:20:
=2E./../src/lisp.h:3661:43: note: expected =E2=80=98_Bool=E2=80=99 but ar=
gument is of type =E2=80=98Lisp_Object=E2=80=99 {aka =E2=80=98struct Lisp=
_Object=E2=80=99}
                               Lisp_Object, bool);
                                            ^~~~
make[1]: *** [Makefile:402: frame.o] Fehler 1
make[1]: *** Es wird auf noch nicht beendete Prozesse gewartet....
make[1]: Verzeichnis =E2=80=9E/home/martin/emacs-git/release/obj-gtk/src=E2=
=80=9C wird verlassen
make: *** [Makefile:424: src] Fehler 2

martin





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 13 May 2020 14:58:53 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed May 13 10:58:53 2020
Received: from localhost ([127.0.0.1]:59071 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYsqT-00055t-JS
	for submit <at> debbugs.gnu.org; Wed, 13 May 2020 10:58:53 -0400
Received: from mout.gmx.net ([212.227.15.18]:35037)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rudalics@HIDDEN>) id 1jYsqR-00055M-MV
 for 41200 <at> debbugs.gnu.org; Wed, 13 May 2020 10:58:52 -0400
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net;
 s=badeba3b8450; t=1589381924;
 bh=WkNaqULZy852dcWol+vYvJcqvqr3DkQuNXHA5RZ+oRo=;
 h=X-UI-Sender-Class:Subject:To:Cc:References:From:Date:In-Reply-To;
 b=gqs7ZqkDPeNV3yTPK4hm68Gha9QfsUxd0GIRLyE2KEaReoR3PQ+4LytlWzY2c02a2
 IQX7XKEd8b6bJ5Ad0W7O+sSNWbTnb4pzEevsJ3du6wXJ4GNOiYTx5UP3y54ojJg/Mi
 p6bb9gFndu9TcK4sTAL3q+D42+OU9NaSn31Y9ltM=
X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c
Received: from [192.168.1.101] ([212.95.5.196]) by mail.gmx.com (mrgmx005
 [212.227.17.190]) with ESMTPSA (Nemesis) id 1Mq2nA-1inDx02tSU-00nARk; Wed, 13
 May 2020 16:58:44 +0200
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: Eli Zaretskii <eliz@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <2050d979-369b-f546-eb48-2a34befb5602@HIDDEN>
 <3c3cbd2d-3a05-297a-3019-13253180a4e2@HIDDEN>
 <94f4ec10-9ac8-b12f-9bf5-896f573161de@HIDDEN>
 <49ee1a74-2bbc-47b0-6db0-1a2489091c3f@HIDDEN>
 <18cd985b-5a76-2274-1783-8c8cad6395e6@HIDDEN> <83zhad6nno.fsf@HIDDEN>
From: martin rudalics <rudalics@HIDDEN>
Message-ID: <8b42edb0-d3da-e119-618d-a025c3ca1375@HIDDEN>
Date: Wed, 13 May 2020 16:58:40 +0200
MIME-Version: 1.0
In-Reply-To: <83zhad6nno.fsf@HIDDEN>
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Language: en-US
Content-Transfer-Encoding: 7bit
X-Provags-ID: V03:K1:/cmG2EKc9gQshqujX36vjKEhEkfH37ogV8D6hdE3jbO9Tlx1brr
 kDQUiMKYQGFLWnfVz4KYeP/gJaEYBm1BGSayh++Y9oaGgKMkfkPtuEdKsdLVD4Qw4hpaseu
 f4V/46rEZv3eZtwPtZc3qD3Bjf/lmip2xwhc6WDuTzB9z/kLnglu8D2Gg1dBkamZyyDWcSC
 GtLu7E9DzwNX4oFeSJ+gw==
X-Spam-Flag: NO
X-UI-Out-Filterresults: notjunk:1;V03:K0:sSJql+JMWW4=:RH/zKj2YBBa4UJDK0ii36h
 2GdU/XhtGnrzRJQe2j8ZpYg9cfZ2srlFDozq6jt+lECK8Y40BnilnrwUoh6rmrc2RuZBVl6iz
 M3zdZ+rQpiWCtaytuIbdE9iMCGeTQXRjk3NQsHL24oSuX2ug5EI7neHDpHIPSStgVvwXZzZH8
 htBgYs5hVZbMypal+VGOQFWJ9m4SWaaUEUyZc4sUeFNoQjUaKmfa83ZxYMNQRxsIdx5nQBdbu
 3zZtkKNPvGW2wsNPrsE7/6ZZ/Hsc58KBPGuEWK5T6pp0mIQ0LGHDnVruathnfJ271iYkWdPNS
 r/fnzXJplGYhqsoYZTOgsipzZ0HPkzuvACL1fljaO4qdRVjNU6T2FV2jO+2zVfF/mLZ9CorD+
 wjoJVir0aI/23nESBAC+1JioOclAQv9aZ3fM4U2u/KtlLHqvbJFla3WA4GnbfDEFPKjbR0oOm
 +/Rx3hA2L74Y9xsvLVPS90pvVdaytaF1zvy/WkmFivx8gibXEamALAXRU4gkDxjlx9OtcgJwm
 7SJK9EdXlFhAEeTZWPOA11wKkguZOR1acy9PwdYsx0YrtGYoV+ZA1Y3CJAJ+nvqEr23/nxQNB
 neJyOO4i6ZG1t6oYhEDLw3562+I1Md88UI+CMocIyz3UNed14LmdIfMevcr8mj6Yfvkdw34CQ
 toIo3fXGGgCELjDSMLIl0CWKkctmz4HD0xTfcZYVI8DZ61Wd4SCzvNW3bIwGr8FPqLM9Yvdj4
 Xkh00SoqvgqU9m4yRa9tx4OFKuMco3mSZ9mgEZCLfVxiHmcZkAKWyJHRWeOb5pzeiVn2t0zG8
 KIOPdNd0tft/IhiFt2yb3Ut5zd9o/ZEoRt1wPy7MBRC124xznR8K0CZZwD/G1uteop8GPiIMG
 cC40Av9vvhdiksxBxKv7w2yIQ6CjYHnjoQDbMF8fQ8mD532kV8lVGbiPrR0mnmG3T1haZ1B/p
 tl7Vw65/b0tPCSytdnidDKQlFU1uq5gcl47cFVATHo9vYPSEkuYerwSKkXKgNpbffHsJaSnrf
 T5M/TKyehFfZw+bNnPxAXyQwlq5NRDquO+ZL6ArbF1cp2LmePcDtVdlmXJzrOZeVBogquQcbx
 ua641dkscDmdEKJ/xf3lA+v0oKwOquypgjltElTQH1a79zGdFvTGl5jwRkSjROuIDSGiPbWAA
 Rw4ZovLUxSB0HFK4EaPdGBrvq8XvZxhWE12+GTbSgxbPEBkYq8+1WtsKIlWXy9A6d0e5EAJXb
 /a7PZ0ChqT4lBov7d
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
Cc: cpitclaudel@HIDDEN, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

> No, please go ahead.

Installed meanwhile.

Thanks, martin






Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 13 May 2020 02:41:35 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 12 22:41:35 2020
Received: from localhost ([127.0.0.1]:57006 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYhKw-000272-6q
	for submit <at> debbugs.gnu.org; Tue, 12 May 2020 22:41:35 -0400
Received: from mail-qk1-f175.google.com ([209.85.222.175]:39341)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jYhKu-00026j-7T
 for 41200 <at> debbugs.gnu.org; Tue, 12 May 2020 22:41:33 -0400
Received: by mail-qk1-f175.google.com with SMTP id a136so6984529qkg.6
 for <41200 <at> debbugs.gnu.org>; Tue, 12 May 2020 19:41:32 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:cc:references:from:message-id:date:user-agent
 :mime-version:in-reply-to:content-language;
 bh=yi61qkNXk+D9+Dvj1IhmA+DARRUctBqYF6aadcg/PeE=;
 b=PZ3iBCNWPMW+W5tsPC7zQFbMWyqbA0tkUcgsZPSLMlPggA4txkDnRa0LQAXB2/KFQc
 S83rOQl2dRaoydTml/rY5ukOc7lTcF76n/m8B+xgxP9//aVZ34WSUCWJvM68tI/TIvMb
 Io+MCdkiLjEX+BOeO9imUdL/VkbfqbaUu4jNz6Dm3My2/Hxb3dmDTBblQw6zMw04SNwy
 yc4Yf7IX/0Du/mVw0w/+ylfGrQjxNtB6MGKoUbf66DkSunvwrnpvoYBjpWtJmzq15UmA
 nYa0ocWskhB/dewLjNs/3E7Fuqo/q2BfJMCIlCeXaPwtQcATa5z/D4nSTWmf4llTISoI
 hYJw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:cc:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language;
 bh=yi61qkNXk+D9+Dvj1IhmA+DARRUctBqYF6aadcg/PeE=;
 b=orw5jV7KET137JrY5IcR0gMJf50gH+Al8Gm16dw1vZrxzZrfvLg6RLgn0OxbKu6vGn
 Z8EKlLia6nbT/XSysWhxNN6qMI6cgl4hJXf+YPGw19U9ZUJZXVrZERGHxngH50i/h+py
 dC7RmVT/AB0hAhqMCAnWVNuTYVE+kQ6pBfgoh214n6G5DXRvpVu6IYSMzCX2nZYPMYBx
 JJGaOvXQjrgJE1ECMTr45FkRLlsuEuif8fh2tOq1lZzd4srJGRQ5t9eqz/v06RuGqmjL
 UMt3kW4IXeH+TnG2ArgCgG0vQNZ3PSHrA3wWyJ56lq0Uo6F10vKzANmz090uhLoJyMCt
 3CKw==
X-Gm-Message-State: AGi0Pub98WMi8agnSiG8XXVuKKGQLZqxixKLjMIG8yMuEGw981bOGVTa
 eh8ihuCNMgx+wDczBPHX+ASZnDdCmvE=
X-Google-Smtp-Source: APiQypKxIKYxyN4PqAFt5yT9SKqBFarjz0yCeCcfk3GbSZEdyFC0gAqkWGk/09vSdDy25y9ush0MeA==
X-Received: by 2002:a37:48c8:: with SMTP id
 v191mr22458155qka.268.1589337686278; 
 Tue, 12 May 2020 19:41:26 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id e3sm1992203qtg.61.2020.05.12.19.41.25
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Tue, 12 May 2020 19:41:25 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: Eli Zaretskii <eliz@HIDDEN>
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <83lflx896q.fsf@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <cd9163e0-ddf8-9443-8507-502dee728911@HIDDEN>
Date: Tue, 12 May 2020 22:41:24 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <83lflx896q.fsf@HIDDEN>
Content-Type: multipart/mixed; boundary="------------203724E7FFC950361B806F14"
Content-Language: en-GB
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

This is a multi-part message in MIME format.
--------------203724E7FFC950361B806F14
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

On 12/05/2020 11.27, Eli Zaretskii wrote:
> (The code is actually in a subroutine called by internal-lisp-face-p.)
> Which means face-set-after-frame-default, which loops over all of the
> faces, runs with O(n²) complexity in the number of faces.
> 
> So I think if we want to support such large amounts of faces, we
> should not store them in alists, but in a more efficient data
> structure.

Indeed, you're completely right; thanks!  Replacing face_alist and Vface_new_frame_defaults with hash tables makes the worst example about 10 times faster, and with that change tooltips now take 30 to 50ms to display instead of 500-600ms in my real-life use case (my usual config).  I have attached a patch.

I left a few questions in the code; I hope that's OK.  I have a few more questions that are not part of the code:

* I removed the function frame-face-alist and changed the type of the variable face-new-frame-defaults.  Both were documented as internal.  Should I add an ELisp implementation of frame-face-alist for compatibility?  (It wouldn't be a perfect shim, since modifying its return value wouldn't do the same).  For face-new-frame-defaults it's a bit trickier, since the variable now holds a hash table.  Should I change its name to make the change obvious, at least? 
* The name face_hash isn't ideal, since there's already a distinct notion of face hashes (hash codes).  Can you think of a better name? 
* I imagine that this change needs to be advertised somewhere, but I'm not sure where; NEWS?

Lastly, do the following new profiles suggest other opportunities for improvement?

- ...                                                             499  52%
   Automatic GC                                                   499  52%
- command-execute                                                 454  47%
 - call-interactively                                             454  47%
  - funcall-interactively                                         433  45%
   - eval-defun                                                   427  44%
    - elisp--eval-defun                                           427  44%
     - eval-region                                                426  44%
      - my-bench-x-tip                                            426  44%
       - let                                                      406  42%
        - list                                                    406  42%
         - let                                                    406  42%
          - x-show-tip                                            390  40%
           - face-set-after-frame-default                         387  40%
            - face-spec-recalc                                    374  39%
             - make-face-x-resource-internal                      296  30%
              - set-face-attributes-from-resources                273  28%
               - set-face-attribute-from-resource                 219  22%
                + face-name                                        65   6%
             + face-spec-reset-face                                62   6%
             + face-spec-set-2                                      6   0%
             + face-spec-choose                                     2   0%
            + face-list                                             2   0%
           + frame-windows-min-size                                 1   0%
       + my-def-many-faces                                         20   2%
     + end-of-defun                                                 1   0%
   + execute-extended-command                                       6   0%
  + byte-code                                                      21   2%
+ redisplay_internal (C function)                                   2   0%
  tooltip-hide                                                      1   0%

- command-execute                                                 768  80%
 - call-interactively                                             768  80%
  - apply                                                         768  80%
   - call-interactively@ido-cr+-record-current-command                768  80%
    - apply                                                       768  80%
     - #<subr call-interactively>                                 768  80%
      - funcall-interactively                                     768  80%
       - eval-defun                                               715  74%
        - apply                                                   713  74%
         - #<compiled 0x151e3cbebf653c17>                         712  74%
          - elisp--eval-defun                                     712  74%
           - eval-region                                          709  74%
            - apply                                               709  74%
             - #<lambda 0x32ad1cc4311e0c0>                        709  74%
              - endless/eval-overlay                              709  74%
               - apply                                            709  74%
                - #<subr eval-region>                             707  74%
                 - my-bench-x-tip                                 707  74%
                  - let                                           689  72%
                   - list                                         689  72%
                    - let                                         689  72%
                     - x-show-tip                                 676  70%
                      - face-set-after-frame-default                674  70%
                       - face-spec-recalc                         660  69%
                        - face-spec-set-2                         350  36%
                         - apply                                  348  36%
                          - set-face-attribute                    342  35%
                           - internal-set-lisp-face-attribute                342  35%
                            - frame-set-background-mode                331  34%
                             - face-spec-recalc                   284  29%
                              - make-face-x-resource-internal                235  24%
                               - set-face-attributes-from-resources                216  22%
                                - set-face-attribute-from-resource                174  18%
                                 - face-name                       36   3%
                                  + check-face                     21   2%
                              + face-spec-reset-face                 40   4%
                              + face-spec-set-2                     4   0%
                             + face-attr-match-p                   24   2%
                               face-spec-choose                     1   0%
                             + face-list                            1   0%
                        - make-face-x-resource-internal                248  25%
                         - set-face-attributes-from-resources                215  22%
                          - set-face-attribute-from-resource                169  17%
                           + face-name                             36   3%
                        + face-spec-reset-face                     54   5%
                        + face-spec-choose                          2   0%
                       + face-list                                  1   0%
                  + my-def-many-faces                              18   1%
           + beginning-of-defun                                     1   0%
             end-of-defun                                           1   0%
        + #<lambda 0x159f62efd027a>                                 2   0%
       + smex                                                      53   5%
- ...                                                             182  19%
   Automatic GC                                                   182  19%
+ redisplay_internal (C function)                                   3   0%

Also, since the GC seems to be a significant part, here's a memory profile:

- command-execute                                         305,314,261  99%
 - call-interactively                                     305,314,261  99%
  - funcall-interactively                                 305,262,257  99%
   - eval-defun                                           303,318,241  98%
    - elisp--eval-defun                                   303,317,185  98%
     - eval-region                                        303,296,332  98%
      - my-bench-x-tip                                    303,295,276  98%
       - let                                              273,049,377  89%
        - list                                            273,049,377  89%
         - let                                            273,049,377  89%
          - x-show-tip                                    177,538,262  57%
           - face-set-after-frame-default                 175,519,190  57%
            - face-spec-recalc                            174,935,046  57%
             - make-face-x-resource-internal              138,435,960  45%
              + set-face-attributes-from-resources        138,407,728  45%
             + face-spec-reset-face                        36,126,838  11%
             + face-spec-choose                                74,360   0%
             + face-spec-set-2                                 21,216   0%
            + face-list                                       554,400   0%
           + frame-windows-min-size                             7,676   0%
           + run-at-time                                        4,352   0%
            setq                                                4,224   0%
          + float-time                                          3,888   0%
       + my-def-many-faces                                 30,245,899   9%
      + internal-macroexpand-for-load                           1,056   0%
     + end-of-defun                                             4,160   0%
     + beginning-of-defun                                       2,112   0%
   + execute-extended-command                               1,944,016   0%
  + byte-code                                                  52,004   0%
+ redisplay_internal (C function)                           1,427,117   0%

> No Emacs version information?

Woops. Sorry! GNU Emacs 28.0.50 (build 10, x86_64-pc-linux-gnu, GTK+ Version 3.22.30, cairo version 1.15.10) of 2020-05-10

Thanks again for the pointers,
Clément.

--------------203724E7FFC950361B806F14
Content-Type: text/x-patch; charset=UTF-8;
 name="0001-Store-frame-faces-in-hash-tables-instead-of-alists.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0001-Store-frame-faces-in-hash-tables-instead-of-alists.patc";
 filename*1="h"

From 6d3d5d94189ae31fdbc29b2db0707d6b13a5c362 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Pit-Claudel?= <clement.pitclaudel@HIDDEN>
Date: Tue, 12 May 2020 21:48:32 -0400
Subject: [PATCH] Store frame faces in hash tables instead of alists

* lisp/emacs-lisp/edebug.el (edebug-eval-defun):
* lisp/progmodes/elisp-mode.el (elisp--eval-defun-1):
* lisp/faces.el (face-list):
* lisp/frame.el (frame-set-background-mode): Update to work with hash
tables instead of alists.

* src/frame.h (struct frame): Remove face_alist, add face_hash.
(fset_face_alist): Remove.
(fset_face_hash): New function.
* src/frame.c (make_frame): Initialize f->face_hash.
(Fmake_terminal_frame): Update to work with hash tables instead of
alists.
* src/xfaces.c (lface_from_face_name_no_resolve):
(Finternal_make_lisp_face):
(update_face_from_frame_parameter): Update to work with hash tables
instead of alists.
* src/xfaces.c (Fframe_face_hash): New function.
(Fframe_face_alist): Remove.
(init_xfaces): Compute face IDs from they face property, not from
their position in face_alist.
(syms_of_xfaces): Remove frame_face_alist, add frame_face_hash;
change Vface_new_frame_defaults into a hash table.
---
 lisp/emacs-lisp/edebug.el    |  3 +-
 lisp/faces.el                |  4 ++-
 lisp/frame.el                |  2 +-
 lisp/progmodes/elisp-mode.el |  3 +-
 src/frame.c                  | 21 ++++++++----
 src/frame.h                  |  8 ++---
 src/xfaces.c                 | 64 ++++++++++++++++++++----------------
 7 files changed, 59 insertions(+), 46 deletions(-)

diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index 78461185d3..97ca964eef 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -488,8 +488,7 @@ edebug-eval-defun
 	   (set-default (nth 1 form) (eval (nth 2 form) lexical-binding)))
           ((eq (car form) 'defface)
            ;; Reset the face.
-           (setq face-new-frame-defaults
-                 (assq-delete-all (nth 1 form) face-new-frame-defaults))
+           (remhash (nth 1 form) face-new-frame-defaults)
            (put (nth 1 form) 'face-defface-spec nil)
            (put (nth 1 form) 'face-documentation (nth 3 form))
 	   ;; See comments in `eval-defun-1' for purpose of code below
diff --git a/lisp/faces.el b/lisp/faces.el
index e707f6f4b6..1764f3da75 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -179,7 +179,9 @@ face-font-registry-alternatives
 
 (defun face-list ()
   "Return a list of all defined faces."
-  (mapcar #'car face-new-frame-defaults))
+  (let ((faces nil))
+    (maphash (lambda (face _) (push face faces)) face-new-frame-defaults)
+    (nreverse faces)))
 
 (defun make-face (face)
   "Define a new face with name FACE, a symbol.
diff --git a/lisp/frame.el b/lisp/frame.el
index 6c2f774709..bab3c2a1c2 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -1227,7 +1227,7 @@ frame-set-background-mode
                          ;; during startup with -rv on the command
                          ;; line for the initial frame, because frames
                          ;; are not recorded in the pdump file.
-                         (assq face (frame-face-alist))
+                         (gethash face (frame-face-hash))
                          (face-spec-match-p face
                                             (face-user-default-spec face)
                                             ;; FIXME: why selected-frame and
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index b737134f90..dc8688c864 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -1304,8 +1304,7 @@ elisp--eval-defun-1
 	((eq (car form) 'custom-declare-face)
 	 ;; Reset the face.
 	 (let ((face-symbol (eval (nth 1 form) lexical-binding)))
-	   (setq face-new-frame-defaults
-		 (assq-delete-all face-symbol face-new-frame-defaults))
+	   (remhash face-new-frame-defaults face-symbol)
 	   (put face-symbol 'face-defface-spec nil)
 	   (put face-symbol 'face-override-spec nil))
 	 form)
diff --git a/src/frame.c b/src/frame.c
index c871e4fd99..4423965a01 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -946,6 +946,11 @@ make_frame (bool mini_p)
   rw->total_lines = mini_p ? 9 : 10;
   rw->pixel_height = rw->total_lines * FRAME_LINE_HEIGHT (f);
 
+  // QUESTION: is this where this should be initialized?
+  fset_face_hash
+    (f, make_hash_table(hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
+                        DEFAULT_REHASH_THRESHOLD, Qnil, Qnil));
+
   if (mini_p)
     {
       mw->top_line = rw->total_lines;
@@ -1254,7 +1259,7 @@ DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
 {
   struct frame *f;
   struct terminal *t = NULL;
-  Lisp_Object frame, tem;
+  Lisp_Object frame;
   struct frame *sf = SELECTED_FRAME ();
 
 #ifdef MSDOS
@@ -1336,14 +1341,16 @@ DEFUN ("make-terminal-frame", Fmake_terminal_frame, Smake_terminal_frame,
   store_in_alist (&parms, Qminibuffer, Qt);
   Fmodify_frame_parameters (frame, parms);
 
-  /* Make the frame face alist be frame-specific, so that each
+  /* Make the frame face hash be frame-specific, so that each
      frame could change its face definitions independently.  */
-  fset_face_alist (f, Fcopy_alist (sf->face_alist));
-  /* Simple Fcopy_alist isn't enough, because we need the contents of
-     the vectors which are the CDRs of associations in face_alist to
+  fset_face_hash (f, Fcopy_hash_table (sf->face_hash));
+  /* Simple copy_hash_table isn't enough, because we need the contents of
+     the vectors which are the values in face_hash to
      be copied as well.  */
-  for (tem = f->face_alist; CONSP (tem); tem = XCDR (tem))
-    XSETCDR (XCAR (tem), Fcopy_sequence (XCDR (XCAR (tem))));
+  ptrdiff_t idx = 0;
+  struct Lisp_Hash_Table *table = XHASH_TABLE(f->face_hash);
+  for (idx = 0; idx < table->count; ++idx)
+    set_hash_value_slot (table, idx, Fcopy_sequence(HASH_VALUE (table, idx)));
 
   f->can_set_window_size = true;
   f->after_make_frame = true;
diff --git a/src/frame.h b/src/frame.h
index 476bac67fa..0a324414a6 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -158,8 +158,8 @@ #define EMACS_FRAME_H
      There are four additional elements of nil at the end, to terminate.  */
   Lisp_Object menu_bar_items;
 
-  /* Alist of elements (FACE-NAME . FACE-VECTOR-DATA).  */
-  Lisp_Object face_alist;
+  /* Hash table of FACE-NAME keys and FACE-VECTOR-DATA values.  */
+  Lisp_Object face_hash;
 
   /* A vector that records the entire structure of this frame's menu bar.
      For the format of the data, see extensive comments in xmenu.c.
@@ -661,9 +661,9 @@ fset_condemned_scroll_bars (struct frame *f, Lisp_Object val)
   f->condemned_scroll_bars = val;
 }
 INLINE void
-fset_face_alist (struct frame *f, Lisp_Object val)
+fset_face_hash (struct frame *f, Lisp_Object val)
 {
-  f->face_alist = val;
+  f->face_hash = val;
 }
 #if defined (HAVE_WINDOW_SYSTEM)
 INLINE void
diff --git a/src/xfaces.c b/src/xfaces.c
index 7d7aff95c1..cccf0e4852 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -1843,13 +1843,11 @@ lface_from_face_name_no_resolve (struct frame *f, Lisp_Object face_name,
   Lisp_Object lface;
 
   if (f)
-    lface = assq_no_quit (face_name, f->face_alist);
+    lface = Fgethash (face_name, f->face_hash, Qnil);
   else
-    lface = assq_no_quit (face_name, Vface_new_frame_defaults);
+    lface = Fgethash (face_name, Vface_new_frame_defaults, Qnil);
 
-  if (CONSP (lface))
-    lface = XCDR (lface);
-  else if (signal_p)
+  if (signal_p && NILP (lface))
     signal_error ("Invalid face", face_name);
 
   check_lface (lface);
@@ -2736,8 +2734,7 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
     {
       global_lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
       ASET (global_lface, 0, Qface);
-      Vface_new_frame_defaults = Fcons (Fcons (face, global_lface),
-					Vface_new_frame_defaults);
+      Fputhash(face, global_lface, Vface_new_frame_defaults);
 
       /* Assign the new Lisp face a unique ID.  The mapping from Lisp
 	 face id to Lisp face is given by the vector lface_id_to_name.
@@ -2763,7 +2760,7 @@ DEFUN ("internal-make-lisp-face", Finternal_make_lisp_face,
 	{
 	  lface = make_vector (LFACE_VECTOR_SIZE, Qunspecified);
 	  ASET (lface, 0, Qface);
-	  fset_face_alist (f, Fcons (Fcons (face, lface), f->face_alist));
+	  Fputhash (face, lface, f->face_hash);
 	}
       else
 	for (i = 1; i < LFACE_VECTOR_SIZE; ++i)
@@ -3508,7 +3505,7 @@ update_face_from_frame_parameter (struct frame *f, Lisp_Object param,
   /* If there are no faces yet, give up.  This is the case when called
      from Fx_create_frame, and we do the necessary things later in
      face-set-after-frame-defaults.  */
-  if (NILP (f->face_alist))
+  if (XFIXNAT(Fhash_table_count(f->face_hash)) == 0)
     return;
 
   if (EQ (param, Qforeground_color))
@@ -4174,14 +4171,14 @@ DEFUN ("internal-lisp-face-empty-p", Finternal_lisp_face_empty_p,
   return i == LFACE_VECTOR_SIZE ? Qt : Qnil;
 }
 
-
-DEFUN ("frame-face-alist", Fframe_face_alist, Sframe_face_alist,
+// QUESTION: Should I add an ELisp version of frame-face-hash?
+DEFUN ("frame-face-hash", Fframe_face_hash, Sframe_face_hash,
        0, 1, 0,
        doc: /* Return an alist of frame-local faces defined on FRAME.
 For internal use only.  */)
   (Lisp_Object frame)
 {
-  return decode_live_frame (frame)->face_alist;
+  return decode_live_frame (frame)->face_hash;
 }
 
 
@@ -6678,30 +6675,37 @@ DEFUN ("show-face-resources", Fshow_face_resources, Sshow_face_resources,
 
 #ifdef HAVE_PDUMPER
 /* All the faces defined during loadup are recorded in
-   face-new-frame-defaults, with the last face first in the list.  We
-   need to set next_lface_id to the next face ID number, so that any
-   new faces defined in this session will have face IDs different from
-   those defined during loadup.  We also need to set up the
-   lface_id_to_name[] array for the faces that were defined during
-   loadup.  */
+   face-new-frame-defaults.  We need to set next_lface_id to the next
+   face ID number, so that any new faces defined in this session will
+   have face IDs different from those defined during loadup.  We also
+   need to set up the lface_id_to_name[] array for the faces that were
+   defined during loadup.  */
 void
 init_xfaces (void)
 {
-  if (CONSP (Vface_new_frame_defaults))
+  int nfaces = XFIXNAT(Fhash_table_count (Vface_new_frame_defaults));
+  if (nfaces > 0)
     {
       /* Allocate the lface_id_to_name[] array.  */
-      lface_id_to_name_size = next_lface_id =
-	XFIXNAT (Flength (Vface_new_frame_defaults));
+      lface_id_to_name_size = next_lface_id = nfaces;
       lface_id_to_name = xnmalloc (next_lface_id, sizeof *lface_id_to_name);
 
       /* Store the faces.  */
-      Lisp_Object tail;
-      int i = next_lface_id - 1;
-      for (tail = Vface_new_frame_defaults; CONSP (tail); tail = XCDR (tail))
+      struct Lisp_Hash_Table* table = XHASH_TABLE(Vface_new_frame_defaults);
+      for (ptrdiff_t idx = 0; idx < nfaces; ++idx)
 	{
-	  Lisp_Object lface = XCAR (tail);
-	  eassert (i >= 0);
-	  lface_id_to_name[i--] = XCAR (lface);
+	  Lisp_Object lface = HASH_KEY(table, idx);
+          Lisp_Object face_id = Fget (lface, Qface);
+          // FIXME why is (get 'tab-line 'face) 0?
+          if (!FIXNATP (face_id))
+            // FIXME: I'm not sure what to do in this case
+            printf("Face %s has no id\n",  SDATA(SYMBOL_NAME (lface)));
+          else
+            {
+              int id = XFIXNAT(face_id);
+              eassert (id >= 0);
+              lface_id_to_name[id] = lface;
+            }
 	}
     }
   face_attr_sym[0] = Qface;
@@ -6855,7 +6859,7 @@ syms_of_xfaces (void)
   defsubr (&Sinternal_copy_lisp_face);
   defsubr (&Sinternal_merge_in_global_face);
   defsubr (&Sface_font);
-  defsubr (&Sframe_face_alist);
+  defsubr (&Sframe_face_hash);
   defsubr (&Sdisplay_supports_face_attributes_p);
   defsubr (&Scolor_distance);
   defsubr (&Sinternal_set_font_selection_order);
@@ -6881,7 +6885,9 @@ syms_of_xfaces (void)
 
   DEFVAR_LISP ("face-new-frame-defaults", Vface_new_frame_defaults,
     doc: /* List of global face definitions (for internal use only.)  */);
-  Vface_new_frame_defaults = Qnil;
+  Vface_new_frame_defaults =
+    make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
+                     DEFAULT_REHASH_THRESHOLD, Qnil, Qnil);
 
   DEFVAR_LISP ("face-default-stipple", Vface_default_stipple,
     doc: /* Default stipple pattern used on monochrome displays.
-- 
2.17.1


--------------203724E7FFC950361B806F14--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 12 May 2020 17:58:49 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 12 13:58:49 2020
Received: from localhost ([127.0.0.1]:56476 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYZB2-0002oD-W0
	for submit <at> debbugs.gnu.org; Tue, 12 May 2020 13:58:49 -0400
Received: from eggs.gnu.org ([209.51.188.92]:60668)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1jYZB1-0002nz-1u
 for 41200 <at> debbugs.gnu.org; Tue, 12 May 2020 13:58:47 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:46772)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jYZAv-0003yz-JZ; Tue, 12 May 2020 13:58:41 -0400
Received: from [176.228.60.248] (port=3111 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jYZAu-0002LE-4W; Tue, 12 May 2020 13:58:40 -0400
Date: Tue, 12 May 2020 20:58:19 +0300
Message-Id: <83zhad6nno.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: martin rudalics <rudalics@HIDDEN>
In-Reply-To: <18cd985b-5a76-2274-1783-8c8cad6395e6@HIDDEN> (message from
 martin rudalics on Tue, 12 May 2020 19:42:52 +0200)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <2050d979-369b-f546-eb48-2a34befb5602@HIDDEN>
 <3c3cbd2d-3a05-297a-3019-13253180a4e2@HIDDEN>
 <94f4ec10-9ac8-b12f-9bf5-896f573161de@HIDDEN>
 <49ee1a74-2bbc-47b0-6db0-1a2489091c3f@HIDDEN>
 <18cd985b-5a76-2274-1783-8c8cad6395e6@HIDDEN>
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: cpitclaudel@HIDDEN, 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: martin rudalics <rudalics@HIDDEN>
> Date: Tue, 12 May 2020 19:42:52 +0200
> 
>  > Indeed, with tooltip-reuse-hidden-frame t and your patch, creating a
>  >  tooltip is instantaneous (after the first tooltip is created)
> 
> Eli, any problems to fix this in Emacs 27?

No, please go ahead.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 12 May 2020 17:43:01 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 12 13:43:01 2020
Received: from localhost ([127.0.0.1]:56463 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYYvl-0002OZ-8F
	for submit <at> debbugs.gnu.org; Tue, 12 May 2020 13:43:01 -0400
Received: from mout.gmx.net ([212.227.17.21]:42777)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rudalics@HIDDEN>) id 1jYYvj-0002OM-NT
 for 41200 <at> debbugs.gnu.org; Tue, 12 May 2020 13:43:00 -0400
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net;
 s=badeba3b8450; t=1589305373;
 bh=0M5uE37pchtIP3t02a4ow0WpWvHe4X/Xbdj6PIQPCQA=;
 h=X-UI-Sender-Class:Subject:To:References:From:Date:In-Reply-To;
 b=LEQJuYI2HSu4jOL4Q5Of7PSNykpPKt0WIaqDZmD93D7wnjG64Hffc5E+51Sn9xXTa
 JN+vmnjQPrphcPRC25EyypvT+4yiu1Fmv09h7Vqk3eu48367YfRHZwbBVbcbt2sVop
 upiZavsXZOXkTUcpHNsuXpSp4HL2vGj53LxmybA0=
X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c
Received: from [192.168.1.101] ([212.95.5.251]) by mail.gmx.com (mrgmx104
 [212.227.17.168]) with ESMTPSA (Nemesis) id 1M4s51-1jZOXa1MZz-0021zP; Tue, 12
 May 2020 19:42:53 +0200
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>,
 41200 <at> debbugs.gnu.org
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <2050d979-369b-f546-eb48-2a34befb5602@HIDDEN>
 <3c3cbd2d-3a05-297a-3019-13253180a4e2@HIDDEN>
 <94f4ec10-9ac8-b12f-9bf5-896f573161de@HIDDEN>
 <49ee1a74-2bbc-47b0-6db0-1a2489091c3f@HIDDEN>
From: martin rudalics <rudalics@HIDDEN>
Message-ID: <18cd985b-5a76-2274-1783-8c8cad6395e6@HIDDEN>
Date: Tue, 12 May 2020 19:42:52 +0200
MIME-Version: 1.0
In-Reply-To: <49ee1a74-2bbc-47b0-6db0-1a2489091c3f@HIDDEN>
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Language: en-US
Content-Transfer-Encoding: 7bit
X-Provags-ID: V03:K1:SON8cpiPfHuEsSHV4lCSUBVWg+7fC7PeyVu06ZVOpee+kWN1+3J
 cBJTPQmDxunw9o3Af9vjwwlmARCyNUOZQuJqCd3Kiqut13dwMWp5RNx9Ha0OpuWb4d9UyLD
 g+FM6VtDLrP8zKv30VJrJpzTHTW2IY5WzUgEaWPqnvpUVwIaWZCn1/QLwECu1gknF66dsEb
 7fXstk0UF+8DUoW+z2evg==
X-Spam-Flag: NO
X-UI-Out-Filterresults: notjunk:1;V03:K0:YrQNbWEann0=:tPYgzwAUXdOszwrr1H3K/v
 5rGTizbsjzJIffTr2G7lu3/9xI0rvge2ht6CQnxilMibmQj8t416Gcumo4GuTgiq80qDyHIpM
 wFhXENVQ3E1IsB1GZ3W9EZ/TIf4JsLDvJSRbhoCxvxLAvfQN4UKXsQM8ydn2FXdxW83zmXuLR
 eeumg8UkmjZfrRTFScAWX9BASGnPzfZdDXh7Z0AJ3LJ9qDK6lcnXZL6CV6eyjYG2P8R4TrjvN
 Zfq2JmxCPy1DMhihZ9KPuMbBxEMUYX/O63uHd63mb04hmQfdOHFy6Yay3BPXNYXkeYwo644g+
 fDD/lD16D+q/DrY7NHToxZAijWssLLgT1VDlgAyOI/wPZryeDQRHR966sr7GqA6VLcwP8PPoS
 i+kVbuqWLMKbPLeGYErG+xk3oHJ7P3mCGRtlNZ+HhR/pA56MW1Rarjvp+bpdEJGfef6nQSo3j
 LXxZDU4WeTFBNWTOPDBqdsDLvSmmDCmcJr/SxkAylqoOA6/A5OXloLX2GRLUF15pjbRN2ndyI
 SFn7a0YsnpIftyD97dsJIfDndViL1aTtklFF3YrjL+TUt8dVT8jAdZMLpIl2HQvAIdwydrtZ9
 oWFTs9e4v1atQNt76onQaHOWnviJ5jux/lDkFXeD6IUHulkawVgNq4eSHejL7jT3XjwsM7KfX
 S5Ux5UjyRK9MqX5+HcU1g7OkvLt4BfFFdS+ktNLfixlEk7ra2HVtTGxBQ4KTq3Susy4MiiDzH
 hJDGbqniqyFDyYDI9fk8sUqm5hi/dbZMTfGPfsPuTSKgQCdv10EXSbuSyoIlJEAD4fAWxRRlp
 ChystGgErV8+immOGBPNMo7fAu7fD7DLaES0ORMzdKJe0euUZTirinvj4HMUppFJM6nccv7yc
 xM0C6ldU266XmnO1V5ABp5i5uIL45tl0aM7MSJUby45PfuAHOG66Pm6CfFoTY+UrzZivXT/u7
 MyB0ERPA1dItbMHrBnXa4+ZN8Ng+FNH//qLTrlIDwuIn7ZX8ow3SyRE6X09R9wWX+bN79pKjW
 zrakaRzkKmhSsSCfafdKKOWJQu+bBdbv0VcUmKMkZA7HEPO8ZYohNyQyRPLnj5sVWNldS/8+Y
 Q0cSwT7XGNPHyGYREekeuaoffJu+K95tm6uVtvT5dcVCsvojT2E6aE+Ie9yy9NXr8g5r5tBdc
 oqYdg+nhTOzMXXOEnPIxk9e8a2IarbM5mwmb9B5+UEtUv5l1r+As6cIf5rUl/uTllPVs2skNH
 jGAITlkb8N2Lf9pmd
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

 > Indeed, with tooltip-reuse-hidden-frame t and your patch, creating a
 >  tooltip is instantaneous (after the first tooltip is created)

Eli, any problems to fix this in Emacs 27?

 > The docstring suggests that with this option, results won't always be
 > correct.  Is there a chance that we could rebuild the frame when
 > needed and then make that option the default?

It depends on what "when needed" stands for.  Basically, the results may
be incorrect when some sort of face change happens.  But, as I recently
mentioned in another thread, the code not reusing a hidden frame already
fails picking up an internal border face specified via

   (set-face-background 'internal-border "red")

so such annoyances are already present in the default code.

In principle, you can always add or remove some non-position-specifying
alist entry and the tooltip frame will be recreated from scratch.  So if
we can identify the "when needed", it should be easy to add such an
entry and remove it as soon as the next tooltip frame has been created.

martin




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 12 May 2020 17:19:16 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 12 13:19:16 2020
Received: from localhost ([127.0.0.1]:56430 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYYYl-0001jm-SG
	for submit <at> debbugs.gnu.org; Tue, 12 May 2020 13:19:16 -0400
Received: from mail-qv1-f50.google.com ([209.85.219.50]:47066)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jYYYk-0001ja-4L
 for 41200 <at> debbugs.gnu.org; Tue, 12 May 2020 13:19:14 -0400
Received: by mail-qv1-f50.google.com with SMTP id 59so6800749qva.13
 for <41200 <at> debbugs.gnu.org>; Tue, 12 May 2020 10:19:14 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:references:from:message-id:date:user-agent:mime-version
 :in-reply-to:content-language:content-transfer-encoding;
 bh=C2LaFqQvUtRHvd1w/RnVymdADGdMExGxFy71UPiTFU4=;
 b=PLNEGsTb/64RRZIyDkNkMsEai9RjQ5X6oKdTvHtBSI9JQUcrLT4Kxfm0m0DetcLdHH
 Dr4wX/dM3lRsGUt+aIj2K+ZjoTp2DynPzTfIJmd7sgHn5qLtI3VqvxnWl6TUlS+GRo1L
 i8KHqKYypm508CmgJ2KZoZs63K6CJVZwGvq8eVGDNCk0D0Kq6QTDv8FKe2up/i36/uyb
 HovWCDLtkHrx9qwalLVeR790S6aWmEhssggQKtyIi6U14Q+hupRsk+ARQihXTZ2NQL1T
 E7LV8gMJ55SUdhjUEmcDv0psyHuOO7aFfcBEf4RCgFQmUPrRjIDxBtGGLoJd3/gUFUwJ
 jJjQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language
 :content-transfer-encoding;
 bh=C2LaFqQvUtRHvd1w/RnVymdADGdMExGxFy71UPiTFU4=;
 b=oKrS7IIFgadiPF6jyKa9ILe4Xm7o1kw2dUvR1xlBfAoIIwCHIO04BikKjgb6+TWpKX
 gLPlbLfsxZnUq4n2Y2MsnTlFykS4ed8YVunl3H2Aars/BmaSWLr1GWX9IeHUhtJgwbDx
 IvhLRoPgpiEqnleyIKqfNeIHVI2TsWHUdtGzjogWK8M4drjPLrdKlY86py2F46Vrq/e2
 vQuU5bs5ESVyTZjQVIswwZNjsesbtWNJzHJrDeL3aja4Vv9SNb8H1xtylC6z60r73tiT
 lm9pxaInkmNPD7pg1p/SilYwQIMlPQHUG8AIOA8LansZhcU/FKEvQcI47PyvP8pgRx94
 zLIQ==
X-Gm-Message-State: AGi0Pubb0AcmGBIn96gtKi47TuD4dIa0RuqrHURX5JH0COOVmuY3sF75
 aUOgr/BObQkpVVrU7Hvm01lsziGoL2M=
X-Google-Smtp-Source: APiQypK48oIBDNRq2CUhdVVldkHkZpivbmtzdhzaRzAGr9iEHklvZ9rDep44pfbk+dHuPdYzOO4rTg==
X-Received: by 2002:a05:6214:14e2:: with SMTP id
 k2mr22287811qvw.142.1589303948495; 
 Tue, 12 May 2020 10:19:08 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id x22sm12365181qtr.57.2020.05.12.10.19.07
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Tue, 12 May 2020 10:19:07 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: martin rudalics <rudalics@HIDDEN>, 41200 <at> debbugs.gnu.org
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <2050d979-369b-f546-eb48-2a34befb5602@HIDDEN>
 <3c3cbd2d-3a05-297a-3019-13253180a4e2@HIDDEN>
 <94f4ec10-9ac8-b12f-9bf5-896f573161de@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <49ee1a74-2bbc-47b0-6db0-1a2489091c3f@HIDDEN>
Date: Tue, 12 May 2020 13:19:06 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <94f4ec10-9ac8-b12f-9bf5-896f573161de@HIDDEN>
Content-Type: text/plain; charset=utf-8
Content-Language: en-GB
Content-Transfer-Encoding: 8bit
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

On 12/05/2020 11.12, martin rudalics wrote:
>>> Please try with 'tooltip-reuse-hidden-frame' non-nil (there's nothing we
>>> can do about a session's first tooltip appearance, though).
>>
>> I'm not seeing a difference here.  I used this code to test:
> 
> Looks like a devastating bug in the GTK builds.  Can you try with the
> attached patch?
> 
> Thanks, martin

Indeed, with tooltip-reuse-hidden-frame t and your patch, creating a tooltip is instantaneous (after the first tooltip is created)
The docstring suggests that with this option, results won't always be correct.  Is there a chance that we could rebuild the frame when needed and then make that option the default?






Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 12 May 2020 15:28:30 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 12 11:28:30 2020
Received: from localhost ([127.0.0.1]:56360 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYWpa-0005DN-8M
	for submit <at> debbugs.gnu.org; Tue, 12 May 2020 11:28:30 -0400
Received: from eggs.gnu.org ([209.51.188.92]:35666)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1jYWpY-0005D7-Kj
 for 41200 <at> debbugs.gnu.org; Tue, 12 May 2020 11:28:29 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:43200)
 by eggs.gnu.org with esmtp (Exim 4.90_1)
 (envelope-from <eliz@HIDDEN>)
 id 1jYWpT-0000yJ-CX; Tue, 12 May 2020 11:28:23 -0400
Received: from [176.228.60.248] (port=1750 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1jYWpN-0002Yc-Cb; Tue, 12 May 2020 11:28:19 -0400
Date: Tue, 12 May 2020 18:27:57 +0300
Message-Id: <83lflx896q.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel <cpitclaudel@HIDDEN>
In-Reply-To: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN> (message from
 =?utf-8?Q?Cl=C3=A9ment?= Pit-Claudel on Tue, 12 May 2020 00:30:23 -0400)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 41200
Cc: 41200 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Resent-From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
> Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
> Resent-CC: bug-gnu-emacs@HIDDEN
> Resent-Sender: help-debbugs@HIDDEN
> From: Clément Pit-Claudel <cpitclaudel@HIDDEN>
> Date: Tue, 12 May 2020 00:30:23 -0400
> 
> 
> [1:text/plain Hide]
> 
> Hi all,
> 
>   (defun my-def-many-faces (nfaces)
>     (dotimes (i nfaces)
>       (custom-declare-face
>        (intern (format "my-face-%d" i))
>        '((t)) "A face."
>        :group 'basic-faces)))
> 
>   (defun my-bench-x-tip (nfaces)
>     (setq x-gtk-use-system-tooltips nil)
>     (my-def-many-faces nfaces)
>     (benchmark-run 1 (x-show-tip "Test" (selected-frame) nil 5 nil nil)))
> 
>   (my-bench-x-tip 100) ;; ⇒ (0.035934318 1 0.015908304000000012)
>   (my-bench-x-tip 200) ;; ⇒ (0.049593474 1 0.01508625500000002)
>   (my-bench-x-tip 300) ;; ⇒ (0.094929297 2 0.03376510099999999)
>   (my-bench-x-tip 400) ;; ⇒ (0.094900665 2 0.03254889999999999)
>   (my-bench-x-tip 500) ;; ⇒ (0.118183442 2 0.03218763600000002)
>   (my-bench-x-tip 600) ;; ⇒ (0.154759438 3 0.04923829399999996)
>   (my-bench-x-tip 700) ;; ⇒ (0.183241646 3 0.04901039700000004)
>   (my-bench-x-tip 800) ;; ⇒ (0.212218872 3 0.050182316999999976)
>   (my-bench-x-tip 900) ;; ⇒ (0.248743542 3 0.04915146899999995)
>   (my-bench-x-tip 1000) ;; ⇒ (0.29221963 3 0.04943874300000006)
>   (my-bench-x-tip 1100) ;; ⇒ (0.334084605 3 0.05403986499999991)
>   (my-bench-x-tip 1200) ;; ⇒ (0.397292289 4 0.06869684599999992)
>   (my-bench-x-tip 1300) ;; ⇒ (0.442873256 4 0.06865671799999995)
>   (my-bench-x-tip 1400) ;; ⇒ (0.492474982 4 0.06888139900000001)
>   (my-bench-x-tip 1500) ;; ⇒ (0.579180262 5 0.08583425400000011)
>   (my-bench-x-tip 1600) ;; ⇒ (0.63504114 5 0.08973981699999989)
>   (my-bench-x-tip 1700) ;; ⇒ (0.723722857 5 0.09094433899999999)
>   (my-bench-x-tip 1800) ;; ⇒ (0.791952279 5 0.08777533800000015)
>   (my-bench-x-tip 1900) ;; ⇒ (0.902377982 6 0.10768666300000018)
>   (my-bench-x-tip 2000) ;; ⇒ (0.998815784 6 0.11384837999999986)
> 
> Be sure to run it in emacs -q, not emacs -Q, because emacs -Q ignores X resources and hence skips the body of make-face-x-resource-internal, which contributes greatly to the issue.
> For some reasons the effects are a bit worse in my config — roughly a factor 3 to 5 (I have 600 faces defined, and each tooltip takes .5s to display).  The profiles below suggest that face-spec-set-2 is called in my config, but not in my repro, which could explain part of the difference.
> 
> This is what the profile in emacs -q looks like:
> 
> - command-execute                                                1742  97%
>  - call-interactively                                            1742  97%
>   - funcall-interactively                                        1720  96%
>    - eval-defun                                                  1711  95%
>     - elisp--eval-defun                                          1711  95%
>      - eval-region                                               1711  95%
>       - let                                                      1711  95%
>        - list                                                    1711  95%
>         - let                                                    1711  95%
>          - x-show-tip                                            1708  95%
>           - face-set-after-frame-default                         1708  95%
>            - face-spec-recalc                                    1654  92%
>             - make-face-x-resource-internal                      1414  78%
>              - set-face-attributes-from-resources                1413  78%
>               - set-face-attribute-from-resource                 1394  77%
>                - face-name                                       1353  75%
>                 - check-face                                     1348  75%
>                    facep                                         1344  75%

If you look at internal-lisp-face-p, which is the workhorse of facep,
you will see that it does the moral equivalent of

  (assq FACE (frame-face-alist))

(The code is actually in a subroutine called by internal-lisp-face-p.)
Which means face-set-after-frame-default, which loops over all of the
faces, runs with O(n²) complexity in the number of faces.

So I think if we want to support such large amounts of faces, we
should not store them in alists, but in a more efficient data
structure.

> Configured using:
>  'configure -C'
> 
> Configured features:
> XPM JPEG TIFF GIF PNG RSVG CAIRO SOUND GPM DBUS GSETTINGS GLIB NOTIFY
> INOTIFY ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE HARFBUZZ M17N_FLT LIBOTF
> ZLIB TOOLKIT_SCROLL_BARS GTK3 X11 XDBE XIM MODULES THREADS LIBSYSTEMD
> JSON PDUMPER LCMS2 GMP

No Emacs version information?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 12 May 2020 15:13:09 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 12 11:13:09 2020
Received: from localhost ([127.0.0.1]:56355 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYWai-0004or-US
	for submit <at> debbugs.gnu.org; Tue, 12 May 2020 11:13:09 -0400
Received: from mout.gmx.net ([212.227.15.19]:52901)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rudalics@HIDDEN>) id 1jYWah-0004oI-5C
 for 41200 <at> debbugs.gnu.org; Tue, 12 May 2020 11:13:07 -0400
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net;
 s=badeba3b8450; t=1589296380;
 bh=DiQpSvrLAsjnP+H6OMGtNVJwMiZ1SDjZ0nTfNBy1j2E=;
 h=X-UI-Sender-Class:Subject:To:References:From:Date:In-Reply-To;
 b=c2pTfcx+/hOl5KaZ2wp24myksEz3k71qgaUUSO5/WVFIaYBGGUBgTn6uYhPOXGJLO
 BNzf8aR7fki8/1KI29woqBqDF/H0KgJWLea1tXHO7t7BX6vTUO8g3qCqWneyWy0X4n
 fQHxMmAOQsYpV5DW7drindRDt6Q+ZNMJnKuQGXD8=
X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c
Received: from [192.168.1.101] ([212.95.5.251]) by mail.gmx.com (mrgmx005
 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MHXBj-1jLY9F094L-00DWoa; Tue, 12
 May 2020 17:13:00 +0200
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>,
 41200 <at> debbugs.gnu.org
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <2050d979-369b-f546-eb48-2a34befb5602@HIDDEN>
 <3c3cbd2d-3a05-297a-3019-13253180a4e2@HIDDEN>
From: martin rudalics <rudalics@HIDDEN>
Message-ID: <94f4ec10-9ac8-b12f-9bf5-896f573161de@HIDDEN>
Date: Tue, 12 May 2020 17:12:58 +0200
MIME-Version: 1.0
In-Reply-To: <3c3cbd2d-3a05-297a-3019-13253180a4e2@HIDDEN>
Content-Type: multipart/mixed; boundary="------------F4BBAAA002A0E0E4024F980B"
Content-Language: en-US
X-Provags-ID: V03:K1:3ywq4wb7kdM92zPl1ATiyArEEAKGMHu0V70dhwia0xR+sZpjJTk
 WdZGUhIlXnPFZjegwUE3vByndfeN61MFkc6YhXrG6varhOZQbEAXTwiIbo2oOxeB6rUh5Bh
 4YHQlymxLUAos7Nx//oTN6c0HDUc4Hvfcv4ChN9t7o2M0Xh+3f+GiTuQODQ88q5P1TG/Ml1
 EbGuAkgiONTZMnFHtyKyA==
X-Spam-Flag: NO
X-UI-Out-Filterresults: notjunk:1;V03:K0:jTmrtYAa73g=:2gJt2tJouH/vr4XVKcVRT4
 itpI4TCGh1fMWLw6S16NtPHs/9mj16EKTWMMeGzNxt9mYnFJHnNwiGJ1gDxWXSeeFXpq077rM
 VnnLab71s1WShPIYbVfpfn0g4tPSFs40JJLfTeOIPMYkTZP3x496FEEWh3jlHYNuZfpJ67m5r
 EcqDLoMRPqqhW09Ljv2Czg5PvnFpztQM0flBiBVoiABiQWEPonsl3m05GbiGHCJAwR2Y1eEB3
 R8bMrLPYToVbj16rfF0NwpzkBXsvRj/uzll7SYaTb9UtPmSjhT+X7IJCn6Xk0/sUfMDNmYbBG
 pi+41ZtjMKjhxhL2C3zxOHIebMv7I2CaPCy1DoIG1z0csUaaff0X13UdXc0bcT69HlmMiq3WY
 ZHDup9bjKfaZxZrtmeqpcgc9xgVkBGaBJFODYi81zbr61Wj0ugk0eWZYBSPAOcRUQeYa+h0ZL
 KByUFUKBholeGz1i5+XPIoVIYgT0CyOha8d/ILceImguZnDrXKEEGLdAz5Vvu1rdNrk/uFVuY
 zRn3ScR+VvK8imfhByF0Xb6MZg5NiNYe0MA7PPxPnK08yQH7hbIMJ/3zXki0XGz5HwpyEOyCr
 x7fkAgVIsxAmT0pNfrpLr+zmodiFdQI9VMvbZBuUlTam4nwjlmnnAMlp6EVpPsNkemcvP1Oav
 Lhh36mzGutwaS8EWdEGC8CXSa6etNSnAKC+e53DkbOtkQn/ZJTZOW5mTXL3G7XA5jM8UpTIAn
 Bh6353Uhb0m3SxmBSDpCqlKUip4cO9umJ59N9RhE9YkuKXYx5VkAA7DnPNLkqMXE411IRh7Iq
 /7Tx+vWS4HW77CqwRs7utl1qfu7FIxx7YimraBVtXJ26h/+4g+8TmCg4dHETbKOo2mSUNsoUA
 bPdo0c6jEt8+JN8m/2b63DZSwHET+jLaHC7s/tltIHaDXsQQXTqnlNZC9GY/CSYM75Cxn9vDu
 EOVU3VYNpmYcrjXKpWmz33/nxnrA5LBNyKLw6L4/oKcCWJWtXtnY7nGJifbhyhNHCDyHn7yl+
 uajoYWAi/DYt69xRPL7o7iIvVid2ESeLVFyDOeppOqz0jCyljed9R/a4tWAyQRLpyapOFpNP2
 Bbzh8uMuGVbOclRNm+PqtVaHaVisfbujQGS5Bil7//s8GVBLDe0Urbu9ymiBWOr3yASArbdkI
 0CKnPRdIlbxQOXwKxRNySWrZCGCkkgQZte5cr1t+04Gl+w+XpVLu74plDHMUZIupuXQniEZks
 zpW9xuvLczbD8IFev
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

This is a multi-part message in MIME format.
--------------F4BBAAA002A0E0E4024F980B
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit

 >> Please try with 'tooltip-reuse-hidden-frame' non-nil (there's nothing we
 >> can do about a session's first tooltip appearance, though).
 >
 > I'm not seeing a difference here.  I used this code to test:

Looks like a devastating bug in the GTK builds.  Can you try with the
attached patch?

Thanks, martin

--------------F4BBAAA002A0E0E4024F980B
Content-Type: text/x-patch;
 name="tooltip-hide.diff"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
 filename="tooltip-hide.diff"

diff --git a/src/xfns.c b/src/xfns.c
index a5431aa890..a8cdd66b57 100644
=2D-- a/src/xfns.c
+++ b/src/xfns.c
@@ -6748,7 +6748,8 @@ x_hide_tip (bool delete)

       /* Reset tip_last_frame, it will be reassigned when showing the
 	 next GTK+ system tooltip.  */
-      tip_last_frame =3D Qnil;
+      if (x_gtk_use_system_tooltips)
+	tip_last_frame =3D Qnil;

       /* Now look whether there's an Emacs tip around.  */
       if (FRAMEP (tip_frame))

--------------F4BBAAA002A0E0E4024F980B--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 12 May 2020 11:30:11 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 12 07:30:11 2020
Received: from localhost ([127.0.0.1]:54411 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYT6w-0000rl-K6
	for submit <at> debbugs.gnu.org; Tue, 12 May 2020 07:30:10 -0400
Received: from mail-qt1-f170.google.com ([209.85.160.170]:43374)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jYT6u-0000k5-TQ
 for 41200 <at> debbugs.gnu.org; Tue, 12 May 2020 07:30:09 -0400
Received: by mail-qt1-f170.google.com with SMTP id z90so10630212qtd.10
 for <41200 <at> debbugs.gnu.org>; Tue, 12 May 2020 04:30:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:to:references:from:message-id:date:user-agent:mime-version
 :in-reply-to:content-language:content-transfer-encoding;
 bh=d6vgVxJGKJBlEp4f998eqUDkJdY5JfVcXnDNyuXD82s=;
 b=tiAyF8kcpw0UMzfDx8NlhZg1OJ/JXifwTXPHa9lIDNIbjFvhqH8oMvghfWhZf4rZVT
 zTCtkY4CM4uYnOilpByOITNcC0T0eAYIW487SpSMcE/AsD85W7w3D0uR3YsknVdJXFuU
 Ttv0B9rNLeK/7s7ucq0T69ikhU9ryCbDie5OpzRVMnV2NYH/53DmOHr07umZVzuYhhJY
 FLsv281pqVnjJgazlulOnboSVJqinR2etiWMtN2PUC/M7d7MOBnH+yVB0v5xSl1ri4oa
 i+diwQCb5vu2Zk94chmvhgbFEamfBlQxyoGqngOZW9f2At7DuHUTQuBreKuDDGf0RvMq
 yzag==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:to:references:from:message-id:date
 :user-agent:mime-version:in-reply-to:content-language
 :content-transfer-encoding;
 bh=d6vgVxJGKJBlEp4f998eqUDkJdY5JfVcXnDNyuXD82s=;
 b=jU2eNTaOVwZ83D5Q7T1WSVA1V41kGBSl9egD6FzrRahouumsOeRm8ZrCZZP9MHBNnL
 GeWDHDGSUibHfneQb0V2h0XpPHxnahPm03whaH7e1aoAdnsTpzOSQfLOADjtTeFKFgCQ
 ISl9GMIPoLcxbIHDFpOnB8PgxF/ne+aBqnb9wnb43iMf61Q54f/ElMW5nJIZ4tmX41it
 Qgh7ftciU5xawV96mrgTBmwU+iE6xxtQ+p1R8VR6Naq2THNPsiKV1geXho667AQ1ubgO
 ukiPpJ/GH35dAsCKXhmxbtdOyW4d3BOo6QXvs39Q06Z4h+8czwu6SAiFiXOjZ/GPxqcv
 Dtpw==
X-Gm-Message-State: AGi0PubCXDnqS+VDZrCr3eF1CE2t5AZZO7tXHQ2lILiYE+urwFWc6gMZ
 TfFBOwoZE5CXCVrMfF+6b9PrAxr1+zQ=
X-Google-Smtp-Source: APiQypKY1CqxH9rxwYFjts+/Rs/f6WBDIsFt3qLYETemY5hYgjKslOkVAo3GTjiK37EKT8sLagRpvA==
X-Received: by 2002:ac8:4b45:: with SMTP id e5mr21018416qts.86.1589283003211; 
 Tue, 12 May 2020 04:30:03 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id l9sm11716747qth.60.2020.05.12.04.30.02
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Tue, 12 May 2020 04:30:02 -0700 (PDT)
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: martin rudalics <rudalics@HIDDEN>, 41200 <at> debbugs.gnu.org
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
 <2050d979-369b-f546-eb48-2a34befb5602@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Message-ID: <3c3cbd2d-3a05-297a-3019-13253180a4e2@HIDDEN>
Date: Tue, 12 May 2020 07:30:01 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
In-Reply-To: <2050d979-369b-f546-eb48-2a34befb5602@HIDDEN>
Content-Type: text/plain; charset=utf-8
Content-Language: en-GB
Content-Transfer-Encoding: 7bit
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 41200
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

On 12/05/2020 02.42, martin rudalics wrote:
>> Is seems that defining a face makes x-show-tip a tiny bit slower, but
>> these effects stack.
> 
> Please try with 'tooltip-reuse-hidden-frame' non-nil (there's nothing we
> can do about a session's first tooltip appearance, though).

I'm not seeing a difference here.  I used this code to test:


(defun my-def-many-faces (nfaces)
  (dotimes (i nfaces)
    (custom-declare-face
     (intern (format "my-face-%d" i))
     '((t)) "A face."
     :group 'basic-faces)))

(defun my-bench-x-tip (nfaces)
  (setq x-gtk-use-system-tooltips nil
        tooltip-reuse-hidden-frame t)
  (my-def-many-faces nfaces)
  (benchmark-run 1 (x-show-tip "Test" (selected-frame) nil 5 nil nil)))





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at 41200 <at> debbugs.gnu.org:


Received: (at 41200) by debbugs.gnu.org; 12 May 2020 06:42:59 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 12 02:42:59 2020
Received: from localhost ([127.0.0.1]:53952 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYOd1-0001VP-Ct
	for submit <at> debbugs.gnu.org; Tue, 12 May 2020 02:42:59 -0400
Received: from mout.gmx.net ([212.227.17.20]:48933)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rudalics@HIDDEN>) id 1jYOd0-0001VA-CZ
 for 41200 <at> debbugs.gnu.org; Tue, 12 May 2020 02:42:58 -0400
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net;
 s=badeba3b8450; t=1589265771;
 bh=L9xesa8557SDVKwggRNTsMpUHnGv3TyTSFdIp7mCKVg=;
 h=X-UI-Sender-Class:Subject:To:References:From:Date:In-Reply-To;
 b=YTYc0QobqJIm73UMt35TECJoyr9ljt5jWU3cqFYPdH7zoye9abB8yVzkNXIJueKJ7
 VIG2MMRO+OsQBSV3mQcQTvM0gcTFK2ardIcel1fX2bfchHBZ0UBUBKoP3zrow3Db+N
 9UaX6g57j3s+c/wmHsWnuuI2mL9U12wGiBb0A1zw=
X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c
Received: from [192.168.1.101] ([212.95.5.251]) by mail.gmx.com (mrgmx104
 [212.227.17.168]) with ESMTPSA (Nemesis) id 1Mj8qj-1iwK7i2gnV-00fEjo; Tue, 12
 May 2020 08:42:51 +0200
Subject: Re: bug#41200: Displaying a tooltip with x-show-tip gets very slow as
 more faces are defined
To: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>,
 41200 <at> debbugs.gnu.org
References: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
From: martin rudalics <rudalics@HIDDEN>
Message-ID: <2050d979-369b-f546-eb48-2a34befb5602@HIDDEN>
Date: Tue, 12 May 2020 08:42:50 +0200
MIME-Version: 1.0
In-Reply-To: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Language: en-US
Content-Transfer-Encoding: 7bit
X-Provags-ID: V03:K1:kKzGBMjsZkk4WEBo/cOtiZ7OB6T/adBNBaksU7P8XuR/ClvqZ18
 YGMCBOoewqDg6ZSU6jxZ9JMrPULIH4HEu+eijy7/CSTqkCxW1miTIch8VZf1fImsjbROFKO
 GUiHoA6o9MC2jhMLHRToHBXVPKuW5/1w+JxKJVqpAg6vEAViSi9EXn5KQOQ26qaQbN7CF+H
 EHB3XCRskrWR2NGv3X9YA==
X-Spam-Flag: NO
X-UI-Out-Filterresults: notjunk:1;V03:K0:CITVrP0ORsM=:2CCLfurWR6NqBZD0NWIphw
 d0Piq/QaGPWUyrbhEmS/Wa9UAertT2KwdW/56oLjMCTsNo9/t/yxxshySvjfVxlMvx2zDah0c
 aTwEzS0XhvrSGR1qmYodcc52N80H+UrOrT2t0tV2Lk5+iGfQ9CzbpYT/LI/TfcMURrvGc0lPD
 +NEEJwHOS6qf5k05SmE7iVM8q23ziWpbF/tc+GVv23Tz/Qx/a9BjIwBStdCi8NwSRT4cvnLdC
 ZKbep4n8jaGFsagIRuYrYTdtCN/7URzYhFY4iAO3QsyAg7foeD7nJtX18wH/payYvn4erHkeE
 WitJBd02x4KFrgFGaV4O17h+AdeJyksZVmnaab56gXWSPv/cJ/h/UcgrSKkHhOyLK9rqFS7Qo
 JtOSBx2t20aqAeksUCZ1rkXMfenrVdNwH+cAzN3Kx4IyL2UUb5bertYC/O7LfdXTWJ0XH7X5x
 wyVIlEXR0lqPz52fGrXo1hsLFThbRnv96xlCZiQYklWtWxmWZQPIgEtnvdjv6SNUx935H/+ip
 ZXURdsMaUf9mzAbW80lSb0hv+olwNggWKfPS//3NUCPTF0NdTjaiocgg8lnTxT6Hoqn9Nz8yc
 CModZ8xt/slDX/HVQBHVVkvSOPUNcyS/sPc6TwehWN7Kwfg8fXFMm8SagZx6QFST8TAUuWcwn
 ziZLpj8p9U5Qq542uC34dstRrAWcPqzFZE4q+qeuR1xRHLKxZrjmqtVQh/ioKUbVE/ZtWg3iD
 iMr6pRnGn1SASJkAFA71l2pryxoAjpGH8gJRWuX44RmmywnaaO9CrUIIT1Tf2JTwJ9wwSo5F+
 NWCD2cXIhaZfHNdFoYpPSKG7LSj7AseaIwmIH819eD0Czj+G19oHPKCVEG5sqpjJKbiO5RN1+
 tPPnx+LsHmY2x7JSY4vyG/NF5Fgcc9GMtL+H95OYpNYJ7fxNDAGJCwl0Sh8OnJzuvapyFxjQu
 tdRW7rmwcQ1PFI30v75DQ+iqB5Vpx77FnlAg11UOQKajG2q6/V29kQ1nhF490Xy8Ty4znlqAg
 hi0TO0oqG2j3N5/91Eiv26kqzpdLh7jev9Xl8bXBEm5q9051+lrZuLStW2vNsFaOPNN0XZTLe
 0AX5xgQM9dY4FICciS4dZtLam9Immg/+OK/8OAyCJ52G2hArx4PMai3h+Mn0wz24ebbSzqUnQ
 B+Cz8vLr0wqAbSJyxkeXVo/HmtLfsJLqOKRQ0IkaXQzc193Ouy7m4r+99SBP+YHHJxRkm2c1U
 qeZEaVz/72gWCJfSk
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 41200
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

 > Is seems that defining a face makes x-show-tip a tiny bit slower, but
 > these effects stack.

Please try with 'tooltip-reuse-hidden-frame' non-nil (there's nothing we
can do about a session's first tooltip appearance, though).

martin




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 12 May 2020 04:30:35 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 12 00:30:35 2020
Received: from localhost ([127.0.0.1]:53879 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1jYMYr-0006Mk-SJ
	for submit <at> debbugs.gnu.org; Tue, 12 May 2020 00:30:35 -0400
Received: from lists.gnu.org ([209.51.188.17]:43248)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <cpitclaudel@HIDDEN>) id 1jYMYo-0006MZ-EO
 for submit <at> debbugs.gnu.org; Tue, 12 May 2020 00:30:32 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:37396)
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <cpitclaudel@HIDDEN>)
 id 1jYMYo-0002cs-7V
 for bug-gnu-emacs@HIDDEN; Tue, 12 May 2020 00:30:30 -0400
Received: from mail-qt1-x82e.google.com ([2607:f8b0:4864:20::82e]:38518)
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <cpitclaudel@HIDDEN>)
 id 1jYMYk-0004HM-Sm
 for bug-gnu-emacs@HIDDEN; Tue, 12 May 2020 00:30:29 -0400
Received: by mail-qt1-x82e.google.com with SMTP id i68so10043388qtb.5
 for <bug-gnu-emacs@HIDDEN>; Mon, 11 May 2020 21:30:26 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=to:from:subject:message-id:date:user-agent:mime-version
 :content-language;
 bh=z1C+rxoZyx3NQElvIUvKQXSv3XhhXvUjCEp+IpdY+MA=;
 b=ZJvk6nfGlfa31ME/IfeZmXjlp2VZ+vNgNTJUsIX55VratugnIeh0Ip1B8HcbrcSlFT
 rco6wKIx8uwjlyE2+JWrBMwZRJYmhrrHlE5q9EQvb9K0BlIO0teQQa8cFscrZDGiDKi+
 u7lalclnnjSdz3ZW+vjTMH5PaVgb/sy1GjsZ/2iK6zZQSYdbtXza/3Tf+/Sq7R82zqb6
 xXJlT1h4iBckpUzHyikRBrmsnXxSJkacnLP+dw6w+ovcLSuENp2HO/bKJ/8vbheCoSju
 NPY1zPedhtIiAXrGTzQCRrdsVP+HeqttfwOX07ubqGNrKxyAjjWtPdD+MHJdurvEew48
 S+FQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:to:from:subject:message-id:date:user-agent
 :mime-version:content-language;
 bh=z1C+rxoZyx3NQElvIUvKQXSv3XhhXvUjCEp+IpdY+MA=;
 b=dP39PuVr++lj2IJ6BiL34Roz64H3aOUGXiL6foff01isDXT82X5wbVE5laat1iM7Ji
 ixu4yD+uExiLrLbRy/dRVA5n3waxEunh5hX0NzUk8DgcZAqWcTxa7rRXLqhoPb8+nnjX
 fq0kG1dx1VhFy7x9AT1735uly11MRz5ralc8TLd3PgGziBF+8d2MgYwjDkRyuXIi81Dv
 mVCMES6+9L9R95kr66qCs4Z6j/oYQXbB8V/9nQEOi7+XVmiii6C4ZoCXWRgt0/WJ7mKv
 LRlaMq+gDoC8Tu8DGuLCyZWoSLnn9DS4sLvPLulBFb405TykG0jjl2py+4mtBPoPFdeJ
 GpJQ==
X-Gm-Message-State: AGi0PuYKNrhV3fRqQ9FBGE3iD5si0EcFHo6eetpKGYo2GRnp3nShabwe
 GjPXHbEuApW+9r9Lpt/WB4wH2y3nX+Y=
X-Google-Smtp-Source: APiQypJ1qs/h/NtWnO/l6i9mvZo5vXYw2U9piUscDq30xOG0PLqWptn/Jd64r2j0Ti//GKBkQep6Vg==
X-Received: by 2002:aed:3aa3:: with SMTP id o32mr20858456qte.364.1589257825266; 
 Mon, 11 May 2020 21:30:25 -0700 (PDT)
Received: from ?IPv6:2601:184:4180:66e7:4d17:b25e:8d9:2188?
 ([2601:184:4180:66e7:4d17:b25e:8d9:2188])
 by smtp.googlemail.com with ESMTPSA id
 g11sm10030722qkk.106.2020.05.11.21.30.24 for <bug-gnu-emacs@HIDDEN>
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Mon, 11 May 2020 21:30:24 -0700 (PDT)
To: bug-gnu-emacs <bug-gnu-emacs@HIDDEN>
From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= <cpitclaudel@HIDDEN>
Subject: Displaying a tooltip with x-show-tip gets very slow as more faces are
 defined
Message-ID: <8fd8896a-cd5c-66f4-4792-f65cac4dc4f5@HIDDEN>
Date: Tue, 12 May 2020 00:30:23 -0400
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
 Thunderbird/68.7.0
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------6B3BC16CBBDC72B8800AD96F"
Content-Language: en-GB
Received-SPF: pass client-ip=2607:f8b0:4864:20::82e;
 envelope-from=cpitclaudel@HIDDEN; helo=mail-qt1-x82e.google.com
X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache.
 That's all we know.
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,
 RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001 autolearn=_AUTOLEARN
X-Spam_action: no action
X-Spam-Score: 0.7 (/)
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -2.3 (--)

This is a multi-part message in MIME format.
--------------6B3BC16CBBDC72B8800AD96F
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

Hi all,

I've recently noticed that opening a tooltip on my machine takes about 0.5s when x-gtk-use-system-tooltips is set to nil.
I bisected my config, and… nothing.  It's not one package: instead, it's an accumulation of small slowdowns.
Is seems that defining a face makes x-show-tip a tiny bit slower, but these effects stack.

Here is a repro:

  (defun my-def-many-faces (nfaces)
    (dotimes (i nfaces)
      (custom-declare-face
       (intern (format "my-face-%d" i))
       '((t)) "A face."
       :group 'basic-faces)))

  (defun my-bench-x-tip (nfaces)
    (setq x-gtk-use-system-tooltips nil)
    (my-def-many-faces nfaces)
    (benchmark-run 1 (x-show-tip "Test" (selected-frame) nil 5 nil nil)))

  (my-bench-x-tip 100) ;; ⇒ (0.035934318 1 0.015908304000000012)
  (my-bench-x-tip 200) ;; ⇒ (0.049593474 1 0.01508625500000002)
  (my-bench-x-tip 300) ;; ⇒ (0.094929297 2 0.03376510099999999)
  (my-bench-x-tip 400) ;; ⇒ (0.094900665 2 0.03254889999999999)
  (my-bench-x-tip 500) ;; ⇒ (0.118183442 2 0.03218763600000002)
  (my-bench-x-tip 600) ;; ⇒ (0.154759438 3 0.04923829399999996)
  (my-bench-x-tip 700) ;; ⇒ (0.183241646 3 0.04901039700000004)
  (my-bench-x-tip 800) ;; ⇒ (0.212218872 3 0.050182316999999976)
  (my-bench-x-tip 900) ;; ⇒ (0.248743542 3 0.04915146899999995)
  (my-bench-x-tip 1000) ;; ⇒ (0.29221963 3 0.04943874300000006)
  (my-bench-x-tip 1100) ;; ⇒ (0.334084605 3 0.05403986499999991)
  (my-bench-x-tip 1200) ;; ⇒ (0.397292289 4 0.06869684599999992)
  (my-bench-x-tip 1300) ;; ⇒ (0.442873256 4 0.06865671799999995)
  (my-bench-x-tip 1400) ;; ⇒ (0.492474982 4 0.06888139900000001)
  (my-bench-x-tip 1500) ;; ⇒ (0.579180262 5 0.08583425400000011)
  (my-bench-x-tip 1600) ;; ⇒ (0.63504114 5 0.08973981699999989)
  (my-bench-x-tip 1700) ;; ⇒ (0.723722857 5 0.09094433899999999)
  (my-bench-x-tip 1800) ;; ⇒ (0.791952279 5 0.08777533800000015)
  (my-bench-x-tip 1900) ;; ⇒ (0.902377982 6 0.10768666300000018)
  (my-bench-x-tip 2000) ;; ⇒ (0.998815784 6 0.11384837999999986)

Be sure to run it in emacs -q, not emacs -Q, because emacs -Q ignores X resources and hence skips the body of make-face-x-resource-internal, which contributes greatly to the issue.
For some reasons the effects are a bit worse in my config — roughly a factor 3 to 5 (I have 600 faces defined, and each tooltip takes .5s to display).  The profiles below suggest that face-spec-set-2 is called in my config, but not in my repro, which could explain part of the difference.

This is what the profile in emacs -q looks like:

- command-execute                                                1742  97%
 - call-interactively                                            1742  97%
  - funcall-interactively                                        1720  96%
   - eval-defun                                                  1711  95%
    - elisp--eval-defun                                          1711  95%
     - eval-region                                               1711  95%
      - let                                                      1711  95%
       - list                                                    1711  95%
        - let                                                    1711  95%
         - x-show-tip                                            1708  95%
          - face-set-after-frame-default                         1708  95%
           - face-spec-recalc                                    1654  92%
            - make-face-x-resource-internal                      1414  78%
             - set-face-attributes-from-resources                1413  78%
              - set-face-attribute-from-resource                 1394  77%
               - face-name                                       1353  75%
                - check-face                                     1348  75%
                   facep                                         1344  75%
            - face-spec-reset-face                                239  13%
             - apply                                              239  13%
                set-face-attribute                                234  13%

And this is what it looks like in my config:

- command-execute                                                1423  87%
 - call-interactively                                            1423  87%
  - apply                                                        1423  87%
   - call-interactively@ido-cr+-record-current-command               1423  87%
    - apply                                                      1423  87%
     - #<subr call-interactively>                                1423  87%
      - funcall-interactively                                    1423  87%
       - eval-defun                                              1345  83%
        - apply                                                  1345  83%
         - #<compiled 0x1fa5d1dc39debc9e>                        1345  83%
          - elisp--eval-defun                                    1345  83%
           - eval-region                                         1344  83%
            - apply                                              1344  83%
             - #<lambda -0x120930d847119138>                     1344  83%
              - endless/eval-overlay                             1344  83%
               - apply                                           1343  83%
                - #<subr eval-region>                            1343  83%
                 - my-bench-x-tip                                1343  83%
                  - let                                          1280  79%
                   - list                                        1280  79%
                    - let                                        1280  79%
                     - x-show-tip                                1277  78%
                      - face-set-after-frame-default               1277  78%
                       - face-spec-recalc                        1218  75%
                        - face-spec-set-2                         673  41%
                         - apply                                  672  41%
                          - set-face-attribute                    671  41%
                           - internal-set-lisp-face-attribute                669  41%
                            - frame-set-background-mode                651  40%
                             - face-spec-recalc                   411  25%
                              - make-face-x-resource-internal                352  21%
                               - set-face-attributes-from-resources                350  21%
                                - set-face-attribute-from-resource                343  21%
                                 - face-name                      312  19%
                                  - check-face                    309  19%
                                     facep                        308  19%
                              + face-spec-reset-face                 56   3%
                                face-spec-choose                    1   0%
                              + face-spec-set-2                     1   0%
                             - face-attr-match-p                  235  14%
                                face-attribute                    235  14%
                        - make-face-x-resource-internal                321  19%
                         - set-face-attributes-from-resources                320  19%
                          - set-face-attribute-from-resource                316  19%
                           - face-name                            296  18%
                            - check-face                          294  18%
                               facep                              293  18%
                        - face-spec-reset-face                    223  13%
                         - apply                                  223  13%
                            set-face-attribute                    219  13%
                  + my-def-many-faces                              63   3%
               + cider--make-result-overlay                         1   0%
           + end-of-defun                                           1   0%
       + smex                                                      78   4%
+ ...                                                             188  11%
+ timer-event-handler                                               4   0%
+ redisplay_internal (C function)                                   2   0%
+ flyspell-post-command-hook                                        1   0%


I've attached both profiles.

Clément.

Configured using:
 'configure -C'

Configured features:
XPM JPEG TIFF GIF PNG RSVG CAIRO SOUND GPM DBUS GSETTINGS GLIB NOTIFY
INOTIFY ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE HARFBUZZ M17N_FLT LIBOTF
ZLIB TOOLKIT_SCROLL_BARS GTK3 X11 XDBE XIM MODULES THREADS LIBSYSTEMD
JSON PDUMPER LCMS2 GMP

Important settings:
  value of $LC_MONETARY: en_DK.UTF-8
  value of $LC_NUMERIC: en_DK.UTF-8
  value of $LC_TIME: en_DK.UTF-8
  value of $LANG: en_US.UTF-8
  value of $XMODIFIERS: @im=ibus
  locale-coding-system: utf-8-unix

Major mode: Fundamental

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  buffer-read-only: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message rmc puny dired dired-loaddefs
format-spec rfc822 mml easymenu mml-sec password-cache epa derived epg
epg-config gnus-util rmail rmail-loaddefs text-property-search time-date
subr-x seq byte-opt gv bytecomp byte-compile cconv mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader cl-loaddefs
cl-lib sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils
tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type
mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode elisp-mode
lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch
timer select scroll-bar mouse jit-lock font-lock syntax facemenu
font-core term/tty-colors frame minibuffer cl-generic cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european
ethiopic indian cyrillic chinese composite charscript charprop
case-table epa-hook jka-cmpr-hook help simple abbrev obarray
cl-preloaded nadvice loaddefs button faces cus-face macroexp files
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget hashtable-print-readable backquote threads dbusbind
inotify lcms2 dynamic-setting system-font-setting font-render-setting
cairo move-toolbar gtk x-toolkit x multi-tty make-network-process emacs)

Memory information:
((conses 16 48162 5363)
 (symbols 48 6344 1)
 (strings 32 15896 1092)
 (string-bytes 1 517314)
 (vectors 16 10213)
 (vector-slots 8 140571 9444)
 (floats 8 19 41)
 (intervals 56 230 7)
 (buffers 992 11))

--------------6B3BC16CBBDC72B8800AD96F
Content-Type: text/plain; charset=UTF-8;
 name="tip.emacs-q.prof"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="tip.emacs-q.prof"

Cltwcm9maWxlci1wcm9maWxlICIyNC4zIiBjcHUgI3MoaGFzaC10YWJsZSBzaXplIDY1IHRl
c3QgZXF1YWwgcmVoYXNoLXNpemUgMS41IHJlaGFzaC10aHJlc2hvbGQgMC44MTI1IGRhdGEg
KFtyZWRpc3BsYXkgc2l0LWZvciBleGVjdXRlLWV4dGVuZGVkLWNvbW1hbmQgZnVuY2FsbC1p
bnRlcmFjdGl2ZWx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSA0IFtzaXQtZm9yIGV4ZWN1dGUt
ZXh0ZW5kZWQtY29tbWFuZCBmdW5jYWxsLWludGVyYWN0aXZlbHkgY2FsbC1pbnRlcmFjdGl2
ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsXSAzIFtsZXQgbGlzdCBsZXQgZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwtZGVm
dW4gZXZhbC1kZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkgY2FsbC1pbnRlcmFjdGl2ZWx5
IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDMgW2ZhY2Vw
IGNoZWNrLWZhY2UgZmFjZS1uYW1lIHNldC1mYWNlLWF0dHJpYnV0ZS1mcm9tLXJlc291cmNl
IHNldC1mYWNlLWF0dHJpYnV0ZXMtZnJvbS1yZXNvdXJjZXMgbWFrZS1mYWNlLXgtcmVzb3Vy
Y2UtaW50ZXJuYWwgZmFjZS1zcGVjLXJlY2FsYyBmYWNlLXNldC1hZnRlci1mcmFtZS1kZWZh
dWx0IHgtc2hvdy10aXAgbGV0IGxpc3QgbGV0IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRl
ZnVuIGV2YWwtZGVmdW4gZnVuY2FsbC1pbnRlcmFjdGl2ZWx5XSAxMzQ0IFtzZXQtZmFjZS1h
dHRyaWJ1dGUtZnJvbS1yZXNvdXJjZSBzZXQtZmFjZS1hdHRyaWJ1dGVzLWZyb20tcmVzb3Vy
Y2VzIG1ha2UtZmFjZS14LXJlc291cmNlLWludGVybmFsIGZhY2Utc3BlYy1yZWNhbGMgZmFj
ZS1zZXQtYWZ0ZXItZnJhbWUtZGVmYXVsdCB4LXNob3ctdGlwIGxldCBsaXN0IGxldCBldmFs
LXJlZ2lvbiBlbGlzcC0tZXZhbC1kZWZ1biBldmFsLWRlZnVuIGZ1bmNhbGwtaW50ZXJhY3Rp
dmVseSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbF0gNDEgW2ZhY2Ut
bmFtZSBzZXQtZmFjZS1hdHRyaWJ1dGUtZnJvbS1yZXNvdXJjZSBzZXQtZmFjZS1hdHRyaWJ1
dGVzLWZyb20tcmVzb3VyY2VzIG1ha2UtZmFjZS14LXJlc291cmNlLWludGVybmFsIGZhY2Ut
c3BlYy1yZWNhbGMgZmFjZS1zZXQtYWZ0ZXItZnJhbWUtZGVmYXVsdCB4LXNob3ctdGlwIGxl
dCBsaXN0IGxldCBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1kZWZ1biBldmFsLWRlZnVuIGZ1
bmNhbGwtaW50ZXJhY3RpdmVseSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRl
XSA1IFtzZXQtZmFjZS1hdHRyaWJ1dGVzLWZyb20tcmVzb3VyY2VzIG1ha2UtZmFjZS14LXJl
c291cmNlLWludGVybmFsIGZhY2Utc3BlYy1yZWNhbGMgZmFjZS1zZXQtYWZ0ZXItZnJhbWUt
ZGVmYXVsdCB4LXNob3ctdGlwIGxldCBsaXN0IGxldCBldmFsLXJlZ2lvbiBlbGlzcC0tZXZh
bC1kZWZ1biBldmFsLWRlZnVuIGZ1bmNhbGwtaW50ZXJhY3RpdmVseSBjYWxsLWludGVyYWN0
aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBuaWxdIDE5IFtmYWNlLXNldC1hZnRlci1mcmFt
ZS1kZWZhdWx0IHgtc2hvdy10aXAgbGV0IGxpc3QgbGV0IGV2YWwtcmVnaW9uIGVsaXNwLS1l
dmFsLWRlZnVuIGV2YWwtZGVmdW4gZnVuY2FsbC1pbnRlcmFjdGl2ZWx5IGNhbGwtaW50ZXJh
Y3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmlsIG5pbF0gNTQgW3NldC1m
YWNlLWF0dHJpYnV0ZSBhcHBseSBmYWNlLXNwZWMtcmVzZXQtZmFjZSBmYWNlLXNwZWMtcmVj
YWxjIGZhY2Utc2V0LWFmdGVyLWZyYW1lLWRlZmF1bHQgeC1zaG93LXRpcCBsZXQgbGlzdCBs
ZXQgZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwtZGVmdW4gZXZhbC1kZWZ1biBmdW5jYWxsLWlu
dGVyYWN0aXZlbHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWxdIDIz
NCBbZmFjZS1zcGVjLXJlY2FsYyBmYWNlLXNldC1hZnRlci1mcmFtZS1kZWZhdWx0IHgtc2hv
dy10aXAgbGV0IGxpc3QgbGV0IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVuIGV2YWwt
ZGVmdW4gZnVuY2FsbC1pbnRlcmFjdGl2ZWx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5k
LWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmlsXSAxIFtjaGVjay1mYWNlIGZhY2UtbmFtZSBzZXQt
ZmFjZS1hdHRyaWJ1dGUtZnJvbS1yZXNvdXJjZSBzZXQtZmFjZS1hdHRyaWJ1dGVzLWZyb20t
cmVzb3VyY2VzIG1ha2UtZmFjZS14LXJlc291cmNlLWludGVybmFsIGZhY2Utc3BlYy1yZWNh
bGMgZmFjZS1zZXQtYWZ0ZXItZnJhbWUtZGVmYXVsdCB4LXNob3ctdGlwIGxldCBsaXN0IGxl
dCBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1kZWZ1biBldmFsLWRlZnVuIGZ1bmNhbGwtaW50
ZXJhY3RpdmVseSBjYWxsLWludGVyYWN0aXZlbHldIDQgW21ha2UtZmFjZS14LXJlc291cmNl
LWludGVybmFsIGZhY2Utc3BlYy1yZWNhbGMgZmFjZS1zZXQtYWZ0ZXItZnJhbWUtZGVmYXVs
dCB4LXNob3ctdGlwIGxldCBsaXN0IGxldCBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1kZWZ1
biBldmFsLWRlZnVuIGZ1bmNhbGwtaW50ZXJhY3RpdmVseSBjYWxsLWludGVyYWN0aXZlbHkg
Y29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsXSAxIFthcHBseSBmYWNlLXNwZWMtcmVzZXQt
ZmFjZSBmYWNlLXNwZWMtcmVjYWxjIGZhY2Utc2V0LWFmdGVyLWZyYW1lLWRlZmF1bHQgeC1z
aG93LXRpcCBsZXQgbGlzdCBsZXQgZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwtZGVmdW4gZXZh
bC1kZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1h
bmQtZXhlY3V0ZSBuaWwgbmlsXSA1IFtuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDIgW3Rvb2x0aXAtaGlkZSBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bF0gMSBbY29tcGxldGluZy1yZWFkLWRlZmF1bHQgY29tcGxldGluZy1yZWFkIHJlYWQtZXh0
ZW5kZWQtY29tbWFuZCBieXRlLWNvZGUgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhl
Y3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDEzIFtyZWFk
LWZyb20tbWluaWJ1ZmZlciBjb21wbGV0aW5nLXJlYWQtZGVmYXVsdCBjb21wbGV0aW5nLXJl
YWQgcmVhZC1leHRlbmRlZC1jb21tYW5kIGJ5dGUtY29kZSBjYWxsLWludGVyYWN0aXZlbHkg
Y29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSA5
IFtwcm9maWxlci1yZXBvcnQgZnVuY2FsbC1pbnRlcmFjdGl2ZWx5IGNhbGwtaW50ZXJhY3Rp
dmVseSBjb21tYW5kLWV4ZWN1dGUgZXhlY3V0ZS1leHRlbmRlZC1jb21tYW5kIGZ1bmNhbGwt
aW50ZXJhY3RpdmVseSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDIgW0F1dG9tYXRpY1wgR0NdIDQ3KSkgKDI0
MjUwIDc3OTcgNjM3NTIgNTIwMDAwKSBuaWxdCg==
--------------6B3BC16CBBDC72B8800AD96F
Content-Type: text/plain; charset=UTF-8;
 name="tip.personal-config.prof"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="tip.personal-config.prof"

Cltwcm9maWxlci1wcm9maWxlICIyNC4zIiBjcHUgI3MoaGFzaC10YWJsZSBzaXplIDY1IHRl
c3QgZXF1YWwgcmVoYXNoLXNpemUgMS41IHJlaGFzaC10aHJlc2hvbGQgMC44MTI1IGRhdGEg
KFtzZXQtZmFjZS1hdHRyaWJ1dGUgcGFnZS1icmVhay1saW5lcy0tdXBkYXRlLWRpc3BsYXkt
dGFibGUgbWFwYyBwYWdlLWJyZWFrLWxpbmVzLS11cGRhdGUtZGlzcGxheS10YWJsZXMgcmVk
aXNwbGF5X2ludGVybmFsXCBcKENcIGZ1bmN0aW9uXCkgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0g
MSBbbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAxNDAgW2lzcGVs
bC1zZW5kLXN0cmluZyBmbHlzcGVsbC13b3JkIGZseXNwZWxsLXBvc3QtY29tbWFuZC1ob29r
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMSBbYXBwbHkgZWxkb2MtbWluaWJ1ZmZl
ci1tZXNzYWdlIGVsZG9jLW1lc3NhZ2UgZWxkb2MtcHJpbnQtY3VycmVudC1zeW1ib2wtaW5m
byAiIzxjb21waWxlZCAweDE2ZjY5NzVhZGFjZTNhZGY+IiBhcHBseSB0aW1lci1ldmVudC1o
YW5kbGVyIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsXSAyIFtzeW50YXgtcHBzcyBiZWdpbm5pbmctb2YtZGVmdW4t
cmF3IGVuZC1vZi1kZWZ1biBlbGlzcC0tZXZhbC1kZWZ1biAiIzxjb21waWxlZCAweDFmYTVk
MWRjMzlkZWJjOWU+IiBhcHBseSBldmFsLWRlZnVuIGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAi
IzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseUBp
ZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5
IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
XSAxIFtlbGlzcC0tYmVnaW5uaW5nLW9mLXNleHAgZWxpc3AtLWZuc3ltLWluLWN1cnJlbnQt
c2V4cCBlbGlzcC1lbGRvYy1kb2N1bWVudGF0aW9uLWZ1bmN0aW9uIHJ1bi1ob29rLXdpdGgt
YXJncy11bnRpbC1zdWNjZXNzIGVsZG9jLWRvY3VtZW50YXRpb24tZGVmYXVsdCBlbGRvYy1w
cmludC1jdXJyZW50LXN5bWJvbC1pbmZvICIjPGNvbXBpbGVkIDB4MTZmNjk3NWFkYWNlM2Fk
Zj4iIGFwcGx5IHRpbWVyLWV2ZW50LWhhbmRsZXIgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAxIFtpbnRlcm4gY3VzdG9tLWRl
Y2xhcmUtZmFjZSB3aGlsZSBsZXQgbXktZGVmLW1hbnktZmFjZXMgbXktYmVuY2gteC10aXAg
IiM8c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVuZGxlc3MvZXZhbC1vdmVybGF5ICIjPGxh
bWJkYSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkgZXZhbC1yZWdpb24gZWxpc3AtLWV2
YWwtZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5ZGViYzllPiIgYXBwbHkgZXZhbC1k
ZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+
IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21t
YW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMSBbbWFr
ZS1mYWNlIG1ha2UtZW1wdHktZmFjZSBmYWNlLXNwZWMtc2V0IGN1c3RvbS1kZWNsYXJlLWZh
Y2Ugd2hpbGUgbGV0IG15LWRlZi1tYW55LWZhY2VzIG15LWJlbmNoLXgtdGlwICIjPHN1YnIg
ZXZhbC1yZWdpb24+IiBhcHBseSBlbmRsZXNzL2V2YWwtb3ZlcmxheSAiIzxsYW1iZGEgLTB4
MTIwOTMwZDg0NzExOTEzOD4iIGFwcGx5IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVu
ICIjPGNvbXBpbGVkIDB4MWZhNWQxZGMzOWRlYmM5ZT4iIGFwcGx5IGV2YWwtZGVmdW4gZnVu
Y2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkg
Y2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBhcHBs
eSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAxOCBbc2V0LWZhY2UtYXR0cmlidXRl
LWZyb20tcmVzb3VyY2Ugc2V0LWZhY2UtYXR0cmlidXRlcy1mcm9tLXJlc291cmNlcyBtYWtl
LWZhY2UteC1yZXNvdXJjZS1pbnRlcm5hbCBmYWNlLXNwZWMtcmVjYWxjIGZhY2Utc3BlYy1z
ZXQgY3VzdG9tLWRlY2xhcmUtZmFjZSB3aGlsZSBsZXQgbXktZGVmLW1hbnktZmFjZXMgbXkt
YmVuY2gteC10aXAgIiM8c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVuZGxlc3MvZXZhbC1v
dmVybGF5ICIjPGxhbWJkYSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkgZXZhbC1yZWdp
b24gZWxpc3AtLWV2YWwtZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5ZGViYzllPiIg
YXBwbHkgZXZhbC1kZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWlu
dGVyYWN0aXZlbHk+IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQt
Y3VycmVudC1jb21tYW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1
dGUgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSA1IFtjdXN0b20t
aGFuZGxlLWtleXdvcmQgY3VzdG9tLWhhbmRsZS1hbGwta2V5d29yZHMgY3VzdG9tLWRlY2xh
cmUtZmFjZSB3aGlsZSBsZXQgbXktZGVmLW1hbnktZmFjZXMgbXktYmVuY2gteC10aXAgIiM8
c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVuZGxlc3MvZXZhbC1vdmVybGF5ICIjPGxhbWJk
YSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkgZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwt
ZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5ZGViYzllPiIgYXBwbHkgZXZhbC1kZWZ1
biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBh
cHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5k
IGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAxMyBbZmFjZXAgbWFr
ZS1mYWNlIG1ha2UtZW1wdHktZmFjZSBmYWNlLXNwZWMtc2V0IGN1c3RvbS1kZWNsYXJlLWZh
Y2Ugd2hpbGUgbGV0IG15LWRlZi1tYW55LWZhY2VzIG15LWJlbmNoLXgtdGlwICIjPHN1YnIg
ZXZhbC1yZWdpb24+IiBhcHBseSBlbmRsZXNzL2V2YWwtb3ZlcmxheSAiIzxsYW1iZGEgLTB4
MTIwOTMwZDg0NzExOTEzOD4iIGFwcGx5IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVu
ICIjPGNvbXBpbGVkIDB4MWZhNWQxZGMzOWRlYmM5ZT4iIGFwcGx5IGV2YWwtZGVmdW4gZnVu
Y2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkg
Y2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBhcHBs
eSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDE1IFtzZXQtZmFjZS1hdHRyaWJ1dGVzLWZy
b20tcmVzb3VyY2VzIG1ha2UtZmFjZS14LXJlc291cmNlLWludGVybmFsIG1ha2UtZmFjZSBt
YWtlLWVtcHR5LWZhY2UgZmFjZS1zcGVjLXNldCBjdXN0b20tZGVjbGFyZS1mYWNlIHdoaWxl
IGxldCBteS1kZWYtbWFueS1mYWNlcyBteS1iZW5jaC14LXRpcCAiIzxzdWJyIGV2YWwtcmVn
aW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFsLW92ZXJsYXkgIiM8bGFtYmRhIC0weDEyMDkzMGQ4
NDcxMTkxMzg+IiBhcHBseSBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1kZWZ1biAiIzxjb21w
aWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+IiBhcHBseSBldmFsLWRlZnVuIGZ1bmNhbGwtaW50
ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFwcGx5IGNhbGwtaW50
ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkgY2FsbC1p
bnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWxdIDEgW2ZhY2UtbmFtZSBzZXQtZmFjZS1hdHRyaWJ1dGUtZnJvbS1y
ZXNvdXJjZSBzZXQtZmFjZS1hdHRyaWJ1dGVzLWZyb20tcmVzb3VyY2VzIG1ha2UtZmFjZS14
LXJlc291cmNlLWludGVybmFsIG1ha2UtZmFjZSBtYWtlLWVtcHR5LWZhY2UgZmFjZS1zcGVj
LXNldCBjdXN0b20tZGVjbGFyZS1mYWNlIHdoaWxlIGxldCBteS1kZWYtbWFueS1mYWNlcyBt
eS1iZW5jaC14LXRpcCAiIzxzdWJyIGV2YWwtcmVnaW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFs
LW92ZXJsYXkgIiM8bGFtYmRhIC0weDEyMDkzMGQ4NDcxMTkxMzg+IiBhcHBseSBldmFsLXJl
Z2lvbiBlbGlzcC0tZXZhbC1kZWZ1biAiIzxjb21waWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+
IiBhcHBseSBldmFsLWRlZnVuIGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwt
aW50ZXJhY3RpdmVseT4iIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29y
ZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhl
Y3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAxIFthcHBseSBmYWNlLXNw
ZWMtcmVzZXQtZmFjZSBmYWNlLXNwZWMtcmVjYWxjIGZhY2Utc3BlYy1zZXQgY3VzdG9tLWRl
Y2xhcmUtZmFjZSB3aGlsZSBsZXQgbXktZGVmLW1hbnktZmFjZXMgbXktYmVuY2gteC10aXAg
IiM8c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVuZGxlc3MvZXZhbC1vdmVybGF5ICIjPGxh
bWJkYSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkgZXZhbC1yZWdpb24gZWxpc3AtLWV2
YWwtZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5ZGViYzllPiIgYXBwbHkgZXZhbC1k
ZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+
IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21t
YW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMSBbZmFjZXAgY2hlY2stZmFj
ZSBmYWNlLW5hbWUgc2V0LWZhY2UtYXR0cmlidXRlLWZyb20tcmVzb3VyY2Ugc2V0LWZhY2Ut
YXR0cmlidXRlcy1mcm9tLXJlc291cmNlcyBtYWtlLWZhY2UteC1yZXNvdXJjZS1pbnRlcm5h
bCBtYWtlLWZhY2UgbWFrZS1lbXB0eS1mYWNlIGZhY2Utc3BlYy1zZXQgY3VzdG9tLWRlY2xh
cmUtZmFjZSB3aGlsZSBsZXQgbXktZGVmLW1hbnktZmFjZXMgbXktYmVuY2gteC10aXAgIiM8
c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVuZGxlc3MvZXZhbC1vdmVybGF5ICIjPGxhbWJk
YSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkgZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwt
ZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5ZGViYzllPiIgYXBwbHkgZXZhbC1kZWZ1
biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBh
cHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5k
IGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWxdIDEgW21ha2UtZmFjZS14LXJlc291cmNlLWludGVybmFsIG1ha2UtZmFj
ZSBtYWtlLWVtcHR5LWZhY2UgZmFjZS1zcGVjLXNldCBjdXN0b20tZGVjbGFyZS1mYWNlIHdo
aWxlIGxldCBteS1kZWYtbWFueS1mYWNlcyBteS1iZW5jaC14LXRpcCAiIzxzdWJyIGV2YWwt
cmVnaW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFsLW92ZXJsYXkgIiM8bGFtYmRhIC0weDEyMDkz
MGQ4NDcxMTkxMzg+IiBhcHBseSBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1kZWZ1biAiIzxj
b21waWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+IiBhcHBseSBldmFsLWRlZnVuIGZ1bmNhbGwt
aW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFwcGx5IGNhbGwt
aW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkgY2Fs
bC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAyIFtzZXQtZmFjZS1hdHRyaWJ1dGUtZnJvbS1yZXNv
dXJjZSBzZXQtZmFjZS1hdHRyaWJ1dGVzLWZyb20tcmVzb3VyY2VzIG1ha2UtZmFjZS14LXJl
c291cmNlLWludGVybmFsIG1ha2UtZmFjZSBtYWtlLWVtcHR5LWZhY2UgZmFjZS1zcGVjLXNl
dCBjdXN0b20tZGVjbGFyZS1mYWNlIHdoaWxlIGxldCBteS1kZWYtbWFueS1mYWNlcyBteS1i
ZW5jaC14LXRpcCAiIzxzdWJyIGV2YWwtcmVnaW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFsLW92
ZXJsYXkgIiM8bGFtYmRhIC0weDEyMDkzMGQ4NDcxMTkxMzg+IiBhcHBseSBldmFsLXJlZ2lv
biBlbGlzcC0tZXZhbC1kZWZ1biAiIzxjb21waWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+IiBh
cHBseSBldmFsLWRlZnVuIGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50
ZXJhY3RpdmVseT4iIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1j
dXJyZW50LWNvbW1hbmQgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0
ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMyBbY2hlY2stZmFjZSBm
YWNlLW5hbWUgc2V0LWZhY2UtYXR0cmlidXRlLWZyb20tcmVzb3VyY2Ugc2V0LWZhY2UtYXR0
cmlidXRlcy1mcm9tLXJlc291cmNlcyBtYWtlLWZhY2UteC1yZXNvdXJjZS1pbnRlcm5hbCBt
YWtlLWZhY2UgbWFrZS1lbXB0eS1mYWNlIGZhY2Utc3BlYy1zZXQgY3VzdG9tLWRlY2xhcmUt
ZmFjZSB3aGlsZSBsZXQgbXktZGVmLW1hbnktZmFjZXMgbXktYmVuY2gteC10aXAgIiM8c3Vi
ciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVuZGxlc3MvZXZhbC1vdmVybGF5ICIjPGxhbWJkYSAt
MHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkgZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwtZGVm
dW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5ZGViYzllPiIgYXBwbHkgZXZhbC1kZWZ1biBm
dW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBs
eSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFw
cGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsXSAxIFtmYWNlbWVudS1hZGQtbmV3LWZhY2UgbWFrZS1mYWNlIG1ha2Ut
ZW1wdHktZmFjZSBmYWNlLXNwZWMtc2V0IGN1c3RvbS1kZWNsYXJlLWZhY2Ugd2hpbGUgbGV0
IG15LWRlZi1tYW55LWZhY2VzIG15LWJlbmNoLXgtdGlwICIjPHN1YnIgZXZhbC1yZWdpb24+
IiBhcHBseSBlbmRsZXNzL2V2YWwtb3ZlcmxheSAiIzxsYW1iZGEgLTB4MTIwOTMwZDg0NzEx
OTEzOD4iIGFwcGx5IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVuICIjPGNvbXBpbGVk
IDB4MWZhNWQxZGMzOWRlYmM5ZT4iIGFwcGx5IGV2YWwtZGVmdW4gZnVuY2FsbC1pbnRlcmFj
dGl2ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkgY2FsbC1pbnRlcmFj
dGl2ZWx5QGlkby1jcistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBhcHBseSBjYWxsLWludGVy
YWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWxdIDEgW2xldCBsaXN0IGxldCBteS1iZW5jaC14LXRpcCAiIzxzdWJy
IGV2YWwtcmVnaW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFsLW92ZXJsYXkgIiM8bGFtYmRhIC0w
eDEyMDkzMGQ4NDcxMTkxMzg+IiBhcHBseSBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1kZWZ1
biAiIzxjb21waWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+IiBhcHBseSBldmFsLWRlZnVuIGZ1
bmNhbGwtaW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFwcGx5
IGNhbGwtaW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQgYXBw
bHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDMgW2Zy
YW1lLXNldC1iYWNrZ3JvdW5kLW1vZGUgaW50ZXJuYWwtc2V0LWxpc3AtZmFjZS1hdHRyaWJ1
dGUgc2V0LWZhY2UtYXR0cmlidXRlIGFwcGx5IGZhY2Utc3BlYy1zZXQtMiBmYWNlLXNwZWMt
cmVjYWxjIGZhY2Utc2V0LWFmdGVyLWZyYW1lLWRlZmF1bHQgeC1zaG93LXRpcCBsZXQgbGlz
dCBsZXQgbXktYmVuY2gteC10aXAgIiM8c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVuZGxl
c3MvZXZhbC1vdmVybGF5ICIjPGxhbWJkYSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkg
ZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwtZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5
ZGViYzllPiIgYXBwbHkgZXZhbC1kZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3Vi
ciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNy
Ky1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21t
YW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gNSBbZmFjZS1h
dHRyaWJ1dGUgZmFjZS1hdHRyLW1hdGNoLXAgZnJhbWUtc2V0LWJhY2tncm91bmQtbW9kZSBp
bnRlcm5hbC1zZXQtbGlzcC1mYWNlLWF0dHJpYnV0ZSBzZXQtZmFjZS1hdHRyaWJ1dGUgYXBw
bHkgZmFjZS1zcGVjLXNldC0yIGZhY2Utc3BlYy1yZWNhbGMgZmFjZS1zZXQtYWZ0ZXItZnJh
bWUtZGVmYXVsdCB4LXNob3ctdGlwIGxldCBsaXN0IGxldCBteS1iZW5jaC14LXRpcCAiIzxz
dWJyIGV2YWwtcmVnaW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFsLW92ZXJsYXkgIiM8bGFtYmRh
IC0weDEyMDkzMGQ4NDcxMTkxMzg+IiBhcHBseSBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1k
ZWZ1biAiIzxjb21waWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+IiBhcHBseSBldmFsLWRlZnVu
IGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFw
cGx5IGNhbGwtaW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQg
YXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbF0gMjM1IFtpbnRlcm5hbC1zZXQtbGlzcC1mYWNlLWF0dHJpYnV0ZSBzZXQt
ZmFjZS1hdHRyaWJ1dGUgYXBwbHkgZmFjZS1zcGVjLXNldC0yIGZhY2Utc3BlYy1yZWNhbGMg
ZmFjZS1zZXQtYWZ0ZXItZnJhbWUtZGVmYXVsdCB4LXNob3ctdGlwIGxldCBsaXN0IGxldCBt
eS1iZW5jaC14LXRpcCAiIzxzdWJyIGV2YWwtcmVnaW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFs
LW92ZXJsYXkgIiM8bGFtYmRhIC0weDEyMDkzMGQ4NDcxMTkxMzg+IiBhcHBseSBldmFsLXJl
Z2lvbiBlbGlzcC0tZXZhbC1kZWZ1biAiIzxjb21waWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+
IiBhcHBseSBldmFsLWRlZnVuIGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwt
aW50ZXJhY3RpdmVseT4iIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29y
ZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhl
Y3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMTggW2ZhY2VwIGNo
ZWNrLWZhY2UgZmFjZS1uYW1lIHNldC1mYWNlLWF0dHJpYnV0ZS1mcm9tLXJlc291cmNlIHNl
dC1mYWNlLWF0dHJpYnV0ZXMtZnJvbS1yZXNvdXJjZXMgbWFrZS1mYWNlLXgtcmVzb3VyY2Ut
aW50ZXJuYWwgZmFjZS1zcGVjLXJlY2FsYyBmcmFtZS1zZXQtYmFja2dyb3VuZC1tb2RlIGlu
dGVybmFsLXNldC1saXNwLWZhY2UtYXR0cmlidXRlIHNldC1mYWNlLWF0dHJpYnV0ZSBhcHBs
eSBmYWNlLXNwZWMtc2V0LTIgZmFjZS1zcGVjLXJlY2FsYyBmYWNlLXNldC1hZnRlci1mcmFt
ZS1kZWZhdWx0IHgtc2hvdy10aXAgbGV0IGxpc3QgbGV0IG15LWJlbmNoLXgtdGlwICIjPHN1
YnIgZXZhbC1yZWdpb24+IiBhcHBseSBlbmRsZXNzL2V2YWwtb3ZlcmxheSAiIzxsYW1iZGEg
LTB4MTIwOTMwZDg0NzExOTEzOD4iIGFwcGx5IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRl
ZnVuICIjPGNvbXBpbGVkIDB4MWZhNWQxZGMzOWRlYmM5ZT4iIGFwcGx5IGV2YWwtZGVmdW4g
ZnVuY2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBw
bHkgY2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBh
cHBseSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMzA4IFtzZXQt
ZmFjZS1hdHRyaWJ1dGUtZnJvbS1yZXNvdXJjZSBzZXQtZmFjZS1hdHRyaWJ1dGVzLWZyb20t
cmVzb3VyY2VzIG1ha2UtZmFjZS14LXJlc291cmNlLWludGVybmFsIGZhY2Utc3BlYy1yZWNh
bGMgZnJhbWUtc2V0LWJhY2tncm91bmQtbW9kZSBpbnRlcm5hbC1zZXQtbGlzcC1mYWNlLWF0
dHJpYnV0ZSBzZXQtZmFjZS1hdHRyaWJ1dGUgYXBwbHkgZmFjZS1zcGVjLXNldC0yIGZhY2Ut
c3BlYy1yZWNhbGMgZmFjZS1zZXQtYWZ0ZXItZnJhbWUtZGVmYXVsdCB4LXNob3ctdGlwIGxl
dCBsaXN0IGxldCBteS1iZW5jaC14LXRpcCAiIzxzdWJyIGV2YWwtcmVnaW9uPiIgYXBwbHkg
ZW5kbGVzcy9ldmFsLW92ZXJsYXkgIiM8bGFtYmRhIC0weDEyMDkzMGQ4NDcxMTkxMzg+IiBh
cHBseSBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1kZWZ1biAiIzxjb21waWxlZCAweDFmYTVk
MWRjMzlkZWJjOWU+IiBhcHBseSBldmFsLWRlZnVuIGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAi
IzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseUBp
ZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5
IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDMxIFtzZXQtZmFjZS1hdHRyaWJ1
dGUgYXBwbHkgZmFjZS1zcGVjLXJlc2V0LWZhY2UgZmFjZS1zcGVjLXJlY2FsYyBmcmFtZS1z
ZXQtYmFja2dyb3VuZC1tb2RlIGludGVybmFsLXNldC1saXNwLWZhY2UtYXR0cmlidXRlIHNl
dC1mYWNlLWF0dHJpYnV0ZSBhcHBseSBmYWNlLXNwZWMtc2V0LTIgZmFjZS1zcGVjLXJlY2Fs
YyBmYWNlLXNldC1hZnRlci1mcmFtZS1kZWZhdWx0IHgtc2hvdy10aXAgbGV0IGxpc3QgbGV0
IG15LWJlbmNoLXgtdGlwICIjPHN1YnIgZXZhbC1yZWdpb24+IiBhcHBseSBlbmRsZXNzL2V2
YWwtb3ZlcmxheSAiIzxsYW1iZGEgLTB4MTIwOTMwZDg0NzExOTEzOD4iIGFwcGx5IGV2YWwt
cmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVuICIjPGNvbXBpbGVkIDB4MWZhNWQxZGMzOWRlYmM5
ZT4iIGFwcGx5IGV2YWwtZGVmdW4gZnVuY2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2Fs
bC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVj
b3JkLWN1cnJlbnQtY29tbWFuZCBhcHBseSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1l
eGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gNTMgW3NldC1mYWNlLWF0dHJpYnV0ZXMtZnJvbS1y
ZXNvdXJjZXMgbWFrZS1mYWNlLXgtcmVzb3VyY2UtaW50ZXJuYWwgZmFjZS1zcGVjLXJlY2Fs
YyBmcmFtZS1zZXQtYmFja2dyb3VuZC1tb2RlIGludGVybmFsLXNldC1saXNwLWZhY2UtYXR0
cmlidXRlIHNldC1mYWNlLWF0dHJpYnV0ZSBhcHBseSBmYWNlLXNwZWMtc2V0LTIgZmFjZS1z
cGVjLXJlY2FsYyBmYWNlLXNldC1hZnRlci1mcmFtZS1kZWZhdWx0IHgtc2hvdy10aXAgbGV0
IGxpc3QgbGV0IG15LWJlbmNoLXgtdGlwICIjPHN1YnIgZXZhbC1yZWdpb24+IiBhcHBseSBl
bmRsZXNzL2V2YWwtb3ZlcmxheSAiIzxsYW1iZGEgLTB4MTIwOTMwZDg0NzExOTEzOD4iIGFw
cGx5IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVuICIjPGNvbXBpbGVkIDB4MWZhNWQx
ZGMzOWRlYmM5ZT4iIGFwcGx5IGV2YWwtZGVmdW4gZnVuY2FsbC1pbnRlcmFjdGl2ZWx5ICIj
PHN1YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5QGlk
by1jcistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBhcHBseSBjYWxsLWludGVyYWN0aXZlbHkg
Y29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDcgW21ha2UtZmFjZS14LXJl
c291cmNlLWludGVybmFsIGZhY2Utc3BlYy1yZWNhbGMgZnJhbWUtc2V0LWJhY2tncm91bmQt
bW9kZSBpbnRlcm5hbC1zZXQtbGlzcC1mYWNlLWF0dHJpYnV0ZSBzZXQtZmFjZS1hdHRyaWJ1
dGUgYXBwbHkgZmFjZS1zcGVjLXNldC0yIGZhY2Utc3BlYy1yZWNhbGMgZmFjZS1zZXQtYWZ0
ZXItZnJhbWUtZGVmYXVsdCB4LXNob3ctdGlwIGxldCBsaXN0IGxldCBteS1iZW5jaC14LXRp
cCAiIzxzdWJyIGV2YWwtcmVnaW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFsLW92ZXJsYXkgIiM8
bGFtYmRhIC0weDEyMDkzMGQ4NDcxMTkxMzg+IiBhcHBseSBldmFsLXJlZ2lvbiBlbGlzcC0t
ZXZhbC1kZWZ1biAiIzxjb21waWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+IiBhcHBseSBldmFs
LWRlZnVuIGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVs
eT4iIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNv
bW1hbmQgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbF0gMiBbZmFjZS1zcGVjLXJlY2FsYyBmcmFtZS1zZXQtYmFja2dy
b3VuZC1tb2RlIGludGVybmFsLXNldC1saXNwLWZhY2UtYXR0cmlidXRlIHNldC1mYWNlLWF0
dHJpYnV0ZSBhcHBseSBmYWNlLXNwZWMtc2V0LTIgZmFjZS1zcGVjLXJlY2FsYyBmYWNlLXNl
dC1hZnRlci1mcmFtZS1kZWZhdWx0IHgtc2hvdy10aXAgbGV0IGxpc3QgbGV0IG15LWJlbmNo
LXgtdGlwICIjPHN1YnIgZXZhbC1yZWdpb24+IiBhcHBseSBlbmRsZXNzL2V2YWwtb3Zlcmxh
eSAiIzxsYW1iZGEgLTB4MTIwOTMwZDg0NzExOTEzOD4iIGFwcGx5IGV2YWwtcmVnaW9uIGVs
aXNwLS1ldmFsLWRlZnVuICIjPGNvbXBpbGVkIDB4MWZhNWQxZGMzOWRlYmM5ZT4iIGFwcGx5
IGV2YWwtZGVmdW4gZnVuY2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFj
dGl2ZWx5PiIgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVjb3JkLWN1cnJl
bnQtY29tbWFuZCBhcHBseSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMSBbY2hlY2stZmFjZSBmYWNlLW5hbWUgc2V0
LWZhY2UtYXR0cmlidXRlLWZyb20tcmVzb3VyY2Ugc2V0LWZhY2UtYXR0cmlidXRlcy1mcm9t
LXJlc291cmNlcyBtYWtlLWZhY2UteC1yZXNvdXJjZS1pbnRlcm5hbCBmYWNlLXNwZWMtcmVj
YWxjIGZyYW1lLXNldC1iYWNrZ3JvdW5kLW1vZGUgaW50ZXJuYWwtc2V0LWxpc3AtZmFjZS1h
dHRyaWJ1dGUgc2V0LWZhY2UtYXR0cmlidXRlIGFwcGx5IGZhY2Utc3BlYy1zZXQtMiBmYWNl
LXNwZWMtcmVjYWxjIGZhY2Utc2V0LWFmdGVyLWZyYW1lLWRlZmF1bHQgeC1zaG93LXRpcCBs
ZXQgbGlzdCBsZXQgbXktYmVuY2gteC10aXAgIiM8c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5
IGVuZGxlc3MvZXZhbC1vdmVybGF5ICIjPGxhbWJkYSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIg
YXBwbHkgZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwtZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1
ZDFkYzM5ZGViYzllPiIgYXBwbHkgZXZhbC1kZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkg
IiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlA
aWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVs
eSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMSBbYXBwbHkgZmFjZS1zcGVjLXJlc2V0LWZh
Y2UgZmFjZS1zcGVjLXJlY2FsYyBmcmFtZS1zZXQtYmFja2dyb3VuZC1tb2RlIGludGVybmFs
LXNldC1saXNwLWZhY2UtYXR0cmlidXRlIHNldC1mYWNlLWF0dHJpYnV0ZSBhcHBseSBmYWNl
LXNwZWMtc2V0LTIgZmFjZS1zcGVjLXJlY2FsYyBmYWNlLXNldC1hZnRlci1mcmFtZS1kZWZh
dWx0IHgtc2hvdy10aXAgbGV0IGxpc3QgbGV0IG15LWJlbmNoLXgtdGlwICIjPHN1YnIgZXZh
bC1yZWdpb24+IiBhcHBseSBlbmRsZXNzL2V2YWwtb3ZlcmxheSAiIzxsYW1iZGEgLTB4MTIw
OTMwZDg0NzExOTEzOD4iIGFwcGx5IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVuICIj
PGNvbXBpbGVkIDB4MWZhNWQxZGMzOWRlYmM5ZT4iIGFwcGx5IGV2YWwtZGVmdW4gZnVuY2Fs
bC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkgY2Fs
bC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBhcHBseSBj
YWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxd
IDMgW2ZhY2UtbmFtZSBzZXQtZmFjZS1hdHRyaWJ1dGUtZnJvbS1yZXNvdXJjZSBzZXQtZmFj
ZS1hdHRyaWJ1dGVzLWZyb20tcmVzb3VyY2VzIG1ha2UtZmFjZS14LXJlc291cmNlLWludGVy
bmFsIGZhY2Utc3BlYy1yZWNhbGMgZnJhbWUtc2V0LWJhY2tncm91bmQtbW9kZSBpbnRlcm5h
bC1zZXQtbGlzcC1mYWNlLWF0dHJpYnV0ZSBzZXQtZmFjZS1hdHRyaWJ1dGUgYXBwbHkgZmFj
ZS1zcGVjLXNldC0yIGZhY2Utc3BlYy1yZWNhbGMgZmFjZS1zZXQtYWZ0ZXItZnJhbWUtZGVm
YXVsdCB4LXNob3ctdGlwIGxldCBsaXN0IGxldCBteS1iZW5jaC14LXRpcCAiIzxzdWJyIGV2
YWwtcmVnaW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFsLW92ZXJsYXkgIiM8bGFtYmRhIC0weDEy
MDkzMGQ4NDcxMTkxMzg+IiBhcHBseSBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1kZWZ1biAi
Izxjb21waWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+IiBhcHBseSBldmFsLWRlZnVuIGZ1bmNh
bGwtaW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFwcGx5IGNh
bGwtaW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkg
Y2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMyBbZmFj
ZS1zcGVjLWNob29zZSBmYWNlLXNwZWMtcmVjYWxjIGZyYW1lLXNldC1iYWNrZ3JvdW5kLW1v
ZGUgaW50ZXJuYWwtc2V0LWxpc3AtZmFjZS1hdHRyaWJ1dGUgc2V0LWZhY2UtYXR0cmlidXRl
IGFwcGx5IGZhY2Utc3BlYy1zZXQtMiBmYWNlLXNwZWMtcmVjYWxjIGZhY2Utc2V0LWFmdGVy
LWZyYW1lLWRlZmF1bHQgeC1zaG93LXRpcCBsZXQgbGlzdCBsZXQgbXktYmVuY2gteC10aXAg
IiM8c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVuZGxlc3MvZXZhbC1vdmVybGF5ICIjPGxh
bWJkYSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkgZXZhbC1yZWdpb24gZWxpc3AtLWV2
YWwtZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5ZGViYzllPiIgYXBwbHkgZXZhbC1k
ZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+
IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21t
YW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWxdIDEgW3NldC1mYWNlLWF0dHJpYnV0ZSBhcHBseSBmYWNlLXNwZWMt
c2V0LTIgZmFjZS1zcGVjLXJlY2FsYyBmcmFtZS1zZXQtYmFja2dyb3VuZC1tb2RlIGludGVy
bmFsLXNldC1saXNwLWZhY2UtYXR0cmlidXRlIHNldC1mYWNlLWF0dHJpYnV0ZSBhcHBseSBm
YWNlLXNwZWMtc2V0LTIgZmFjZS1zcGVjLXJlY2FsYyBmYWNlLXNldC1hZnRlci1mcmFtZS1k
ZWZhdWx0IHgtc2hvdy10aXAgbGV0IGxpc3QgbGV0IG15LWJlbmNoLXgtdGlwICIjPHN1YnIg
ZXZhbC1yZWdpb24+IiBhcHBseSBlbmRsZXNzL2V2YWwtb3ZlcmxheSAiIzxsYW1iZGEgLTB4
MTIwOTMwZDg0NzExOTEzOD4iIGFwcGx5IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVu
ICIjPGNvbXBpbGVkIDB4MWZhNWQxZGMzOWRlYmM5ZT4iIGFwcGx5IGV2YWwtZGVmdW4gZnVu
Y2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkg
Y2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBhcHBs
eSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0g
MSBbc2V0LWZhY2UtYXR0cmlidXRlIGFwcGx5IGZhY2Utc3BlYy1zZXQtMiBmYWNlLXNwZWMt
cmVjYWxjIGZhY2Utc2V0LWFmdGVyLWZyYW1lLWRlZmF1bHQgeC1zaG93LXRpcCBsZXQgbGlz
dCBsZXQgbXktYmVuY2gteC10aXAgIiM8c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVuZGxl
c3MvZXZhbC1vdmVybGF5ICIjPGxhbWJkYSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkg
ZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwtZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5
ZGViYzllPiIgYXBwbHkgZXZhbC1kZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3Vi
ciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNy
Ky1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21t
YW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAy
IFtmYWNlcCBjaGVjay1mYWNlIGZhY2UtbmFtZSBzZXQtZmFjZS1hdHRyaWJ1dGUtZnJvbS1y
ZXNvdXJjZSBzZXQtZmFjZS1hdHRyaWJ1dGVzLWZyb20tcmVzb3VyY2VzIG1ha2UtZmFjZS14
LXJlc291cmNlLWludGVybmFsIGZhY2Utc3BlYy1yZWNhbGMgZmFjZS1zZXQtYWZ0ZXItZnJh
bWUtZGVmYXVsdCB4LXNob3ctdGlwIGxldCBsaXN0IGxldCBteS1iZW5jaC14LXRpcCAiIzxz
dWJyIGV2YWwtcmVnaW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFsLW92ZXJsYXkgIiM8bGFtYmRh
IC0weDEyMDkzMGQ4NDcxMTkxMzg+IiBhcHBseSBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1k
ZWZ1biAiIzxjb21waWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+IiBhcHBseSBldmFsLWRlZnVu
IGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFw
cGx5IGNhbGwtaW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQg
YXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWxdIDI5MyBbc2V0LWZhY2UtYXR0cmlidXRlIGFwcGx5IGZhY2Utc3Bl
Yy1yZXNldC1mYWNlIGZhY2Utc3BlYy1yZWNhbGMgZmFjZS1zZXQtYWZ0ZXItZnJhbWUtZGVm
YXVsdCB4LXNob3ctdGlwIGxldCBsaXN0IGxldCBteS1iZW5jaC14LXRpcCAiIzxzdWJyIGV2
YWwtcmVnaW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFsLW92ZXJsYXkgIiM8bGFtYmRhIC0weDEy
MDkzMGQ4NDcxMTkxMzg+IiBhcHBseSBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1kZWZ1biAi
Izxjb21waWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+IiBhcHBseSBldmFsLWRlZnVuIGZ1bmNh
bGwtaW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFwcGx5IGNh
bGwtaW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkg
Y2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWxdIDIxOSBbZmFjZS1zZXQtYWZ0ZXItZnJhbWUtZGVmYXVs
dCB4LXNob3ctdGlwIGxldCBsaXN0IGxldCBteS1iZW5jaC14LXRpcCAiIzxzdWJyIGV2YWwt
cmVnaW9uPiIgYXBwbHkgZW5kbGVzcy9ldmFsLW92ZXJsYXkgIiM8bGFtYmRhIC0weDEyMDkz
MGQ4NDcxMTkxMzg+IiBhcHBseSBldmFsLXJlZ2lvbiBlbGlzcC0tZXZhbC1kZWZ1biAiIzxj
b21waWxlZCAweDFmYTVkMWRjMzlkZWJjOWU+IiBhcHBseSBldmFsLWRlZnVuIGZ1bmNhbGwt
aW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFwcGx5IGNhbGwt
aW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkgY2Fs
bC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSA1OSBbc2V0LWZhY2UtYXR0cmli
dXRlLWZyb20tcmVzb3VyY2Ugc2V0LWZhY2UtYXR0cmlidXRlcy1mcm9tLXJlc291cmNlcyBt
YWtlLWZhY2UteC1yZXNvdXJjZS1pbnRlcm5hbCBmYWNlLXNwZWMtcmVjYWxjIGZhY2Utc2V0
LWFmdGVyLWZyYW1lLWRlZmF1bHQgeC1zaG93LXRpcCBsZXQgbGlzdCBsZXQgbXktYmVuY2gt
eC10aXAgIiM8c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVuZGxlc3MvZXZhbC1vdmVybGF5
ICIjPGxhbWJkYSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkgZXZhbC1yZWdpb24gZWxp
c3AtLWV2YWwtZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5ZGViYzllPiIgYXBwbHkg
ZXZhbC1kZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0
aXZlbHk+IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVu
dC1jb21tYW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAyMCBbc2V0LWZhY2UtYXR0
cmlidXRlcy1mcm9tLXJlc291cmNlcyBtYWtlLWZhY2UteC1yZXNvdXJjZS1pbnRlcm5hbCBm
YWNlLXNwZWMtcmVjYWxjIGZhY2Utc2V0LWFmdGVyLWZyYW1lLWRlZmF1bHQgeC1zaG93LXRp
cCBsZXQgbGlzdCBsZXQgbXktYmVuY2gteC10aXAgIiM8c3ViciBldmFsLXJlZ2lvbj4iIGFw
cGx5IGVuZGxlc3MvZXZhbC1vdmVybGF5ICIjPGxhbWJkYSAtMHgxMjA5MzBkODQ3MTE5MTM4
PiIgYXBwbHkgZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwtZGVmdW4gIiM8Y29tcGlsZWQgMHgx
ZmE1ZDFkYzM5ZGViYzllPiIgYXBwbHkgZXZhbC1kZWZ1biBmdW5jYWxsLWludGVyYWN0aXZl
bHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBseSBjYWxsLWludGVyYWN0aXZl
bHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFwcGx5IGNhbGwtaW50ZXJhY3Rp
dmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbF0gNCBbZmFjZS1zcGVjLXJlY2FsYyBmYWNlLXNldC1hZnRlci1mcmFtZS1k
ZWZhdWx0IHgtc2hvdy10aXAgbGV0IGxpc3QgbGV0IG15LWJlbmNoLXgtdGlwICIjPHN1YnIg
ZXZhbC1yZWdpb24+IiBhcHBseSBlbmRsZXNzL2V2YWwtb3ZlcmxheSAiIzxsYW1iZGEgLTB4
MTIwOTMwZDg0NzExOTEzOD4iIGFwcGx5IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVu
ICIjPGNvbXBpbGVkIDB4MWZhNWQxZGMzOWRlYmM5ZT4iIGFwcGx5IGV2YWwtZGVmdW4gZnVu
Y2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkg
Y2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBhcHBs
eSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMSBbZmFjZS1uYW1lIHNldC1m
YWNlLWF0dHJpYnV0ZS1mcm9tLXJlc291cmNlIHNldC1mYWNlLWF0dHJpYnV0ZXMtZnJvbS1y
ZXNvdXJjZXMgbWFrZS1mYWNlLXgtcmVzb3VyY2UtaW50ZXJuYWwgZmFjZS1zcGVjLXJlY2Fs
YyBmYWNlLXNldC1hZnRlci1mcmFtZS1kZWZhdWx0IHgtc2hvdy10aXAgbGV0IGxpc3QgbGV0
IG15LWJlbmNoLXgtdGlwICIjPHN1YnIgZXZhbC1yZWdpb24+IiBhcHBseSBlbmRsZXNzL2V2
YWwtb3ZlcmxheSAiIzxsYW1iZGEgLTB4MTIwOTMwZDg0NzExOTEzOD4iIGFwcGx5IGV2YWwt
cmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVuICIjPGNvbXBpbGVkIDB4MWZhNWQxZGMzOWRlYmM5
ZT4iIGFwcGx5IGV2YWwtZGVmdW4gZnVuY2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2Fs
bC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVj
b3JkLWN1cnJlbnQtY29tbWFuZCBhcHBseSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1l
eGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAyIFthcHBseSBm
YWNlLXNwZWMtcmVzZXQtZmFjZSBmYWNlLXNwZWMtcmVjYWxjIGZhY2Utc2V0LWFmdGVyLWZy
YW1lLWRlZmF1bHQgeC1zaG93LXRpcCBsZXQgbGlzdCBsZXQgbXktYmVuY2gteC10aXAgIiM8
c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVuZGxlc3MvZXZhbC1vdmVybGF5ICIjPGxhbWJk
YSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkgZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwt
ZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5ZGViYzllPiIgYXBwbHkgZXZhbC1kZWZ1
biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBh
cHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5k
IGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gNCBbbWFrZS1mYWNlLXgtcmVzb3Vy
Y2UtaW50ZXJuYWwgZmFjZS1zcGVjLXJlY2FsYyBmYWNlLXNldC1hZnRlci1mcmFtZS1kZWZh
dWx0IHgtc2hvdy10aXAgbGV0IGxpc3QgbGV0IG15LWJlbmNoLXgtdGlwICIjPHN1YnIgZXZh
bC1yZWdpb24+IiBhcHBseSBlbmRsZXNzL2V2YWwtb3ZlcmxheSAiIzxsYW1iZGEgLTB4MTIw
OTMwZDg0NzExOTEzOD4iIGFwcGx5IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVuICIj
PGNvbXBpbGVkIDB4MWZhNWQxZGMzOWRlYmM5ZT4iIGFwcGx5IGV2YWwtZGVmdW4gZnVuY2Fs
bC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkgY2Fs
bC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBhcHBseSBj
YWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAxIFthcHBseSBmYWNlLXNwZWMtc2V0LTIg
ZmFjZS1zcGVjLXJlY2FsYyBmYWNlLXNldC1hZnRlci1mcmFtZS1kZWZhdWx0IHgtc2hvdy10
aXAgbGV0IGxpc3QgbGV0IG15LWJlbmNoLXgtdGlwICIjPHN1YnIgZXZhbC1yZWdpb24+IiBh
cHBseSBlbmRsZXNzL2V2YWwtb3ZlcmxheSAiIzxsYW1iZGEgLTB4MTIwOTMwZDg0NzExOTEz
OD4iIGFwcGx5IGV2YWwtcmVnaW9uIGVsaXNwLS1ldmFsLWRlZnVuICIjPGNvbXBpbGVkIDB4
MWZhNWQxZGMzOWRlYmM5ZT4iIGFwcGx5IGV2YWwtZGVmdW4gZnVuY2FsbC1pbnRlcmFjdGl2
ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkgY2FsbC1pbnRlcmFjdGl2
ZWx5QGlkby1jcistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBhcHBseSBjYWxsLWludGVyYWN0
aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWxdIDEgW2NoZWNrLWZhY2UgZmFjZS1uYW1lIHNldC1mYWNlLWF0dHJpYnV0
ZS1mcm9tLXJlc291cmNlIHNldC1mYWNlLWF0dHJpYnV0ZXMtZnJvbS1yZXNvdXJjZXMgbWFr
ZS1mYWNlLXgtcmVzb3VyY2UtaW50ZXJuYWwgZmFjZS1zcGVjLXJlY2FsYyBmYWNlLXNldC1h
ZnRlci1mcmFtZS1kZWZhdWx0IHgtc2hvdy10aXAgbGV0IGxpc3QgbGV0IG15LWJlbmNoLXgt
dGlwICIjPHN1YnIgZXZhbC1yZWdpb24+IiBhcHBseSBlbmRsZXNzL2V2YWwtb3ZlcmxheSAi
IzxsYW1iZGEgLTB4MTIwOTMwZDg0NzExOTEzOD4iIGFwcGx5IGV2YWwtcmVnaW9uIGVsaXNw
LS1ldmFsLWRlZnVuICIjPGNvbXBpbGVkIDB4MWZhNWQxZGMzOWRlYmM5ZT4iIGFwcGx5IGV2
YWwtZGVmdW4gZnVuY2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFjdGl2
ZWx5PiIgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVjb3JkLWN1cnJlbnQt
Y29tbWFuZCBhcHBseSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDEgW2ZhY2Utc3BlYy1zZXQtMiBmYWNlLXNw
ZWMtcmVjYWxjIGZhY2Utc2V0LWFmdGVyLWZyYW1lLWRlZmF1bHQgeC1zaG93LXRpcCBsZXQg
bGlzdCBsZXQgbXktYmVuY2gteC10aXAgIiM8c3ViciBldmFsLXJlZ2lvbj4iIGFwcGx5IGVu
ZGxlc3MvZXZhbC1vdmVybGF5ICIjPGxhbWJkYSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBw
bHkgZXZhbC1yZWdpb24gZWxpc3AtLWV2YWwtZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFk
YzM5ZGViYzllPiIgYXBwbHkgZXZhbC1kZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8
c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRv
LWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBj
b21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWxdIDEgW2ZvcndhcmQtc2V4cCBiYWNrd2FyZC1zZXhwIGNsb2p1cmUtYmFja3dh
cmQtbG9naWNhbC1zZXhwIGNpZGVyLS1tYWtlLXJlc3VsdC1vdmVybGF5IGVuZGxlc3MvZXZh
bC1vdmVybGF5ICIjPGxhbWJkYSAtMHgxMjA5MzBkODQ3MTE5MTM4PiIgYXBwbHkgZXZhbC1y
ZWdpb24gZWxpc3AtLWV2YWwtZGVmdW4gIiM8Y29tcGlsZWQgMHgxZmE1ZDFkYzM5ZGViYzll
PiIgYXBwbHkgZXZhbC1kZWZ1biBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxs
LWludGVyYWN0aXZlbHk+IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNv
cmQtY3VycmVudC1jb21tYW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4
ZWN1dGUgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDEgW2V2YWwgZm9ybWF0LW1vZGUtbGluZSBzbWwv
ZmlsbC13aWR0aC1hdmFpbGFibGUgc21sL2dlbmVyYXRlLW1pbm9yLW1vZGVzIGV2YWwgcmVk
aXNwbGF5X2ludGVybmFsXCBcKENcIGZ1bmN0aW9uXCkgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAxIFsi
Izxjb21waWxlZCAweGE3MjFmMGZmNjQ4Mzk+IiBhcHBseSB0aW1lci1ldmVudC1oYW5kbGVy
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMSBbIiM8Y29tcGlsZWQgMHhkZTE0ODM4
Mzk4OGU3NTM+IiBtYXBhdG9tcyBzbWV4LWRldGVjdC1uZXctY29tbWFuZHMgc21leCBmdW5j
YWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBseSBj
YWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFwcGx5
IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gNCBbbWFwYXRvbXMgc21leC1kZXRl
Y3QtbmV3LWNvbW1hbmRzIHNtZXggZnVuY2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2Fs
bC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVj
b3JkLWN1cnJlbnQtY29tbWFuZCBhcHBseSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1l
eGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsXSAxIFsiIzxjb21waWxlZCAtMHgzYWM2ZWNhYjc0YWZkNjQ+IiBtYXBjIGlkby1z
ZXQtbWF0Y2hlcy0xIGlkby1zZXQtbWF0Y2hlcyBpZG8tcmVhZC1pbnRlcm5hbCAiIzxjb21w
aWxlZCAweGQ5NzEwYTk3Nzc4YWU2NT4iIGFwcGx5IGlkby1jb21wbGV0aW5nLXJlYWRAaWRv
LWNyKy1yZXBsYWNlIGFwcGx5IGlkby1jb21wbGV0aW5nLXJlYWQgc21leC1jb21wbGV0aW5n
LXJlYWQgc21leC1yZWFkLWFuZC1ydW4gc21leCBmdW5jYWxsLWludGVyYWN0aXZlbHkgIiM8
c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlAaWRv
LWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseSBj
b21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMSBbaWRvLXNldC1tYXRjaGVzLTEgaWRv
LXNldC1tYXRjaGVzIGlkby1yZWFkLWludGVybmFsICIjPGNvbXBpbGVkIDB4ZDk3MTBhOTc3
NzhhZTY1PiIgYXBwbHkgaWRvLWNvbXBsZXRpbmctcmVhZEBpZG8tY3IrLXJlcGxhY2UgYXBw
bHkgaWRvLWNvbXBsZXRpbmctcmVhZCBzbWV4LWNvbXBsZXRpbmctcmVhZCBzbWV4LXJlYWQt
YW5kLXJ1biBzbWV4IGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJh
Y3RpdmVseT4iIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJy
ZW50LWNvbW1hbmQgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWxdIDEgWyIjPGNvbXBpbGVkIC0weDNhYzZlY2FiNzRhZmQ2
ND4iIG1hcGMgaWRvLXNldC1tYXRjaGVzLTEgaWRvLXNldC1tYXRjaGVzICIjPGNvbXBpbGVk
IDB4MTY2OTgzYzNiZTUxYjU2YT4iIGFwcGx5IGlkby1leGhpYml0IHJlYWQtZnJvbS1taW5p
YnVmZmVyIGlkby1yZWFkLWludGVybmFsICIjPGNvbXBpbGVkIDB4ZDk3MTBhOTc3NzhhZTY1
PiIgYXBwbHkgaWRvLWNvbXBsZXRpbmctcmVhZEBpZG8tY3IrLXJlcGxhY2UgYXBwbHkgaWRv
LWNvbXBsZXRpbmctcmVhZCBzbWV4LWNvbXBsZXRpbmctcmVhZCBzbWV4LXJlYWQtYW5kLXJ1
biBzbWV4IGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVs
eT4iIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNv
bW1hbmQgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDE2IFttYXBj
IGlkby1zZXQtbWF0Y2hlcy0xIGlkby1zZXQtbWF0Y2hlcyAiIzxjb21waWxlZCAweDE2Njk4
M2MzYmU1MWI1NmE+IiBhcHBseSBpZG8tZXhoaWJpdCByZWFkLWZyb20tbWluaWJ1ZmZlciBp
ZG8tcmVhZC1pbnRlcm5hbCAiIzxjb21waWxlZCAweGQ5NzEwYTk3Nzc4YWU2NT4iIGFwcGx5
IGlkby1jb21wbGV0aW5nLXJlYWRAaWRvLWNyKy1yZXBsYWNlIGFwcGx5IGlkby1jb21wbGV0
aW5nLXJlYWQgc21leC1jb21wbGV0aW5nLXJlYWQgc21leC1yZWFkLWFuZC1ydW4gc21leCBm
dW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBs
eSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFw
cGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gNSBbaWRvLWNvbXBs
ZXRpb25zICIjPGNvbXBpbGVkIDB4MTY2OTgzYzNiZTUxYjU2YT4iIGFwcGx5IGlkby1leGhp
Yml0IHJlYWQtZnJvbS1taW5pYnVmZmVyIGlkby1yZWFkLWludGVybmFsICIjPGNvbXBpbGVk
IDB4ZDk3MTBhOTc3NzhhZTY1PiIgYXBwbHkgaWRvLWNvbXBsZXRpbmctcmVhZEBpZG8tY3Ir
LXJlcGxhY2UgYXBwbHkgaWRvLWNvbXBsZXRpbmctcmVhZCBzbWV4LWNvbXBsZXRpbmctcmVh
ZCBzbWV4LXJlYWQtYW5kLXJ1biBzbWV4IGZ1bmNhbGwtaW50ZXJhY3RpdmVseSAiIzxzdWJy
IGNhbGwtaW50ZXJhY3RpdmVseT4iIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVseUBpZG8tY3Ir
LXJlY29yZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5IGNvbW1h
bmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWxdIDEgW3JlYWQtZnJvbS1taW5pYnVmZmVyIGlkby1yZWFk
LWludGVybmFsICIjPGNvbXBpbGVkIDB4ZDk3MTBhOTc3NzhhZTY1PiIgYXBwbHkgaWRvLWNv
bXBsZXRpbmctcmVhZEBpZG8tY3IrLXJlcGxhY2UgYXBwbHkgaWRvLWNvbXBsZXRpbmctcmVh
ZCBzbWV4LWNvbXBsZXRpbmctcmVhZCBzbWV4LXJlYWQtYW5kLXJ1biBzbWV4IGZ1bmNhbGwt
aW50ZXJhY3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFwcGx5IGNhbGwt
aW50ZXJhY3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkgY2Fs
bC1pbnRlcmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsXSAzNCBbaWRvLXJlYWQtaW50ZXJuYWwgIiM8Y29tcGlsZWQgMHhkOTcxMGE5Nzc3OGFl
NjU+IiBhcHBseSBpZG8tY29tcGxldGluZy1yZWFkQGlkby1jcistcmVwbGFjZSBhcHBseSBp
ZG8tY29tcGxldGluZy1yZWFkIHNtZXgtY29tcGxldGluZy1yZWFkIHNtZXgtcmVhZC1hbmQt
cnVuIHNtZXggZnVuY2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1YnIgY2FsbC1pbnRlcmFjdGl2
ZWx5PiIgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1jcistcmVjb3JkLWN1cnJlbnQt
Y29tbWFuZCBhcHBseSBjYWxsLWludGVyYWN0aXZlbHkgY29tbWFuZC1leGVjdXRlIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAxMCBbbWFwY2FyIGlkby1maW5kLWNvbW1vbi1z
dWJzdHJpbmcgaWRvLXNldC1jb21tb24tY29tcGxldGlvbiAiIzxjb21waWxlZCAweDE2Njk4
M2MzYmU1MWI1NmE+IiBhcHBseSBpZG8tZXhoaWJpdCByZWFkLWZyb20tbWluaWJ1ZmZlciBp
ZG8tcmVhZC1pbnRlcm5hbCAiIzxjb21waWxlZCAweGQ5NzEwYTk3Nzc4YWU2NT4iIGFwcGx5
IGlkby1jb21wbGV0aW5nLXJlYWRAaWRvLWNyKy1yZXBsYWNlIGFwcGx5IGlkby1jb21wbGV0
aW5nLXJlYWQgc21leC1jb21wbGV0aW5nLXJlYWQgc21leC1yZWFkLWFuZC1ydW4gc21leCBm
dW5jYWxsLWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBs
eSBjYWxsLWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFw
cGx5IGNhbGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMSBbYXBwbHkgaWRv
LXRpZHkgcmVhZC1mcm9tLW1pbmlidWZmZXIgaWRvLXJlYWQtaW50ZXJuYWwgIiM8Y29tcGls
ZWQgMHhkOTcxMGE5Nzc3OGFlNjU+IiBhcHBseSBpZG8tY29tcGxldGluZy1yZWFkQGlkby1j
cistcmVwbGFjZSBhcHBseSBpZG8tY29tcGxldGluZy1yZWFkIHNtZXgtY29tcGxldGluZy1y
ZWFkIHNtZXgtcmVhZC1hbmQtcnVuIHNtZXggZnVuY2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1
YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1j
cistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBhcHBseSBjYWxsLWludGVyYWN0aXZlbHkgY29t
bWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXSAxIFtpZG8td29yZC1tYXRjaGluZy1z
dWJzdHJpbmcgbWFwY2FyIGlkby1maW5kLWNvbW1vbi1zdWJzdHJpbmcgaWRvLXNldC1jb21t
b24tY29tcGxldGlvbiAiIzxjb21waWxlZCAweDE2Njk4M2MzYmU1MWI1NmE+IiBhcHBseSBp
ZG8tZXhoaWJpdCByZWFkLWZyb20tbWluaWJ1ZmZlciBpZG8tcmVhZC1pbnRlcm5hbCAiIzxj
b21waWxlZCAweGQ5NzEwYTk3Nzc4YWU2NT4iIGFwcGx5IGlkby1jb21wbGV0aW5nLXJlYWRA
aWRvLWNyKy1yZXBsYWNlIGFwcGx5IGlkby1jb21wbGV0aW5nLXJlYWQgc21leC1jb21wbGV0
aW5nLXJlYWQgc21leC1yZWFkLWFuZC1ydW4gc21leCBmdW5jYWxsLWludGVyYWN0aXZlbHkg
IiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBseSBjYWxsLWludGVyYWN0aXZlbHlA
aWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFwcGx5IGNhbGwtaW50ZXJhY3RpdmVs
eSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5p
bCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwg
bmlsIG5pbCBuaWwgbmlsXSAxIFtzZWxmLWluc2VydC1jb21tYW5kIGZ1bmNhbGwtaW50ZXJh
Y3RpdmVseSAiIzxzdWJyIGNhbGwtaW50ZXJhY3RpdmVseT4iIGFwcGx5IGNhbGwtaW50ZXJh
Y3RpdmVseUBpZG8tY3IrLXJlY29yZC1jdXJyZW50LWNvbW1hbmQgYXBwbHkgY2FsbC1pbnRl
cmFjdGl2ZWx5IGNvbW1hbmQtZXhlY3V0ZSByZWFkLWZyb20tbWluaWJ1ZmZlciBpZG8tcmVh
ZC1pbnRlcm5hbCAiIzxjb21waWxlZCAweGQ5NzEwYTk3Nzc4YWU2NT4iIGFwcGx5IGlkby1j
b21wbGV0aW5nLXJlYWRAaWRvLWNyKy1yZXBsYWNlIGFwcGx5IGlkby1jb21wbGV0aW5nLXJl
YWQgc21leC1jb21wbGV0aW5nLXJlYWQgc21leC1yZWFkLWFuZC1ydW4gc21leCBmdW5jYWxs
LWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBseSBjYWxs
LWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFwcGx5IGNh
bGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdIDEgW3Byb2ZpbGVyLXJlcG9ydCBmdW5jYWxs
LWludGVyYWN0aXZlbHkgIiM8c3ViciBjYWxsLWludGVyYWN0aXZlbHk+IiBhcHBseSBjYWxs
LWludGVyYWN0aXZlbHlAaWRvLWNyKy1yZWNvcmQtY3VycmVudC1jb21tYW5kIGFwcGx5IGNh
bGwtaW50ZXJhY3RpdmVseSBjb21tYW5kLWV4ZWN1dGUgZXhlY3V0ZS1leHRlbmRlZC1jb21t
YW5kIHNtZXgtcmVhZC1hbmQtcnVuIHNtZXggZnVuY2FsbC1pbnRlcmFjdGl2ZWx5ICIjPHN1
YnIgY2FsbC1pbnRlcmFjdGl2ZWx5PiIgYXBwbHkgY2FsbC1pbnRlcmFjdGl2ZWx5QGlkby1j
cistcmVjb3JkLWN1cnJlbnQtY29tbWFuZCBhcHBseSBjYWxsLWludGVyYWN0aXZlbHkgY29t
bWFuZC1leGVjdXRlIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmls
IG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBu
aWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0gMSBbQXV0b21hdGljXCBHQ10g
MTg4KSkgKDI0MjUwIDk1MjQgMTc5MDA3IDgwMzAwMCkgbmlsXQo=
--------------6B3BC16CBBDC72B8800AD96F--




Acknowledgement sent to Clément Pit-Claudel <cpitclaudel@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#41200; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Sun, 24 May 2020 22:15:02 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.