GNU bug report logs - #80026
[PATCH] Improve vtable--limit-string performance

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: Stéphane Marks <shipmints@HIDDEN>; Keywords: patch; dated Wed, 17 Dec 2025 18:58:02 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

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


Received: (at 80026) by debbugs.gnu.org; 19 Dec 2025 13:19:17 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Dec 19 08:19:17 2025
Received: from localhost ([127.0.0.1]:38233 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWaO0-0003kR-C1
	for submit <at> debbugs.gnu.org; Fri, 19 Dec 2025 08:19:17 -0500
Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:53286)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <visuweshm@HIDDEN>)
 id 1vWaNx-0003jz-2H
 for 80026 <at> debbugs.gnu.org; Fri, 19 Dec 2025 08:19:10 -0500
Received: by mail-pl1-x642.google.com with SMTP id
 d9443c01a7336-2a0d67f1877so21294745ad.2
 for <80026 <at> debbugs.gnu.org>; Fri, 19 Dec 2025 05:19:09 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1766150343; x=1766755143; darn=debbugs.gnu.org;
 h=mime-version:user-agent:references:message-id:date:in-reply-to
 :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to;
 bh=Fg37f1BAMsdNRiObKcGs4jkcpZjQgtnurZfIFCfLBR0=;
 b=fiENtoFqGDvl+F77FzcOgXXeOX2K+6w4p7PIrK24WeH6LdjOjFzVOS+aWZudsOo7HY
 009poTN+SjeTFRRtNoZK38o19iW4pmg62q0nBE1oTGBe+pZDAx8opAuZoHCGX+GxtoGU
 KOy3ggLz8YSYpwsixD2rR35pVcIv+wZ6PfFu/+fEjJ6mjxf2FxyFGmIPeEiCZ2sLY/SD
 JyiuxU5qpmKoipcwtweuu2hcvUjWfblrOnnK13cyL6iu5HJzyyPzaNrtCTNPnWJ5IMz6
 sSJk2dzxMskyygtnbFO3C5+aJE0SM4C9jrgebvIpLpBcLznRv9wl0H38bgDUqZw8+j3x
 Rblw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1766150343; x=1766755143;
 h=mime-version:user-agent:references:message-id:date:in-reply-to
 :subject:cc:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject
 :date:message-id:reply-to;
 bh=Fg37f1BAMsdNRiObKcGs4jkcpZjQgtnurZfIFCfLBR0=;
 b=IPOfhliqMKRKOITw3hasM97KmVwf0OVrOhOk7AedtYqIaj5KFMCw/EQYUxBTKDiAlH
 Pf2kU/+drCtqEDtYfgkmF667GPmZHRNMx5y5yka8yxolaIRK0SenZ6dAfoyXv/x15uK/
 29HXpzAup9f9b1KlP850hcpsr3Kr8qH2vmLYpcjYEwnpMx9YMble+/uqPXQCvuNLhFlV
 /K6eLvkUVIG65WUY/CXbG6HehY1yg+kbo9d7KAWhTN/I6j40XJj3oAkDqGCNfCLEOLD+
 UuJSyG9fhT4c0npW3YiSj5w1UR/4WWZdiUJR7HL8mGkh8mfMswlcXS69qeL1iu579he3
 eLpw==
X-Forwarded-Encrypted: i=1;
 AJvYcCUqNTCqjnerdtrvABjCF1IwHa5mQPuB3F8kURwjaGEyESx9IdaI9ZXhAISZ+pOQKvxWXOTDHw==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yya8Th2nf3ERbAxXA5QXuJRs95aoZ6zgfeLQZ23jbFw3piRganK
 WeBelMoMxWcRdbRALunIkJMpMr0fJ3OChZxB10ktx0cQiCLLbb7OaN8Z
X-Gm-Gg: AY/fxX4imZ1lEtEV6Om77uAEDBi0PAHbboHPhApa+Na8x+MsDB9pICcodlKTMCctU4Z
 ON5I5uZcD1U/tEvQ3Bw12uYHvfAQ0zr2ZGwQuxkemhAyNii2BV+//cRVQBZ0LzfhtwawrCFfwRj
 6or+2LMB5U2QKBRXlMtJniBq4HiOH+aE3DTqTdsMYXG+sOrryz9i6lo5ZAa54pbkCeleSFyTJ7k
 c9kM0R7iqLLWYnorg6JltdGmiT7RHcO3tSUc51/3ge+HAr8ZmwBHD3lls024BqvLXM30QUQ2dEk
 ZahAz1OW7cSX7rOUdnSk8GrZTgja+a75198XPoMGG9i9AO2syLO47++PCLJVklqq5XCofT6QaPv
 jD8nffItJI4c+eG0JGWFEQ2nB9iLGWplBA/tMsqNrC6K1S9NSJ5sC7+MgJDbZN/xLbpTtyNyKbh
 t811XD0xw=
X-Google-Smtp-Source: AGHT+IGSe5HpB6E6aSK1Waf73MPsyCLxK2tskE6ovxoYzf0pBiit8d8XddBIjtIlYDGczfb7w8hIrA==
X-Received: by 2002:a17:902:cf0d:b0:29f:b3e5:5186 with SMTP id
 d9443c01a7336-2a2f293d13bmr29901655ad.56.1766150342842; 
 Fri, 19 Dec 2025 05:19:02 -0800 (PST)
Received: from localhost ([158.144.40.156])
 by smtp.gmail.com with UTF8SMTPSA id
 d9443c01a7336-2a2f3d4d869sm23335155ad.53.2025.12.19.05.19.01
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Fri, 19 Dec 2025 05:19:02 -0800 (PST)
From: Visuwesh <visuweshm@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
In-Reply-To: <86o6nu28t6.fsf@HIDDEN>
Date: Fri, 19 Dec 2025 18:48:51 +0530
Message-ID: <874ipm624k.fsf@HIDDEN>
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 <87ike35c45.fsf@HIDDEN> <86o6nu28t6.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, shipmints@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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 (-)

--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

[=E0=AE=B5=E0=AF=86=E0=AE=B3=E0=AF=8D=E0=AE=B3=E0=AE=BF =E0=AE=9F=E0=AE=BF=
=E0=AE=9A=E0=AE=AE=E0=AF=8D=E0=AE=AA=E0=AE=B0=E0=AF=8D 19, 2025] Eli Zarets=
kii wrote:

>> Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@fastmai=
l.fm,
>>  80026 <at> debbugs.gnu.org, adam@HIDDEN, larsi@HIDDEN, arstoffel@gm=
ail.com,
>>  ijqq@HIDDEN
>> From: Visuwesh <visuweshm@HIDDEN>
>> Date: Fri, 19 Dec 2025 09:58:26 +0530
>
> I cannot read this:

Sorry about that: I didn't have the sendmail symlink when I initially
sent the mail, so had to resend it after installing the relevant distro
package for it.  I checked the message in yhetil.org, and it showed up
fine so I assumed all was well.  In any case, I reproduce the message
below:

St=C3=A9phane Marks wrote:

Hi,

> This implements a simple heuristic to limit the number of times
> `string-pixel-width` gets called by estimating the string's truncation
> position in advance.  This is overridable column-by-column should some
> strings in the vtable be composed of widely varying font widths that
> necessitates minor adjustments to the heuristic.  This approach performs
> well in testing (and I tested several approaches) and has been tested by
> more than one vtable user.

A na=C3=AFve question: have you tested this with columns that contain image
s?  I wanted to test this scenario out but the patch doesn't apply for
me: vtable--limit-string does not take a BUFFER argument, and I'm on
master 26dcbd06eda.

If it would be more convenient to have code that would produce such a
table, then PFA.  The entry point is the vz/bookwrym-list-shelves
command.


--=-=-=
Content-Type: text/x-emacs-lisp
Content-Disposition: attachment
Content-Description: vtable code that produces a column with image

(defun vz/bookwrym--shelves (user instance)
  "Return the list of shelf URLs for bookwrym USER in INSTANCE."
  (with-current-buffer
      (url-retrieve-synchronously
       (concat instance "/user/" user "/books"))
    (goto-char (point-min))
    (search-forward "\n\n")
    (let ((dom (libxml-parse-html-region (point) (point-max)))
          ret)
      (dolist (a (dom-by-tag (dom-by-id dom "tour-user-shelves") 'a))
        ;; /books doesn't have a JSON endpoint.
        (unless (string-suffix-p "/books" (dom-attr a 'href))
          (push (concat instance (dom-attr a 'href) ".json")
                ret)))
      ret)))

(defun vz/bookwrym--json ()
  (goto-char (point-min))
  (search-forward "\n\n")
  (json-parse-buffer :object-type 'alist
                     :array-type 'list
                     :null-object nil))

(defun vz/bookwrym--shelf (url)
  "Return books in shelf of user in instance given by URL."
  (with-current-buffer (url-retrieve-synchronously url)
    (goto-char (point-min))
    (search-forward "\n\n")
    (let ((json (json-parse-buffer :object-type 'alist
                                   :array-type 'list
                                   :null-object nil)))
      (let-alist json
        (unless (= .totalItems 0)
          (let* ((pre (concat (string-remove-suffix ".json" url)
                              "?page="))
                 (start (string-remove-prefix pre .first)))
            (nreverse
             (vz/bookwrym--books
              (with-current-buffer
                  (url-retrieve-synchronously (concat url "?page=" start))
                (vz/bookwrym--json))
              .name))))))))

(defvar vz/bookwrym--author-cache (make-hash-table :test #'equal)
  "A hashtable of author URL and their actual name.")

(defun vz/bookwrym--author (url)
  "Return the name of the author in URL."
  (with-memoization (gethash url vz/bookwrym--author-cache)
    (with-current-buffer (url-retrieve-synchronously (concat url ".json"))
      (or (cdr (assq 'name (vz/bookwrym--json)))
          "Unknown"))))

(defun vz/bookwrym--books (json shelf &optional ret)
  (dolist (book (cdr (assq 'orderedItems json)))
    (let-alist book
      (let ((authors (mapcar #'vz/bookwrym--author .authors))
            ret*)
        (push (cons 'shelf shelf) ret*)
        (when .cover.url
          (push (cons 'cover .cover.url) ret*))
        (push (cons 'url .id) ret*)
        (push (cons 'title .title) ret*)
        (push (cons 'authors authors) ret*)
        (push (cons 'published
                    (cond
                     ((not (string-empty-p .publishedDate))
                      .publishedDate)
                     ((not (string-empty-p .firstPublishedDate))
                      .firstPublishedDate)
                     (t nil)))
              ret*)
        (push ret* ret))))
  (if (cdr (assq 'next json))
      (vz/bookwrym--books
       (with-current-buffer
           (url-retrieve-synchronously
            (concat (string-trim-right
                     (cdr (assq 'id json))
                     "\\?page=[0-9]+")
                    ".json?page="
                    (string-trim-left
                     (cdr (assq 'next json))
                     "[^0-9]+")))
         (vz/bookwrym--json))
       shelf
       ret)
    ret))

(defvar vz/bookwrym-instance "https://bookrastinating.com"
  "Instance of bookwrym to use by default.")

(defvar vz/bookwrym-user "brontea"
  "Bookwrym user to view by default.")

(defvar vz/bookwrym--cover-width 10)

(defun vz/bookwrym--cover ()
  (goto-char (point-min))
  (search-forward "\n\n")
  (delete-region (point-min) (point))
  (propertize "*" 'display (create-image (buffer-string) nil t
                                         :max-width (cons vz/bookwrym--cover-width 'cw))))

(defun vz/bookwrym-list-shelves (&optional user instance)
  "List shelves of USER in bookwrym instance INSTANCE.
Interactively, query for the user and instance with the prefix argument."
  (interactive
   (if current-prefix-arg
       (string-split (read-string "What user to view (@USER@INSTANCE)? ") "@" t)
     (list vz/bookwrym-user vz/bookwrym-instance)))
  (let* ((shelves (vz/bookwrym--shelves user instance))
         (books (mapcan #'vz/bookwrym--shelf shelves)))
    (require 'vtable)
    (with-current-buffer (get-buffer-create "*Bookwrym*")
      (let ((inhibit-read-only t))
        (erase-buffer)
        (face-remap-set-base 'header-line
                             :background (face-attribute 'header-line :background))
        (make-vtable
         ;; :use-header-line nil
         :columns `((:name "Cover" :width ,vz/bookwrym--cover-width
                           :formatter (lambda (x) (or x ""))
                           :getter ,(lambda (object _) (cdr (assq 'cover-img object))))
                    "Shelf" "Title"
                    (:name "Authors"
                           :getter
                           ,(lambda (object _) (string-join (cdr (assq 'authors object)) ", ")))
                    "Published")
         :column-colors '("#ffffff" "#e5e5eb" "#f2f2f4")
         :row-colors '("#f2f2f4" "#e5e5eb" "#ffffff")
         :getter (lambda (object column vtable)
                   (or (cdr (assq (intern (downcase (vtable-column vtable column)))
                                  object))
                       ""))
         :objects-function (lambda () books))
        (read-only-mode 1)
        (pop-to-buffer (current-buffer))
        (save-excursion
          (goto-char (point-min))
          (let ((i 0))
            (while (not (eobp))
              (let ((object (vtable-current-object)))
                (when (assq 'cover object)
                  (url-retrieve (cdr (assq 'cover object))
                                (lambda (status buffer object n)
                                  (unless (eq (car status) :error)
                                    (let ((cover (vz/bookwrym--cover)))
                                      (with-current-buffer buffer
                                        (save-excursion
                                          (goto-char (point-min))
                                          (vtable-update-object (vtable-current-table)
                                                                (cons (cons 'cover-img cover)
                                                                      object)
                                                                object)))
                                      (setf (alist-get 'cover-img (nth n books)) cover))))
                                (list (current-buffer) object i)))
                (when object (setq i (1+ i))))
              (forward-line 1))))))))

--=-=-=--




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

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


Received: (at 80026) by debbugs.gnu.org; 19 Dec 2025 08:08:28 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Dec 19 03:08:28 2025
Received: from localhost ([127.0.0.1]:34769 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWVXH-0000aK-4U
	for submit <at> debbugs.gnu.org; Fri, 19 Dec 2025 03:08:27 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10]:60336)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1vWVXE-0000Zx-2e
 for 80026 <at> debbugs.gnu.org; Fri, 19 Dec 2025 03:08:25 -0500
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1vWVX7-0003xX-Cw; Fri, 19 Dec 2025 03:08:17 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date:
 mime-version; bh=JyDVzDO1NmyDDZzZdBgJxw4K+JJj9lGeaN7bfp7BcF8=; b=i+VmHnIsWB4G
 BG72AJzJVvaiA0h+CGmfzRkd33sRZ3TS+u5sCAWPL7gyZwPnZVBMPHdzSf9kNYdcTDncatUNeN7cx
 4LX9DPxVIv3Id2RzgZL1zjQwZt2fbTcXjeip1c0comrYVqAe3Jxwj/cipEjV1PFNXIQs+Sog9cFnA
 YtJqJGUJvHV36uXTWLRvII7Y4WHj9nLQzqeC+n8w/rX/aYWTKHr3FvJoUMtY8hjFbmqispNyL906q
 ALWaoDR5ppByJR7NpLxV3mK6Ice6OCiI4BWuwmthttUxXBYl7hb0JqVFBZHq0bsJw98ZixSGw62lD
 XySV/zrjO474NOUwVeZw/w==;
Date: Fri, 19 Dec 2025 10:08:05 +0200
Message-Id: <86o6nu28t6.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Visuwesh <visuweshm@HIDDEN>
In-Reply-To: <87ike35c45.fsf@HIDDEN> (message from Visuwesh on Fri, 19 Dec
 2025 09:58:26 +0530)
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 <87ike35c45.fsf@HIDDEN>
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, shipmints@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
>  80026 <at> debbugs.gnu.org, adam@HIDDEN, larsi@HIDDEN, arstoffel@HIDDEN,
>  ijqq@HIDDEN
> From: Visuwesh <visuweshm@HIDDEN>
> Date: Fri, 19 Dec 2025 09:58:26 +0530

I cannot read this:

> LS09LT0tPQpDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1U
> cmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZQoKWz1FMD1BRT1BQT1FMD1BRj04MT1F
> MD1BRT1BND1FMD1BRT1BOT1FMD1BRj04RCA9RTA9QUU9OUY9RTA9QUU9QkY9RTA9QUU9OUE9Cj1F
> MD1BRT1BRT1FMD1BRj04RD1FMD1BRT1BQT1FMD1BRT1CMD1FMD1BRj04RCAxNywgMjAyNV0gU3Q9
> QzM9QTlwaGFuZSBNYXJrcz0KIHdyb3RlOgoKSGksCgo+IFRoaXMgaW1wbGVtZW50cyBhIHNpbXBs
> ZSBoZXVyaXN0aWMgdG8gbGltaXQgdGhlIG51bWJlciBvZiB0aW1lcwo+IGBzdHJpbmctcGl4ZWwt
> d2lkdGhgIGdldHMgY2FsbGVkIGJ5IGVzdGltYXRpbmcgdGhlIHN0cmluZydzIHRydW5jYXRpb24K
> PiBwb3NpdGlvbiBpbiBhZHZhbmNlLiAgVGhpcyBpcyBvdmVycmlkYWJsZSBjb2x1bW4tYnktY29s
> dW1uIHNob3VsZCBzb21lCj4gc3RyaW5ncyBpbiB0aGUgdnRhYmxlIGJlIGNvbXBvc2VkIG9mIHdp
> ZGVseSB2YXJ5aW5nIGZvbnQgd2lkdGhzIHRoYXQKPiBuZWNlc3NpdGF0ZXMgbWlub3IgYWRqdXN0
> bWVudHMgdG8gdGhlIGhldXJpc3RpYy4gIFRoaXMgYXBwcm9hY2ggcGVyZm9ybXMKPiB3ZWxsIGlu
> IHRlc3RpbmcgKGFuZCBJIHRlc3RlZCBzZXZlcmFsIGFwcHJvYWNoZXMpIGFuZCBoYXMgYmVlbiB0
> ZXN0ZWQgYnkKPiBtb3JlIHRoYW4gb25lIHZ0YWJsZSB1c2VyLgoKQSBuYT1DMz1BRnZlIHF1ZXN0
> aW9uOiBoYXZlIHlvdSB0ZXN0ZWQgdGhpcyB3aXRoIGNvbHVtbnMgdGhhdCBjb250YWluIGltYWdl
> PQpzPwpJIHdhbnRlZCB0byB0ZXN0IHRoaXMgc2NlbmFyaW8gb3V0IGJ1dCB0aGUgcGF0Y2ggZG9l
> c24ndCBhcHBseSBmb3IgbWU6CnZ0YWJsZS0tbGltaXQtc3RyaW5nIGRvZXMgbm90IHRha2UgYSBC
> VUZGRVIgYXJndW1lbnQsIGFuZCBJJ20gb24gbWFzdGVyCjI2ZGNiZDA2ZWRhLgoKSWYgaXQgd291
> bGQgYmUgbW9yZSBjb252ZW5pZW50IHRvIGhhdmUgY29kZSB0aGF0IHdvdWxkIHByb2R1Y2Ugc3Vj
> aCBhCnRhYmxlLCB0aGVuIFBGQS4gIFRoZSBlbnRyeSBwb2ludCBpcyB0aGUgdnovYm9va3dyeW0t
> bGlzdC1zaGVsdmVzCmNvbW1hbmQuCgoKLS09LT0tPQpDb250ZW50LVR5cGU6IHRleHQveC1lbWFj
> cy1saXNwCkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKQ29udGVudC1EZXNjcmlwdGlv
> bjogdnRhYmxlIHdpdGggaW1hZ2UgY29sdW1uCgooZGVmdW4gdnovYm9va3dyeW0tLXNoZWx2ZXMg
> KHVzZXIgaW5zdGFuY2UpCiAgIlJldHVybiB0aGUgbGlzdCBvZiBzaGVsZiBVUkxzIGZvciBib29r
> d3J5bSBVU0VSIGluIElOU1RBTkNFLiIKICAod2l0aC1jdXJyZW50LWJ1ZmZlcgogICAgICAodXJs
> LXJldHJpZXZlLXN5bmNocm9ub3VzbHkKICAgICAgIChjb25jYXQgaW5zdGFuY2UgIi91c2VyLyIg
> dXNlciAiL2Jvb2tzIikpCiAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQogICAgKHNlYXJjaC1m
> b3J3YXJkICJcblxuIikKICAgIChsZXQgKChkb20gKGxpYnhtbC1wYXJzZS1odG1sLXJlZ2lvbiAo
> cG9pbnQpIChwb2ludC1tYXgpKSkKICAgICAgICAgIHJldCkKICAgICAgKGRvbGlzdCAoYSAoZG9t
> LWJ5LXRhZyAoZG9tLWJ5LWlkIGRvbSAidG91ci11c2VyLXNoZWx2ZXMiKSAnYSkpCiAgICAgICAg
> OzsgL2Jvb2tzIGRvZXNuJ3QgaGF2ZSBhIEpTT04gZW5kcG9pbnQuCiAgICAgICAgKHVubGVzcyAo
> c3RyaW5nLXN1ZmZpeC1wICIvYm9va3MiIChkb20tYXR0ciBhICdocmVmKSkKICAgICAgICAgIChw
> dXNoIChjb25jYXQgaW5zdGFuY2UgKGRvbS1hdHRyIGEgJ2hyZWYpICIuanNvbiIpCiAgICAgICAg
> ICAgICAgICByZXQpKSkKICAgICAgcmV0KSkpCgooZGVmdW4gdnovYm9va3dyeW0tLWpzb24gKCkK
> ICAoZ290by1jaGFyIChwb2ludC1taW4pKQogIChzZWFyY2gtZm9yd2FyZCAiXG5cbiIpCiAgKGpz
> b24tcGFyc2UtYnVmZmVyIDpvYmplY3QtdHlwZSAnYWxpc3QKICAgICAgICAgICAgICAgICAgICAg
> OmFycmF5LXR5cGUgJ2xpc3QKICAgICAgICAgICAgICAgICAgICAgOm51bGwtb2JqZWN0IG5pbCkp
> CgooZGVmdW4gdnovYm9va3dyeW0tLXNoZWxmICh1cmwpCiAgIlJldHVybiBib29rcyBpbiBzaGVs
> ZiBvZiB1c2VyIGluIGluc3RhbmNlIGdpdmVuIGJ5IFVSTC4iCiAgKHdpdGgtY3VycmVudC1idWZm
> ZXIgKHVybC1yZXRyaWV2ZS1zeW5jaHJvbm91c2x5IHVybCkKICAgIChnb3RvLWNoYXIgKHBvaW50
> LW1pbikpCiAgICAoc2VhcmNoLWZvcndhcmQgIlxuXG4iKQogICAgKGxldCAoKGpzb24gKGpzb24t
> cGFyc2UtYnVmZmVyIDpvYmplY3QtdHlwZSAnYWxpc3QKICAgICAgICAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICA6YXJyYXktdHlwZSAnbGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
> ICAgICAgIDpudWxsLW9iamVjdCBuaWwpKSkKICAgICAgKGxldC1hbGlzdCBqc29uCiAgICAgICAg
> KHVubGVzcyAoPSAudG90YWxJdGVtcyAwKQogICAgICAgICAgKGxldCogKChwcmUgKGNvbmNhdCAo
> c3RyaW5nLXJlbW92ZS1zdWZmaXggIi5qc29uIiB1cmwpCiAgICAgICAgICAgICAgICAgICAgICAg
> ICAgICAgICI/cGFnZT0iKSkKICAgICAgICAgICAgICAgICAoc3RhcnQgKHN0cmluZy1yZW1vdmUt
> cHJlZml4IHByZSAuZmlyc3QpKSkKICAgICAgICAgICAgKG5yZXZlcnNlCiAgICAgICAgICAgICAo
> dnovYm9va3dyeW0tLWJvb2tzCiAgICAgICAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIKICAg
> ICAgICAgICAgICAgICAgKHVybC1yZXRyaWV2ZS1zeW5jaHJvbm91c2x5IChjb25jYXQgdXJsICI/
> cGFnZT0iIHN0YXJ0KSkKICAgICAgICAgICAgICAgICh2ei9ib29rd3J5bS0tanNvbikpCiAgICAg
> ICAgICAgICAgLm5hbWUpKSkpKSkpKQoKKGRlZnZhciB2ei9ib29rd3J5bS0tYXV0aG9yLWNhY2hl
> IChtYWtlLWhhc2gtdGFibGUgOnRlc3QgIydlcXVhbCkKICAiQSBoYXNodGFibGUgb2YgYXV0aG9y
> IFVSTCBhbmQgdGhlaXIgYWN0dWFsIG5hbWUuIikKCihkZWZ1biB2ei9ib29rd3J5bS0tYXV0aG9y
> ICh1cmwpCiAgIlJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIGluIFVSTC4iCiAgKHdpdGgt
> bWVtb2l6YXRpb24gKGdldGhhc2ggdXJsIHZ6L2Jvb2t3cnltLS1hdXRob3ItY2FjaGUpCiAgICAo
> d2l0aC1jdXJyZW50LWJ1ZmZlciAodXJsLXJldHJpZXZlLXN5bmNocm9ub3VzbHkgKGNvbmNhdCB1
> cmwgIi5qc29uIikpCiAgICAgIChvciAoY2RyIChhc3NxICduYW1lICh2ei9ib29rd3J5bS0tanNv
> bikpKQogICAgICAgICAgIlVua25vd24iKSkpKQoKKGRlZnVuIHZ6L2Jvb2t3cnltLS1ib29rcyAo
> anNvbiBzaGVsZiAmb3B0aW9uYWwgcmV0KQogIChkb2xpc3QgKGJvb2sgKGNkciAoYXNzcSAnb3Jk
> ZXJlZEl0ZW1zIGpzb24pKSkKICAgIChsZXQtYWxpc3QgYm9vawogICAgICAobGV0ICgoYXV0aG9y
> cyAobWFwY2FyICMndnovYm9va3dyeW0tLWF1dGhvciAuYXV0aG9ycykpCiAgICAgICAgICAgIHJl
> dCopCiAgICAgICAgKHB1c2ggKGNvbnMgJ3NoZWxmIHNoZWxmKSByZXQqKQogICAgICAgICh3aGVu
> IC5jb3Zlci51cmwKICAgICAgICAgIChwdXNoIChjb25zICdjb3ZlciAuY292ZXIudXJsKSByZXQq
> KSkKICAgICAgICAocHVzaCAoY29ucyAndXJsIC5pZCkgcmV0KikKICAgICAgICAocHVzaCAoY29u
> cyAndGl0bGUgLnRpdGxlKSByZXQqKQogICAgICAgIChwdXNoIChjb25zICdhdXRob3JzIGF1dGhv
> cnMpIHJldCopCiAgICAgICAgKHB1c2ggKGNvbnMgJ3B1Ymxpc2hlZAogICAgICAgICAgICAgICAg
> ICAgIChjb25kCiAgICAgICAgICAgICAgICAgICAgICgobm90IChzdHJpbmctZW1wdHktcCAucHVi
> bGlzaGVkRGF0ZSkpCiAgICAgICAgICAgICAgICAgICAgICAucHVibGlzaGVkRGF0ZSkKICAgICAg
> ICAgICAgICAgICAgICAgKChub3QgKHN0cmluZy1lbXB0eS1wIC5maXJzdFB1Ymxpc2hlZERhdGUp
> KQogICAgICAgICAgICAgICAgICAgICAgLmZpcnN0UHVibGlzaGVkRGF0ZSkKICAgICAgICAgICAg
> ICAgICAgICAgKHQgbmlsKSkpCiAgICAgICAgICAgICAgcmV0KikKICAgICAgICAocHVzaCByZXQq
> IHJldCkpKSkKICAoaWYgKGNkciAoYXNzcSAnbmV4dCBqc29uKSkKICAgICAgKHZ6L2Jvb2t3cnlt
> LS1ib29rcwogICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIKICAgICAgICAgICAodXJsLXJldHJp
> ZXZlLXN5bmNocm9ub3VzbHkKICAgICAgICAgICAgKGNvbmNhdCAoc3RyaW5nLXRyaW0tcmlnaHQK
> ICAgICAgICAgICAgICAgICAgICAgKGNkciAoYXNzcSAnaWQganNvbikpCiAgICAgICAgICAgICAg
> ICAgICAgICJcXD9wYWdlPVswLTldKyIpCiAgICAgICAgICAgICAgICAgICAgIi5qc29uP3BhZ2U9
> IgogICAgICAgICAgICAgICAgICAgIChzdHJpbmctdHJpbS1sZWZ0CiAgICAgICAgICAgICAgICAg
> ICAgIChjZHIgKGFzc3EgJ25leHQganNvbikpCiAgICAgICAgICAgICAgICAgICAgICJbXjAtOV0r
> IikpKQogICAgICAgICAodnovYm9va3dyeW0tLWpzb24pKQogICAgICAgc2hlbGYKICAgICAgIHJl
> dCkKICAgIHJldCkpCgooZGVmdmFyIHZ6L2Jvb2t3cnltLWluc3RhbmNlICJodHRwczovL2Jvb2ty
> YXN0aW5hdGluZy5jb20iCiAgIkluc3RhbmNlIG9mIGJvb2t3cnltIHRvIHVzZSBieSBkZWZhdWx0
> LiIpCgooZGVmdmFyIHZ6L2Jvb2t3cnltLXVzZXIgImJyb250ZWEiCiAgIkJvb2t3cnltIHVzZXIg
> dG8gdmlldyBieSBkZWZhdWx0LiIpCgooZGVmdmFyIHZ6L2Jvb2t3cnltLS1jb3Zlci13aWR0aCAx
> MCkKCihkZWZ1biB2ei9ib29rd3J5bS0tY292ZXIgKCkKICAoZ290by1jaGFyIChwb2ludC1taW4p
> KQogIChzZWFyY2gtZm9yd2FyZCAiXG5cbiIpCiAgKGRlbGV0ZS1yZWdpb24gKHBvaW50LW1pbikg
> KHBvaW50KSkKICAocHJvcGVydGl6ZSAiKiIgJ2Rpc3BsYXkgKGNyZWF0ZS1pbWFnZSAoYnVmZmVy
> LXN0cmluZykgbmlsIHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6
> bWF4LXdpZHRoIChjb25zIHZ6L2Jvb2t3cnltLS1jb3Zlci13aWR0aCAnY3cpKSkpCgooZGVmdW4g
> dnovYm9va3dyeW0tbGlzdC1zaGVsdmVzICgmb3B0aW9uYWwgdXNlciBpbnN0YW5jZSkKICAiTGlz
> dCBzaGVsdmVzIG9mIFVTRVIgaW4gYm9va3dyeW0gaW5zdGFuY2UgSU5TVEFOQ0UuCkludGVyYWN0
> aXZlbHksIHF1ZXJ5IGZvciB0aGUgdXNlciBhbmQgaW5zdGFuY2Ugd2l0aCB0aGUgcHJlZml4IGFy
> Z3VtZW50LiIKICAoaW50ZXJhY3RpdmUKICAgKGlmIGN1cnJlbnQtcHJlZml4LWFyZwogICAgICAg
> KHN0cmluZy1zcGxpdCAocmVhZC1zdHJpbmcgIldoYXQgdXNlciB0byB2aWV3IChAVVNFUkBJTlNU
> QU5DRSk/ICIpICJAIiB0KQogICAgIChsaXN0IHZ6L2Jvb2t3cnltLXVzZXIgdnovYm9va3dyeW0t
> aW5zdGFuY2UpKSkKICAobGV0KiAoKHNoZWx2ZXMgKHZ6L2Jvb2t3cnltLS1zaGVsdmVzIHVzZXIg
> aW5zdGFuY2UpKQogICAgICAgICAoYm9va3MgKG1hcGNhbiAjJ3Z6L2Jvb2t3cnltLS1zaGVsZiBz
> aGVsdmVzKSkpCiAgICAocmVxdWlyZSAndnRhYmxlKQogICAgKHdpdGgtY3VycmVudC1idWZmZXIg
> KGdldC1idWZmZXItY3JlYXRlICIqQm9va3dyeW0qIikKICAgICAgKGxldCAoKGluaGliaXQtcmVh
> ZC1vbmx5IHQpKQogICAgICAgIChlcmFzZS1idWZmZXIpCiAgICAgICAgKGZhY2UtcmVtYXAtc2V0
> LWJhc2UgJ2hlYWRlci1saW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJhY2tncm91
> bmQgKGZhY2UtYXR0cmlidXRlICdoZWFkZXItbGluZSA6YmFja2dyb3VuZCkpCiAgICAgICAgKG1h
> a2UtdnRhYmxlCiAgICAgICAgIDs7IDp1c2UtaGVhZGVyLWxpbmUgbmlsCiAgICAgICAgIDpjb2x1
> bW5zIGAoKDpuYW1lICJDb3ZlciIgOndpZHRoICx2ei9ib29rd3J5bS0tY292ZXItd2lkdGgKICAg
> ICAgICAgICAgICAgICAgICAgICAgICAgOmZvcm1hdHRlciAobGFtYmRhICh4KSAob3IgeCAiIikp
> CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDpnZXR0ZXIgLChsYW1iZGEgKG9iamVjdCBfKSAo
> Y2RyIChhc3NxICdjb3Zlci1pbWcgb2JqZWN0KSkpKQogICAgICAgICAgICAgICAgICAgICJTaGVs
> ZiIgIlRpdGxlIgogICAgICAgICAgICAgICAgICAgICg6bmFtZSAiQXV0aG9ycyIKICAgICAgICAg
> ICAgICAgICAgICAgICAgICAgOmdldHRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAsKGxh
> bWJkYSAob2JqZWN0IF8pIChzdHJpbmctam9pbiAoY2RyIChhc3NxICdhdXRob3JzIG9iamVjdCkp
> ICIsICIpKSkKICAgICAgICAgICAgICAgICAgICAiUHVibGlzaGVkIikKICAgICAgICAgOmNvbHVt
> bi1jb2xvcnMgJygiI2ZmZmZmZiIgIiNlNWU1ZWIiICIjZjJmMmY0IikKICAgICAgICAgOnJvdy1j
> b2xvcnMgJygiI2YyZjJmNCIgIiNlNWU1ZWIiICIjZmZmZmZmIikKICAgICAgICAgOmdldHRlciAo
> bGFtYmRhIChvYmplY3QgY29sdW1uIHZ0YWJsZSkKICAgICAgICAgICAgICAgICAgIChvciAoY2Ry
> IChhc3NxIChpbnRlcm4gKGRvd25jYXNlICh2dGFibGUtY29sdW1uIHZ0YWJsZSBjb2x1bW4pKSkK
> ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCkpCiAgICAgICAgICAgICAg
> ICAgICAgICAgIiIpKQogICAgICAgICA6b2JqZWN0cy1mdW5jdGlvbiAobGFtYmRhICgpIGJvb2tz
> KSkKICAgICAgICAocmVhZC1vbmx5LW1vZGUgMSkKICAgICAgICAocG9wLXRvLWJ1ZmZlciAoY3Vy
> cmVudC1idWZmZXIpKQogICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgKGdvdG8tY2hh
> ciAocG9pbnQtbWluKSkKICAgICAgICAgIChsZXQgKChpIDApKQogICAgICAgICAgICAod2hpbGUg
> KG5vdCAoZW9icCkpCiAgICAgICAgICAgICAgKGxldCAoKG9iamVjdCAodnRhYmxlLWN1cnJlbnQt
> b2JqZWN0KSkpCiAgICAgICAgICAgICAgICAod2hlbiAoYXNzcSAnY292ZXIgb2JqZWN0KQogICAg
> ICAgICAgICAgICAgICAodXJsLXJldHJpZXZlIChjZHIgKGFzc3EgJ2NvdmVyIG9iamVjdCkpCiAg
> ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoc3RhdHVzIGJ1ZmZlciBvYmpl
> Y3QgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmxlc3MgKGVxIChjYXIg
> c3RhdHVzKSA6ZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQg
> KChjb3ZlciAodnovYm9va3dyeW0tLWNvdmVyKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCiAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICAgICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKICAgICAgICAg
> ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS11cGRhdGUtb2JqZWN0ICh2
> dGFibGUtY3VycmVudC10YWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zIChjb25zICdjb3Zlci1pbWcgY292ZXIp
> CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICAgICBvYmplY3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QpKSkKICAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICAgICAgICAgICAoc2V0ZiAoYWxpc3QtZ2V0ICdjb3Zlci1pbWcgKG50aCBuIGJv
> b2tzKSkgY292ZXIpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgKGN1
> cnJlbnQtYnVmZmVyKSBvYmplY3QgaSkpKQogICAgICAgICAgICAgICAgKHdoZW4gb2JqZWN0IChz
> ZXRxIGkgKDErIGkpKSkpCiAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAxKSkpKSkpKSkKLS09
> LT0tPS0tCg==




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

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


Received: (at 80026) by debbugs.gnu.org; 19 Dec 2025 07:19:29 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Dec 19 02:19:29 2025
Received: from localhost ([127.0.0.1]:34374 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWUls-0005Nt-Qf
	for submit <at> debbugs.gnu.org; Fri, 19 Dec 2025 02:19:29 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10]:48496)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1vWUlo-0005NZ-Aw
 for 80026 <at> debbugs.gnu.org; Fri, 19 Dec 2025 02:19:26 -0500
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1vWUlh-0007T8-IQ; Fri, 19 Dec 2025 02:19:17 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=h9P8O9JUa+RQ4OvPZISQJ7k9AxhYM4SLe3cEWIGfU1Q=; b=iKIm1TnrhW/gM/BEtHX+
 BR/5Cd9kYfaSi7uMUU5qLzSvyqzScIBWXdrR3RFP/zR0o+hWg66k5o5PGH/b/HoUGGxwVud/s+s7m
 morgHJ2r/txaVoMHQpQ7eM/NfWLXS4gAqThR/WzM5YVTARaJeDgI+iBLdobywpTnmTGXk8Baqggs9
 Q/Khu5QmbaS2xLI3V6shkdUZfxCUBBov1SBP5iOMZ/v1ELR2m8HmnweHMKjFsxE+E1qpA4cII9AGN
 Ek8ODnqGXday3pEXuVIgtmG9YIk8XY19cMkHQUGdaHdGQzQhnN0fgDAUS26tTrb3Nj+WveNjjRb6l
 txcnYP/+X6eBkw==;
Date: Fri, 19 Dec 2025 09:18:48 +0200
Message-Id: <86sed70wiv.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
In-Reply-To: <CAN+1HbpBhNaZudz2CR2ZW36dbLcQ5cmxzdhLHnJGY-m_2ycbsQ@HIDDEN>
 (message from =?utf-8?Q?St=C3=A9phane?= Marks on Thu, 18 Dec 2025 15:06:30
 -0500)
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 <86zf7g2v9t.fsf@HIDDEN>
 <CAN+1HbqaOS-Dhf=FayFLcux5RAqd+YTO8sjLm0dgwqfiNN-qow@HIDDEN>
 <CAN+1HbpXAa=MK7VbaUvuQnVC1Mb4EqZqj9C-TYNgMxPR2Wb8Aw@HIDDEN>
 <CAN+1HbqV3QVKGD61c5fBNagEVc+DT0A7UrfRh5+SDCu=tPb6Dw@HIDDEN>
 <861pkr3cei.fsf@HIDDEN>
 <CAN+1Hbqn_Ojes=iinTJAaMvp+D1Y+R5cRX8dKjO41LRrfqbvfA@HIDDEN>
 <86zf7f1ugq.fsf@HIDDEN>
 <CAN+1Hbr80y5GaGkMB3zE=hfG5kc_+jq5CgYbdMWpQ5895O0Ljw@HIDDEN>
 <CAN+1HbpBhNaZudz2CR2ZW36dbLcQ5cmxzdhLHnJGY-m_2ycbsQ@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: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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 (---)

> From: Stéphane Marks <shipmints@HIDDEN>
> Date: Thu, 18 Dec 2025 15:06:30 -0500
> Cc: 80026 <at> debbugs.gnu.org, sbaugh@HIDDEN, krisbalintona@HIDDEN, 
> 	joostkremers@HIDDEN, ijqq@HIDDEN, visuweshm@HIDDEN, 
> 	adam@HIDDEN, larsi@HIDDEN, arstoffel@HIDDEN
> 
> Okay here's what I think you meant, though it uses and reuses the work buffer vs. the vtable buffer itself (I'm
> not even sure where to insert the string, save excursion and go to the end and insert there and then delete
> it?).  Perhaps the function is screwy in some way.  Heuristic still beats it.

This is not what I meant.

>       ;; Setup current buffer to correctly compute pixel width.
>       (when buffer
>         (dolist (v '(face-remapping-alist
>                      char-property-alias-alist
>                      default-text-properties))
>           (if (local-variable-p v buffer)
>               (set (make-local-variable v)
>                    (buffer-local-value v buffer)))))
>       ;; Avoid deactivating the region as side effect.
>       (let (deactivate-mark)
>         (insert string))
>       ;; If `display-line-numbers' is enabled in internal
>       ;; buffers (e.g. globally), it breaks width calculation
>       ;; (bug#59311).  Disable `line-prefix' and `wrap-prefix',
>       ;; for the same reason.
>       (add-text-properties
>        (point-min) (point-max)
>        '(display-line-numbers-disable t line-prefix "" wrap-prefix ""))


This part should be done just once, the first time the buffer is
created and the full string is inserted into it.

>       (let ((string-pixels (car (buffer-text-pixel-size nil nil t))))
>         (while (and (> (buffer-size) 0)
>                     (if string-pixels (prog1
>                                           (> string-pixels pixels)
>                                         (setq string-pixels nil))
>                       (> (car (buffer-text-pixel-size nil nil t)) pixels)))
>           (delete-char -1))
>         (substring string 0 (buffer-size))))))

Instead of calling buffer-text-pixel-size, which requires you to
delete characters, call window-text-pixel-size and iterate on its
TO argument.  This will allow you to insert string only once, and
avoid modifying the buffer.




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

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


Received: (at submit) by debbugs.gnu.org; 19 Dec 2025 04:32:50 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 18 23:32:50 2025
Received: from localhost ([127.0.0.1]:33112 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWSAb-00033z-Ko
	for submit <at> debbugs.gnu.org; Thu, 18 Dec 2025 23:32:50 -0500
Received: from lists.gnu.org ([2001:470:142::17]:42194)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <visuweshm@HIDDEN>)
 id 1vWSAY-00033k-LC
 for submit <at> debbugs.gnu.org; Thu, 18 Dec 2025 23:32:47 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <visuweshm@HIDDEN>)
 id 1vWSAS-0003MM-AG
 for bug-gnu-emacs@HIDDEN; Thu, 18 Dec 2025 23:32:40 -0500
Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <visuweshm@HIDDEN>)
 id 1vWSAQ-000866-DM
 for bug-gnu-emacs@HIDDEN; Thu, 18 Dec 2025 23:32:40 -0500
Received: by mail-pl1-x642.google.com with SMTP id
 d9443c01a7336-2a07f8dd9cdso15219915ad.1
 for <bug-gnu-emacs@HIDDEN>; Thu, 18 Dec 2025 20:32:37 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1766118756; x=1766723556; darn=gnu.org;
 h=content-transfer-encoding:mime-version:user-agent:references
 :message-id:date:in-reply-to:subject:cc:to:from:from:to:cc:subject
 :date:message-id:reply-to;
 bh=RMOTmwEfc2s9lbivdX6aTDcQ6JCd/ZY/+GXLaR77vQk=;
 b=B4yRAVDosNIVpt9F7r2PT8IhuSgEhazzNPxShD6eN6c+dQNyJnpurFALg6QSPa/Tfg
 7bJS7NbKSrdAM5ux9ParowX5n8OE0Yc8kdW/I9PI+77OeVw1sbl0LsJB0OYRW2gfHYHr
 0Lha69XQjMZFH2+4Yq+UtzM/ww6LzIy7//YbRP9HaGiPQX/uHTJkDw+7MrnwJzlK8RU0
 jgXuWFvDDT2r5KYtMauwByN+69C/jY7WnhthcovsI4tEM3VWH+T8rtNTSjuT8d/KT5kH
 6ygpfESEfJ5HijnJ/b/A6VQJ0l+DVLLC9IttWrHtdIUUkewlVGAb5fmfjXDpOSBBYY43
 jlvw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1766118756; x=1766723556;
 h=content-transfer-encoding:mime-version:user-agent:references
 :message-id:date:in-reply-to:subject:cc:to:from:x-gm-gg
 :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=RMOTmwEfc2s9lbivdX6aTDcQ6JCd/ZY/+GXLaR77vQk=;
 b=nRvBGcxiRollKOWeHm5q7S8RIK+7kxEc0teVs7Gpgo/jYHSe1lDHBtUXLEU634r91g
 VU+TFkl9ZFyZpOt/Rtg3wHYZSYLFoEAaVs5YdwsWPn4F/qjhuGl3y2fdN0eWXYdV+QRf
 quP1djua0P6WCsefBz9r74klyomL9lDLPafY12gIEzmslw/s30aBlpAs0QXF6U98NlCF
 Lo/4C+3cNn6jqJc/obta2pdj+wdrPY3QvSKBCo1srHKxKHAhT/CEq4xo7Zc5xsbo6G48
 c8hZaX3gD8AeXww3WhJlRv7BKoqXbNJNjL3HAr/GSWEYLvUJ97Prsdxm77R3+Tx8hDPF
 xBsg==
X-Gm-Message-State: AOJu0YxApZk5rZ8wiDJiMosWqARvgbskCsBzGHEVUEdnNSAhvf4MN3i6
 SCANC/JuUU4Xvfg24V4ivcq+vxr/A9PBxSvBvLiaWm1GSnqdOdfIwa5x
X-Gm-Gg: AY/fxX4BRL8henH41dipxi0AunnPkYUTz0ktqGXX1iPV9IFXLvJdK0B4kbmSHkCJxV2
 Q+uElAKIEJvx7ra1JuAOK14UfnD1Edt1GJbbvWGAfu46IGQMDq6gnDuk5xghB+eCV8sdTm52MrV
 KrgKzyrH2j9K+ANJhtwY9OBbnEqoGZXSlW87lGGDJ30vyERmM3GpHhcOfLLUZRRJVsjO8G8LOUM
 ZViePv8HU7sS+RJVU85puuQ6ch6NeHgCRqDQwN1YqfmY3+/M9XIsV0XhqUj0mt85y49xWmohZGS
 rWCtIf9T2KmzEYX8qa/m/tiejvM0okM5PKQBQOPiJ8PrzQ3r9A/ruhsXnJ4VsSI64wsZD8z2QIW
 fWJcpWxb33vwZMiWqEHbHlY34RENVh6bcsf272MlbCWccUf3/QveVnVSOSqNmx7O7AgGUqRh6BP
 ZhR7sl3K0=
X-Google-Smtp-Source: AGHT+IHJrUxo2A94GhTwO4R6RAcGTDZn6wRwM7+JholpPiReYh2MuOgmMVzBCvczKnC7QnzK9wxBoQ==
X-Received: by 2002:a17:903:1a08:b0:297:c048:fb60 with SMTP id
 d9443c01a7336-2a2f2427399mr16643895ad.25.1766118756308; 
 Thu, 18 Dec 2025 20:32:36 -0800 (PST)
Received: from localhost ([158.144.40.156])
 by smtp.gmail.com with UTF8SMTPSA id
 d9443c01a7336-2a2f3d76ce3sm8159385ad.90.2025.12.18.20.32.35
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Thu, 18 Dec 2025 20:32:36 -0800 (PST)
From: Visuwesh <visuweshm@HIDDEN>
To: =?us-ascii?Q?=3D=3Futf-8=3FQ=3FSt=3DC3=3DA9phane=3F=3D?= Marks
 <shipmints@HIDDEN>
Subject: Re: [PATCH] Improve vtable--limit-string performance
In-Reply-To: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
Date: Fri, 19 Dec 2025 09:58:26 +0530
Message-ID: <87ike35c45.fsf@HIDDEN>
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
Content-Transfer-Encoding: base64
Received-SPF: pass client-ip=2607:f8b0:4864:20::642;
 envelope-from=visuweshm@HIDDEN; helo=mail-pl1-x642.google.com
X-Spam_score_int: -6
X-Spam_score: -0.7
X-Spam_bar: /
X-Spam_report: (-0.7 / 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,
 PYZOR_CHECK=1.392, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,
 SPF_PASS=-0.001, TVD_SPACE_RATIO=0.001 autolearn=no autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: submit
Cc: Spencer Baugh <sbaugh@HIDDEN>,
 Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, bug-gnu-emacs@HIDDEN,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>, ijqq@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: -0.0 (/)

LS09LT0tPQpDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1U
cmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZQoKWz1FMD1BRT1BQT1FMD1BRj04MT1F
MD1BRT1BND1FMD1BRT1BOT1FMD1BRj04RCA9RTA9QUU9OUY9RTA9QUU9QkY9RTA9QUU9OUE9Cj1F
MD1BRT1BRT1FMD1BRj04RD1FMD1BRT1BQT1FMD1BRT1CMD1FMD1BRj04RCAxNywgMjAyNV0gU3Q9
QzM9QTlwaGFuZSBNYXJrcz0KIHdyb3RlOgoKSGksCgo+IFRoaXMgaW1wbGVtZW50cyBhIHNpbXBs
ZSBoZXVyaXN0aWMgdG8gbGltaXQgdGhlIG51bWJlciBvZiB0aW1lcwo+IGBzdHJpbmctcGl4ZWwt
d2lkdGhgIGdldHMgY2FsbGVkIGJ5IGVzdGltYXRpbmcgdGhlIHN0cmluZydzIHRydW5jYXRpb24K
PiBwb3NpdGlvbiBpbiBhZHZhbmNlLiAgVGhpcyBpcyBvdmVycmlkYWJsZSBjb2x1bW4tYnktY29s
dW1uIHNob3VsZCBzb21lCj4gc3RyaW5ncyBpbiB0aGUgdnRhYmxlIGJlIGNvbXBvc2VkIG9mIHdp
ZGVseSB2YXJ5aW5nIGZvbnQgd2lkdGhzIHRoYXQKPiBuZWNlc3NpdGF0ZXMgbWlub3IgYWRqdXN0
bWVudHMgdG8gdGhlIGhldXJpc3RpYy4gIFRoaXMgYXBwcm9hY2ggcGVyZm9ybXMKPiB3ZWxsIGlu
IHRlc3RpbmcgKGFuZCBJIHRlc3RlZCBzZXZlcmFsIGFwcHJvYWNoZXMpIGFuZCBoYXMgYmVlbiB0
ZXN0ZWQgYnkKPiBtb3JlIHRoYW4gb25lIHZ0YWJsZSB1c2VyLgoKQSBuYT1DMz1BRnZlIHF1ZXN0
aW9uOiBoYXZlIHlvdSB0ZXN0ZWQgdGhpcyB3aXRoIGNvbHVtbnMgdGhhdCBjb250YWluIGltYWdl
PQpzPwpJIHdhbnRlZCB0byB0ZXN0IHRoaXMgc2NlbmFyaW8gb3V0IGJ1dCB0aGUgcGF0Y2ggZG9l
c24ndCBhcHBseSBmb3IgbWU6CnZ0YWJsZS0tbGltaXQtc3RyaW5nIGRvZXMgbm90IHRha2UgYSBC
VUZGRVIgYXJndW1lbnQsIGFuZCBJJ20gb24gbWFzdGVyCjI2ZGNiZDA2ZWRhLgoKSWYgaXQgd291
bGQgYmUgbW9yZSBjb252ZW5pZW50IHRvIGhhdmUgY29kZSB0aGF0IHdvdWxkIHByb2R1Y2Ugc3Vj
aCBhCnRhYmxlLCB0aGVuIFBGQS4gIFRoZSBlbnRyeSBwb2ludCBpcyB0aGUgdnovYm9va3dyeW0t
bGlzdC1zaGVsdmVzCmNvbW1hbmQuCgoKLS09LT0tPQpDb250ZW50LVR5cGU6IHRleHQveC1lbWFj
cy1saXNwCkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKQ29udGVudC1EZXNjcmlwdGlv
bjogdnRhYmxlIHdpdGggaW1hZ2UgY29sdW1uCgooZGVmdW4gdnovYm9va3dyeW0tLXNoZWx2ZXMg
KHVzZXIgaW5zdGFuY2UpCiAgIlJldHVybiB0aGUgbGlzdCBvZiBzaGVsZiBVUkxzIGZvciBib29r
d3J5bSBVU0VSIGluIElOU1RBTkNFLiIKICAod2l0aC1jdXJyZW50LWJ1ZmZlcgogICAgICAodXJs
LXJldHJpZXZlLXN5bmNocm9ub3VzbHkKICAgICAgIChjb25jYXQgaW5zdGFuY2UgIi91c2VyLyIg
dXNlciAiL2Jvb2tzIikpCiAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQogICAgKHNlYXJjaC1m
b3J3YXJkICJcblxuIikKICAgIChsZXQgKChkb20gKGxpYnhtbC1wYXJzZS1odG1sLXJlZ2lvbiAo
cG9pbnQpIChwb2ludC1tYXgpKSkKICAgICAgICAgIHJldCkKICAgICAgKGRvbGlzdCAoYSAoZG9t
LWJ5LXRhZyAoZG9tLWJ5LWlkIGRvbSAidG91ci11c2VyLXNoZWx2ZXMiKSAnYSkpCiAgICAgICAg
OzsgL2Jvb2tzIGRvZXNuJ3QgaGF2ZSBhIEpTT04gZW5kcG9pbnQuCiAgICAgICAgKHVubGVzcyAo
c3RyaW5nLXN1ZmZpeC1wICIvYm9va3MiIChkb20tYXR0ciBhICdocmVmKSkKICAgICAgICAgIChw
dXNoIChjb25jYXQgaW5zdGFuY2UgKGRvbS1hdHRyIGEgJ2hyZWYpICIuanNvbiIpCiAgICAgICAg
ICAgICAgICByZXQpKSkKICAgICAgcmV0KSkpCgooZGVmdW4gdnovYm9va3dyeW0tLWpzb24gKCkK
ICAoZ290by1jaGFyIChwb2ludC1taW4pKQogIChzZWFyY2gtZm9yd2FyZCAiXG5cbiIpCiAgKGpz
b24tcGFyc2UtYnVmZmVyIDpvYmplY3QtdHlwZSAnYWxpc3QKICAgICAgICAgICAgICAgICAgICAg
OmFycmF5LXR5cGUgJ2xpc3QKICAgICAgICAgICAgICAgICAgICAgOm51bGwtb2JqZWN0IG5pbCkp
CgooZGVmdW4gdnovYm9va3dyeW0tLXNoZWxmICh1cmwpCiAgIlJldHVybiBib29rcyBpbiBzaGVs
ZiBvZiB1c2VyIGluIGluc3RhbmNlIGdpdmVuIGJ5IFVSTC4iCiAgKHdpdGgtY3VycmVudC1idWZm
ZXIgKHVybC1yZXRyaWV2ZS1zeW5jaHJvbm91c2x5IHVybCkKICAgIChnb3RvLWNoYXIgKHBvaW50
LW1pbikpCiAgICAoc2VhcmNoLWZvcndhcmQgIlxuXG4iKQogICAgKGxldCAoKGpzb24gKGpzb24t
cGFyc2UtYnVmZmVyIDpvYmplY3QtdHlwZSAnYWxpc3QKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICA6YXJyYXktdHlwZSAnbGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDpudWxsLW9iamVjdCBuaWwpKSkKICAgICAgKGxldC1hbGlzdCBqc29uCiAgICAgICAg
KHVubGVzcyAoPSAudG90YWxJdGVtcyAwKQogICAgICAgICAgKGxldCogKChwcmUgKGNvbmNhdCAo
c3RyaW5nLXJlbW92ZS1zdWZmaXggIi5qc29uIiB1cmwpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICI/cGFnZT0iKSkKICAgICAgICAgICAgICAgICAoc3RhcnQgKHN0cmluZy1yZW1vdmUt
cHJlZml4IHByZSAuZmlyc3QpKSkKICAgICAgICAgICAgKG5yZXZlcnNlCiAgICAgICAgICAgICAo
dnovYm9va3dyeW0tLWJvb2tzCiAgICAgICAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIKICAg
ICAgICAgICAgICAgICAgKHVybC1yZXRyaWV2ZS1zeW5jaHJvbm91c2x5IChjb25jYXQgdXJsICI/
cGFnZT0iIHN0YXJ0KSkKICAgICAgICAgICAgICAgICh2ei9ib29rd3J5bS0tanNvbikpCiAgICAg
ICAgICAgICAgLm5hbWUpKSkpKSkpKQoKKGRlZnZhciB2ei9ib29rd3J5bS0tYXV0aG9yLWNhY2hl
IChtYWtlLWhhc2gtdGFibGUgOnRlc3QgIydlcXVhbCkKICAiQSBoYXNodGFibGUgb2YgYXV0aG9y
IFVSTCBhbmQgdGhlaXIgYWN0dWFsIG5hbWUuIikKCihkZWZ1biB2ei9ib29rd3J5bS0tYXV0aG9y
ICh1cmwpCiAgIlJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIGluIFVSTC4iCiAgKHdpdGgt
bWVtb2l6YXRpb24gKGdldGhhc2ggdXJsIHZ6L2Jvb2t3cnltLS1hdXRob3ItY2FjaGUpCiAgICAo
d2l0aC1jdXJyZW50LWJ1ZmZlciAodXJsLXJldHJpZXZlLXN5bmNocm9ub3VzbHkgKGNvbmNhdCB1
cmwgIi5qc29uIikpCiAgICAgIChvciAoY2RyIChhc3NxICduYW1lICh2ei9ib29rd3J5bS0tanNv
bikpKQogICAgICAgICAgIlVua25vd24iKSkpKQoKKGRlZnVuIHZ6L2Jvb2t3cnltLS1ib29rcyAo
anNvbiBzaGVsZiAmb3B0aW9uYWwgcmV0KQogIChkb2xpc3QgKGJvb2sgKGNkciAoYXNzcSAnb3Jk
ZXJlZEl0ZW1zIGpzb24pKSkKICAgIChsZXQtYWxpc3QgYm9vawogICAgICAobGV0ICgoYXV0aG9y
cyAobWFwY2FyICMndnovYm9va3dyeW0tLWF1dGhvciAuYXV0aG9ycykpCiAgICAgICAgICAgIHJl
dCopCiAgICAgICAgKHB1c2ggKGNvbnMgJ3NoZWxmIHNoZWxmKSByZXQqKQogICAgICAgICh3aGVu
IC5jb3Zlci51cmwKICAgICAgICAgIChwdXNoIChjb25zICdjb3ZlciAuY292ZXIudXJsKSByZXQq
KSkKICAgICAgICAocHVzaCAoY29ucyAndXJsIC5pZCkgcmV0KikKICAgICAgICAocHVzaCAoY29u
cyAndGl0bGUgLnRpdGxlKSByZXQqKQogICAgICAgIChwdXNoIChjb25zICdhdXRob3JzIGF1dGhv
cnMpIHJldCopCiAgICAgICAgKHB1c2ggKGNvbnMgJ3B1Ymxpc2hlZAogICAgICAgICAgICAgICAg
ICAgIChjb25kCiAgICAgICAgICAgICAgICAgICAgICgobm90IChzdHJpbmctZW1wdHktcCAucHVi
bGlzaGVkRGF0ZSkpCiAgICAgICAgICAgICAgICAgICAgICAucHVibGlzaGVkRGF0ZSkKICAgICAg
ICAgICAgICAgICAgICAgKChub3QgKHN0cmluZy1lbXB0eS1wIC5maXJzdFB1Ymxpc2hlZERhdGUp
KQogICAgICAgICAgICAgICAgICAgICAgLmZpcnN0UHVibGlzaGVkRGF0ZSkKICAgICAgICAgICAg
ICAgICAgICAgKHQgbmlsKSkpCiAgICAgICAgICAgICAgcmV0KikKICAgICAgICAocHVzaCByZXQq
IHJldCkpKSkKICAoaWYgKGNkciAoYXNzcSAnbmV4dCBqc29uKSkKICAgICAgKHZ6L2Jvb2t3cnlt
LS1ib29rcwogICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIKICAgICAgICAgICAodXJsLXJldHJp
ZXZlLXN5bmNocm9ub3VzbHkKICAgICAgICAgICAgKGNvbmNhdCAoc3RyaW5nLXRyaW0tcmlnaHQK
ICAgICAgICAgICAgICAgICAgICAgKGNkciAoYXNzcSAnaWQganNvbikpCiAgICAgICAgICAgICAg
ICAgICAgICJcXD9wYWdlPVswLTldKyIpCiAgICAgICAgICAgICAgICAgICAgIi5qc29uP3BhZ2U9
IgogICAgICAgICAgICAgICAgICAgIChzdHJpbmctdHJpbS1sZWZ0CiAgICAgICAgICAgICAgICAg
ICAgIChjZHIgKGFzc3EgJ25leHQganNvbikpCiAgICAgICAgICAgICAgICAgICAgICJbXjAtOV0r
IikpKQogICAgICAgICAodnovYm9va3dyeW0tLWpzb24pKQogICAgICAgc2hlbGYKICAgICAgIHJl
dCkKICAgIHJldCkpCgooZGVmdmFyIHZ6L2Jvb2t3cnltLWluc3RhbmNlICJodHRwczovL2Jvb2ty
YXN0aW5hdGluZy5jb20iCiAgIkluc3RhbmNlIG9mIGJvb2t3cnltIHRvIHVzZSBieSBkZWZhdWx0
LiIpCgooZGVmdmFyIHZ6L2Jvb2t3cnltLXVzZXIgImJyb250ZWEiCiAgIkJvb2t3cnltIHVzZXIg
dG8gdmlldyBieSBkZWZhdWx0LiIpCgooZGVmdmFyIHZ6L2Jvb2t3cnltLS1jb3Zlci13aWR0aCAx
MCkKCihkZWZ1biB2ei9ib29rd3J5bS0tY292ZXIgKCkKICAoZ290by1jaGFyIChwb2ludC1taW4p
KQogIChzZWFyY2gtZm9yd2FyZCAiXG5cbiIpCiAgKGRlbGV0ZS1yZWdpb24gKHBvaW50LW1pbikg
KHBvaW50KSkKICAocHJvcGVydGl6ZSAiKiIgJ2Rpc3BsYXkgKGNyZWF0ZS1pbWFnZSAoYnVmZmVy
LXN0cmluZykgbmlsIHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6
bWF4LXdpZHRoIChjb25zIHZ6L2Jvb2t3cnltLS1jb3Zlci13aWR0aCAnY3cpKSkpCgooZGVmdW4g
dnovYm9va3dyeW0tbGlzdC1zaGVsdmVzICgmb3B0aW9uYWwgdXNlciBpbnN0YW5jZSkKICAiTGlz
dCBzaGVsdmVzIG9mIFVTRVIgaW4gYm9va3dyeW0gaW5zdGFuY2UgSU5TVEFOQ0UuCkludGVyYWN0
aXZlbHksIHF1ZXJ5IGZvciB0aGUgdXNlciBhbmQgaW5zdGFuY2Ugd2l0aCB0aGUgcHJlZml4IGFy
Z3VtZW50LiIKICAoaW50ZXJhY3RpdmUKICAgKGlmIGN1cnJlbnQtcHJlZml4LWFyZwogICAgICAg
KHN0cmluZy1zcGxpdCAocmVhZC1zdHJpbmcgIldoYXQgdXNlciB0byB2aWV3IChAVVNFUkBJTlNU
QU5DRSk/ICIpICJAIiB0KQogICAgIChsaXN0IHZ6L2Jvb2t3cnltLXVzZXIgdnovYm9va3dyeW0t
aW5zdGFuY2UpKSkKICAobGV0KiAoKHNoZWx2ZXMgKHZ6L2Jvb2t3cnltLS1zaGVsdmVzIHVzZXIg
aW5zdGFuY2UpKQogICAgICAgICAoYm9va3MgKG1hcGNhbiAjJ3Z6L2Jvb2t3cnltLS1zaGVsZiBz
aGVsdmVzKSkpCiAgICAocmVxdWlyZSAndnRhYmxlKQogICAgKHdpdGgtY3VycmVudC1idWZmZXIg
KGdldC1idWZmZXItY3JlYXRlICIqQm9va3dyeW0qIikKICAgICAgKGxldCAoKGluaGliaXQtcmVh
ZC1vbmx5IHQpKQogICAgICAgIChlcmFzZS1idWZmZXIpCiAgICAgICAgKGZhY2UtcmVtYXAtc2V0
LWJhc2UgJ2hlYWRlci1saW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJhY2tncm91
bmQgKGZhY2UtYXR0cmlidXRlICdoZWFkZXItbGluZSA6YmFja2dyb3VuZCkpCiAgICAgICAgKG1h
a2UtdnRhYmxlCiAgICAgICAgIDs7IDp1c2UtaGVhZGVyLWxpbmUgbmlsCiAgICAgICAgIDpjb2x1
bW5zIGAoKDpuYW1lICJDb3ZlciIgOndpZHRoICx2ei9ib29rd3J5bS0tY292ZXItd2lkdGgKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgOmZvcm1hdHRlciAobGFtYmRhICh4KSAob3IgeCAiIikp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDpnZXR0ZXIgLChsYW1iZGEgKG9iamVjdCBfKSAo
Y2RyIChhc3NxICdjb3Zlci1pbWcgb2JqZWN0KSkpKQogICAgICAgICAgICAgICAgICAgICJTaGVs
ZiIgIlRpdGxlIgogICAgICAgICAgICAgICAgICAgICg6bmFtZSAiQXV0aG9ycyIKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgOmdldHRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAsKGxh
bWJkYSAob2JqZWN0IF8pIChzdHJpbmctam9pbiAoY2RyIChhc3NxICdhdXRob3JzIG9iamVjdCkp
ICIsICIpKSkKICAgICAgICAgICAgICAgICAgICAiUHVibGlzaGVkIikKICAgICAgICAgOmNvbHVt
bi1jb2xvcnMgJygiI2ZmZmZmZiIgIiNlNWU1ZWIiICIjZjJmMmY0IikKICAgICAgICAgOnJvdy1j
b2xvcnMgJygiI2YyZjJmNCIgIiNlNWU1ZWIiICIjZmZmZmZmIikKICAgICAgICAgOmdldHRlciAo
bGFtYmRhIChvYmplY3QgY29sdW1uIHZ0YWJsZSkKICAgICAgICAgICAgICAgICAgIChvciAoY2Ry
IChhc3NxIChpbnRlcm4gKGRvd25jYXNlICh2dGFibGUtY29sdW1uIHZ0YWJsZSBjb2x1bW4pKSkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCkpCiAgICAgICAgICAgICAg
ICAgICAgICAgIiIpKQogICAgICAgICA6b2JqZWN0cy1mdW5jdGlvbiAobGFtYmRhICgpIGJvb2tz
KSkKICAgICAgICAocmVhZC1vbmx5LW1vZGUgMSkKICAgICAgICAocG9wLXRvLWJ1ZmZlciAoY3Vy
cmVudC1idWZmZXIpKQogICAgICAgIChzYXZlLWV4Y3Vyc2lvbgogICAgICAgICAgKGdvdG8tY2hh
ciAocG9pbnQtbWluKSkKICAgICAgICAgIChsZXQgKChpIDApKQogICAgICAgICAgICAod2hpbGUg
KG5vdCAoZW9icCkpCiAgICAgICAgICAgICAgKGxldCAoKG9iamVjdCAodnRhYmxlLWN1cnJlbnQt
b2JqZWN0KSkpCiAgICAgICAgICAgICAgICAod2hlbiAoYXNzcSAnY292ZXIgb2JqZWN0KQogICAg
ICAgICAgICAgICAgICAodXJsLXJldHJpZXZlIChjZHIgKGFzc3EgJ2NvdmVyIG9iamVjdCkpCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoc3RhdHVzIGJ1ZmZlciBvYmpl
Y3QgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmxlc3MgKGVxIChjYXIg
c3RhdHVzKSA6ZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQg
KChjb3ZlciAodnovYm9va3dyeW0tLWNvdmVyKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS11cGRhdGUtb2JqZWN0ICh2
dGFibGUtY3VycmVudC10YWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zIChjb25zICdjb3Zlci1pbWcgY292ZXIp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBvYmplY3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QpKSkKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoc2V0ZiAoYWxpc3QtZ2V0ICdjb3Zlci1pbWcgKG50aCBuIGJv
b2tzKSkgY292ZXIpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgKGN1
cnJlbnQtYnVmZmVyKSBvYmplY3QgaSkpKQogICAgICAgICAgICAgICAgKHdoZW4gb2JqZWN0IChz
ZXRxIGkgKDErIGkpKSkpCiAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAxKSkpKSkpKSkKLS09
LT0tPS0tCg==




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

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


Received: (at 80026) by debbugs.gnu.org; 18 Dec 2025 20:06:54 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 18 15:06:54 2025
Received: from localhost ([127.0.0.1]:57342 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWKGw-0005wd-8g
	for submit <at> debbugs.gnu.org; Thu, 18 Dec 2025 15:06:53 -0500
Received: from mail-vs1-xe2b.google.com ([2607:f8b0:4864:20::e2b]:46202)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vWKGt-0005wJ-3b
 for 80026 <at> debbugs.gnu.org; Thu, 18 Dec 2025 15:06:48 -0500
Received: by mail-vs1-xe2b.google.com with SMTP id
 ada2fe7eead31-5e55bd6f5bbso662796137.0
 for <80026 <at> debbugs.gnu.org>; Thu, 18 Dec 2025 12:06:47 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1766088401; x=1766693201; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=QBdp28P1jDIR8ybTK+l8CLPlYX1F2uPUMVICuMX4Ux0=;
 b=XBIQk7nS3ZWdbBD22Vc0z86c8i6Jh5kUMnzVaN/cF8ConPG5oShi6pzlWD1V/EGqvE
 1BGILJfP6+gUOYbjgy8Bk58QMM0n7bTJ4YazcvLC8Zj/puIDXkFeXRLccbffLTtsyylG
 JpEDGPbg6JOeWYlXW3UH114sSf3MAPdXT7ipFvTUNg1NH3zpew4oPwcr48uie9XfQ9Zt
 G71uZyDm8C0sxxTLBSTpXV3P+WSSHfFrv10xUbUu61WPckvWyXO29Y6muINwTb47/AdE
 9YbAp/Eq7vwwhQF8Or+v3UhNxmD12+js0CO+Ahef9g/KVjOFJMI9Y/fJJ8uW795PlHPE
 JDxQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1766088401; x=1766693201;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=QBdp28P1jDIR8ybTK+l8CLPlYX1F2uPUMVICuMX4Ux0=;
 b=i0X8sX8qBw5mCe604Yy7g55rqghfs8nyt5ILLLmg3wnT02JNy9bOwUaysiFkR6QeYG
 FFiijPqySkFHdaQJaOYN0HXyVNRLQ59yc5uJtZPwuYQYQW2fRcf/d5fyFpSgk+kg+9kN
 gIfcHhDw1wNsVqF3oqS0AODTnjM51szjXMnXXcsJ1jRc1cnlI8+Ewpayo8l8CMw+ad2c
 cHJtSEB5zVfbHe2oiNWspJGR7cK0whnh6GLoC/3eSdVeS3U/5h8ygHg+WWCyaxd5mXtL
 n+wMUF7RHW4RRFllvOvVBCKmML/PcSsDkSP9NXe1zwhChyT2fvJcXN2KLNY+SDjiOBZH
 /1zA==
X-Gm-Message-State: AOJu0YzuwrwDw18M7F1/XB+Z6jMfRAht78Yyz10pFdWWVCl2XSFgg+wT
 tRY27+cirBRoLYCEamLA8qpSw+sE5BcM3SZj8tZq3TbiadOxy5kb2XiTgxfEx4LAKDmebwtO8H3
 mlZFSs0b/Ota1Hh9A2SxtD1HiMfNDkAU=
X-Gm-Gg: AY/fxX6lmH+uFLjH/QM9pVvhpWNWZosytc5c73nhj5DWRpftRqtzb8g3kTdaBjvyRgf
 v2SN/HhDataaktdCLaV1eERptProhKnxq3Fs8QJQ3VrzSz0NlZ/kdGLWtWjj7ejLWZeiVKXiopL
 CWuJHo7af6AgoB9PtLPVqnNHXYnJUo2x6w1F45CRcHEuDmGWMzX3ihNux7pDM/f9TMRLCdpXEbD
 CSYH3jggqJ9OUUzQTR/tJPPn2lqZqCPRpiewxOYlNlVVB/3gYCHrFNn+QjjHhphFBhfMpI=
X-Google-Smtp-Source: AGHT+IEb57kiPAR37eJV5iRtZRFDf+RR0kzyxqwSznAJBxOHsTiVVxBupwXmOAFPhxcwhN1JjpOT4RX/2mqe83836EA=
X-Received: by 2002:a05:6102:5687:b0:5db:1fbc:4462 with SMTP id
 ada2fe7eead31-5eb1a8155d8mr190612137.31.1766088401281; Thu, 18 Dec 2025
 12:06:41 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 <86zf7g2v9t.fsf@HIDDEN>
 <CAN+1HbqaOS-Dhf=FayFLcux5RAqd+YTO8sjLm0dgwqfiNN-qow@HIDDEN>
 <CAN+1HbpXAa=MK7VbaUvuQnVC1Mb4EqZqj9C-TYNgMxPR2Wb8Aw@HIDDEN>
 <CAN+1HbqV3QVKGD61c5fBNagEVc+DT0A7UrfRh5+SDCu=tPb6Dw@HIDDEN>
 <861pkr3cei.fsf@HIDDEN>
 <CAN+1Hbqn_Ojes=iinTJAaMvp+D1Y+R5cRX8dKjO41LRrfqbvfA@HIDDEN>
 <86zf7f1ugq.fsf@HIDDEN>
 <CAN+1Hbr80y5GaGkMB3zE=hfG5kc_+jq5CgYbdMWpQ5895O0Ljw@HIDDEN>
In-Reply-To: <CAN+1Hbr80y5GaGkMB3zE=hfG5kc_+jq5CgYbdMWpQ5895O0Ljw@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Thu, 18 Dec 2025 15:06:30 -0500
X-Gm-Features: AQt7F2pwTVDREg186Sn4UISSnbb5sLre6J3DN5MDqLEgQzkP3DoMSGwIDGh57BE
Message-ID: <CAN+1HbpBhNaZudz2CR2ZW36dbLcQ5cmxzdhLHnJGY-m_2ycbsQ@HIDDEN>
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
To: Eli Zaretskii <eliz@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000cce69706463f7f83"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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 (-)

--000000000000cce69706463f7f83
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, Dec 18, 2025 at 2:34=E2=80=AFPM St=C3=A9phane Marks <shipmints@gmai=
l.com> wrote:

> On Thu, Dec 18, 2025 at 2:05=E2=80=AFPM Eli Zaretskii <eliz@HIDDEN> wrot=
e:
>
>> > From: St=C3=A9phane Marks <shipmints@HIDDEN>
>> > Date: Thu, 18 Dec 2025 12:55:33 -0500
>> > Cc: 80026 <at> debbugs.gnu.org, sbaugh@HIDDEN,
>> krisbalintona@HIDDEN,
>> >       joostkremers@HIDDEN, ijqq@HIDDEN,
>> visuweshm@HIDDEN,
>> >       adam@HIDDEN, larsi@HIDDEN, arstoffel@HIDDEN
>> >
>> >  > Benchmark results show that the heuristic outperforms the naive for
>> every string length and even
>> >  where the
>> >  > heuristic guess adjustment adds 2 characters.  You can see that lon=
g
>> strings suffer dramatically.  I
>> >  also used
>> >  > several long strings provided by Kristoffer from his real-world use
>> cases.  I don't yet have his
>> >  permission to
>> >  > add them formally to the test but can trivially concoct similar
>> strings.
>> >  >
>> >  > The test tries to fit strings into 100, 500, and 1000 pixel columns=
,
>> typical column width for strings,
>> >  1000
>> >  > iterations each.
>> >
>> >  Thanks.  But what is 'len' in this output?
>> >
>> > It's the length of the input strings to truncate to the max pixels.
>> Varying the input length demonstrates both
>> > on-par (a tiny bit better) performance for short strings and much
>> better performance for longer input strings.
>>
>> Then the benchmark seems to tell that the performance of
>> vtable--limit-string is non-linear in the length of the string:
>>
>>   pixels=3D100 len=3D011 func=3Dnaive       (0.031156 0 0.0)
>>   pixels=3D100 len=3D023 func=3Dnaive       (0.112267 0 0.0)
>>   pixels=3D100 len=3D047 func=3Dnaive       (0.30842200000000003 0 0.0)
>>   pixels=3D100 len=3D095 func=3Dnaive       (0.837941 0 0.0)
>>
>> And this is probably because each time vtable--limit-string calls
>> string-pixel-width, the latter inserts the string into a buffer and
>> then works on the buffer.  So I think one thing to try is to insert
>> the string only once, and then call window-text-pixel-size, with the
>> portion of the string to be measured controlled by the FROM and TO
>> arguments of window-text-pixel-size.  This should significantly reduce
>> the overhead of calling string-pixel-width for each substring of the
>> string.
>>
>
> Maybe but I'd think the heuristic will beat it every time given that the
> truncation estimate shows itself to be accurate.
>
> I can implement a truncate-string-to-pixel-width function that does what
> string-pixel-width does that could replace the vtable function if it prov=
es
> to be sufficiently fast.  Maybe today maybe tomorrow.
>

Okay here's what I think you meant, though it uses and reuses the work
buffer vs. the vtable buffer itself (I'm not even sure where to insert the
string, save excursion and go to the end and insert there and then delete
it?).  Perhaps the function is screwy in some way.  Heuristic still beats
it.

(defun truncate-string-to-pixel-width (string pixels &optional buffer)
  "Return STRING truncated to fit within in PIXELS.
If BUFFER is non-nil, use the face remappings, alternative and default
properties from that buffer when determining the width.
If you call this function to measure pixel width of a string
with embedded newlines, it returns the width of the widest
substring that does not include newlines."
  (declare (important-return-value t))
  (if (zerop (length string))
      0
    ;; Keeping a work buffer around is more efficient than creating a
    ;; new temporary buffer.
    (with-work-buffer
      ;; Setup current buffer to correctly compute pixel width.
      (when buffer
        (dolist (v '(face-remapping-alist
                     char-property-alias-alist
                     default-text-properties))
          (if (local-variable-p v buffer)
              (set (make-local-variable v)
                   (buffer-local-value v buffer)))))
      ;; Avoid deactivating the region as side effect.
      (let (deactivate-mark)
        (insert string))
      ;; If `display-line-numbers' is enabled in internal
      ;; buffers (e.g. globally), it breaks width calculation
      ;; (bug#59311).  Disable `line-prefix' and `wrap-prefix',
      ;; for the same reason.
      (add-text-properties
       (point-min) (point-max)
       '(display-line-numbers-disable t line-prefix "" wrap-prefix ""))
      (let ((string-pixels (car (buffer-text-pixel-size nil nil t))))
        (while (and (> (buffer-size) 0)
                    (if string-pixels (prog1
                                          (> string-pixels pixels)
                                        (setq string-pixels nil))
                      (> (car (buffer-text-pixel-size nil nil t)) pixels)))
          (delete-char -1))
        (substring string 0 (buffer-size))))))

pixels=3D100 len=3D003 func=3Dnaive       (0.0063950000000000005 0 0.0)
pixels=3D100 len=3D003 func=3Dt-s-t-p-w   (0.007994 0 0.0)
pixels=3D100 len=3D003 func=3Dheuristic+0 (0.006236 0 0.0)
pixels=3D100 len=3D003 func=3Dheuristic+2 (0.006215 0 0.0)
---
pixels=3D100 len=3D011 func=3Dnaive       (0.031788 0 0.0)
pixels=3D100 len=3D011 func=3Dt-s-t-p-w   (0.026893 0 0.0)
pixels=3D100 len=3D011 func=3Dheuristic+0 (0.018702 0 0.0)
pixels=3D100 len=3D011 func=3Dheuristic+2 (0.024654000000000002 0 0.0)
---
pixels=3D100 len=3D023 func=3Dnaive       (0.114598 0 0.0)
pixels=3D100 len=3D023 func=3Dt-s-t-p-w   (0.088504 0 0.0)
pixels=3D100 len=3D023 func=3Dheuristic+0 (0.014005 0 0.0)
pixels=3D100 len=3D023 func=3Dheuristic+2 (0.025701 0 0.0)
---
pixels=3D100 len=3D047 func=3Dnaive       (0.315523 0 0.0)
pixels=3D100 len=3D047 func=3Dt-s-t-p-w   (0.245707 0 0.0)
pixels=3D100 len=3D047 func=3Dheuristic+0 (0.015999000000000003 0 0.0)
pixels=3D100 len=3D047 func=3Dheuristic+2 (0.027639 0 0.0)
---
pixels=3D100 len=3D095 func=3Dnaive       (0.869488 0 0.0)
pixels=3D100 len=3D095 func=3Dt-s-t-p-w   (0.683964 0 0.0)
pixels=3D100 len=3D095 func=3Dheuristic+0 (0.020001 0 0.0)
pixels=3D100 len=3D095 func=3Dheuristic+2 (0.035457999999999996 0 0.0)
---
pixels=3D100 len=3D241 func=3Dnaive       (3.753899 1 0.09117999999999427)
pixels=3D100 len=3D241 func=3Dt-s-t-p-w   (3.215154 0 0.0)
pixels=3D100 len=3D241 func=3Dheuristic+0 (0.031103000000000002 0 0.0)
pixels=3D100 len=3D241 func=3Dheuristic+2 (0.043434 0 0.0)
---
pixels=3D100 len=3D482 func=3Dnaive       (11.685177999999999 2
0.16571500000000583)
pixels=3D100 len=3D482 func=3Dt-s-t-p-w   (10.667202 0 0.0)
pixels=3D100 len=3D482 func=3Dheuristic+0 (0.049013999999999995 0 0.0)
pixels=3D100 len=3D482 func=3Dheuristic+2 (0.061099 0 0.0)
---
pixels=3D500 len=3D003 func=3Dnaive       (0.006419 0 0.0)
pixels=3D500 len=3D003 func=3Dt-s-t-p-w   (0.007862 0 0.0)
pixels=3D500 len=3D003 func=3Dheuristic+0 (0.006312000000000001 0 0.0)
pixels=3D500 len=3D003 func=3Dheuristic+2 (0.0061530000000000005 0 0.0)
---
pixels=3D500 len=3D011 func=3Dnaive       (0.007126 0 0.0)
pixels=3D500 len=3D011 func=3Dt-s-t-p-w   (0.009124 0 0.0)
pixels=3D500 len=3D011 func=3Dheuristic+0 (0.006971000000000001 0 0.0)
pixels=3D500 len=3D011 func=3Dheuristic+2 (0.006932000000000001 0 0.0)
---
pixels=3D500 len=3D023 func=3Dnaive       (0.008341 0 0.0)
pixels=3D500 len=3D023 func=3Dt-s-t-p-w   (0.009788999999999999 0 0.0)
pixels=3D500 len=3D023 func=3Dheuristic+0 (0.007909 0 0.0)
pixels=3D500 len=3D023 func=3Dheuristic+2 (0.007738 0 0.0)
---
pixels=3D500 len=3D047 func=3Dnaive       (0.09095700000000001 0 0.0)
pixels=3D500 len=3D047 func=3Dt-s-t-p-w   (0.07583300000000001 0 0.0)
pixels=3D500 len=3D047 func=3Dheuristic+0 (0.018677000000000003 0 0.0)
pixels=3D500 len=3D047 func=3Dheuristic+2 (0.035324 0 0.0)
---
pixels=3D500 len=3D095 func=3Dnaive       (0.630095 0 0.0)
pixels=3D500 len=3D095 func=3Dt-s-t-p-w   (0.524951 0 0.0)
pixels=3D500 len=3D095 func=3Dheuristic+0 (0.022356 0 0.0)
pixels=3D500 len=3D095 func=3Dheuristic+2 (0.039214 0 0.0)
---
pixels=3D500 len=3D241 func=3Dnaive       (3.452412 1 0.09696800000000394)
pixels=3D500 len=3D241 func=3Dt-s-t-p-w   (2.968355 0 0.0)
pixels=3D500 len=3D241 func=3Dheuristic+0 (0.032931999999999996 0 0.0)
pixels=3D500 len=3D241 func=3Dheuristic+2 (0.049274 0 0.0)
---
pixels=3D500 len=3D482 func=3Dnaive       (11.199719 2 0.1634030000000024)
pixels=3D500 len=3D482 func=3Dt-s-t-p-w   (10.212119000000001 0 0.0)
pixels=3D500 len=3D482 func=3Dheuristic+0 (0.050258 0 0.0)
pixels=3D500 len=3D482 func=3Dheuristic+2 (0.067481 0 0.0)
---
pixels=3D1000 len=3D003 func=3Dnaive       (0.006269 0 0.0)
pixels=3D1000 len=3D003 func=3Dt-s-t-p-w   (0.007803 0 0.0)
pixels=3D1000 len=3D003 func=3Dheuristic+0 (0.005975 0 0.0)
pixels=3D1000 len=3D003 func=3Dheuristic+2 (0.005836 0 0.0)
---
pixels=3D1000 len=3D011 func=3Dnaive       (0.006713 0 0.0)
pixels=3D1000 len=3D011 func=3Dt-s-t-p-w   (0.008369 0 0.0)
pixels=3D1000 len=3D011 func=3Dheuristic+0 (0.006582 0 0.0)
pixels=3D1000 len=3D011 func=3Dheuristic+2 (0.006825 0 0.0)
---
pixels=3D1000 len=3D023 func=3Dnaive       (0.007742000000000001 0 0.0)
pixels=3D1000 len=3D023 func=3Dt-s-t-p-w   (0.009468 0 0.0)
pixels=3D1000 len=3D023 func=3Dheuristic+0 (0.007546000000000001 0 0.0)
pixels=3D1000 len=3D023 func=3Dheuristic+2 (0.0076100000000000004 0 0.0)
---
pixels=3D1000 len=3D047 func=3Dnaive       (0.009765 0 0.0)
pixels=3D1000 len=3D047 func=3Dt-s-t-p-w   (0.011391 0 0.0)
pixels=3D1000 len=3D047 func=3Dheuristic+0 (0.009403 0 0.0)
pixels=3D1000 len=3D047 func=3Dheuristic+2 (0.009529 0 0.0)
---
pixels=3D1000 len=3D095 func=3Dnaive       (0.240419 0 0.0)
pixels=3D1000 len=3D095 func=3Dt-s-t-p-w   (0.20951 0 0.0)
pixels=3D1000 len=3D095 func=3Dheuristic+0 (0.02418 0 0.0)
pixels=3D1000 len=3D095 func=3Dheuristic+2 (0.047563999999999995 0 0.0)
---
pixels=3D1000 len=3D241 func=3Dnaive       (2.898081 0 0.0)
pixels=3D1000 len=3D241 func=3Dt-s-t-p-w   (2.582903 0 0.0)
pixels=3D1000 len=3D241 func=3Dheuristic+0 (0.035483999999999995 0 0.0)
pixels=3D1000 len=3D241 func=3Dheuristic+2 (0.058371 0 0.0)
---
pixels=3D1000 len=3D482 func=3Dnaive       (10.858842 2 0.1688879999999955)
pixels=3D1000 len=3D482 func=3Dt-s-t-p-w   (9.853366 0 0.0)
pixels=3D1000 len=3D482 func=3Dheuristic+0 (0.053123 0 0.0)
pixels=3D1000 len=3D482 func=3Dheuristic+2 (0.075433 0 0.0)

--000000000000cce69706463f7f83
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Thu, Dec 18, 2025 at 2:34=E2=80=AFPM St=C3=A9phane Marks &lt;<a href=3D"=
mailto:shipmints@HIDDEN">shipmints@HIDDEN</a>&gt; wrote:</span></div>=
</div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D=
"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(2=
04,204,204);padding-left:1ex"><div dir=3D"ltr"><div dir=3D"ltr"><div style=
=3D"font-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-=
serif">On Thu, Dec 18, 2025 at 2:05=E2=80=AFPM Eli Zaretskii &lt;<a href=3D=
"mailto:eliz@HIDDEN" target=3D"_blank">eliz@HIDDEN</a>&gt; wrote:</span><=
/div></div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);paddi=
ng-left:1ex">&gt; From: St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints=
@gmail.com" target=3D"_blank">shipmints@HIDDEN</a>&gt;<br>
&gt; Date: Thu, 18 Dec 2025 12:55:33 -0500<br>
&gt; Cc: <a href=3D"mailto:80026 <at> debbugs.gnu.org" target=3D"_blank">80026@d=
ebbugs.gnu.org</a>, <a href=3D"mailto:sbaugh@HIDDEN" target=3D"_bla=
nk">sbaugh@HIDDEN</a>, <a href=3D"mailto:krisbalintona@HIDDEN" t=
arget=3D"_blank">krisbalintona@HIDDEN</a>, <br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0<a href=3D"mailto:joostkremers@HIDDEN" =
target=3D"_blank">joostkremers@HIDDEN</a>, <a href=3D"mailto:ijqq@prot=
onmail.com" target=3D"_blank">ijqq@HIDDEN</a>, <a href=3D"mailto:vi=
suweshm@HIDDEN" target=3D"_blank">visuweshm@HIDDEN</a>, <br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0<a href=3D"mailto:adam@HIDDEN" target=
=3D"_blank">adam@HIDDEN</a>, <a href=3D"mailto:larsi@HIDDEN" targe=
t=3D"_blank">larsi@HIDDEN</a>, <a href=3D"mailto:arstoffel@HIDDEN" tar=
get=3D"_blank">arstoffel@HIDDEN</a><br>
&gt; <br>
&gt;=C2=A0 &gt; Benchmark results show that the heuristic outperforms the n=
aive for every string length and even<br>
&gt;=C2=A0 where the<br>
&gt;=C2=A0 &gt; heuristic guess adjustment adds 2 characters.=C2=A0 You can=
 see that long strings suffer dramatically.=C2=A0 I<br>
&gt;=C2=A0 also used<br>
&gt;=C2=A0 &gt; several long strings provided by Kristoffer from his real-w=
orld use cases.=C2=A0 I don&#39;t yet have his<br>
&gt;=C2=A0 permission to<br>
&gt;=C2=A0 &gt; add them formally to the test but can trivially concoct sim=
ilar strings.<br>
&gt;=C2=A0 &gt; <br>
&gt;=C2=A0 &gt; The test tries to fit strings into 100, 500, and 1000 pixel=
 columns, typical column width for strings,<br>
&gt;=C2=A0 1000<br>
&gt;=C2=A0 &gt; iterations each.<br>
&gt; <br>
&gt;=C2=A0 Thanks.=C2=A0 But what is &#39;len&#39; in this output?<br>
&gt; <br>
&gt; It&#39;s the length of the input strings to truncate to the max pixels=
.=C2=A0 Varying the input length demonstrates both<br>
&gt; on-par (a tiny bit better) performance for short strings and much bett=
er performance for longer input strings.<br>
<br>
Then the benchmark seems to tell that the performance of<br>
vtable--limit-string is non-linear in the length of the string:<br>
<br>
=C2=A0 pixels=3D100 len=3D011 func=3Dnaive=C2=A0 =C2=A0 =C2=A0 =C2=A0(0.031=
156 0 0.0)<br>
=C2=A0 pixels=3D100 len=3D023 func=3Dnaive=C2=A0 =C2=A0 =C2=A0 =C2=A0(0.112=
267 0 0.0)<br>
=C2=A0 pixels=3D100 len=3D047 func=3Dnaive=C2=A0 =C2=A0 =C2=A0 =C2=A0(0.308=
42200000000003 0 0.0)<br>
=C2=A0 pixels=3D100 len=3D095 func=3Dnaive=C2=A0 =C2=A0 =C2=A0 =C2=A0(0.837=
941 0 0.0)<br>
<br>
And this is probably because each time vtable--limit-string calls<br>
string-pixel-width, the latter inserts the string into a buffer and<br>
then works on the buffer.=C2=A0 So I think one thing to try is to insert<br=
>
the string only once, and then call window-text-pixel-size, with the<br>
portion of the string to be measured controlled by the FROM and TO<br>
arguments of window-text-pixel-size.=C2=A0 This should significantly reduce=
<br>
the overhead of calling string-pixel-width for each substring of the<br>
string.<br></blockquote><div><br></div><div style=3D"font-family:monospace"=
>Maybe but I&#39;d think the heuristic will beat it every time given that t=
he truncation estimate shows itself to be accurate.</div><div style=3D"font=
-family:monospace"><br></div><div style=3D"font-family:monospace">I can imp=
lement a truncate-string-to-pixel-width function that does what string-pixe=
l-width does that could replace the vtable function if it proves to be suff=
iciently fast.=C2=A0 Maybe today maybe tomorrow.</div></div></div></blockqu=
ote><div><br></div><div class=3D"gmail_default" style=3D"font-family:monosp=
ace">Okay here&#39;s what I think you meant, though it uses and reuses the =
work buffer vs. the vtable buffer itself (I&#39;m not even sure where to in=
sert the string, save excursion and go to the end and insert there and then=
 delete it?).=C2=A0 Perhaps the function is screwy in some way.=C2=A0 Heuri=
stic still beats it.</div><div class=3D"gmail_default" style=3D"font-family=
:monospace"><br></div><div class=3D"gmail_default" style=3D"font-family:mon=
ospace">(defun truncate-string-to-pixel-width (string pixels &amp;optional =
buffer)<br>=C2=A0 &quot;Return STRING truncated to fit within in PIXELS.<br=
>If BUFFER is non-nil, use the face remappings, alternative and default<br>=
properties from that buffer when determining the width.<br>If you call this=
 function to measure pixel width of a string<br>with embedded newlines, it =
returns the width of the widest<br>substring that does not include newlines=
.&quot;<br>=C2=A0 (declare (important-return-value t))<br>=C2=A0 (if (zerop=
 (length string))<br>=C2=A0 =C2=A0 =C2=A0 0<br>=C2=A0 =C2=A0 ;; Keeping a w=
ork buffer around is more efficient than creating a<br>=C2=A0 =C2=A0 ;; new=
 temporary buffer.<br>=C2=A0 =C2=A0 (with-work-buffer<br>=C2=A0 =C2=A0 =C2=
=A0 ;; Setup current buffer to correctly compute pixel width.<br>=C2=A0 =C2=
=A0 =C2=A0 (when buffer<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (dolist (v &#39;(fac=
e-remapping-alist<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0char-property-alias-alist<br>=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0default-text-propert=
ies))<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (local-variable-p v buffer)=
<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (set (make-local-varia=
ble v)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0(buffer-local-value v buffer)))))<br>=C2=A0 =C2=A0 =C2=A0 ;; Avoid de=
activating the region as side effect.<br>=C2=A0 =C2=A0 =C2=A0 (let (deactiv=
ate-mark)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (insert string))<br>=C2=A0 =C2=A0 =
=C2=A0 ;; If `display-line-numbers&#39; is enabled in internal<br>=C2=A0 =
=C2=A0 =C2=A0 ;; buffers (e.g. globally), it breaks width calculation<br>=
=C2=A0 =C2=A0 =C2=A0 ;; (bug#59311).=C2=A0 Disable `line-prefix&#39; and `w=
rap-prefix&#39;,<br>=C2=A0 =C2=A0 =C2=A0 ;; for the same reason.<br>=C2=A0 =
=C2=A0 =C2=A0 (add-text-properties<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0(point-min=
) (point-max)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;(display-line-numbers-disa=
ble t line-prefix &quot;&quot; wrap-prefix &quot;&quot;))<br>=C2=A0 =C2=A0 =
=C2=A0 (let ((string-pixels (car (buffer-text-pixel-size nil nil t))))<br>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (while (and (&gt; (buffer-size) 0)<br>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (if string-p=
ixels (prog1<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 (&gt; string-pixels pixels)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq string-pixels nil))<br>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (&gt;=
 (car (buffer-text-pixel-size nil nil t)) pixels)))<br>=C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 (delete-char -1))<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (substring =
string 0 (buffer-size))))))<br></div><div class=3D"gmail_default" style=3D"=
font-family:monospace"><br></div><div class=3D"gmail_default" style=3D"font=
-family:monospace">pixels=3D100 len=3D003 func=3Dnaive =C2=A0 =C2=A0 =C2=A0=
 (0.0063950000000000005 0 0.0)<br>pixels=3D100 len=3D003 func=3Dt-s-t-p-w =
=C2=A0 (0.007994 0 0.0)<br>pixels=3D100 len=3D003 func=3Dheuristic+0 (0.006=
236 0 0.0)<br>pixels=3D100 len=3D003 func=3Dheuristic+2 (0.006215 0 0.0)<br=
>---<br>pixels=3D100 len=3D011 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.031788 =
0 0.0)<br>pixels=3D100 len=3D011 func=3Dt-s-t-p-w =C2=A0 (0.026893 0 0.0)<b=
r>pixels=3D100 len=3D011 func=3Dheuristic+0 (0.018702 0 0.0)<br>pixels=3D10=
0 len=3D011 func=3Dheuristic+2 (0.024654000000000002 0 0.0)<br>---<br>pixel=
s=3D100 len=3D023 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.114598 0 0.0)<br>pix=
els=3D100 len=3D023 func=3Dt-s-t-p-w =C2=A0 (0.088504 0 0.0)<br>pixels=3D10=
0 len=3D023 func=3Dheuristic+0 (0.014005 0 0.0)<br>pixels=3D100 len=3D023 f=
unc=3Dheuristic+2 (0.025701 0 0.0)<br>---<br>pixels=3D100 len=3D047 func=3D=
naive =C2=A0 =C2=A0 =C2=A0 (0.315523 0 0.0)<br>pixels=3D100 len=3D047 func=
=3Dt-s-t-p-w =C2=A0 (0.245707 0 0.0)<br>pixels=3D100 len=3D047 func=3Dheuri=
stic+0 (0.015999000000000003 0 0.0)<br>pixels=3D100 len=3D047 func=3Dheuris=
tic+2 (0.027639 0 0.0)<br>---<br>pixels=3D100 len=3D095 func=3Dnaive =C2=A0=
 =C2=A0 =C2=A0 (0.869488 0 0.0)<br>pixels=3D100 len=3D095 func=3Dt-s-t-p-w =
=C2=A0 (0.683964 0 0.0)<br>pixels=3D100 len=3D095 func=3Dheuristic+0 (0.020=
001 0 0.0)<br>pixels=3D100 len=3D095 func=3Dheuristic+2 (0.0354579999999999=
96 0 0.0)<br>---<br>pixels=3D100 len=3D241 func=3Dnaive =C2=A0 =C2=A0 =C2=
=A0 (3.753899 1 0.09117999999999427)<br>pixels=3D100 len=3D241 func=3Dt-s-t=
-p-w =C2=A0 (3.215154 0 0.0)<br>pixels=3D100 len=3D241 func=3Dheuristic+0 (=
0.031103000000000002 0 0.0)<br>pixels=3D100 len=3D241 func=3Dheuristic+2 (0=
.043434 0 0.0)<br>---<br>pixels=3D100 len=3D482 func=3Dnaive =C2=A0 =C2=A0 =
=C2=A0 (11.685177999999999 2 0.16571500000000583)<br>pixels=3D100 len=3D482=
 func=3Dt-s-t-p-w =C2=A0 (10.667202 0 0.0)<br>pixels=3D100 len=3D482 func=
=3Dheuristic+0 (0.049013999999999995 0 0.0)<br>pixels=3D100 len=3D482 func=
=3Dheuristic+2 (0.061099 0 0.0)<br>---<br>pixels=3D500 len=3D003 func=3Dnai=
ve =C2=A0 =C2=A0 =C2=A0 (0.006419 0 0.0)<br>pixels=3D500 len=3D003 func=3Dt=
-s-t-p-w =C2=A0 (0.007862 0 0.0)<br>pixels=3D500 len=3D003 func=3Dheuristic=
+0 (0.006312000000000001 0 0.0)<br>pixels=3D500 len=3D003 func=3Dheuristic+=
2 (0.0061530000000000005 0 0.0)<br>---<br>pixels=3D500 len=3D011 func=3Dnai=
ve =C2=A0 =C2=A0 =C2=A0 (0.007126 0 0.0)<br>pixels=3D500 len=3D011 func=3Dt=
-s-t-p-w =C2=A0 (0.009124 0 0.0)<br>pixels=3D500 len=3D011 func=3Dheuristic=
+0 (0.006971000000000001 0 0.0)<br>pixels=3D500 len=3D011 func=3Dheuristic+=
2 (0.006932000000000001 0 0.0)<br>---<br>pixels=3D500 len=3D023 func=3Dnaiv=
e =C2=A0 =C2=A0 =C2=A0 (0.008341 0 0.0)<br>pixels=3D500 len=3D023 func=3Dt-=
s-t-p-w =C2=A0 (0.009788999999999999 0 0.0)<br>pixels=3D500 len=3D023 func=
=3Dheuristic+0 (0.007909 0 0.0)<br>pixels=3D500 len=3D023 func=3Dheuristic+=
2 (0.007738 0 0.0)<br>---<br>pixels=3D500 len=3D047 func=3Dnaive =C2=A0 =C2=
=A0 =C2=A0 (0.09095700000000001 0 0.0)<br>pixels=3D500 len=3D047 func=3Dt-s=
-t-p-w =C2=A0 (0.07583300000000001 0 0.0)<br>pixels=3D500 len=3D047 func=3D=
heuristic+0 (0.018677000000000003 0 0.0)<br>pixels=3D500 len=3D047 func=3Dh=
euristic+2 (0.035324 0 0.0)<br>---<br>pixels=3D500 len=3D095 func=3Dnaive =
=C2=A0 =C2=A0 =C2=A0 (0.630095 0 0.0)<br>pixels=3D500 len=3D095 func=3Dt-s-=
t-p-w =C2=A0 (0.524951 0 0.0)<br>pixels=3D500 len=3D095 func=3Dheuristic+0 =
(0.022356 0 0.0)<br>pixels=3D500 len=3D095 func=3Dheuristic+2 (0.039214 0 0=
.0)<br>---<br>pixels=3D500 len=3D241 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (3.4=
52412 1 0.09696800000000394)<br>pixels=3D500 len=3D241 func=3Dt-s-t-p-w =C2=
=A0 (2.968355 0 0.0)<br>pixels=3D500 len=3D241 func=3Dheuristic+0 (0.032931=
999999999996 0 0.0)<br>pixels=3D500 len=3D241 func=3Dheuristic+2 (0.049274 =
0 0.0)<br>---<br>pixels=3D500 len=3D482 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (=
11.199719 2 0.1634030000000024)<br>pixels=3D500 len=3D482 func=3Dt-s-t-p-w =
=C2=A0 (10.212119000000001 0 0.0)<br>pixels=3D500 len=3D482 func=3Dheuristi=
c+0 (0.050258 0 0.0)<br>pixels=3D500 len=3D482 func=3Dheuristic+2 (0.067481=
 0 0.0)<br>---<br>pixels=3D1000 len=3D003 func=3Dnaive =C2=A0 =C2=A0 =C2=A0=
 (0.006269 0 0.0)<br>pixels=3D1000 len=3D003 func=3Dt-s-t-p-w =C2=A0 (0.007=
803 0 0.0)<br>pixels=3D1000 len=3D003 func=3Dheuristic+0 (0.005975 0 0.0)<b=
r>pixels=3D1000 len=3D003 func=3Dheuristic+2 (0.005836 0 0.0)<br>---<br>pix=
els=3D1000 len=3D011 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.006713 0 0.0)<br>=
pixels=3D1000 len=3D011 func=3Dt-s-t-p-w =C2=A0 (0.008369 0 0.0)<br>pixels=
=3D1000 len=3D011 func=3Dheuristic+0 (0.006582 0 0.0)<br>pixels=3D1000 len=
=3D011 func=3Dheuristic+2 (0.006825 0 0.0)<br>---<br>pixels=3D1000 len=3D02=
3 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.007742000000000001 0 0.0)<br>pixels=
=3D1000 len=3D023 func=3Dt-s-t-p-w =C2=A0 (0.009468 0 0.0)<br>pixels=3D1000=
 len=3D023 func=3Dheuristic+0 (0.007546000000000001 0 0.0)<br>pixels=3D1000=
 len=3D023 func=3Dheuristic+2 (0.0076100000000000004 0 0.0)<br>---<br>pixel=
s=3D1000 len=3D047 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.009765 0 0.0)<br>pi=
xels=3D1000 len=3D047 func=3Dt-s-t-p-w =C2=A0 (0.011391 0 0.0)<br>pixels=3D=
1000 len=3D047 func=3Dheuristic+0 (0.009403 0 0.0)<br>pixels=3D1000 len=3D0=
47 func=3Dheuristic+2 (0.009529 0 0.0)<br>---<br>pixels=3D1000 len=3D095 fu=
nc=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.240419 0 0.0)<br>pixels=3D1000 len=3D095=
 func=3Dt-s-t-p-w =C2=A0 (0.20951 0 0.0)<br>pixels=3D1000 len=3D095 func=3D=
heuristic+0 (0.02418 0 0.0)<br>pixels=3D1000 len=3D095 func=3Dheuristic+2 (=
0.047563999999999995 0 0.0)<br>---<br>pixels=3D1000 len=3D241 func=3Dnaive =
=C2=A0 =C2=A0 =C2=A0 (2.898081 0 0.0)<br>pixels=3D1000 len=3D241 func=3Dt-s=
-t-p-w =C2=A0 (2.582903 0 0.0)<br>pixels=3D1000 len=3D241 func=3Dheuristic+=
0 (0.035483999999999995 0 0.0)<br>pixels=3D1000 len=3D241 func=3Dheuristic+=
2 (0.058371 0 0.0)<br>---<br>pixels=3D1000 len=3D482 func=3Dnaive =C2=A0 =
=C2=A0 =C2=A0 (10.858842 2 0.1688879999999955)<br>pixels=3D1000 len=3D482 f=
unc=3Dt-s-t-p-w =C2=A0 (9.853366 0 0.0)<br>pixels=3D1000 len=3D482 func=3Dh=
euristic+0 (0.053123 0 0.0)<br>pixels=3D1000 len=3D482 func=3Dheuristic+2 (=
0.075433 0 0.0)<br></div><div class=3D"gmail_default" style=3D"font-family:=
monospace"><br></div><div class=3D"gmail_default" style=3D"font-family:mono=
space"><br></div></div></div>

--000000000000cce69706463f7f83--




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

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


Received: (at 80026) by debbugs.gnu.org; 18 Dec 2025 19:34:39 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 18 14:34:39 2025
Received: from localhost ([127.0.0.1]:57107 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWJln-000458-2S
	for submit <at> debbugs.gnu.org; Thu, 18 Dec 2025 14:34:39 -0500
Received: from mail-vs1-xe34.google.com ([2607:f8b0:4864:20::e34]:44379)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vWJlk-00044r-Fa
 for 80026 <at> debbugs.gnu.org; Thu, 18 Dec 2025 14:34:37 -0500
Received: by mail-vs1-xe34.google.com with SMTP id
 ada2fe7eead31-5dfd2148bf3so308794137.1
 for <80026 <at> debbugs.gnu.org>; Thu, 18 Dec 2025 11:34:36 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1766086471; x=1766691271; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=1dRF070P90ZbimwL4lQ0hdABt8PplmWc48WlsuvwQwg=;
 b=XrtmB2E6ibbahE3YG1FIw6QZtrANWOeYOthvb/R8Hcw6enBCZwhHLLm7nZVH2uyXY+
 ogmqfmMoHv4tqc5k1d3E5tghq9RGiKgOHECPV18Rm6Ak7CPsWecaGBgdp+Odcvr7ymsO
 /6KE6aNz8JznyQcGJmdvL4s/s9E+jVkaY9gBK8SUQjcd3M+3qe26xnh47+Lut3ifSR0c
 jQUmuoUpXXF5y7nU52tzdE8pJt41Jhpnk2DGN1+CKpDEz8+hCPuUIS8d/nguWsuQF6q8
 ciY4nJM2OnxDbkMdkNM3Hu2NBKyhj6441hZmR6QBKWhCStZGJb920hcephyd+f9HJFep
 HH+Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1766086471; x=1766691271;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=1dRF070P90ZbimwL4lQ0hdABt8PplmWc48WlsuvwQwg=;
 b=sl27Bvz/dLJZyUd9tfxciJI7dXvpsG/Jk5nVjVa+OGrmHiks0QqDxoXOSwoPugvXKi
 9uXwQESkVuIc5d6PVwF7weK4JLhKQVKeO7keCRx8GqrYCPhvmOlksRhVsh84laNQfySz
 JdKJACkujdQWcraB1GPc3vBg6UH3Wv/kFXJlSuKQPJn1EP9OgT7ous3dqQzroIfRryZB
 vZlxMOsPq1ylPuAOlMxtWGekTaGPlmSO/Rlfv7ZQfQBf2R5/b5XkaGYrF14MrVMsPUag
 qT6CW1tu9yC6kfnigr0osKg0a0OhyoQY7HVzCGXJIYzY+UH0wHRsHhpiiOwzxOLRUfT+
 MHTQ==
X-Gm-Message-State: AOJu0Yz8RZlSjN17FgBdxoYJKILJ+B4tufFJvgmoUo+wcl6cJIKK+FZA
 TQ4RXHWqzkmKLj93rMJC4iG/6VthToIKxmGnzA469a4ZJFgp7nT3Rr2O1mf21wA+p8RcXSJ+9as
 sk3As3/RyYQUWp1jHljTOUrAcPzICKmA=
X-Gm-Gg: AY/fxX6bbreZlbaKVhcss7512P7d/Ejy1yTNWp4BuQaBdhqyEMDkdOtUP+Wxts7F/A5
 YgHidf81el1IOWDjPK+U/iBXt/SER7hvR5xhIrZSlfEyXl1vI+p1yEDySpJ5wdl2IPPnNh+Uwje
 TAMnmdan3lIxk/ULQk4CZKsf4Ta+FsDlb5+6KExTzzpl2tLRt8BEBNf8IMJBs9ELK7nlHrHGskq
 LLrgRgbkUYR8jIiIrxOLEDTMs0bsvAw9Cs+9OE4B820Wy7P6AX5GBVpzKNUSJVdUYvYFSM=
X-Google-Smtp-Source: AGHT+IECscXF6GqkI3cFwoeFLxq1bPuDyHWSrz/4clxfurepBBGKRoFEKmzWlsipsH8r5fiUodBBZqnsMz7ugC2aLGI=
X-Received: by 2002:a05:6102:2c88:b0:5db:cc25:dd7e with SMTP id
 ada2fe7eead31-5eb1a8122e7mr161713137.34.1766086470769; Thu, 18 Dec 2025
 11:34:30 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 <86zf7g2v9t.fsf@HIDDEN>
 <CAN+1HbqaOS-Dhf=FayFLcux5RAqd+YTO8sjLm0dgwqfiNN-qow@HIDDEN>
 <CAN+1HbpXAa=MK7VbaUvuQnVC1Mb4EqZqj9C-TYNgMxPR2Wb8Aw@HIDDEN>
 <CAN+1HbqV3QVKGD61c5fBNagEVc+DT0A7UrfRh5+SDCu=tPb6Dw@HIDDEN>
 <861pkr3cei.fsf@HIDDEN>
 <CAN+1Hbqn_Ojes=iinTJAaMvp+D1Y+R5cRX8dKjO41LRrfqbvfA@HIDDEN>
 <86zf7f1ugq.fsf@HIDDEN>
In-Reply-To: <86zf7f1ugq.fsf@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Thu, 18 Dec 2025 14:34:19 -0500
X-Gm-Features: AQt7F2reYhskFXPNjsD_tDjKBEm-9mK-ACoB9NucHEI6O_RfYLTYcjhNIuZHIGU
Message-ID: <CAN+1Hbr80y5GaGkMB3zE=hfG5kc_+jq5CgYbdMWpQ5895O0Ljw@HIDDEN>
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
To: Eli Zaretskii <eliz@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000bb9e6606463f0ce0"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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 (-)

--000000000000bb9e6606463f0ce0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, Dec 18, 2025 at 2:05=E2=80=AFPM Eli Zaretskii <eliz@HIDDEN> wrote:

> > From: St=C3=A9phane Marks <shipmints@HIDDEN>
> > Date: Thu, 18 Dec 2025 12:55:33 -0500
> > Cc: 80026 <at> debbugs.gnu.org, sbaugh@HIDDEN,
> krisbalintona@HIDDEN,
> >       joostkremers@HIDDEN, ijqq@HIDDEN, visuweshm@HIDDEN=
m,
>
> >       adam@HIDDEN, larsi@HIDDEN, arstoffel@HIDDEN
> >
> >  > Benchmark results show that the heuristic outperforms the naive for
> every string length and even
> >  where the
> >  > heuristic guess adjustment adds 2 characters.  You can see that long
> strings suffer dramatically.  I
> >  also used
> >  > several long strings provided by Kristoffer from his real-world use
> cases.  I don't yet have his
> >  permission to
> >  > add them formally to the test but can trivially concoct similar
> strings.
> >  >
> >  > The test tries to fit strings into 100, 500, and 1000 pixel columns,
> typical column width for strings,
> >  1000
> >  > iterations each.
> >
> >  Thanks.  But what is 'len' in this output?
> >
> > It's the length of the input strings to truncate to the max pixels.
> Varying the input length demonstrates both
> > on-par (a tiny bit better) performance for short strings and much bette=
r
> performance for longer input strings.
>
> Then the benchmark seems to tell that the performance of
> vtable--limit-string is non-linear in the length of the string:
>
>   pixels=3D100 len=3D011 func=3Dnaive       (0.031156 0 0.0)
>   pixels=3D100 len=3D023 func=3Dnaive       (0.112267 0 0.0)
>   pixels=3D100 len=3D047 func=3Dnaive       (0.30842200000000003 0 0.0)
>   pixels=3D100 len=3D095 func=3Dnaive       (0.837941 0 0.0)
>
> And this is probably because each time vtable--limit-string calls
> string-pixel-width, the latter inserts the string into a buffer and
> then works on the buffer.  So I think one thing to try is to insert
> the string only once, and then call window-text-pixel-size, with the
> portion of the string to be measured controlled by the FROM and TO
> arguments of window-text-pixel-size.  This should significantly reduce
> the overhead of calling string-pixel-width for each substring of the
> string.
>

Maybe but I'd think the heuristic will beat it every time given that the
truncation estimate shows itself to be accurate.

I can implement a truncate-string-to-pixel-width function that does what
string-pixel-width does that could replace the vtable function if it proves
to be sufficiently fast.  Maybe today maybe tomorrow.

--000000000000bb9e6606463f0ce0
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Thu, Dec 18, 2025 at 2:05=E2=80=AFPM Eli Zaretskii &lt;<a href=3D"mailto=
:eliz@HIDDEN">eliz@HIDDEN</a>&gt; wrote:</span></div></div><div class=3D"=
gmail_quote gmail_quote_container"><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex">&gt; From: St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@g=
mail.com" target=3D"_blank">shipmints@HIDDEN</a>&gt;<br>
&gt; Date: Thu, 18 Dec 2025 12:55:33 -0500<br>
&gt; Cc: <a href=3D"mailto:80026 <at> debbugs.gnu.org" target=3D"_blank">80026@d=
ebbugs.gnu.org</a>, <a href=3D"mailto:sbaugh@HIDDEN" target=3D"_bla=
nk">sbaugh@HIDDEN</a>, <a href=3D"mailto:krisbalintona@HIDDEN" t=
arget=3D"_blank">krisbalintona@HIDDEN</a>, <br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0<a href=3D"mailto:joostkremers@HIDDEN" =
target=3D"_blank">joostkremers@HIDDEN</a>, <a href=3D"mailto:ijqq@prot=
onmail.com" target=3D"_blank">ijqq@HIDDEN</a>, <a href=3D"mailto:vi=
suweshm@HIDDEN" target=3D"_blank">visuweshm@HIDDEN</a>, <br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0<a href=3D"mailto:adam@HIDDEN" target=
=3D"_blank">adam@HIDDEN</a>, <a href=3D"mailto:larsi@HIDDEN" targe=
t=3D"_blank">larsi@HIDDEN</a>, <a href=3D"mailto:arstoffel@HIDDEN" tar=
get=3D"_blank">arstoffel@HIDDEN</a><br>
&gt; <br>
&gt;=C2=A0 &gt; Benchmark results show that the heuristic outperforms the n=
aive for every string length and even<br>
&gt;=C2=A0 where the<br>
&gt;=C2=A0 &gt; heuristic guess adjustment adds 2 characters.=C2=A0 You can=
 see that long strings suffer dramatically.=C2=A0 I<br>
&gt;=C2=A0 also used<br>
&gt;=C2=A0 &gt; several long strings provided by Kristoffer from his real-w=
orld use cases.=C2=A0 I don&#39;t yet have his<br>
&gt;=C2=A0 permission to<br>
&gt;=C2=A0 &gt; add them formally to the test but can trivially concoct sim=
ilar strings.<br>
&gt;=C2=A0 &gt; <br>
&gt;=C2=A0 &gt; The test tries to fit strings into 100, 500, and 1000 pixel=
 columns, typical column width for strings,<br>
&gt;=C2=A0 1000<br>
&gt;=C2=A0 &gt; iterations each.<br>
&gt; <br>
&gt;=C2=A0 Thanks.=C2=A0 But what is &#39;len&#39; in this output?<br>
&gt; <br>
&gt; It&#39;s the length of the input strings to truncate to the max pixels=
.=C2=A0 Varying the input length demonstrates both<br>
&gt; on-par (a tiny bit better) performance for short strings and much bett=
er performance for longer input strings.<br>
<br>
Then the benchmark seems to tell that the performance of<br>
vtable--limit-string is non-linear in the length of the string:<br>
<br>
=C2=A0 pixels=3D100 len=3D011 func=3Dnaive=C2=A0 =C2=A0 =C2=A0 =C2=A0(0.031=
156 0 0.0)<br>
=C2=A0 pixels=3D100 len=3D023 func=3Dnaive=C2=A0 =C2=A0 =C2=A0 =C2=A0(0.112=
267 0 0.0)<br>
=C2=A0 pixels=3D100 len=3D047 func=3Dnaive=C2=A0 =C2=A0 =C2=A0 =C2=A0(0.308=
42200000000003 0 0.0)<br>
=C2=A0 pixels=3D100 len=3D095 func=3Dnaive=C2=A0 =C2=A0 =C2=A0 =C2=A0(0.837=
941 0 0.0)<br>
<br>
And this is probably because each time vtable--limit-string calls<br>
string-pixel-width, the latter inserts the string into a buffer and<br>
then works on the buffer.=C2=A0 So I think one thing to try is to insert<br=
>
the string only once, and then call window-text-pixel-size, with the<br>
portion of the string to be measured controlled by the FROM and TO<br>
arguments of window-text-pixel-size.=C2=A0 This should significantly reduce=
<br>
the overhead of calling string-pixel-width for each substring of the<br>
string.<br></blockquote><div><br></div><div class=3D"gmail_default" style=
=3D"font-family:monospace">Maybe but I&#39;d think the heuristic will beat =
it every time given that the truncation estimate shows itself to be accurat=
e.</div><div class=3D"gmail_default" style=3D"font-family:monospace"><br></=
div><div class=3D"gmail_default" style=3D"font-family:monospace">I can impl=
ement a truncate-string-to-pixel-width function that does what string-pixel=
-width does that could replace the vtable function if it proves to be suffi=
ciently fast.=C2=A0 Maybe today maybe tomorrow.</div></div></div>

--000000000000bb9e6606463f0ce0--




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

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


Received: (at 80026) by debbugs.gnu.org; 18 Dec 2025 19:06:03 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 18 14:06:03 2025
Received: from localhost ([127.0.0.1]:56853 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWJK3-0002T1-12
	for submit <at> debbugs.gnu.org; Thu, 18 Dec 2025 14:06:02 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10]:54094)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1vWJJz-0002Sm-ID
 for 80026 <at> debbugs.gnu.org; Thu, 18 Dec 2025 14:05:57 -0500
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1vWJJr-0003Gi-Pn; Thu, 18 Dec 2025 14:05:47 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=YNJsMy2b4nk0XSoGUqCq9opNpy8Z79ZhV/HRjl6jE38=; b=Wj5A/2N6A3rtsznvWw3W
 3S6hK+SiUoPDlWTrjcV9+/Uxsb56+Hs/9ChvwJTJmFPuphi/mSPScUXHD5l3RFLuDrBuRdMTCoqpx
 2dRZJXkkxokfSuY/SRqm/+UbM5HEkKBdoymW+0MBoYpkkEgvc4NtZVQzqM13wV8RJH6DZeTmFMYmn
 1ApysYM8W2HPwPB2nicGVxCzU/fLgqTu5Q1xu39sHr2wIIPXsolfh/xkVRz0eWbEAe6t292AtixF8
 Inw16yhZmrmNYQlm55ZF3KuSVLkVuuUgAWQn3Na1/GENKD0qVnffPzbrlue/G6XeeEk10Enfpu/W5
 TE0CvnBNwhf6bA==;
Date: Thu, 18 Dec 2025 21:05:41 +0200
Message-Id: <86zf7f1ugq.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
In-Reply-To: <CAN+1Hbqn_Ojes=iinTJAaMvp+D1Y+R5cRX8dKjO41LRrfqbvfA@HIDDEN>
 (message from =?utf-8?Q?St=C3=A9phane?= Marks on Thu, 18 Dec 2025 12:55:33
 -0500)
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 <86zf7g2v9t.fsf@HIDDEN>
 <CAN+1HbqaOS-Dhf=FayFLcux5RAqd+YTO8sjLm0dgwqfiNN-qow@HIDDEN>
 <CAN+1HbpXAa=MK7VbaUvuQnVC1Mb4EqZqj9C-TYNgMxPR2Wb8Aw@HIDDEN>
 <CAN+1HbqV3QVKGD61c5fBNagEVc+DT0A7UrfRh5+SDCu=tPb6Dw@HIDDEN>
 <861pkr3cei.fsf@HIDDEN>
 <CAN+1Hbqn_Ojes=iinTJAaMvp+D1Y+R5cRX8dKjO41LRrfqbvfA@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: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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 (-)

> From: Stéphane Marks <shipmints@HIDDEN>
> Date: Thu, 18 Dec 2025 12:55:33 -0500
> Cc: 80026 <at> debbugs.gnu.org, sbaugh@HIDDEN, krisbalintona@HIDDEN, 
> 	joostkremers@HIDDEN, ijqq@HIDDEN, visuweshm@HIDDEN, 
> 	adam@HIDDEN, larsi@HIDDEN, arstoffel@HIDDEN
> 
>  > Benchmark results show that the heuristic outperforms the naive for every string length and even
>  where the
>  > heuristic guess adjustment adds 2 characters.  You can see that long strings suffer dramatically.  I
>  also used
>  > several long strings provided by Kristoffer from his real-world use cases.  I don't yet have his
>  permission to
>  > add them formally to the test but can trivially concoct similar strings.
>  > 
>  > The test tries to fit strings into 100, 500, and 1000 pixel columns, typical column width for strings,
>  1000
>  > iterations each.
> 
>  Thanks.  But what is 'len' in this output?
> 
> It's the length of the input strings to truncate to the max pixels.  Varying the input length demonstrates both
> on-par (a tiny bit better) performance for short strings and much better performance for longer input strings.

Then the benchmark seems to tell that the performance of
vtable--limit-string is non-linear in the length of the string:

  pixels=100 len=011 func=naive       (0.031156 0 0.0)
  pixels=100 len=023 func=naive       (0.112267 0 0.0)
  pixels=100 len=047 func=naive       (0.30842200000000003 0 0.0)
  pixels=100 len=095 func=naive       (0.837941 0 0.0)

And this is probably because each time vtable--limit-string calls
string-pixel-width, the latter inserts the string into a buffer and
then works on the buffer.  So I think one thing to try is to insert
the string only once, and then call window-text-pixel-size, with the
portion of the string to be measured controlled by the FROM and TO
arguments of window-text-pixel-size.  This should significantly reduce
the overhead of calling string-pixel-width for each substring of the
string.




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

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


Received: (at 80026) by debbugs.gnu.org; 18 Dec 2025 17:55:57 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 18 12:55:57 2025
Received: from localhost ([127.0.0.1]:56201 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWIED-0006LE-Sv
	for submit <at> debbugs.gnu.org; Thu, 18 Dec 2025 12:55:57 -0500
Received: from mail-vs1-xe2b.google.com ([2607:f8b0:4864:20::e2b]:50325)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vWIEA-0006L0-HW
 for 80026 <at> debbugs.gnu.org; Thu, 18 Dec 2025 12:55:51 -0500
Received: by mail-vs1-xe2b.google.com with SMTP id
 ada2fe7eead31-5e9d2ce037aso700834137.0
 for <80026 <at> debbugs.gnu.org>; Thu, 18 Dec 2025 09:55:50 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1766080544; x=1766685344; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=OxKHEWfB9sEd7hfKWM3UFf7HA73mP4B5qc+RMzJnBq0=;
 b=hXqSWblRbowe/a/iBDjdcvjOqOIxIkbsoPjYBSPjz3M0qhY0fKgqQOd5mxiBtYO2Ka
 rXroaSU8zwG/rcLffN99IqwI9Tk5SXpQbof+yPwdDt2JfWPU6s3tF+MHctbVLU7FU0qY
 bptTKOO4qofPXB9GgEEr6yq/Ux2Oj5sFHzFqJ0k2yo3mSp3CgrGidlGcXvnL90fX7MEH
 f1MKo0hAuL2EYqyOd4XPrj5r4K6Grru+yWAuuImz7kDmVor2GR+YH+yJm51GmUi59Yhx
 n69JMR7Z5a7zVH15/NtKTlmKFyy8kY9nsLYhhpG5M0gAPT2k7phqsdnSLmahC8OnV4dN
 l0Mg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1766080544; x=1766685344;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=OxKHEWfB9sEd7hfKWM3UFf7HA73mP4B5qc+RMzJnBq0=;
 b=rPj8w55F3tUWfYH8S4Wim9z1ogRNjdQJ0jHwn7eBe0gLk9SgWzNkwi+EAhCJSFIh7f
 TWb9zfQ6sDbyUrCpegAms9xXGxJocFDvtnDiCUO8ph0vfV6qldTjSrAFzokNns2VdsJq
 /GhaR7FkBzVO/BiSW+EN40TpT8pkzl1K6+hEf7NoFZDqtvLNI33uPEwnfAuQiazAQMnv
 rV4HXUrJHwZYnHc26+aIabPl61Pwm5iqD3BrVqg7wR4FK6c4WehY4zUVxarZibVmjoMA
 L1ZZTcPrR/RQwRYOAeQmUnOUZmbaMn4xQwpXfFOhiHobvqCzttOWbj0G4G+pCLjQ7BPd
 ByMQ==
X-Gm-Message-State: AOJu0Yy8HIoSd0GINc+aUGQdLrcCLP/U+QrRpeNCzv4jg1sfZop15Uw3
 ttdMLCeJrWWiSyjwMiSz9BGUmthrvJnfq4f1RA2GbjQOf8edZaZqF8/66XlIcXr20L2irT07neo
 XHja9obtDb1HH4a68ji94n/HrU3oaGSI=
X-Gm-Gg: AY/fxX6B7MOQGJvNCk6qpwK5jnMOsXzyic3dGw4cR8uzKRLullJRPKWdyqGP+m9ENxZ
 HWjS+/yAOyW5DC+BzMXc0uBY7lreJoo2qy6h+Jydy4GuqY2InOxEg6M4vHLfvpEETBd4odHzCx/
 HIEt4An3uLw2hZK2amxAjf7oeujqb98Qq63uqElplf5uChaV0YvOcK77CEEQWOMoL5MrU5YMMDc
 mDMgjfXRzVLk+QWWiNzcKmYmCvb8sgIVZejK3Khq04tXhpJQMxhNGTV0jdZHrt1qIPLMvdsXsjR
 MOAidQ==
X-Google-Smtp-Source: AGHT+IH+wZee4jFL53YCkQkVDtpAmx7M5C6/emp519aMkX5lYpSHOlFDJe4XnfWbrzzU79K5YxDHga3qtL5vWmMtgUQ=
X-Received: by 2002:a05:6102:6a93:b0:5db:1e80:7813 with SMTP id
 ada2fe7eead31-5eb1a867550mr8531137.43.1766080544623; Thu, 18 Dec 2025
 09:55:44 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 <86zf7g2v9t.fsf@HIDDEN>
 <CAN+1HbqaOS-Dhf=FayFLcux5RAqd+YTO8sjLm0dgwqfiNN-qow@HIDDEN>
 <CAN+1HbpXAa=MK7VbaUvuQnVC1Mb4EqZqj9C-TYNgMxPR2Wb8Aw@HIDDEN>
 <CAN+1HbqV3QVKGD61c5fBNagEVc+DT0A7UrfRh5+SDCu=tPb6Dw@HIDDEN>
 <861pkr3cei.fsf@HIDDEN>
In-Reply-To: <861pkr3cei.fsf@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Thu, 18 Dec 2025 12:55:33 -0500
X-Gm-Features: AQt7F2q2js7YJyRpqYxaVdbvfejP0NBU6OuQsR1QgvN8LVI2EtjQpx1qg8TrQ5Y
Message-ID: <CAN+1Hbqn_Ojes=iinTJAaMvp+D1Y+R5cRX8dKjO41LRrfqbvfA@HIDDEN>
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
To: Eli Zaretskii <eliz@HIDDEN>
Content-Type: multipart/alternative; boundary="00000000000081d16b06463dabbd"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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 (-)

--00000000000081d16b06463dabbd
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, Dec 18, 2025 at 12:53=E2=80=AFPM Eli Zaretskii <eliz@HIDDEN> wrote=
:

> > From: St=C3=A9phane Marks <shipmints@HIDDEN>
> > Date: Thu, 18 Dec 2025 11:40:52 -0500
> > Cc: 80026 <at> debbugs.gnu.org, sbaugh@HIDDEN,
> krisbalintona@HIDDEN,
> >       joostkremers@HIDDEN, ijqq@HIDDEN, visuweshm@HIDDEN=
m,
>
> >       adam@HIDDEN, larsi@HIDDEN, arstoffel@HIDDEN
> >
> > Benchmark results show that the heuristic outperforms the naive for
> every string length and even where the
> > heuristic guess adjustment adds 2 characters.  You can see that long
> strings suffer dramatically.  I also used
> > several long strings provided by Kristoffer from his real-world use
> cases.  I don't yet have his permission to
> > add them formally to the test but can trivially concoct similar strings=
.
> >
> > The test tries to fit strings into 100, 500, and 1000 pixel columns,
> typical column width for strings, 1000
> > iterations each.
>
> Thanks.  But what is 'len' in this output?
>

It's the length of the input strings to truncate to the max pixels.
Varying the input length demonstrates both on-par (a tiny bit better)
performance for short strings and much better performance for longer input
strings.

--00000000000081d16b06463dabbd
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Thu, Dec 18, 2025 at 12:53=E2=80=AFPM Eli Zaretskii &lt;<a href=3D"mailt=
o:eliz@HIDDEN">eliz@HIDDEN</a>&gt; wrote:</span></div></div><div class=3D=
"gmail_quote gmail_quote_container"><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex">&gt; From: St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@g=
mail.com" target=3D"_blank">shipmints@HIDDEN</a>&gt;<br>
&gt; Date: Thu, 18 Dec 2025 11:40:52 -0500<br>
&gt; Cc: <a href=3D"mailto:80026 <at> debbugs.gnu.org" target=3D"_blank">80026@d=
ebbugs.gnu.org</a>, <a href=3D"mailto:sbaugh@HIDDEN" target=3D"_bla=
nk">sbaugh@HIDDEN</a>, <a href=3D"mailto:krisbalintona@HIDDEN" t=
arget=3D"_blank">krisbalintona@HIDDEN</a>, <br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0<a href=3D"mailto:joostkremers@HIDDEN" =
target=3D"_blank">joostkremers@HIDDEN</a>, <a href=3D"mailto:ijqq@prot=
onmail.com" target=3D"_blank">ijqq@HIDDEN</a>, <a href=3D"mailto:vi=
suweshm@HIDDEN" target=3D"_blank">visuweshm@HIDDEN</a>, <br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0<a href=3D"mailto:adam@HIDDEN" target=
=3D"_blank">adam@HIDDEN</a>, <a href=3D"mailto:larsi@HIDDEN" targe=
t=3D"_blank">larsi@HIDDEN</a>, <a href=3D"mailto:arstoffel@HIDDEN" tar=
get=3D"_blank">arstoffel@HIDDEN</a><br>
&gt; <br>
&gt; Benchmark results show that the heuristic outperforms the naive for ev=
ery string length and even where the<br>
&gt; heuristic guess adjustment adds 2 characters.=C2=A0 You can see that l=
ong strings suffer dramatically.=C2=A0 I also used<br>
&gt; several long strings provided by Kristoffer from his real-world use ca=
ses.=C2=A0 I don&#39;t yet have his permission to<br>
&gt; add them formally to the test but can trivially concoct similar string=
s.<br>
&gt; <br>
&gt; The test tries to fit strings into 100, 500, and 1000 pixel columns, t=
ypical column width for strings, 1000<br>
&gt; iterations each.<br>
<br>
Thanks.=C2=A0 But what is &#39;len&#39; in this output?<br></blockquote><di=
v><br></div><div class=3D"gmail_default" style=3D"font-family:monospace">It=
&#39;s the length of the input strings to truncate to the max pixels.=C2=A0=
 Varying the input length demonstrates both on-par (a tiny bit better) perf=
ormance for short strings and much better performance for longer input stri=
ngs.</div></div></div>

--00000000000081d16b06463dabbd--




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

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


Received: (at 80026) by debbugs.gnu.org; 18 Dec 2025 17:53:08 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 18 12:53:08 2025
Received: from localhost ([127.0.0.1]:56156 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWIBX-00067Z-W0
	for submit <at> debbugs.gnu.org; Thu, 18 Dec 2025 12:53:08 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10]:34762)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1vWIBU-000674-Up
 for 80026 <at> debbugs.gnu.org; Thu, 18 Dec 2025 12:53:06 -0500
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1vWIBO-0007pO-GM; Thu, 18 Dec 2025 12:52:58 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=OHSiL+9/R68dpcDb8KsWVpyjRg8mYiGqdq2X3tTZOpk=; b=rwCeEZoRycxsLyl5fspZ
 SSHH1lzLx0Lq0LbtUhSffYDbPlEGte8gSrENMgTQR+AZZKgfHg6UblYcuADKd1EP6iH8ttgzgWj3V
 LfGuFoMfcs0vY5GioF3QxZAZm13FFlPYdQTqzE6+OKAQh2xJNLvFiGHjnbwMDn+dPmcpzNDU19Vdx
 1yy07jAzICCS5lnt/ZsFNyXxgeaZNbcofIFEl4qhcRyOLH9Mgjg2AZ3KyZdJvwSnfz4xfQ6EOa0hY
 i+ASpaXelEBVCX5/yWvTAcbpbADs/OzfxVS4hUyd5Eh943kDJNSyFBLW7isdVpXj71UiKVLLcacyP
 hJaLZRkVPipvtw==;
Date: Thu, 18 Dec 2025 19:52:53 +0200
Message-Id: <861pkr3cei.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
In-Reply-To: <CAN+1HbqV3QVKGD61c5fBNagEVc+DT0A7UrfRh5+SDCu=tPb6Dw@HIDDEN>
 (message from =?utf-8?Q?St=C3=A9phane?= Marks on Thu, 18 Dec 2025 11:40:52
 -0500)
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 <86zf7g2v9t.fsf@HIDDEN>
 <CAN+1HbqaOS-Dhf=FayFLcux5RAqd+YTO8sjLm0dgwqfiNN-qow@HIDDEN>
 <CAN+1HbpXAa=MK7VbaUvuQnVC1Mb4EqZqj9C-TYNgMxPR2Wb8Aw@HIDDEN>
 <CAN+1HbqV3QVKGD61c5fBNagEVc+DT0A7UrfRh5+SDCu=tPb6Dw@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: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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 (---)

> From: Stéphane Marks <shipmints@HIDDEN>
> Date: Thu, 18 Dec 2025 11:40:52 -0500
> Cc: 80026 <at> debbugs.gnu.org, sbaugh@HIDDEN, krisbalintona@HIDDEN, 
> 	joostkremers@HIDDEN, ijqq@HIDDEN, visuweshm@HIDDEN, 
> 	adam@HIDDEN, larsi@HIDDEN, arstoffel@HIDDEN
> 
> Benchmark results show that the heuristic outperforms the naive for every string length and even where the
> heuristic guess adjustment adds 2 characters.  You can see that long strings suffer dramatically.  I also used
> several long strings provided by Kristoffer from his real-world use cases.  I don't yet have his permission to
> add them formally to the test but can trivially concoct similar strings.
> 
> The test tries to fit strings into 100, 500, and 1000 pixel columns, typical column width for strings, 1000
> iterations each.

Thanks.  But what is 'len' in this output?




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

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


Received: (at 80026) by debbugs.gnu.org; 18 Dec 2025 16:41:14 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 18 11:41:14 2025
Received: from localhost ([127.0.0.1]:55461 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWH3x-0001qb-7K
	for submit <at> debbugs.gnu.org; Thu, 18 Dec 2025 11:41:14 -0500
Received: from mail-vs1-xe31.google.com ([2607:f8b0:4864:20::e31]:53417)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vWH3t-0001qK-SS
 for 80026 <at> debbugs.gnu.org; Thu, 18 Dec 2025 11:41:11 -0500
Received: by mail-vs1-xe31.google.com with SMTP id
 ada2fe7eead31-5eae7bb8018so315708137.2
 for <80026 <at> debbugs.gnu.org>; Thu, 18 Dec 2025 08:41:09 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1766076064; x=1766680864; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=ryUGretbqs0APOawWvX/EjQ5P0eNINSTK/sTqEgCbT8=;
 b=jhlVr6RgJCNopyaxmdn4ojw3E2yu5cOMWL7XBMsL9ezjmKhkktFIgjPCapyCfF8b4z
 9kMfS+s2OQx839Z6uNxZ/5V+NCoOq9nCTmSpv2P9kWnR07lJ36I0XXwBDRlsdNx2kTQp
 t7esJ38HsrSleS+Y+0KcZpt9rYKy7GfB3bt9EnyU0YH4d+oGhowCGnakxKP53VmLHdlC
 6n0mLC0pZZe1l/ggiAdMjzvejJRWxLXFFFLtD+y7t3TBmVMahqJs5i/CFYnaVL15ZRAy
 zUKCHKSICjBbO/P4s2z+5FIIxlGEtBpfDL0fCAWXdpyuRF5gt3cXp0DeDNQpDL8trHDJ
 WUFw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1766076064; x=1766680864;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=ryUGretbqs0APOawWvX/EjQ5P0eNINSTK/sTqEgCbT8=;
 b=r5YEFwwxqoE26bVNR5GjWVZiy5hkG+TPoDCySI9+I/cLyFSa85Oy3bsWqxR+zmLxfd
 ebSFVKsRwZQ+qkbXACbDjJO7Y3VBfjoJEmBkPtqMffxViTlpbVYZ6vLds3RRbwAqnfN5
 LoT+u60LQ6/iTaYVt1lO3pi+EDlMG5Kkhhha6W216o/gefg0W+1sp9wgc7ehWOF3UGu6
 +gW641QrF3KfDqVeQF1LeqptX1QoUormhBCKBCagV8FJFnVaCRGPiYUlE/GJ/oZuvKKw
 mN8aQgsbax8mJ/MVR5s3Cyt/h4pqLW8yUEYj/1Rcq0jr0Hp3addKhl/IX13a0Bd/UNXf
 Ml7Q==
X-Gm-Message-State: AOJu0YwfFcORoG3hVJeZy3O9cg37VYWeKabV69MY+oQyeYNVGRhOFSqO
 MPYxBP5C7d+P+X/tEvPhJxIhipasBO7qBIINs60zXKxyZHiyuG/agT5uOlF1vV3j3W4NP8L5/tI
 bYzjc/u4cBciZEv+rI1gOSJq9/VMobjU=
X-Gm-Gg: AY/fxX7CAzQTdkQt27M/AIxLT0HrUCkDbTNvsXm8vE9SffCW4xgji4Lz+sDZ8QR0Q5p
 1Q2H/kthS5/BSFx64dcbnuZTF3OHgXE3BFLwnNS32nKrOqk01p0fzURUJmJkR+902OVduq5wecb
 y3s4iQSCnRyNSLGE1tgn7exqGeydUqZZ6SeDteZN/QyCGXaqfq5CnpE9e8hRwEgWPKI9PCkOXH4
 1yp3H/8sqOE8YKPWnHJBOWwVttwBFEMdXz/4tQEOTqfftBUjErHC/I6robxANeQZNbr3R8=
X-Google-Smtp-Source: AGHT+IH1OmBeGH1Co2W6horjBwL7SmubbmvLEe+X151TcO1ffS5FGYjRJ8+/Me9fS24wUX5Wj7G2xHKwV1UrzAbQzeI=
X-Received: by 2002:a05:6102:4429:b0:5df:bb10:631e with SMTP id
 ada2fe7eead31-5e827836533mr7446958137.41.1766076064057; Thu, 18 Dec 2025
 08:41:04 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 <86zf7g2v9t.fsf@HIDDEN>
 <CAN+1HbqaOS-Dhf=FayFLcux5RAqd+YTO8sjLm0dgwqfiNN-qow@HIDDEN>
 <CAN+1HbpXAa=MK7VbaUvuQnVC1Mb4EqZqj9C-TYNgMxPR2Wb8Aw@HIDDEN>
In-Reply-To: <CAN+1HbpXAa=MK7VbaUvuQnVC1Mb4EqZqj9C-TYNgMxPR2Wb8Aw@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Thu, 18 Dec 2025 11:40:52 -0500
X-Gm-Features: AQt7F2rNsfGF4xhGUdd0eiPb5eqyL_HHxZv_R-E0vQs6fIu6Wr9e-nIDyMhbhgk
Message-ID: <CAN+1HbqV3QVKGD61c5fBNagEVc+DT0A7UrfRh5+SDCu=tPb6Dw@HIDDEN>
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
To: Eli Zaretskii <eliz@HIDDEN>
Content-Type: multipart/alternative; boundary="00000000000071ceb906463ca0b9"
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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 (-)

--00000000000071ceb906463ca0b9
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, Dec 18, 2025 at 11:28=E2=80=AFAM St=C3=A9phane Marks <shipmints@gma=
il.com> wrote:

> On Thu, Dec 18, 2025 at 9:48=E2=80=AFAM St=C3=A9phane Marks <shipmints@gm=
ail.com>
> wrote:
>
>> On Thu, Dec 18, 2025 at 12:50=E2=80=AFAM Eli Zaretskii <eliz@HIDDEN> wr=
ote:
>>
>>> > Cc: Spencer Baugh <sbaugh@HIDDEN>,
>>> >  Kristoffer Balintona <krisbalintona@HIDDEN>,
>>> >  Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
>>> >  Visuwesh <visuweshm@HIDDEN>, Adam Porter <adam@HIDDEN>,
>>> >  Lars Ingebrigtsen <larsi@HIDDEN>, Augusto Stoffel <
>>> arstoffel@HIDDEN>
>>> > From: St=C3=A9phane Marks <shipmints@HIDDEN>
>>> > Date: Wed, 17 Dec 2025 13:57:20 -0500
>>> >
>>> > This implements a simple heuristic to limit the number of times
>>> `string-pixel-width` gets called by estimating
>>> > the string's truncation position in advance.  This is overridable
>>> column-by-column should some strings in the
>>> > vtable be composed of widely varying font widths that necessitates
>>> minor adjustments to the heuristic.  This
>>> > approach performs well in testing (and I tested several approaches)
>>> and has been tested by more than one
>>> > vtable user.
>>>
>>> Thanks, but are you sure this is not a case of premature optimization?
>>> How important is it to speed up vtable--limit-string?  Can you show
>>> some benchmarks which will point to this function as a hotspot?
>>>
>>> Also, changing the algorithm from an exact one to one using heuristic
>>> requires significant testing with various problematic cases: text
>>> using variable fonts and characters of different glyph-width,
>>> character-composition sequences (e.g., emoji), etc.  Could you please
>>> add such tests to the suite, so we could be sure this change doesn't
>>> introduce regressions?
>>>
>>
>> FWIW, this is not a premature optimization, it is key for vtable
>> performance with columns of, say 500 pixels, on strings that would occup=
y
>> beyond that pixel limit.  If vtable could render only the visible portio=
n
>> of the buffer, it might be less of an issue; however, vtable renders the
>> entire table every time on bulk refreshes and the existing looping metho=
d
>> is slow.  Single object changes render single lines so that's less of an
>> issue since their line location in the buffer is computed.
>>
>> As far as any negative impact is concerned, without adjustment, the wors=
t
>> case is pretty much just a missing displayed character that had been
>> displayed before.
>>
>> In any case, one can disable the heuristic for complete backward
>> compatibility by setting a column's limit-adjustment property to nil for
>> any problematic strings.  I have not yet found one of those in my use bu=
t I
>> don't use other languages like Chinese or whatever that might demonstrat=
e
>> more of an issue.
>>
>> I will adapt my benchmark code, and add some tests for edge cases such a=
s
>> those you mentioned.  If there are already a string corpus to test with =
in
>> the code base, let me know or I'll take a look for one.
>>
>
> I stole some text from the erc tests and added a bunch more including
> multi-character emojis and concocted this test which compares the naive
> string limit code to the heuristic code looking for mismatches with zero
> adjustment.  Let me know if there are other cases you think need attentio=
n.
>
> (ert-deftest test-vtable--limit-string-stress ()
>   (let ((max-pixels 500)
>         (strings (list
>                   "foo bar baz foo bar baz foo bar baz foo bar baz foo ba=
r
> baz foo bar baz"
>                   (concat "=E8=A9=B1=E8=AA=AA=E5=A4=A9=E4=B8=8B=E5=A4=A7=
=E5=8B=A2=EF=BC=8C=E5=88=86=E4=B9=85=E5=BF=85=E5=90=88=EF=BC=8C=E5=90=88=E4=
=B9=85=E5=BF=85=E5=88=86=EF=BC=9A=E5=91=A8=E6=9C=AB=E4=B8=83=E5=9C=8B=E5=88=
=86=E7=88=AD=EF=BC=8C=E5=B9=B6=E5=85=A5=E6=96=BC=E7=A7=A6=E3=80=82"
>                           "=E5=8F=8A=E7=A7=A6=E6=BB=85=E4=B9=8B=E5=BE=8C=
=EF=BC=8C=E6=A5=9A=E3=80=81=E6=BC=A2=E5=88=86=E7=88=AD=EF=BC=8C=E5=8F=88=E5=
=B9=B6=E5=85=A5=E6=96=BC=E6=BC=A2=E3=80=82=E6=BC=A2=E6=9C=9D=E8=87=AA=E9=AB=
=98=E7=A5=96=E6=96=AC=E7=99=BD=E8=9B=87=E8=80=8C=E8=B5=B7=E7=BE=A9=EF=BC=8C=
"
>                           "=E4=B8=80=E7=B5=B1=E5=A4=A9=E4=B8=8B=E3=80=82=
=E5=BE=8C=E4=BE=86=E5=85=89=E6=AD=A6=E4=B8=AD=E8=88=88=EF=BC=8C=E5=82=B3=E8=
=87=B3=E7=8D=BB=E5=B8=9D=EF=BC=8C=E9=81=82=E5=88=86=E7=82=BA=E4=B8=89=E5=9C=
=8B=E3=80=82=E6=8E=A8=E5=85=B6=E8=87=B4=E4=BA=82=E4=B9=8B=E7=94=B1=EF=BC=8C=
"
>                           "=E6=AE=86=E5=A7=8B=E6=96=BC=E6=A1=93=E3=80=81=
=E9=9D=88=E4=BA=8C=E5=B8=9D=E3=80=82=E6=A1=93=E5=B8=9D=E7=A6=81=E9=8C=AE=E5=
=96=84=E9=A1=9E=EF=BC=8C=E5=B4=87=E4=BF=A1=E5=AE=A6=E5=AE=98=E3=80=82=E5=8F=
=8A=E6=A1=93=E5=B8=9D=E5=B4=A9=EF=BC=8C=E9=9D=88=E5=B8=9D=E5=8D=B3=E4=BD=8D=
=EF=BC=8C"
>                           "=E5=A4=A7=E5=B0=87=E8=BB=8D=E7=AB=87=E6=AD=A6=
=E3=80=81=E5=A4=AA=E5=82=85=E9=99=B3=E8=95=83=EF=BC=8C=E5=85=B1=E7=9B=B8=E8=
=BC=94=E4=BD=90=E3=80=82=E6=99=82=E6=9C=89=E5=AE=A6=E5=AE=98=E6=9B=B9=E7=AF=
=80=E7=AD=89=E5=BC=84=E6=AC=8A=EF=BC=8C=E7=AB=87=E6=AD=A6=E3=80=81=E9=99=B3=
=E8=95=83=E8=AC=80=E8=AA=85=E4=B9=8B=EF=BC=8C"
>                           "=E4=BD=9C=E4=BA=8B=E4=B8=8D=E5=AF=86=EF=BC=8C=
=E5=8F=8D=E7=82=BA=E6=89=80=E5=AE=B3=E3=80=82=E4=B8=AD=E6=B6=93=E8=87=AA=E6=
=AD=A4=E6=84=88=E6=A9=AB")
>                   (concat "=D0=BA=D0=BE=D1=80=D0=BE=D1=87=D0=B5 =D1=82=D0=
=B5=D0=BF=D0=B5=D1=80=D1=8C =D0=B5=D1=81=D0=BB=D0=B8 =D0=BF=D0=BE =D1=80=D1=
=83=D1=81=D1=81=D0=BA=D0=B8 =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=
=8C =D0=B2=D1=81=D0=B5 =D1=87=D0=B5=D1=82=D0=BA=D0=BE
> =D0=B8=D0=BB=D0=B8 =D0=B2=D1=81=D0=B5 =D1=80=D0=B0=D0=B2=D0=BD=D0=BE"
>                           " =D0=BA=D0=BE=D1=80=D0=BE=D1=87=D0=B5 =D1=82=
=D0=B5=D0=BF=D0=B5=D1=80=D1=8C =D0=B5=D1=81=D0=BB=D0=B8 =D0=BF=D0=BE =D1=80=
=D1=83=D1=81=D1=81=D0=BA=D0=B8 =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=
=D1=8C =D0=B2=D1=81=D0=B5
> =D1=87=D0=B5=D1=82=D0=BA=D0=BE =D0=B8=D0=BB=D0=B8 =D0=B2=D1=81=D0=B5 =D1=
=80=D0=B0=D0=B2=D0=BD=D0=BE"
>                           " =D0=BA=D0=BE=D1=80=D0=BE=D1=87=D0=B5 =D1=82=
=D0=B5=D0=BF=D0=B5=D1=80=D1=8C =D0=B5=D1=81=D0=BB=D0=B8 =D0=BF=D0=BE =D1=80=
=D1=83=D1=81=D1=81=D0=BA=D0=B8 =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=
=D1=8C =D0=B2=D1=81=D0=B5
> =D1=87=D0=B5=D1=82=D0=BA=D0=BE =D0=B8=D0=BB=D0=B8 =D0=B2=D1=81=D0=B5 =D1=
=80=D0=B0=D0=B2=D0=BD=D0=BE"
>                           " =D0=BA=D0=BE=D1=80=D0=BE=D1=87=D0=B5 =D1=82=
=D0=B5=D0=BF=D0=B5=D1=80=D1=8C =D0=B5=D1=81=D0=BB=D0=B8 =D0=BF=D0=BE =D1=80=
=D1=83=D1=81=D1=81=D0=BA=D0=B8 =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=
=D1=8C =D0=B2=D1=81=D0=B5
> =D1=87=D0=B5=D1=82=D0=BA=D0=BE =D0=B8=D0=BB=D0=B8 =D0=B2=D1=81=D0=B5 =D1=
=80=D0=B0=D0=B2=D0=BD=D0=BE")
>                   "=D0=B1=D1=83=D0=B4=D0=B5=D1=82 =D1=80=D0=B0=D0=B7=D1=
=80=D1=8B=D0=B2 =D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8 =D0=BD=D0=B5=D0=BF=D0=
=BE=D0=BD=D1=8F=D1=82=D0=BD=D0=BE =D0=B3=D0=B4=D0=B5=F0=9F=8F=81=F0=9F=9A=
=A9=F0=9F=8E=8C=F0=9F=8F=B4=F0=9F=8F=B3=EF=B8=8F =F0=9F=8F=B3=EF=B8=8F
> <200d>=F0=9F=8C=88=F0=9F=8F=B3=EF=B8=8F <200d>=E2=9A=A7=EF=B8=8F=F0=9F=8F=
=B4<200d>=E2=98=A0=EF=B8=8F"
>                   (apply #'concat (make-list 200 "\u0065\u0301 ")) ;
> composed e=CC=81 \u00E9
>                   (let ((woman-loves-man ; =F0=9F=91=A9=E2=80=8D=E2=9D=A4=
=EF=B8=8F=E2=80=8D=F0=9F=91=A8
>                          (concat "\N{WOMAN}"
>                                  "\N{ZERO WIDTH JOINER}"
>                                  "\N{HEAVY BLACK HEART}"
>                                  "\N{VARIATION SELECTOR-16}"
>                                  "\N{ZERO WIDTH JOINER}"
>                                  "\N{MAN}"
>                                  " ")))
>                     (apply #'concat (make-list 200 woman-loves-man)))
>                   (propertize (let ((varying-height-string
>                                      (mapconcat
>                                       #'identity
>                                       (list "AWi!"
>                                             (propertize "foo" 'face
> '(:height 2.5))
>                                             (propertize "bar" 'face
> '(:height 0.5))
>                                             (propertize "baz" 'face
> '(:height 1.0)))
>                                       " ")))
>                                 (apply #'concat (make-list 100
> varying-height-string)))
>                               'face 'variable-pitch))))
>     (dolist (height '(1.0 0.5 1.5))
>       (with-temp-buffer
>         (face-remap-add-relative 'default :height height)
>         (dolist (string strings)
>           (should (eq (length (test-vtable-vtable--limit-string-naive
> string max-pixels (current-buffer)))
>                       (length (vtable--limit-string string max-pixels
> (current-buffer) 0)))))))))
>
> I wrote a benchmark ert test but not precisely sure how that works in the
> context of the overall ert suite and how benchmark results are intended t=
o
> be processed.  Perhaps it should be run by hand and not made an ert test =
at
> all but live in the same test file for manual execution.  I didn't see er=
t
> examples of package benchmark code that may check for performance drift o=
r
> whatever.  Perhaps those live somewhere else.
>

Benchmark results show that the heuristic outperforms the naive for every
string length and even where the heuristic guess adjustment adds 2
characters.  You can see that long strings suffer dramatically.  I also
used several long strings provided by Kristoffer from his real-world use
cases.  I don't yet have his permission to add them formally to the test
but can trivially concoct similar strings.

The test tries to fit strings into 100, 500, and 1000 pixel columns,
typical column width for strings, 1000 iterations each.

Considering that I haven't (yet) been able to break the heuristic, it seems
worthy to upgrade vtable--limit-string.  I'm guessing Eli has some crazy
string combo that will break it and force the need for an adjustment
character or two.

Below, naive is the existing vtable--limit-string implementation and the
heuristic one is my replacement. +0 means no adjustment, +2 means add two
characters to test to see if it's slower than the naive version even when
pushed.

pixels=3D100 len=3D003 func=3Dnaive       (0.006355 0 0.0)
pixels=3D100 len=3D003 func=3Dheuristic+0 (0.006028 0 0.0)
pixels=3D100 len=3D003 func=3Dheuristic+2 (0.005978000000000001 0 0.0)
---
pixels=3D100 len=3D011 func=3Dnaive       (0.031156 0 0.0)
pixels=3D100 len=3D011 func=3Dheuristic+0 (0.012612 0 0.0)
pixels=3D100 len=3D011 func=3Dheuristic+2 (0.024152 0 0.0)
---
pixels=3D100 len=3D023 func=3Dnaive       (0.112267 0 0.0)
pixels=3D100 len=3D023 func=3Dheuristic+0 (0.013013 0 0.0)
pixels=3D100 len=3D023 func=3Dheuristic+2 (0.024733 0 0.0)
---
pixels=3D100 len=3D047 func=3Dnaive       (0.30842200000000003 0 0.0)
pixels=3D100 len=3D047 func=3Dheuristic+0 (0.015078000000000001 0 0.0)
pixels=3D100 len=3D047 func=3Dheuristic+2 (0.026317999999999998 0 0.0)
---
pixels=3D100 len=3D095 func=3Dnaive       (0.837941 0 0.0)
pixels=3D100 len=3D095 func=3Dheuristic+0 (0.018804 0 0.0)
pixels=3D100 len=3D095 func=3Dheuristic+2 (0.029800999999999998 0 0.0)
---
pixels=3D100 len=3D241 func=3Dnaive       (3.611275 1 0.08267299999999977)
pixels=3D100 len=3D241 func=3Dheuristic+0 (0.030516 0 0.0)
pixels=3D100 len=3D241 func=3Dheuristic+2 (0.041586 0 0.0)
---
pixels=3D100 len=3D482 func=3Dnaive       (11.761954 3 0.2521639999999934)
pixels=3D100 len=3D482 func=3Dheuristic+0 (0.047342 0 0.0)
pixels=3D100 len=3D482 func=3Dheuristic+2 (0.058127 0 0.0)
---
pixels=3D500 len=3D003 func=3Dnaive       (0.0059770000000000005 0 0.0)
pixels=3D500 len=3D003 func=3Dheuristic+0 (0.005854 0 0.0)
pixels=3D500 len=3D003 func=3Dheuristic+2 (0.005863 0 0.0)
---
pixels=3D500 len=3D011 func=3Dnaive       (0.006519 0 0.0)
pixels=3D500 len=3D011 func=3Dheuristic+0 (0.006482000000000001 0 0.0)
pixels=3D500 len=3D011 func=3Dheuristic+2 (0.006458 0 0.0)
---
pixels=3D500 len=3D023 func=3Dnaive       (0.007701 0 0.0)
pixels=3D500 len=3D023 func=3Dheuristic+0 (0.007569 0 0.0)
pixels=3D500 len=3D023 func=3Dheuristic+2 (0.007457 0 0.0)
---
pixels=3D500 len=3D047 func=3Dnaive       (0.08771100000000001 0 0.0)
pixels=3D500 len=3D047 func=3Dheuristic+0 (0.017457 0 0.0)
pixels=3D500 len=3D047 func=3Dheuristic+2 (0.035449999999999995 0 0.0)
---
pixels=3D500 len=3D095 func=3Dnaive       (0.617932 0 0.0)
pixels=3D500 len=3D095 func=3Dheuristic+0 (0.021932 0 0.0)
pixels=3D500 len=3D095 func=3Dheuristic+2 (0.038285 0 0.0)
---
pixels=3D500 len=3D241 func=3Dnaive       (3.369256 1 0.08657999999999788)
pixels=3D500 len=3D241 func=3Dheuristic+0 (0.032149 0 0.0)
pixels=3D500 len=3D241 func=3Dheuristic+2 (0.049546 0 0.0)
---
pixels=3D500 len=3D482 func=3Dnaive       (11.297365 2 0.1588390000000004)
pixels=3D500 len=3D482 func=3Dheuristic+0 (0.052947999999999995 0 0.0)
pixels=3D500 len=3D482 func=3Dheuristic+2 (0.067152 0 0.0)
---
pixels=3D1000 len=3D003 func=3Dnaive       (0.006092 0 0.0)
pixels=3D1000 len=3D003 func=3Dheuristic+0 (0.006195 0 0.0)
pixels=3D1000 len=3D003 func=3Dheuristic+2 (0.006086 0 0.0)
---
pixels=3D1000 len=3D011 func=3Dnaive       (0.00685 0 0.0)
pixels=3D1000 len=3D011 func=3Dheuristic+0 (0.006679 0 0.0)
pixels=3D1000 len=3D011 func=3Dheuristic+2 (0.006541000000000001 0 0.0)
---
pixels=3D1000 len=3D023 func=3Dnaive       (0.007906 0 0.0)
pixels=3D1000 len=3D023 func=3Dheuristic+0 (0.007488000000000001 0 0.0)
pixels=3D1000 len=3D023 func=3Dheuristic+2 (0.00746 0 0.0)
---
pixels=3D1000 len=3D047 func=3Dnaive       (0.009493 0 0.0)
pixels=3D1000 len=3D047 func=3Dheuristic+0 (0.009209 0 0.0)
pixels=3D1000 len=3D047 func=3Dheuristic+2 (0.009455 0 0.0)
---
pixels=3D1000 len=3D095 func=3Dnaive       (0.243324 0 0.0)
pixels=3D1000 len=3D095 func=3Dheuristic+0 (0.024391000000000003 0 0.0)
pixels=3D1000 len=3D095 func=3Dheuristic+2 (0.046619999999999995 0 0.0)
---
pixels=3D1000 len=3D241 func=3Dnaive       (2.908423 0 0.0)
pixels=3D1000 len=3D241 func=3Dheuristic+0 (0.035608 0 0.0)
pixels=3D1000 len=3D241 func=3Dheuristic+2 (0.057997 0 0.0)
---
pixels=3D1000 len=3D482 func=3Dnaive       (10.948164 2 0.15671299999999633=
)
pixels=3D1000 len=3D482 func=3Dheuristic+0 (0.053785 0 0.0)
pixels=3D1000 len=3D482 func=3Dheuristic+2 (0.07630200000000001 0 0.0)

-St=C3=A9phane

--00000000000071ceb906463ca0b9
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Thu, Dec 18, 2025 at 11:28=E2=80=AFAM St=C3=A9phane Marks &lt;<a href=3D=
"mailto:shipmints@HIDDEN">shipmints@HIDDEN</a>&gt; wrote:</span></div=
></div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rg=
b(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div dir=3D"ltr"><div sty=
le=3D"font-family:monospace"><span style=3D"font-family:Arial,Helvetica,san=
s-serif">On Thu, Dec 18, 2025 at 9:48=E2=80=AFAM St=C3=A9phane Marks &lt;<a=
 href=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN<=
/a>&gt; wrote:</span></div></div><div class=3D"gmail_quote"><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid =
rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div dir=3D"ltr"><div s=
tyle=3D"font-family:monospace"><span style=3D"font-family:Arial,Helvetica,s=
ans-serif">On Thu, Dec 18, 2025 at 12:50=E2=80=AFAM Eli Zaretskii &lt;<a hr=
ef=3D"mailto:eliz@HIDDEN" target=3D"_blank">eliz@HIDDEN</a>&gt; wrote:</s=
pan></div></div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote=
" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);=
padding-left:1ex">&gt; Cc: Spencer Baugh &lt;<a href=3D"mailto:sbaugh@janes=
treet.com" target=3D"_blank">sbaugh@HIDDEN</a>&gt;,<br>
&gt;=C2=A0 Kristoffer Balintona &lt;<a href=3D"mailto:krisbalintona@HIDDEN=
om" target=3D"_blank">krisbalintona@HIDDEN</a>&gt;,<br>
&gt;=C2=A0 Joost Kremers &lt;<a href=3D"mailto:joostkremers@HIDDEN" ta=
rget=3D"_blank">joostkremers@HIDDEN</a>&gt;, <a href=3D"mailto:ijqq@pr=
otonmail.com" target=3D"_blank">ijqq@HIDDEN</a>,<br>
&gt;=C2=A0 Visuwesh &lt;<a href=3D"mailto:visuweshm@HIDDEN" target=3D"_b=
lank">visuweshm@HIDDEN</a>&gt;, Adam Porter &lt;<a href=3D"mailto:adam@a=
lphapapa.net" target=3D"_blank">adam@HIDDEN</a>&gt;,<br>
&gt;=C2=A0 Lars Ingebrigtsen &lt;<a href=3D"mailto:larsi@HIDDEN" target=
=3D"_blank">larsi@HIDDEN</a>&gt;, Augusto Stoffel &lt;<a href=3D"mailto:a=
rstoffel@HIDDEN" target=3D"_blank">arstoffel@HIDDEN</a>&gt;<br>
&gt; From: St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" t=
arget=3D"_blank">shipmints@HIDDEN</a>&gt;<br>
&gt; Date: Wed, 17 Dec 2025 13:57:20 -0500<br>
&gt; <br>
&gt; This implements a simple heuristic to limit the number of times `strin=
g-pixel-width` gets called by estimating<br>
&gt; the string&#39;s truncation position in advance.=C2=A0 This is overrid=
able column-by-column should some strings in the<br>
&gt; vtable be composed of widely varying font widths that necessitates min=
or adjustments to the heuristic.=C2=A0 This<br>
&gt; approach performs well in testing (and I tested several approaches) an=
d has been tested by more than one<br>
&gt; vtable user.<br>
<br>
Thanks, but are you sure this is not a case of premature optimization?<br>
How important is it to speed up vtable--limit-string?=C2=A0 Can you show<br=
>
some benchmarks which will point to this function as a hotspot?<br>
<br>
Also, changing the algorithm from an exact one to one using heuristic<br>
requires significant testing with various problematic cases: text<br>
using variable fonts and characters of different glyph-width,<br>
character-composition sequences (e.g., emoji), etc.=C2=A0 Could you please<=
br>
add such tests to the suite, so we could be sure this change doesn&#39;t<br=
>
introduce regressions?<br></blockquote><div><br></div><div style=3D"font-fa=
mily:monospace">FWIW, this is not a premature optimization, it is key for v=
table performance with columns of, say 500 pixels, on strings that would oc=
cupy beyond that pixel limit.=C2=A0 If vtable could render only the visible=
 portion of the buffer, it might be less of an issue; however, vtable rende=
rs the entire table every time on bulk refreshes and the existing looping m=
ethod is slow.=C2=A0 Single object changes render single lines so that&#39;=
s less of an issue since their line location in the buffer is computed.</di=
v><div style=3D"font-family:monospace"><br></div><div style=3D"font-family:=
monospace">As far as any negative impact is concerned, without adjustment, =
the worst case is pretty much just a missing displayed character that had b=
een displayed before.</div><div style=3D"font-family:monospace"><br></div><=
div style=3D"font-family:monospace">In any case, one can disable the heuris=
tic for complete backward compatibility by setting a column&#39;s limit-adj=
ustment property to nil for any problematic strings.=C2=A0 I have not yet f=
ound one of those in my use but I don&#39;t use=C2=A0other=C2=A0languages l=
ike Chinese or whatever that=C2=A0might=C2=A0demonstrate more of an issue.<=
/div><div style=3D"font-family:monospace"><br></div><div style=3D"font-fami=
ly:monospace"><div>I will adapt my benchmark code, and add some tests for e=
dge cases such as those you=C2=A0mentioned.=C2=A0 If there are already a st=
ring corpus to test with in the code base, let me know or I&#39;ll take a l=
ook for one.</div></div></div></div></blockquote><div><br></div><div style=
=3D"font-family:monospace">I stole some text from the erc tests and added a=
 bunch more including multi-character emojis and concocted this test which =
compares the naive string limit code to the heuristic code looking for mism=
atches with zero adjustment.=C2=A0 Let me know if there are other cases you=
 think need attention.</div><div style=3D"font-family:monospace"><br></div>=
<div style=3D"font-family:monospace">(ert-deftest test-vtable--limit-string=
-stress ()<br>=C2=A0 (let ((max-pixels 500)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =
(strings (list<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 &quot;foo bar baz foo bar baz foo bar baz foo bar baz foo bar baz fo=
o bar baz&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 (concat &quot;=E8=A9=B1=E8=AA=AA=E5=A4=A9=E4=B8=8B=E5=A4=A7=E5=8B=A2=
=EF=BC=8C=E5=88=86=E4=B9=85=E5=BF=85=E5=90=88=EF=BC=8C=E5=90=88=E4=B9=85=E5=
=BF=85=E5=88=86=EF=BC=9A=E5=91=A8=E6=9C=AB=E4=B8=83=E5=9C=8B=E5=88=86=E7=88=
=AD=EF=BC=8C=E5=B9=B6=E5=85=A5=E6=96=BC=E7=A7=A6=E3=80=82&quot;<br>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 &quot;=E5=8F=8A=E7=A7=A6=E6=BB=85=E4=B9=8B=E5=BE=8C=EF=BC=8C=E6=
=A5=9A=E3=80=81=E6=BC=A2=E5=88=86=E7=88=AD=EF=BC=8C=E5=8F=88=E5=B9=B6=E5=85=
=A5=E6=96=BC=E6=BC=A2=E3=80=82=E6=BC=A2=E6=9C=9D=E8=87=AA=E9=AB=98=E7=A5=96=
=E6=96=AC=E7=99=BD=E8=9B=87=E8=80=8C=E8=B5=B7=E7=BE=A9=EF=BC=8C&quot;<br>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 &quot;=E4=B8=80=E7=B5=B1=E5=A4=A9=E4=B8=8B=E3=80=82=E5=BE=
=8C=E4=BE=86=E5=85=89=E6=AD=A6=E4=B8=AD=E8=88=88=EF=BC=8C=E5=82=B3=E8=87=B3=
=E7=8D=BB=E5=B8=9D=EF=BC=8C=E9=81=82=E5=88=86=E7=82=BA=E4=B8=89=E5=9C=8B=E3=
=80=82=E6=8E=A8=E5=85=B6=E8=87=B4=E4=BA=82=E4=B9=8B=E7=94=B1=EF=BC=8C&quot;=
<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 &quot;=E6=AE=86=E5=A7=8B=E6=96=BC=E6=A1=93=E3=80=81=E9=
=9D=88=E4=BA=8C=E5=B8=9D=E3=80=82=E6=A1=93=E5=B8=9D=E7=A6=81=E9=8C=AE=E5=96=
=84=E9=A1=9E=EF=BC=8C=E5=B4=87=E4=BF=A1=E5=AE=A6=E5=AE=98=E3=80=82=E5=8F=8A=
=E6=A1=93=E5=B8=9D=E5=B4=A9=EF=BC=8C=E9=9D=88=E5=B8=9D=E5=8D=B3=E4=BD=8D=EF=
=BC=8C&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &quot;=E5=A4=A7=E5=B0=87=E8=BB=8D=E7=AB=87=
=E6=AD=A6=E3=80=81=E5=A4=AA=E5=82=85=E9=99=B3=E8=95=83=EF=BC=8C=E5=85=B1=E7=
=9B=B8=E8=BC=94=E4=BD=90=E3=80=82=E6=99=82=E6=9C=89=E5=AE=A6=E5=AE=98=E6=9B=
=B9=E7=AF=80=E7=AD=89=E5=BC=84=E6=AC=8A=EF=BC=8C=E7=AB=87=E6=AD=A6=E3=80=81=
=E9=99=B3=E8=95=83=E8=AC=80=E8=AA=85=E4=B9=8B=EF=BC=8C&quot;<br>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 &quot;=E4=BD=9C=E4=BA=8B=E4=B8=8D=E5=AF=86=EF=BC=8C=E5=8F=8D=E7=82=
=BA=E6=89=80=E5=AE=B3=E3=80=82=E4=B8=AD=E6=B6=93=E8=87=AA=E6=AD=A4=E6=84=88=
=E6=A9=AB&quot;)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 (concat &quot;=D0=BA=D0=BE=D1=80=D0=BE=D1=87=D0=B5 =D1=82=D0=B5=D0=
=BF=D0=B5=D1=80=D1=8C =D0=B5=D1=81=D0=BB=D0=B8 =D0=BF=D0=BE =D1=80=D1=83=D1=
=81=D1=81=D0=BA=D0=B8 =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=8C =D0=
=B2=D1=81=D0=B5 =D1=87=D0=B5=D1=82=D0=BA=D0=BE =D0=B8=D0=BB=D0=B8 =D0=B2=D1=
=81=D0=B5 =D1=80=D0=B0=D0=B2=D0=BD=D0=BE&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &quot; =
=D0=BA=D0=BE=D1=80=D0=BE=D1=87=D0=B5 =D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C =
=D0=B5=D1=81=D0=BB=D0=B8 =D0=BF=D0=BE =D1=80=D1=83=D1=81=D1=81=D0=BA=D0=B8 =
=D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=8C =D0=B2=D1=81=D0=B5 =D1=87=
=D0=B5=D1=82=D0=BA=D0=BE =D0=B8=D0=BB=D0=B8 =D0=B2=D1=81=D0=B5 =D1=80=D0=B0=
=D0=B2=D0=BD=D0=BE&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &quot; =D0=BA=D0=BE=D1=80=D0=
=BE=D1=87=D0=B5 =D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C =D0=B5=D1=81=D0=BB=D0=
=B8 =D0=BF=D0=BE =D1=80=D1=83=D1=81=D1=81=D0=BA=D0=B8 =D0=BD=D0=B0=D0=BF=D0=
=B8=D1=81=D0=B0=D1=82=D1=8C =D0=B2=D1=81=D0=B5 =D1=87=D0=B5=D1=82=D0=BA=D0=
=BE =D0=B8=D0=BB=D0=B8 =D0=B2=D1=81=D0=B5 =D1=80=D0=B0=D0=B2=D0=BD=D0=BE&qu=
ot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 &quot; =D0=BA=D0=BE=D1=80=D0=BE=D1=87=D0=B5 =D1=82=
=D0=B5=D0=BF=D0=B5=D1=80=D1=8C =D0=B5=D1=81=D0=BB=D0=B8 =D0=BF=D0=BE =D1=80=
=D1=83=D1=81=D1=81=D0=BA=D0=B8 =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=
=D1=8C =D0=B2=D1=81=D0=B5 =D1=87=D0=B5=D1=82=D0=BA=D0=BE =D0=B8=D0=BB=D0=B8=
 =D0=B2=D1=81=D0=B5 =D1=80=D0=B0=D0=B2=D0=BD=D0=BE&quot;)<br>=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &quot;=D0=B1=D1=83=D0=B4=
=D0=B5=D1=82=C2=A0=D1=80=D0=B0=D0=B7=D1=80=D1=8B=D0=B2=C2=A0=D1=81=D1=82=D1=
=80=D0=BE=D0=BA=D0=B8=C2=A0=D0=BD=D0=B5=D0=BF=D0=BE=D0=BD=D1=8F=D1=82=D0=BD=
=D0=BE=C2=A0=D0=B3=D0=B4=D0=B5=F0=9F=8F=81=F0=9F=9A=A9=F0=9F=8E=8C=F0=9F=8F=
=B4=F0=9F=8F=B3=EF=B8=8F =F0=9F=8F=B3=EF=B8=8F &lt;200d&gt;=F0=9F=8C=88=F0=
=9F=8F=B3=EF=B8=8F &lt;200d&gt;=E2=9A=A7=EF=B8=8F=F0=9F=8F=B4&lt;200d&gt;=
=E2=98=A0=EF=B8=8F&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 (apply #&#39;concat (make-list 200 &quot;\u0065\u0301 &qu=
ot;)) ; composed e=CC=81 \u00E9<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 (let ((woman-loves-man ; =F0=9F=91=A9=E2=80=8D=E2=
=9D=A4=EF=B8=8F=E2=80=8D=F0=9F=91=A8<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(concat &quot;\N{WOM=
AN}&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quot;\N{ZERO WIDTH=
 JOINER}&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quot;\N{HEAV=
Y BLACK HEART}&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quot;=
\N{VARIATION SELECTOR-16}&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0&quot;\N{ZERO WIDTH JOINER}&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0&quot;\N{MAN}&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0&quot; &quot;)))<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 (apply #&#39;concat (make-list 200 woman-loves-man)))<=
br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (properti=
ze (let ((varying-height-string<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0(mapconcat<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 #&#39;identity<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 (list &quot;AWi!&quot;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (propertize &quot;foo&=
quot; &#39;face &#39;(:height 2.5))<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (propertize &quot;bar&quot; &=
#39;face &#39;(:height 0.5))<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (propertize &quot;baz&quot; &#39;fac=
e &#39;(:height 1.0)))<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 &quot; &quot;)))<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (appl=
y #&#39;concat (make-list 100 varying-height-string)))<br>=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 &#39;face &#39;variable-pitch))))<br>=C2=A0 =C2=A0 (dolist (h=
eight &#39;(1.0 0.5 1.5))<br>=C2=A0 =C2=A0 =C2=A0 (with-temp-buffer<br>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 (face-remap-add-relative &#39;default :height heig=
ht)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 (dolist (string strings)<br>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 (should (eq (length (test-vtable-vtable--limit-str=
ing-naive string max-pixels (current-buffer)))<br>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (length (vtable--limit=
-string string max-pixels (current-buffer) 0)))))))))<br></div><div style=
=3D"font-family:monospace"><br></div><div style=3D"font-family:monospace">I=
 wrote a benchmark ert test but not precisely sure how that works in the co=
ntext of the overall ert suite and how benchmark results are intended to be=
 processed.=C2=A0 Perhaps it should be run by hand and not made an ert test=
 at all but live in the same test file for manual execution.=C2=A0 I didn&#=
39;t see ert examples of package benchmark code that may check for performa=
nce drift or whatever.=C2=A0 Perhaps those live somewhere else.<br></div></=
div></div></blockquote><div><br></div><div class=3D"gmail_default" style=3D=
"font-family:monospace">Benchmark results show that the heuristic outperfor=
ms the naive for every string length and even where the heuristic guess adj=
ustment adds 2 characters.=C2=A0 You can see that long strings suffer drama=
tically.=C2=A0 I also used several long strings provided by Kristoffer from=
 his real-world use cases.=C2=A0 I don&#39;t yet have his permission to add=
 them formally to the test but can trivially concoct similar strings.</div>=
<div class=3D"gmail_default" style=3D"font-family:monospace"><br></div><div=
 class=3D"gmail_default" style=3D"font-family:monospace">The test tries to =
fit strings into 100, 500, and 1000 pixel=C2=A0columns, typical column widt=
h for strings,=C2=A01000 iterations each.</div><div class=3D"gmail_default"=
 style=3D"font-family:monospace"><br></div><div class=3D"gmail_default" sty=
le=3D"font-family:monospace">Considering that I haven&#39;t (yet) been able=
 to break the heuristic, it seems worthy to upgrade vtable--limit-string.=
=C2=A0 I&#39;m guessing Eli has some crazy string combo that will break it =
and force the need for an adjustment character or two.</div><div class=3D"g=
mail_default" style=3D"font-family:monospace"><br></div><div class=3D"gmail=
_default" style=3D"font-family:monospace">Below, naive is the existing vtab=
le--limit-string implementation and the heuristic one is my replacement.=C2=
=A0+0 means no adjustment,=C2=A0+2 means add two characters to test to see =
if it&#39;s slower than the naive version even when pushed.</div><div class=
=3D"gmail_default" style=3D"font-family:monospace"><br></div><div class=3D"=
gmail_default" style=3D"font-family:monospace">pixels=3D100 len=3D003 func=
=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.006355 0 0.0)<br>pixels=3D100 len=3D003 fu=
nc=3Dheuristic+0 (0.006028 0 0.0)<br>pixels=3D100 len=3D003 func=3Dheuristi=
c+2 (0.005978000000000001 0 0.0)<br>---<br>pixels=3D100 len=3D011 func=3Dna=
ive =C2=A0 =C2=A0 =C2=A0 (0.031156 0 0.0)<br>pixels=3D100 len=3D011 func=3D=
heuristic+0 (0.012612 0 0.0)<br>pixels=3D100 len=3D011 func=3Dheuristic+2 (=
0.024152 0 0.0)<br>---<br>pixels=3D100 len=3D023 func=3Dnaive =C2=A0 =C2=A0=
 =C2=A0 (0.112267 0 0.0)<br>pixels=3D100 len=3D023 func=3Dheuristic+0 (0.01=
3013 0 0.0)<br>pixels=3D100 len=3D023 func=3Dheuristic+2 (0.024733 0 0.0)<b=
r>---<br>pixels=3D100 len=3D047 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.308422=
00000000003 0 0.0)<br>pixels=3D100 len=3D047 func=3Dheuristic+0 (0.01507800=
0000000001 0 0.0)<br>pixels=3D100 len=3D047 func=3Dheuristic+2 (0.026317999=
999999998 0 0.0)<br>---<br>pixels=3D100 len=3D095 func=3Dnaive =C2=A0 =C2=
=A0 =C2=A0 (0.837941 0 0.0)<br>pixels=3D100 len=3D095 func=3Dheuristic+0 (0=
.018804 0 0.0)<br>pixels=3D100 len=3D095 func=3Dheuristic+2 (0.029800999999=
999998 0 0.0)<br>---<br>pixels=3D100 len=3D241 func=3Dnaive =C2=A0 =C2=A0 =
=C2=A0 (3.611275 1 0.08267299999999977)<br>pixels=3D100 len=3D241 func=3Dhe=
uristic+0 (0.030516 0 0.0)<br>pixels=3D100 len=3D241 func=3Dheuristic+2 (0.=
041586 0 0.0)<br>---<br>pixels=3D100 len=3D482 func=3Dnaive =C2=A0 =C2=A0 =
=C2=A0 (11.761954 3 0.2521639999999934)<br>pixels=3D100 len=3D482 func=3Dhe=
uristic+0 (0.047342 0 0.0)<br>pixels=3D100 len=3D482 func=3Dheuristic+2 (0.=
058127 0 0.0)<br>---<br>pixels=3D500 len=3D003 func=3Dnaive =C2=A0 =C2=A0 =
=C2=A0 (0.0059770000000000005 0 0.0)<br>pixels=3D500 len=3D003 func=3Dheuri=
stic+0 (0.005854 0 0.0)<br>pixels=3D500 len=3D003 func=3Dheuristic+2 (0.005=
863 0 0.0)<br>---<br>pixels=3D500 len=3D011 func=3Dnaive =C2=A0 =C2=A0 =C2=
=A0 (0.006519 0 0.0)<br>pixels=3D500 len=3D011 func=3Dheuristic+0 (0.006482=
000000000001 0 0.0)<br>pixels=3D500 len=3D011 func=3Dheuristic+2 (0.006458 =
0 0.0)<br>---<br>pixels=3D500 len=3D023 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (=
0.007701 0 0.0)<br>pixels=3D500 len=3D023 func=3Dheuristic+0 (0.007569 0 0.=
0)<br>pixels=3D500 len=3D023 func=3Dheuristic+2 (0.007457 0 0.0)<br>---<br>=
pixels=3D500 len=3D047 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.087711000000000=
01 0 0.0)<br>pixels=3D500 len=3D047 func=3Dheuristic+0 (0.017457 0 0.0)<br>=
pixels=3D500 len=3D047 func=3Dheuristic+2 (0.035449999999999995 0 0.0)<br>-=
--<br>pixels=3D500 len=3D095 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.617932 0 =
0.0)<br>pixels=3D500 len=3D095 func=3Dheuristic+0 (0.021932 0 0.0)<br>pixel=
s=3D500 len=3D095 func=3Dheuristic+2 (0.038285 0 0.0)<br>---<br>pixels=3D50=
0 len=3D241 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (3.369256 1 0.086579999999997=
88)<br>pixels=3D500 len=3D241 func=3Dheuristic+0 (0.032149 0 0.0)<br>pixels=
=3D500 len=3D241 func=3Dheuristic+2 (0.049546 0 0.0)<br>---<br>pixels=3D500=
 len=3D482 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (11.297365 2 0.158839000000000=
4)<br>pixels=3D500 len=3D482 func=3Dheuristic+0 (0.052947999999999995 0 0.0=
)<br>pixels=3D500 len=3D482 func=3Dheuristic+2 (0.067152 0 0.0)<br>---<br>p=
ixels=3D1000 len=3D003 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.006092 0 0.0)<b=
r>pixels=3D1000 len=3D003 func=3Dheuristic+0 (0.006195 0 0.0)<br>pixels=3D1=
000 len=3D003 func=3Dheuristic+2 (0.006086 0 0.0)<br>---<br>pixels=3D1000 l=
en=3D011 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.00685 0 0.0)<br>pixels=3D1000=
 len=3D011 func=3Dheuristic+0 (0.006679 0 0.0)<br>pixels=3D1000 len=3D011 f=
unc=3Dheuristic+2 (0.006541000000000001 0 0.0)<br>---<br>pixels=3D1000 len=
=3D023 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.007906 0 0.0)<br>pixels=3D1000 =
len=3D023 func=3Dheuristic+0 (0.007488000000000001 0 0.0)<br>pixels=3D1000 =
len=3D023 func=3Dheuristic+2 (0.00746 0 0.0)<br>---<br>pixels=3D1000 len=3D=
047 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (0.009493 0 0.0)<br>pixels=3D1000 len=
=3D047 func=3Dheuristic+0 (0.009209 0 0.0)<br>pixels=3D1000 len=3D047 func=
=3Dheuristic+2 (0.009455 0 0.0)<br>---<br>pixels=3D1000 len=3D095 func=3Dna=
ive =C2=A0 =C2=A0 =C2=A0 (0.243324 0 0.0)<br>pixels=3D1000 len=3D095 func=
=3Dheuristic+0 (0.024391000000000003 0 0.0)<br>pixels=3D1000 len=3D095 func=
=3Dheuristic+2 (0.046619999999999995 0 0.0)<br>---<br>pixels=3D1000 len=3D2=
41 func=3Dnaive =C2=A0 =C2=A0 =C2=A0 (2.908423 0 0.0)<br>pixels=3D1000 len=
=3D241 func=3Dheuristic+0 (0.035608 0 0.0)<br>pixels=3D1000 len=3D241 func=
=3Dheuristic+2 (0.057997 0 0.0)<br>---<br>pixels=3D1000 len=3D482 func=3Dna=
ive =C2=A0 =C2=A0 =C2=A0 (10.948164 2 0.15671299999999633)<br>pixels=3D1000=
 len=3D482 func=3Dheuristic+0 (0.053785 0 0.0)<br>pixels=3D1000 len=3D482 f=
unc=3Dheuristic+2 (0.07630200000000001 0 0.0)<br></div><div class=3D"gmail_=
default" style=3D"font-family:monospace"><br></div><div class=3D"gmail_defa=
ult" style=3D"font-family:monospace">-St=C3=A9phane=C2=A0</div></div></div>

--00000000000071ceb906463ca0b9--




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

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


Received: (at 80026) by debbugs.gnu.org; 18 Dec 2025 16:29:16 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 18 11:29:16 2025
Received: from localhost ([127.0.0.1]:55299 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWGsK-0000yB-Ve
	for submit <at> debbugs.gnu.org; Thu, 18 Dec 2025 11:29:16 -0500
Received: from mail-ua1-x934.google.com ([2607:f8b0:4864:20::934]:61458)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vWGsH-0000xu-O9
 for 80026 <at> debbugs.gnu.org; Thu, 18 Dec 2025 11:29:11 -0500
Received: by mail-ua1-x934.google.com with SMTP id
 a1e0cc1a2514c-9412f43cb9eso537245241.2
 for <80026 <at> debbugs.gnu.org>; Thu, 18 Dec 2025 08:29:09 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1766075344; x=1766680144; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=XBY4NLQrXq4kJHnQAIK0W0w5uQM4AQAAado1V30D50g=;
 b=jrHSOQOLfizDbuvfYY5W0zn+dl1upQt0txzeWeVhOiRCPJ4Pge4D5Nve439aeyLfZ/
 1dS4EVhhLASokvbVJBWAtxGxiGyUGay9/ow0eOK6n0YjoPP0mdWMaPKXYBW8Vw/BXnU3
 cDU8ERbCHg1QhkAkE+6dLGoJ3B4EaNsxOahm2uO4w2gSIuyjcCExAch+xlm9risCD8pL
 8iwQ7KEHH2BO3ABncNNKmzBZtbHH/gU1EPIRAeZugXve/3OLhdBYe2VT2GdBlCLbwYUc
 RjQiydR8WTIhVttmNAJM/KG9Saeqkr7h47FX7zc5Rva1f51cIctAyC0CFcJmX2Jr8Nuq
 2GGw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1766075344; x=1766680144;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=XBY4NLQrXq4kJHnQAIK0W0w5uQM4AQAAado1V30D50g=;
 b=B0hOtZdiSrdFaDdR54cVb7a2VFM9tEvJQCYo/Y180FSyVfyB4SXKrXRby14PFfUuIO
 zqLQ0ovXKNb8ueluIKK/YJ4ApbGnG2+G/rfyMxt2Ur3uhSrYmMyOW54KP/Ev9ThIitsV
 bfZbQmaONYXi9Q2LLh/U2vuq7GHkqCMZwFBn8DODvuleXgENwm5GW8DFKPCOzkdTrUS4
 aTUzKo2EtMtFNlomd0JcVMcC6wTrEkeNLRV4a7r6ag7nFaT319rD3ByxxYYNBQkla4FO
 lrigvcqyqaoggxMbHYgo161x/rcUablZ10PmmS9bZM/bCgSG/Vv7gI5oHvnxZVDsTtDd
 l+tQ==
X-Gm-Message-State: AOJu0Yyub3vTXq03pt1Hvr+GTLhLpeTx2W4BlAUHDrJ/Du3M5dBb5gEz
 d62lzGqz50DmF7SMnQ7inYIhym3/XLJVFL1S5+XLyoTpZ+uDZgmMbB13Y7oJsJDg249tgowdIMw
 UFbarMwtGuQ7YHScmrMbkolkgY3O136A=
X-Gm-Gg: AY/fxX77UWoPPBFP9GwbbHvsvhJzzefH4sxoMMNDlfy7dnLTg9eh1Wnx6ShpYf30SF1
 0bnlTBGv8ATrXUxwekawpuXr2ZbcKB/GASM4bLHV63j+QJGh8wYCPrENr1n/zGd8SkJrY70XLFp
 EiA9mbowOHnxoRMwAlTMHqo3+pqmslYPTLVFzVilM7cenkZzX7eUzR6Vp8Biis/CVeovln2HztW
 ryJrmuWl2IdpiLeibRZDMNHoa+fsdN+ine38V5Fbr1DPcdCsM16b2ik8yxCUD76yvCkD2I=
X-Google-Smtp-Source: AGHT+IHboANbATGG38ZRMRpzrYU/o3L4DYdQ3zBsAI7+ELQ6rtNvEk0V9/0Xv7ummVYoLvjr3nyU72zJ4r+tBBC+TfM=
X-Received: by 2002:a05:6102:4a8c:b0:5db:ca9e:b57c with SMTP id
 ada2fe7eead31-5e8277b340emr8032147137.27.1766075343849; Thu, 18 Dec 2025
 08:29:03 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 <86zf7g2v9t.fsf@HIDDEN>
 <CAN+1HbqaOS-Dhf=FayFLcux5RAqd+YTO8sjLm0dgwqfiNN-qow@HIDDEN>
In-Reply-To: <CAN+1HbqaOS-Dhf=FayFLcux5RAqd+YTO8sjLm0dgwqfiNN-qow@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Thu, 18 Dec 2025 11:28:52 -0500
X-Gm-Features: AQt7F2o1IBesGhXzmj2VvOk3_sQjVePqEzGwLGuuhWnqO0JpYwYo4tQ9XIrwhOo
Message-ID: <CAN+1HbpXAa=MK7VbaUvuQnVC1Mb4EqZqj9C-TYNgMxPR2Wb8Aw@HIDDEN>
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
To: Eli Zaretskii <eliz@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000845a1606463c75c7"
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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 (-)

--000000000000845a1606463c75c7
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, Dec 18, 2025 at 9:48=E2=80=AFAM St=C3=A9phane Marks <shipmints@gmai=
l.com> wrote:

> On Thu, Dec 18, 2025 at 12:50=E2=80=AFAM Eli Zaretskii <eliz@HIDDEN> wro=
te:
>
>> > Cc: Spencer Baugh <sbaugh@HIDDEN>,
>> >  Kristoffer Balintona <krisbalintona@HIDDEN>,
>> >  Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
>> >  Visuwesh <visuweshm@HIDDEN>, Adam Porter <adam@HIDDEN>,
>> >  Lars Ingebrigtsen <larsi@HIDDEN>, Augusto Stoffel <
>> arstoffel@HIDDEN>
>> > From: St=C3=A9phane Marks <shipmints@HIDDEN>
>> > Date: Wed, 17 Dec 2025 13:57:20 -0500
>> >
>> > This implements a simple heuristic to limit the number of times
>> `string-pixel-width` gets called by estimating
>> > the string's truncation position in advance.  This is overridable
>> column-by-column should some strings in the
>> > vtable be composed of widely varying font widths that necessitates
>> minor adjustments to the heuristic.  This
>> > approach performs well in testing (and I tested several approaches) an=
d
>> has been tested by more than one
>> > vtable user.
>>
>> Thanks, but are you sure this is not a case of premature optimization?
>> How important is it to speed up vtable--limit-string?  Can you show
>> some benchmarks which will point to this function as a hotspot?
>>
>> Also, changing the algorithm from an exact one to one using heuristic
>> requires significant testing with various problematic cases: text
>> using variable fonts and characters of different glyph-width,
>> character-composition sequences (e.g., emoji), etc.  Could you please
>> add such tests to the suite, so we could be sure this change doesn't
>> introduce regressions?
>>
>
> FWIW, this is not a premature optimization, it is key for vtable
> performance with columns of, say 500 pixels, on strings that would occupy
> beyond that pixel limit.  If vtable could render only the visible portion
> of the buffer, it might be less of an issue; however, vtable renders the
> entire table every time on bulk refreshes and the existing looping method
> is slow.  Single object changes render single lines so that's less of an
> issue since their line location in the buffer is computed.
>
> As far as any negative impact is concerned, without adjustment, the worst
> case is pretty much just a missing displayed character that had been
> displayed before.
>
> In any case, one can disable the heuristic for complete backward
> compatibility by setting a column's limit-adjustment property to nil for
> any problematic strings.  I have not yet found one of those in my use but=
 I
> don't use other languages like Chinese or whatever that might demonstrate
> more of an issue.
>
> I will adapt my benchmark code, and add some tests for edge cases such as
> those you mentioned.  If there are already a string corpus to test with i=
n
> the code base, let me know or I'll take a look for one.
>

I stole some text from the erc tests and added a bunch more including
multi-character emojis and concocted this test which compares the naive
string limit code to the heuristic code looking for mismatches with zero
adjustment.  Let me know if there are other cases you think need attention.

(ert-deftest test-vtable--limit-string-stress ()
  (let ((max-pixels 500)
        (strings (list
                  "foo bar baz foo bar baz foo bar baz foo bar baz foo bar
baz foo bar baz"
                  (concat "=E8=A9=B1=E8=AA=AA=E5=A4=A9=E4=B8=8B=E5=A4=A7=E5=
=8B=A2=EF=BC=8C=E5=88=86=E4=B9=85=E5=BF=85=E5=90=88=EF=BC=8C=E5=90=88=E4=B9=
=85=E5=BF=85=E5=88=86=EF=BC=9A=E5=91=A8=E6=9C=AB=E4=B8=83=E5=9C=8B=E5=88=86=
=E7=88=AD=EF=BC=8C=E5=B9=B6=E5=85=A5=E6=96=BC=E7=A7=A6=E3=80=82"
                          "=E5=8F=8A=E7=A7=A6=E6=BB=85=E4=B9=8B=E5=BE=8C=EF=
=BC=8C=E6=A5=9A=E3=80=81=E6=BC=A2=E5=88=86=E7=88=AD=EF=BC=8C=E5=8F=88=E5=B9=
=B6=E5=85=A5=E6=96=BC=E6=BC=A2=E3=80=82=E6=BC=A2=E6=9C=9D=E8=87=AA=E9=AB=98=
=E7=A5=96=E6=96=AC=E7=99=BD=E8=9B=87=E8=80=8C=E8=B5=B7=E7=BE=A9=EF=BC=8C"
                          "=E4=B8=80=E7=B5=B1=E5=A4=A9=E4=B8=8B=E3=80=82=E5=
=BE=8C=E4=BE=86=E5=85=89=E6=AD=A6=E4=B8=AD=E8=88=88=EF=BC=8C=E5=82=B3=E8=87=
=B3=E7=8D=BB=E5=B8=9D=EF=BC=8C=E9=81=82=E5=88=86=E7=82=BA=E4=B8=89=E5=9C=8B=
=E3=80=82=E6=8E=A8=E5=85=B6=E8=87=B4=E4=BA=82=E4=B9=8B=E7=94=B1=EF=BC=8C"
                          "=E6=AE=86=E5=A7=8B=E6=96=BC=E6=A1=93=E3=80=81=E9=
=9D=88=E4=BA=8C=E5=B8=9D=E3=80=82=E6=A1=93=E5=B8=9D=E7=A6=81=E9=8C=AE=E5=96=
=84=E9=A1=9E=EF=BC=8C=E5=B4=87=E4=BF=A1=E5=AE=A6=E5=AE=98=E3=80=82=E5=8F=8A=
=E6=A1=93=E5=B8=9D=E5=B4=A9=EF=BC=8C=E9=9D=88=E5=B8=9D=E5=8D=B3=E4=BD=8D=EF=
=BC=8C"
                          "=E5=A4=A7=E5=B0=87=E8=BB=8D=E7=AB=87=E6=AD=A6=E3=
=80=81=E5=A4=AA=E5=82=85=E9=99=B3=E8=95=83=EF=BC=8C=E5=85=B1=E7=9B=B8=E8=BC=
=94=E4=BD=90=E3=80=82=E6=99=82=E6=9C=89=E5=AE=A6=E5=AE=98=E6=9B=B9=E7=AF=80=
=E7=AD=89=E5=BC=84=E6=AC=8A=EF=BC=8C=E7=AB=87=E6=AD=A6=E3=80=81=E9=99=B3=E8=
=95=83=E8=AC=80=E8=AA=85=E4=B9=8B=EF=BC=8C"
                          "=E4=BD=9C=E4=BA=8B=E4=B8=8D=E5=AF=86=EF=BC=8C=E5=
=8F=8D=E7=82=BA=E6=89=80=E5=AE=B3=E3=80=82=E4=B8=AD=E6=B6=93=E8=87=AA=E6=AD=
=A4=E6=84=88=E6=A9=AB")
                  (concat "=D0=BA=D0=BE=D1=80=D0=BE=D1=87=D0=B5 =D1=82=D0=
=B5=D0=BF=D0=B5=D1=80=D1=8C =D0=B5=D1=81=D0=BB=D0=B8 =D0=BF=D0=BE =D1=80=D1=
=83=D1=81=D1=81=D0=BA=D0=B8 =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=
=8C =D0=B2=D1=81=D0=B5 =D1=87=D0=B5=D1=82=D0=BA=D0=BE
=D0=B8=D0=BB=D0=B8 =D0=B2=D1=81=D0=B5 =D1=80=D0=B0=D0=B2=D0=BD=D0=BE"
                          " =D0=BA=D0=BE=D1=80=D0=BE=D1=87=D0=B5 =D1=82=D0=
=B5=D0=BF=D0=B5=D1=80=D1=8C =D0=B5=D1=81=D0=BB=D0=B8 =D0=BF=D0=BE =D1=80=D1=
=83=D1=81=D1=81=D0=BA=D0=B8 =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=
=8C =D0=B2=D1=81=D0=B5 =D1=87=D0=B5=D1=82=D0=BA=D0=BE
=D0=B8=D0=BB=D0=B8 =D0=B2=D1=81=D0=B5 =D1=80=D0=B0=D0=B2=D0=BD=D0=BE"
                          " =D0=BA=D0=BE=D1=80=D0=BE=D1=87=D0=B5 =D1=82=D0=
=B5=D0=BF=D0=B5=D1=80=D1=8C =D0=B5=D1=81=D0=BB=D0=B8 =D0=BF=D0=BE =D1=80=D1=
=83=D1=81=D1=81=D0=BA=D0=B8 =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=
=8C =D0=B2=D1=81=D0=B5 =D1=87=D0=B5=D1=82=D0=BA=D0=BE
=D0=B8=D0=BB=D0=B8 =D0=B2=D1=81=D0=B5 =D1=80=D0=B0=D0=B2=D0=BD=D0=BE"
                          " =D0=BA=D0=BE=D1=80=D0=BE=D1=87=D0=B5 =D1=82=D0=
=B5=D0=BF=D0=B5=D1=80=D1=8C =D0=B5=D1=81=D0=BB=D0=B8 =D0=BF=D0=BE =D1=80=D1=
=83=D1=81=D1=81=D0=BA=D0=B8 =D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=
=8C =D0=B2=D1=81=D0=B5 =D1=87=D0=B5=D1=82=D0=BA=D0=BE
=D0=B8=D0=BB=D0=B8 =D0=B2=D1=81=D0=B5 =D1=80=D0=B0=D0=B2=D0=BD=D0=BE")
                  "=D0=B1=D1=83=D0=B4=D0=B5=D1=82 =D1=80=D0=B0=D0=B7=D1=80=
=D1=8B=D0=B2 =D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8 =D0=BD=D0=B5=D0=BF=D0=BE=
=D0=BD=D1=8F=D1=82=D0=BD=D0=BE =D0=B3=D0=B4=D0=B5=F0=9F=8F=81=F0=9F=9A=A9=
=F0=9F=8E=8C=F0=9F=8F=B4=F0=9F=8F=B3=EF=B8=8F =F0=9F=8F=B3=EF=B8=8F
<200d>=F0=9F=8C=88=F0=9F=8F=B3=EF=B8=8F <200d>=E2=9A=A7=EF=B8=8F=F0=9F=8F=
=B4<200d>=E2=98=A0=EF=B8=8F"
                  (apply #'concat (make-list 200 "\u0065\u0301 ")) ;
composed e=CC=81 \u00E9
                  (let ((woman-loves-man ; =F0=9F=91=A9=E2=80=8D=E2=9D=A4=
=EF=B8=8F=E2=80=8D=F0=9F=91=A8
                         (concat "\N{WOMAN}"
                                 "\N{ZERO WIDTH JOINER}"
                                 "\N{HEAVY BLACK HEART}"
                                 "\N{VARIATION SELECTOR-16}"
                                 "\N{ZERO WIDTH JOINER}"
                                 "\N{MAN}"
                                 " ")))
                    (apply #'concat (make-list 200 woman-loves-man)))
                  (propertize (let ((varying-height-string
                                     (mapconcat
                                      #'identity
                                      (list "AWi!"
                                            (propertize "foo" 'face
'(:height 2.5))
                                            (propertize "bar" 'face
'(:height 0.5))
                                            (propertize "baz" 'face
'(:height 1.0)))
                                      " ")))
                                (apply #'concat (make-list 100
varying-height-string)))
                              'face 'variable-pitch))))
    (dolist (height '(1.0 0.5 1.5))
      (with-temp-buffer
        (face-remap-add-relative 'default :height height)
        (dolist (string strings)
          (should (eq (length (test-vtable-vtable--limit-string-naive
string max-pixels (current-buffer)))
                      (length (vtable--limit-string string max-pixels
(current-buffer) 0)))))))))

I wrote a benchmark ert test but not precisely sure how that works in the
context of the overall ert suite and how benchmark results are intended to
be processed.  Perhaps it should be run by hand and not made an ert test at
all but live in the same test file for manual execution.  I didn't see ert
examples of package benchmark code that may check for performance drift or
whatever.  Perhaps those live somewhere else.

-St=C3=A9phane

--000000000000845a1606463c75c7
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64

PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBjbGFzcz0iZ21haWxfZGVmYXVsdCIg
c3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OkFy
aWFsLEhlbHZldGljYSxzYW5zLXNlcmlmIj5PbiBUaHUsIERlYyAxOCwgMjAyNSBhdCA5OjQ44oCv
QU0gU3TDqXBoYW5lIE1hcmtzICZsdDs8YSBocmVmPSJtYWlsdG86c2hpcG1pbnRzQGdtYWlsLmNv
bSI+c2hpcG1pbnRzQGdtYWlsLmNvbTwvYT4mZ3Q7IHdyb3RlOjwvc3Bhbj48L2Rpdj48L2Rpdj48
ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSBnbWFpbF9xdW90ZV9jb250YWluZXIiPjxibG9ja3F1b3Rl
IGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDtib3Jk
ZXItbGVmdDoxcHggc29saWQgcmdiKDIwNCwyMDQsMjA0KTtwYWRkaW5nLWxlZnQ6MWV4Ij48ZGl2
IGRpcj0ibHRyIj48ZGl2IGRpcj0ibHRyIj48ZGl2IHN0eWxlPSJmb250LWZhbWlseTptb25vc3Bh
Y2UiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTpBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZiI+
T24gVGh1LCBEZWMgMTgsIDIwMjUgYXQgMTI6NTDigK9BTSBFbGkgWmFyZXRza2lpICZsdDs8YSBo
cmVmPSJtYWlsdG86ZWxpekBnbnUub3JnIiB0YXJnZXQ9Il9ibGFuayI+ZWxpekBnbnUub3JnPC9h
PiZndDsgd3JvdGU6PC9zcGFuPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48
YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MHB4IDBweCAwcHgg
MC44ZXg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYigyMDQsMjA0LDIwNCk7cGFkZGluZy1sZWZ0
OjFleCI+Jmd0OyBDYzogU3BlbmNlciBCYXVnaCAmbHQ7PGEgaHJlZj0ibWFpbHRvOnNiYXVnaEBq
YW5lc3RyZWV0LmNvbSIgdGFyZ2V0PSJfYmxhbmsiPnNiYXVnaEBqYW5lc3RyZWV0LmNvbTwvYT4m
Z3Q7LDxicj4NCiZndDvCoCBLcmlzdG9mZmVyIEJhbGludG9uYSAmbHQ7PGEgaHJlZj0ibWFpbHRv
OmtyaXNiYWxpbnRvbmFAZ21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+a3Jpc2JhbGludG9uYUBn
bWFpbC5jb208L2E+Jmd0Oyw8YnI+DQomZ3Q7wqAgSm9vc3QgS3JlbWVycyAmbHQ7PGEgaHJlZj0i
bWFpbHRvOmpvb3N0a3JlbWVyc0BmYXN0bWFpbC5mbSIgdGFyZ2V0PSJfYmxhbmsiPmpvb3N0a3Jl
bWVyc0BmYXN0bWFpbC5mbTwvYT4mZ3Q7LCA8YSBocmVmPSJtYWlsdG86aWpxcUBwcm90b25tYWls
LmNvbSIgdGFyZ2V0PSJfYmxhbmsiPmlqcXFAcHJvdG9ubWFpbC5jb208L2E+LDxicj4NCiZndDvC
oCBWaXN1d2VzaCAmbHQ7PGEgaHJlZj0ibWFpbHRvOnZpc3V3ZXNobUBnbWFpbC5jb20iIHRhcmdl
dD0iX2JsYW5rIj52aXN1d2VzaG1AZ21haWwuY29tPC9hPiZndDssIEFkYW0gUG9ydGVyICZsdDs8
YSBocmVmPSJtYWlsdG86YWRhbUBhbHBoYXBhcGEubmV0IiB0YXJnZXQ9Il9ibGFuayI+YWRhbUBh
bHBoYXBhcGEubmV0PC9hPiZndDssPGJyPg0KJmd0O8KgIExhcnMgSW5nZWJyaWd0c2VuICZsdDs8
YSBocmVmPSJtYWlsdG86bGFyc2lAZ251cy5vcmciIHRhcmdldD0iX2JsYW5rIj5sYXJzaUBnbnVz
Lm9yZzwvYT4mZ3Q7LCBBdWd1c3RvIFN0b2ZmZWwgJmx0OzxhIGhyZWY9Im1haWx0bzphcnN0b2Zm
ZWxAZ21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+YXJzdG9mZmVsQGdtYWlsLmNvbTwvYT4mZ3Q7
PGJyPg0KJmd0OyBGcm9tOiBTdMOpcGhhbmUgTWFya3MgJmx0OzxhIGhyZWY9Im1haWx0bzpzaGlw
bWludHNAZ21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+c2hpcG1pbnRzQGdtYWlsLmNvbTwvYT4m
Z3Q7PGJyPg0KJmd0OyBEYXRlOiBXZWQsIDE3IERlYyAyMDI1IDEzOjU3OjIwIC0wNTAwPGJyPg0K
Jmd0OyA8YnI+DQomZ3Q7IFRoaXMgaW1wbGVtZW50cyBhIHNpbXBsZSBoZXVyaXN0aWMgdG8gbGlt
aXQgdGhlIG51bWJlciBvZiB0aW1lcyBgc3RyaW5nLXBpeGVsLXdpZHRoYCBnZXRzIGNhbGxlZCBi
eSBlc3RpbWF0aW5nPGJyPg0KJmd0OyB0aGUgc3RyaW5nJiMzOTtzIHRydW5jYXRpb24gcG9zaXRp
b24gaW4gYWR2YW5jZS7CoCBUaGlzIGlzIG92ZXJyaWRhYmxlIGNvbHVtbi1ieS1jb2x1bW4gc2hv
dWxkIHNvbWUgc3RyaW5ncyBpbiB0aGU8YnI+DQomZ3Q7IHZ0YWJsZSBiZSBjb21wb3NlZCBvZiB3
aWRlbHkgdmFyeWluZyBmb250IHdpZHRocyB0aGF0IG5lY2Vzc2l0YXRlcyBtaW5vciBhZGp1c3Rt
ZW50cyB0byB0aGUgaGV1cmlzdGljLsKgIFRoaXM8YnI+DQomZ3Q7IGFwcHJvYWNoIHBlcmZvcm1z
IHdlbGwgaW4gdGVzdGluZyAoYW5kIEkgdGVzdGVkIHNldmVyYWwgYXBwcm9hY2hlcykgYW5kIGhh
cyBiZWVuIHRlc3RlZCBieSBtb3JlIHRoYW4gb25lPGJyPg0KJmd0OyB2dGFibGUgdXNlci48YnI+
DQo8YnI+DQpUaGFua3MsIGJ1dCBhcmUgeW91IHN1cmUgdGhpcyBpcyBub3QgYSBjYXNlIG9mIHBy
ZW1hdHVyZSBvcHRpbWl6YXRpb24/PGJyPg0KSG93IGltcG9ydGFudCBpcyBpdCB0byBzcGVlZCB1
cCB2dGFibGUtLWxpbWl0LXN0cmluZz/CoCBDYW4geW91IHNob3c8YnI+DQpzb21lIGJlbmNobWFy
a3Mgd2hpY2ggd2lsbCBwb2ludCB0byB0aGlzIGZ1bmN0aW9uIGFzIGEgaG90c3BvdD88YnI+DQo8
YnI+DQpBbHNvLCBjaGFuZ2luZyB0aGUgYWxnb3JpdGhtIGZyb20gYW4gZXhhY3Qgb25lIHRvIG9u
ZSB1c2luZyBoZXVyaXN0aWM8YnI+DQpyZXF1aXJlcyBzaWduaWZpY2FudCB0ZXN0aW5nIHdpdGgg
dmFyaW91cyBwcm9ibGVtYXRpYyBjYXNlczogdGV4dDxicj4NCnVzaW5nIHZhcmlhYmxlIGZvbnRz
IGFuZCBjaGFyYWN0ZXJzIG9mIGRpZmZlcmVudCBnbHlwaC13aWR0aCw8YnI+DQpjaGFyYWN0ZXIt
Y29tcG9zaXRpb24gc2VxdWVuY2VzIChlLmcuLCBlbW9qaSksIGV0Yy7CoCBDb3VsZCB5b3UgcGxl
YXNlPGJyPg0KYWRkIHN1Y2ggdGVzdHMgdG8gdGhlIHN1aXRlLCBzbyB3ZSBjb3VsZCBiZSBzdXJl
IHRoaXMgY2hhbmdlIGRvZXNuJiMzOTt0PGJyPg0KaW50cm9kdWNlIHJlZ3Jlc3Npb25zPzxicj48
L2Jsb2NrcXVvdGU+PGRpdj48YnI+PC9kaXY+PGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3Nw
YWNlIj5GV0lXLCB0aGlzIGlzIG5vdCBhIHByZW1hdHVyZSBvcHRpbWl6YXRpb24sIGl0IGlzIGtl
eSBmb3IgdnRhYmxlIHBlcmZvcm1hbmNlIHdpdGggY29sdW1ucyBvZiwgc2F5IDUwMCBwaXhlbHMs
IG9uIHN0cmluZ3MgdGhhdCB3b3VsZCBvY2N1cHkgYmV5b25kIHRoYXQgcGl4ZWwgbGltaXQuwqAg
SWYgdnRhYmxlIGNvdWxkIHJlbmRlciBvbmx5IHRoZSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIGJ1
ZmZlciwgaXQgbWlnaHQgYmUgbGVzcyBvZiBhbiBpc3N1ZTsgaG93ZXZlciwgdnRhYmxlIHJlbmRl
cnMgdGhlIGVudGlyZSB0YWJsZSBldmVyeSB0aW1lIG9uIGJ1bGsgcmVmcmVzaGVzIGFuZCB0aGUg
ZXhpc3RpbmcgbG9vcGluZyBtZXRob2QgaXMgc2xvdy7CoCBTaW5nbGUgb2JqZWN0IGNoYW5nZXMg
cmVuZGVyIHNpbmdsZSBsaW5lcyBzbyB0aGF0JiMzOTtzIGxlc3Mgb2YgYW4gaXNzdWUgc2luY2Ug
dGhlaXIgbGluZSBsb2NhdGlvbiBpbiB0aGUgYnVmZmVyIGlzIGNvbXB1dGVkLjwvZGl2PjxkaXYg
c3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQt
ZmFtaWx5Om1vbm9zcGFjZSI+QXMgZmFyIGFzIGFueSBuZWdhdGl2ZSBpbXBhY3QgaXMgY29uY2Vy
bmVkLCB3aXRob3V0IGFkanVzdG1lbnQsIHRoZSB3b3JzdCBjYXNlIGlzIHByZXR0eSBtdWNoIGp1
c3QgYSBtaXNzaW5nIGRpc3BsYXllZCBjaGFyYWN0ZXIgdGhhdCBoYWQgYmVlbiBkaXNwbGF5ZWQg
YmVmb3JlLjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+PGJyPjwvZGl2
PjxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+SW4gYW55IGNhc2UsIG9uZSBjYW4g
ZGlzYWJsZSB0aGUgaGV1cmlzdGljIGZvciBjb21wbGV0ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5
IGJ5IHNldHRpbmcgYSBjb2x1bW4mIzM5O3MgbGltaXQtYWRqdXN0bWVudCBwcm9wZXJ0eSB0byBu
aWwgZm9yIGFueSBwcm9ibGVtYXRpYyBzdHJpbmdzLsKgIEkgaGF2ZSBub3QgeWV0IGZvdW5kIG9u
ZSBvZiB0aG9zZSBpbiBteSB1c2UgYnV0IEkgZG9uJiMzOTt0IHVzZcKgb3RoZXLCoGxhbmd1YWdl
cyBsaWtlIENoaW5lc2Ugb3Igd2hhdGV2ZXIgdGhhdMKgbWlnaHTCoGRlbW9uc3RyYXRlIG1vcmUg
b2YgYW4gaXNzdWUuPC9kaXY+PGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlIj48YnI+
PC9kaXY+PGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlIj48ZGl2Pkkgd2lsbCBhZGFw
dCBteSBiZW5jaG1hcmsgY29kZSwgYW5kIGFkZCBzb21lIHRlc3RzIGZvciBlZGdlIGNhc2VzIHN1
Y2ggYXMgdGhvc2UgeW91wqBtZW50aW9uZWQuwqAgSWYgdGhlcmUgYXJlIGFscmVhZHkgYSBzdHJp
bmcgY29ycHVzIHRvIHRlc3Qgd2l0aCBpbiB0aGUgY29kZSBiYXNlLCBsZXQgbWUga25vdyBvciBJ
JiMzOTtsbCB0YWtlIGEgbG9vayBmb3Igb25lLjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvYmxv
Y2txdW90ZT48ZGl2Pjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9kZWZhdWx0IiBzdHlsZT0i
Zm9udC1mYW1pbHk6bW9ub3NwYWNlIj5JIHN0b2xlIHNvbWUgdGV4dCBmcm9tIHRoZSBlcmMgdGVz
dHMgYW5kIGFkZGVkIGEgYnVuY2ggbW9yZSBpbmNsdWRpbmcgbXVsdGktY2hhcmFjdGVyIGVtb2pp
cyBhbmQgY29uY29jdGVkIHRoaXMgdGVzdCB3aGljaCBjb21wYXJlcyB0aGUgbmFpdmUgc3RyaW5n
IGxpbWl0IGNvZGUgdG8gdGhlIGhldXJpc3RpYyBjb2RlIGxvb2tpbmcgZm9yIG1pc21hdGNoZXMg
d2l0aCB6ZXJvIGFkanVzdG1lbnQuwqAgTGV0IG1lIGtub3cgaWYgdGhlcmUgYXJlIG90aGVyIGNh
c2VzIHlvdSB0aGluayBuZWVkIGF0dGVudGlvbi48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9kZWZh
dWx0IiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlIj48YnI+PC9kaXY+PGRpdiBjbGFzcz0i
Z21haWxfZGVmYXVsdCIgc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+KGVydC1kZWZ0ZXN0
IHRlc3QtdnRhYmxlLS1saW1pdC1zdHJpbmctc3RyZXNzICgpPGJyPsKgIChsZXQgKChtYXgtcGl4
ZWxzIDUwMCk8YnI+wqAgwqAgwqAgwqAgKHN0cmluZ3MgKGxpc3Q8YnI+wqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgJnF1b3Q7Zm9vIGJhciBiYXogZm9vIGJhciBiYXogZm9vIGJhciBiYXogZm9v
IGJhciBiYXogZm9vIGJhciBiYXogZm9vIGJhciBiYXomcXVvdDs8YnI+wqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgKGNvbmNhdCAmcXVvdDvoqbHoqqrlpKnkuIvlpKfli6LvvIzliIbkuYXlv4Xl
kIjvvIzlkIjkuYXlv4XliIbvvJrlkajmnKvkuIPlnIvliIbniK3vvIzlubblhaXmlrznp6bjgIIm
cXVvdDs8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJnF1b3Q75Y+K
56em5ruF5LmL5b6M77yM5qWa44CB5ryi5YiG54it77yM5Y+I5bm25YWl5pa85ryi44CC5ryi5pyd
6Ieq6auY56WW5pas55m96JuH6ICM6LW3576p77yMJnF1b3Q7PGJyPsKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O+S4gOe1seWkqeS4i+OAguW+jOS+huWFieatpuS4
reiIiO+8jOWCs+iHs+eNu+W4ne+8jOmBguWIhueCuuS4ieWci+OAguaOqOWFtuiHtOS6guS5i+eU
se+8jCZxdW90Ozxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmcXVv
dDvmroblp4vmlrzmoZPjgIHpnYjkuozluJ3jgILmoZPluJ3npoHpjK7lloTpoZ7vvIzltIfkv6Hl
rqblrpjjgILlj4rmoZPluJ3ltKnvvIzpnYjluJ3ljbPkvY3vvIwmcXVvdDs8YnI+wqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJnF1b3Q75aSn5bCH6LuN56uH5q2m44CB5aSq
5YKF6Zmz6JWD77yM5YWx55u46LyU5L2Q44CC5pmC5pyJ5a6m5a6Y5pu556+A562J5byE5qyK77yM
56uH5q2m44CB6Zmz6JWD6KyA6KqF5LmL77yMJnF1b3Q7PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O+S9nOS6i+S4jeWvhu+8jOWPjeeCuuaJgOWus+OAguS4
rea2k+iHquatpOaEiOapqyZxdW90Oyk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKGNv
bmNhdCAmcXVvdDvQutC+0YDQvtGH0LUg0YLQtdC/0LXRgNGMINC10YHQu9C4INC/0L4g0YDRg9GB
0YHQutC4INC90LDQv9C40YHQsNGC0Ywg0LLRgdC1INGH0LXRgtC60L4g0LjQu9C4INCy0YHQtSDR
gNCw0LLQvdC+JnF1b3Q7PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
ICZxdW90OyDQutC+0YDQvtGH0LUg0YLQtdC/0LXRgNGMINC10YHQu9C4INC/0L4g0YDRg9GB0YHQ
utC4INC90LDQv9C40YHQsNGC0Ywg0LLRgdC1INGH0LXRgtC60L4g0LjQu9C4INCy0YHQtSDRgNCw
0LLQvdC+JnF1b3Q7PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZx
dW90OyDQutC+0YDQvtGH0LUg0YLQtdC/0LXRgNGMINC10YHQu9C4INC/0L4g0YDRg9GB0YHQutC4
INC90LDQv9C40YHQsNGC0Ywg0LLRgdC1INGH0LXRgtC60L4g0LjQu9C4INCy0YHQtSDRgNCw0LLQ
vdC+JnF1b3Q7PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90
OyDQutC+0YDQvtGH0LUg0YLQtdC/0LXRgNGMINC10YHQu9C4INC/0L4g0YDRg9GB0YHQutC4INC9
0LDQv9C40YHQsNGC0Ywg0LLRgdC1INGH0LXRgtC60L4g0LjQu9C4INCy0YHQtSDRgNCw0LLQvdC+
JnF1b3Q7KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmcXVvdDvQsdGD0LTQtdGCwqDR
gNCw0LfRgNGL0LLCoNGB0YLRgNC+0LrQuMKg0L3QtdC/0L7QvdGP0YLQvdC+wqDQs9C00LXwn4+B
8J+aqfCfjozwn4+08J+Ps++4jyDwn4+z77iPICZsdDsyMDBkJmd0O/CfjIjwn4+z77iPICZsdDsy
MDBkJmd0O+Kap++4j/Cfj7QmbHQ7MjAwZCZndDvimKDvuI8mcXVvdDs8YnI+wqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgKGFwcGx5ICMmIzM5O2NvbmNhdCAobWFrZS1saXN0IDIwMCAmcXVvdDtc
dTAwNjVcdTAzMDEgJnF1b3Q7KSkgOyBjb21wb3NlZCBlzIEgXHUwMEU5PGJyPsKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIChsZXQgKCh3b21hbi1sb3Zlcy1tYW4gOyDwn5Gp4oCN4p2k77iP4oCN
8J+RqDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChjb25jYXQgJnF1
b3Q7XE57V09NQU59JnF1b3Q7PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgJnF1b3Q7XE57WkVSTyBXSURUSCBKT0lORVJ9JnF1b3Q7PGJyPsKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7XE57SEVB
VlkgQkxBQ0sgSEVBUlR9JnF1b3Q7PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7XE57VkFSSUFUSU9OIFNFTEVDVE9SLTE2fSZxdW90Ozxi
cj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90
O1xOe1pFUk8gV0lEVEggSk9JTkVSfSZxdW90Ozxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O1xOe01BTn0mcXVvdDs8YnI+wqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDsgJnF1b3Q7KSkp
PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChhcHBseSAjJiMzOTtjb25jYXQgKG1h
a2UtbGlzdCAyMDAgd29tYW4tbG92ZXMtbWFuKSkpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIChwcm9wZXJ0aXplIChsZXQgKCh2YXJ5aW5nLWhlaWdodC1zdHJpbmc8YnI+wqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAobWFwY29uY2F0
PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgICMmIzM5O2lkZW50aXR5PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIChsaXN0ICZxdW90O0FXaSEmcXVvdDs8YnI+wqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
KHByb3BlcnRpemUgJnF1b3Q7Zm9vJnF1b3Q7ICYjMzk7ZmFjZSAmIzM5Oyg6aGVpZ2h0IDIuNSkp
PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIChwcm9wZXJ0aXplICZxdW90O2JhciZxdW90OyAmIzM5O2ZhY2UgJiMzOTso
OmhlaWdodCAwLjUpKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAocHJvcGVydGl6ZSAmcXVvdDtiYXomcXVvdDsgJiMz
OTtmYWNlICYjMzk7KDpoZWlnaHQgMS4wKSkpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90OyAmcXVvdDspKSk8YnI+wqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKGFwcGx5ICMmIzM5O2Nv
bmNhdCAobWFrZS1saXN0IDEwMCB2YXJ5aW5nLWhlaWdodC1zdHJpbmcpKSk8YnI+wqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJiMzOTtmYWNlICYjMzk7dmFyaWFi
bGUtcGl0Y2gpKSkpPGJyPsKgIMKgIChkb2xpc3QgKGhlaWdodCAmIzM5OygxLjAgMC41IDEuNSkp
PGJyPsKgIMKgIMKgICh3aXRoLXRlbXAtYnVmZmVyPGJyPsKgIMKgIMKgIMKgIChmYWNlLXJlbWFw
LWFkZC1yZWxhdGl2ZSAmIzM5O2RlZmF1bHQgOmhlaWdodCBoZWlnaHQpPGJyPsKgIMKgIMKgIMKg
IChkb2xpc3QgKHN0cmluZyBzdHJpbmdzKTxicj7CoCDCoCDCoCDCoCDCoCAoc2hvdWxkIChlcSAo
bGVuZ3RoICh0ZXN0LXZ0YWJsZS12dGFibGUtLWxpbWl0LXN0cmluZy1uYWl2ZSBzdHJpbmcgbWF4
LXBpeGVscyAoY3VycmVudC1idWZmZXIpKSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgKGxlbmd0aCAodnRhYmxlLS1saW1pdC1zdHJpbmcgc3RyaW5nIG1heC1waXhlbHMgKGN1
cnJlbnQtYnVmZmVyKSAwKSkpKSkpKSkpPGJyPjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2RlZmF1
bHQiIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJn
bWFpbF9kZWZhdWx0IiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlIj5JIHdyb3RlIGEgYmVu
Y2htYXJrIGVydCB0ZXN0IGJ1dCBub3QgcHJlY2lzZWx5IHN1cmUgaG93IHRoYXQgd29ya3MgaW4g
dGhlIGNvbnRleHQgb2YgdGhlIG92ZXJhbGwgZXJ0IHN1aXRlIGFuZCBob3cgYmVuY2htYXJrIHJl
c3VsdHMgYXJlIGludGVuZGVkIHRvIGJlIHByb2Nlc3NlZC7CoCBQZXJoYXBzIGl0IHNob3VsZCBi
ZSBydW4gYnkgaGFuZCBhbmQgbm90IG1hZGUgYW4gZXJ0IHRlc3QgYXQgYWxsIGJ1dCBsaXZlIGlu
IHRoZSBzYW1lIHRlc3QgZmlsZSBmb3IgbWFudWFsIGV4ZWN1dGlvbi7CoCBJIGRpZG4mIzM5O3Qg
c2VlIGVydCBleGFtcGxlcyBvZiBwYWNrYWdlIGJlbmNobWFyayBjb2RlIHRoYXQgbWF5IGNoZWNr
IGZvciBwZXJmb3JtYW5jZSBkcmlmdCBvciB3aGF0ZXZlci7CoCBQZXJoYXBzIHRob3NlIGxpdmUg
c29tZXdoZXJlIGVsc2UuPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZGVmYXVsdCIgc3R5bGU9ImZv
bnQtZmFtaWx5Om1vbm9zcGFjZSI+PGJyPjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2RlZmF1bHQi
IHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UiPi1TdMOpcGhhbmXCoDwvZGl2PjwvZGl2Pjwv
ZGl2Pg0K
--000000000000845a1606463c75c7--




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

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


Received: (at 80026) by debbugs.gnu.org; 18 Dec 2025 14:48:33 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 18 09:48:33 2025
Received: from localhost ([127.0.0.1]:53071 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWFIs-0001tA-5o
	for submit <at> debbugs.gnu.org; Thu, 18 Dec 2025 09:48:33 -0500
Received: from mail-ua1-x935.google.com ([2607:f8b0:4864:20::935]:46528)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vWFIp-0001sr-3Q
 for 80026 <at> debbugs.gnu.org; Thu, 18 Dec 2025 09:48:28 -0500
Received: by mail-ua1-x935.google.com with SMTP id
 a1e0cc1a2514c-93f69720a7cso369822241.1
 for <80026 <at> debbugs.gnu.org>; Thu, 18 Dec 2025 06:48:27 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1766069301; x=1766674101; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=T+/vYx4hbsR10XG9BtrpAywJkA6vF3It1HojPWdnAJ4=;
 b=KSW79S0gnpyhLtkNGCm/GUfP+y6Lf4sBHA/Ts++yC2t46L0wI5CtH7QZx7P/gUUm+X
 xHauL2Ah3juaZ0RVTU/HU/NsXsdZWGGkmL43mkmGFOJSZkle5+GCtA/ngJMbvrA8sKhI
 k2SA/6Rdz6FX923phJFcHlTlmDid6bwewhwy5epcs18Rs1d/VW0jzujg3RDVLwkhm9bS
 /gr/tCOQVpWZsD+++iJKWnYDJLUoY9DZGW7wnMk7BakgRlrFOPT+jZm+RQWuZqsiLTBn
 C12YxsAt59uEaUMkEU9u4uYfegzC6IIlLa1l88gxF0olZgkOf3Eg6fluJPiNbFDRAoy+
 ckrQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1766069301; x=1766674101;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=T+/vYx4hbsR10XG9BtrpAywJkA6vF3It1HojPWdnAJ4=;
 b=SNtLQ4hTH9FWW73V9sNoCrI0f37L6fuz8usDgWm+4ptR6htzfT7MV2IO1cD8Tja4ML
 nsnnTBvcgze/tqspp26wIIEB9tKiY+X5WT87nnmR1VA+huStyWMa2kq585haxH0U4/8+
 36C99Z8+LPfA9QVVYpPrBFp5+e+gnmSE6vSX5tsptD07tCcF/J6dPGviWpLsMwyGpb7b
 4iD6+dhVT/8CO+ViUPjQTNvvkt/Nc23MKzETmlFsgNn+Fv35gMkdkrbbB3JwluDPIAN8
 5cXtGbVcxtJPw5JR4jKPnbKB2j+GkVb07t52WjC/q7WClWuc3qbyfpt9aKYz+ky2b+o4
 6WyQ==
X-Gm-Message-State: AOJu0YyyU1WD5n+QEMryrn+kRZREOAccQ+jmejrkV2S8eGFJEliSJOty
 vlkbHrU4T/P/8/tGv2d9EyzOQjs9BP6GdU48qFqRoTRFzeOKw4Mj3AsvoN2FRuO9v8SRCaZTf0g
 MepEXtrkMF9gY4al6obRUIeqTC9bpuGI=
X-Gm-Gg: AY/fxX6XRNvfKCKHNCnRwupr5+Aq3e0NE6kanrH7Zfm7tpFfpxGUOM2vdnq3lAE7yOA
 V4oywKbfwCTlFh87e0z8IMtrQ15NHJdmY0Hq/O1hbhmiShPRWjSF+5VNCD96EpqIGQrcv6kIzW1
 9LCEr/zfJdawRHkwNsipGSECvKCesxfKN/mtOQlUZQwco8XNUaFbMLNJkdz9QtaZRqnA/s6j4CP
 QUjQq0pvG+jdMWMg4ZM3xhQFjHny4850W5s9NLfz+mevVZSx6RLPsz/mdP843uoyc4lm2TqZRYV
 BM4gaQ==
X-Google-Smtp-Source: AGHT+IEaPkJaypS/Jcpj89+xws+/HMgw/ZqyNgp8ejpF5zbC7nrAjd5nKI13yPCmfOoQf7rwMxxX1C9qniYcExF/Ilg=
X-Received: by 2002:a05:6102:8002:b0:5dd:b61a:a9c5 with SMTP id
 ada2fe7eead31-5e8272a5b7bmr7929797137.0.1766069301183; Thu, 18 Dec 2025
 06:48:21 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 <86zf7g2v9t.fsf@HIDDEN>
In-Reply-To: <86zf7g2v9t.fsf@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Thu, 18 Dec 2025 09:48:09 -0500
X-Gm-Features: AQt7F2pcHLWSmbLrpU-GlvDstQkYc_uPM0JhHnLIV5Fh6Mc7jTK3m4yn_Bcxciw
Message-ID: <CAN+1HbqaOS-Dhf=FayFLcux5RAqd+YTO8sjLm0dgwqfiNN-qow@HIDDEN>
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
To: Eli Zaretskii <eliz@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000588a4f06463b0d0b"
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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 (-)

--000000000000588a4f06463b0d0b
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, Dec 18, 2025 at 12:50=E2=80=AFAM Eli Zaretskii <eliz@HIDDEN> wrote=
:

> > Cc: Spencer Baugh <sbaugh@HIDDEN>,
> >  Kristoffer Balintona <krisbalintona@HIDDEN>,
> >  Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
> >  Visuwesh <visuweshm@HIDDEN>, Adam Porter <adam@HIDDEN>,
> >  Lars Ingebrigtsen <larsi@HIDDEN>, Augusto Stoffel <
> arstoffel@HIDDEN>
> > From: St=C3=A9phane Marks <shipmints@HIDDEN>
> > Date: Wed, 17 Dec 2025 13:57:20 -0500
> >
> > This implements a simple heuristic to limit the number of times
> `string-pixel-width` gets called by estimating
> > the string's truncation position in advance.  This is overridable
> column-by-column should some strings in the
> > vtable be composed of widely varying font widths that necessitates mino=
r
> adjustments to the heuristic.  This
> > approach performs well in testing (and I tested several approaches) and
> has been tested by more than one
> > vtable user.
>
> Thanks, but are you sure this is not a case of premature optimization?
> How important is it to speed up vtable--limit-string?  Can you show
> some benchmarks which will point to this function as a hotspot?
>
> Also, changing the algorithm from an exact one to one using heuristic
> requires significant testing with various problematic cases: text
> using variable fonts and characters of different glyph-width,
> character-composition sequences (e.g., emoji), etc.  Could you please
> add such tests to the suite, so we could be sure this change doesn't
> introduce regressions?
>

FWIW, this is not a premature optimization, it is key for vtable
performance with columns of, say 500 pixels, on strings that would occupy
beyond that pixel limit.  If vtable could render only the visible portion
of the buffer, it might be less of an issue; however, vtable renders the
entire table every time on bulk refreshes and the existing looping method
is slow.  Single object changes render single lines so that's less of an
issue since their line location in the buffer is computed.

As far as any negative impact is concerned, without adjustment, the worst
case is pretty much just a missing displayed character that had been
displayed before.

In any case, one can disable the heuristic for complete backward
compatibility by setting a column's limit-adjustment property to nil for
any problematic strings.  I have not yet found one of those in my use but I
don't use other languages like Chinese or whatever that might demonstrate
more of an issue.

I will adapt my benchmark code, and add some tests for edge cases such as
those you mentioned.  If there are already a string corpus to test with in
the code base, let me know or I'll take a look for one.

--000000000000588a4f06463b0d0b
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Thu, Dec 18, 2025 at 12:50=E2=80=AFAM Eli Zaretskii &lt;<a href=3D"mailt=
o:eliz@HIDDEN">eliz@HIDDEN</a>&gt; wrote:</span></div></div><div class=3D=
"gmail_quote gmail_quote_container"><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex">&gt; Cc: Spencer Baugh &lt;<a href=3D"mailto:sbaugh@HIDDEN=
om" target=3D"_blank">sbaugh@HIDDEN</a>&gt;,<br>
&gt;=C2=A0 Kristoffer Balintona &lt;<a href=3D"mailto:krisbalintona@HIDDEN=
om" target=3D"_blank">krisbalintona@HIDDEN</a>&gt;,<br>
&gt;=C2=A0 Joost Kremers &lt;<a href=3D"mailto:joostkremers@HIDDEN" ta=
rget=3D"_blank">joostkremers@HIDDEN</a>&gt;, <a href=3D"mailto:ijqq@pr=
otonmail.com" target=3D"_blank">ijqq@HIDDEN</a>,<br>
&gt;=C2=A0 Visuwesh &lt;<a href=3D"mailto:visuweshm@HIDDEN" target=3D"_b=
lank">visuweshm@HIDDEN</a>&gt;, Adam Porter &lt;<a href=3D"mailto:adam@a=
lphapapa.net" target=3D"_blank">adam@HIDDEN</a>&gt;,<br>
&gt;=C2=A0 Lars Ingebrigtsen &lt;<a href=3D"mailto:larsi@HIDDEN" target=
=3D"_blank">larsi@HIDDEN</a>&gt;, Augusto Stoffel &lt;<a href=3D"mailto:a=
rstoffel@HIDDEN" target=3D"_blank">arstoffel@HIDDEN</a>&gt;<br>
&gt; From: St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" t=
arget=3D"_blank">shipmints@HIDDEN</a>&gt;<br>
&gt; Date: Wed, 17 Dec 2025 13:57:20 -0500<br>
&gt; <br>
&gt; This implements a simple heuristic to limit the number of times `strin=
g-pixel-width` gets called by estimating<br>
&gt; the string&#39;s truncation position in advance.=C2=A0 This is overrid=
able column-by-column should some strings in the<br>
&gt; vtable be composed of widely varying font widths that necessitates min=
or adjustments to the heuristic.=C2=A0 This<br>
&gt; approach performs well in testing (and I tested several approaches) an=
d has been tested by more than one<br>
&gt; vtable user.<br>
<br>
Thanks, but are you sure this is not a case of premature optimization?<br>
How important is it to speed up vtable--limit-string?=C2=A0 Can you show<br=
>
some benchmarks which will point to this function as a hotspot?<br>
<br>
Also, changing the algorithm from an exact one to one using heuristic<br>
requires significant testing with various problematic cases: text<br>
using variable fonts and characters of different glyph-width,<br>
character-composition sequences (e.g., emoji), etc.=C2=A0 Could you please<=
br>
add such tests to the suite, so we could be sure this change doesn&#39;t<br=
>
introduce regressions?<br></blockquote><div><br></div><div class=3D"gmail_d=
efault" style=3D"font-family:monospace">FWIW, this is not a premature optim=
ization, it is key for vtable performance with columns of, say 500 pixels, =
on strings that would occupy beyond that pixel limit.=C2=A0 If vtable could=
 render only the visible portion of the buffer, it might be less of an issu=
e; however, vtable renders the entire table every time on bulk refreshes an=
d the existing looping method is slow.=C2=A0 Single object changes render s=
ingle lines so that&#39;s less of an issue since their line location in the=
 buffer is computed.</div><div class=3D"gmail_default" style=3D"font-family=
:monospace"><br></div><div class=3D"gmail_default" style=3D"font-family:mon=
ospace">As far as any negative impact is concerned, without adjustment, the=
 worst case is pretty much just a missing displayed character that had been=
 displayed before.</div><div class=3D"gmail_default" style=3D"font-family:m=
onospace"><br></div><div class=3D"gmail_default" style=3D"font-family:monos=
pace">In any case, one can disable the heuristic for complete backward comp=
atibility by setting a column&#39;s limit-adjustment property to nil for an=
y problematic strings.=C2=A0 I have not yet found one of those in my use bu=
t I don&#39;t use=C2=A0other=C2=A0languages like Chinese or whatever that=
=C2=A0might=C2=A0demonstrate more of an issue.</div><div class=3D"gmail_def=
ault" style=3D"font-family:monospace"><br></div><div class=3D"gmail_default=
" style=3D"font-family:monospace"><div class=3D"gmail_default">I will adapt=
 my benchmark code, and add some tests for edge cases such as those you=C2=
=A0mentioned.=C2=A0 If there are already a string corpus to test with in th=
e code base, let me know or I&#39;ll take a look for one.</div></div></div>=
</div>

--000000000000588a4f06463b0d0b--




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

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


Received: (at 80026) by debbugs.gnu.org; 18 Dec 2025 05:50:56 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 18 00:50:56 2025
Received: from localhost ([127.0.0.1]:48601 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vW6ua-0007wU-L9
	for submit <at> debbugs.gnu.org; Thu, 18 Dec 2025 00:50:56 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10]:36038)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1vW6uX-0007wG-QM
 for 80026 <at> debbugs.gnu.org; Thu, 18 Dec 2025 00:50:51 -0500
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1vW6uR-0005M6-Go; Thu, 18 Dec 2025 00:50:43 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=MNONo79JUn5NrUfpC08rYs1yrDkZoYF80uEnELiOgK0=; b=CjILWtICKf8RtjnBpDT7
 BuLoVvlH7bwpewov1msQLobIBYAwsFziS8ZYU0YPoRqx6H61Og5CoP4CIcmCUIhdsbF+o3ra+hOpV
 S28c9o71UUdhzXHePb8cswm7tgAfGc77wluEN8TLACpgVCIgShcnrb99NsyyZJdl/bNUVpyGSkJuC
 g1myIunK8WhiWGN8eClwK/sSgtN7bH3s240YkZQF4fiXaDLLr1LEDDqeuiDUOvPlVsjy/to5+cX/U
 lbh6tBFyf++Y6O5RnnQpvp6Pa8Q146L+O8DRsOf/cxbx+iQnN9q0KO+c4V0n6c4iYHcOEVgLvEopI
 a7WHxTrUjjk7GA==;
Date: Thu, 18 Dec 2025 07:50:38 +0200
Message-Id: <86zf7g2v9t.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
In-Reply-To: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
 (message from =?utf-8?Q?St=C3=A9phane?= Marks on Wed, 17 Dec 2025 13:57:20
 -0500)
Subject: Re: bug#80026: [PATCH] Improve vtable--limit-string performance
References: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@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: 80026
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 80026 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@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 (-)

> Cc: Spencer Baugh <sbaugh@HIDDEN>,
>  Kristoffer Balintona <krisbalintona@HIDDEN>,
>  Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
>  Visuwesh <visuweshm@HIDDEN>, Adam Porter <adam@HIDDEN>,
>  Lars Ingebrigtsen <larsi@HIDDEN>, Augusto Stoffel <arstoffel@HIDDEN>
> From: Stéphane Marks <shipmints@HIDDEN>
> Date: Wed, 17 Dec 2025 13:57:20 -0500
> 
> This implements a simple heuristic to limit the number of times `string-pixel-width` gets called by estimating
> the string's truncation position in advance.  This is overridable column-by-column should some strings in the
> vtable be composed of widely varying font widths that necessitates minor adjustments to the heuristic.  This
> approach performs well in testing (and I tested several approaches) and has been tested by more than one
> vtable user.

Thanks, but are you sure this is not a case of premature optimization?
How important is it to speed up vtable--limit-string?  Can you show
some benchmarks which will point to this function as a hotspot?

Also, changing the algorithm from an exact one to one using heuristic
requires significant testing with various problematic cases: text
using variable fonts and characters of different glyph-width,
character-composition sequences (e.g., emoji), etc.  Could you please
add such tests to the suite, so we could be sure this change doesn't
introduce regressions?




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

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


Received: (at submit) by debbugs.gnu.org; 17 Dec 2025 18:57:51 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 17 13:57:51 2025
Received: from localhost ([127.0.0.1]:45733 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vVwic-0006XN-O9
	for submit <at> debbugs.gnu.org; Wed, 17 Dec 2025 13:57:51 -0500
Received: from lists.gnu.org ([2001:470:142::17]:55196)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vVwia-0006X2-Cg
 for submit <at> debbugs.gnu.org; Wed, 17 Dec 2025 13:57:48 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <shipmints@HIDDEN>)
 id 1vVwiM-0008A0-Kq
 for bug-gnu-emacs@HIDDEN; Wed, 17 Dec 2025 13:57:37 -0500
Received: from mail-vk1-xa2b.google.com ([2607:f8b0:4864:20::a2b])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <shipmints@HIDDEN>)
 id 1vVwiK-0006OQ-Sj
 for bug-gnu-emacs@HIDDEN; Wed, 17 Dec 2025 13:57:34 -0500
Received: by mail-vk1-xa2b.google.com with SMTP id
 71dfb90a1353d-55b4dafb425so602085e0c.1
 for <bug-gnu-emacs@HIDDEN>; Wed, 17 Dec 2025 10:57:32 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765997851; x=1766602651; darn=gnu.org;
 h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject
 :date:message-id:reply-to;
 bh=yydn/uPeOcNChDl8Qbcou8HC87YghgbyFHUHTD3czQg=;
 b=RIpUW7jvwFT5nWsgiwjS2i5cDnxcWczUicGMhT/cXXCXzXLx4zX6Rrwk2EBnh6csCc
 ipBqUFr8mr1vh4hdZGGn9v1NsPBYRfwWmIikm/qh/uF+y7qm5RSOI6wwe7LALJR6MaHs
 J1yrcCVGWaw/Z58tGtE9hkKt4U3bhY6XbVJgwwRx0CIBJgc9EIZUWj3wUS0prEEjAhfC
 LNHTY8ki/Rx8+AplUPL53PJsQcpM+bzdIwSh0BZab/e1PZxTGGkmhjG4xiO732RbSc3s
 2F+D5SAOlE3u8Ipf8dbBuNgPCPtJrAwTIVyqQcoPOLMkpZ9ykgjxPjpo6XrLHGkQzZMN
 7N0w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765997851; x=1766602651;
 h=cc:to:subject:message-id:date:from:mime-version:x-gm-gg
 :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=yydn/uPeOcNChDl8Qbcou8HC87YghgbyFHUHTD3czQg=;
 b=GFaRxlmicRQX98eeVXkj1FQgQfYB22z89wdeAv5tHRUNGPiq9giXKftMMGyh/O3dXl
 kO7uKfAhhp+kc+3Au048DFD+IY/yUjoBY/QytlLQNlxdIopqzHlPWIQCzBYFwB0zrH6d
 zuJpq++LRtc16sDEWzZCpiwM0w4hupJNIHhlbcKp1JEE74lYBJnKzfomuTh9NJaR8yWi
 5c9EiKAuAuTZf2QObJGGtChV5DhOc3++3xi8hpQeZC6nG4YUMYdypTExOmQA4x3ntvf+
 V3zpsvzB0pgAiZ6rb4z22UWUt+VbJY8Lm0mhClEMRhSsb/5PcDpnUzhavDnJO3M/wwAd
 OKkQ==
X-Gm-Message-State: AOJu0Yzc6DJvOzU9Z0bZ5Z1aQHmW99rwInoNnCMJ7N2KWLPDhQVhRc79
 lpFVdYvBIA26b9Q6uk3SjBzFrRdHSbplmoBhxzMSx/qY12UFiksb/fOTixau38OrcAdm61OkouD
 NO1i35HkLkMOVxf+8RQBjJ6e8N3Wl9Xling==
X-Gm-Gg: AY/fxX51TFXACqRdUcneEBza9hJrsnONRld6psrLzIYtSeWyHw64KoMe/TGnUI0gEJD
 NWTEELlaxxSwBNvKwsLcqok7cL0VNPfjM8TT6XMxpLIuuj0tjdGmPwWP+f6X2D2opIay0ufo6p8
 vbs6cvk1DWyqPJ4d84l9MflQjirkbkdwbry2kPxRL6FpRwproGJMV9OX5yucZJTOg+O48mIXWjI
 9X9rY4XRK4kmvO7gb9ZYlOD8EnkI9PZBdwNucBcmspry0QrzhKwTozcxZXHTAMtTBbypIU=
X-Google-Smtp-Source: AGHT+IGtNv0llrYotTMHRbjhV/sQjwSLXhGpD9UjPENcY5Gj91wbHlL9OrjALmwfGwHGMewUJbXa9lQYAAT3vMXGPQY=
X-Received: by 2002:a05:6122:4311:b0:55e:82c3:e1fb with SMTP id
 71dfb90a1353d-5614f786039mr197820e0c.10.1765997851533; Wed, 17 Dec 2025
 10:57:31 -0800 (PST)
MIME-Version: 1.0
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Wed, 17 Dec 2025 13:57:20 -0500
X-Gm-Features: AQt7F2rLC0habl-WBykBNDVR-_sMtJFOe2twSArzNhYBlLvhVp8GAr-9JwqGDY4
Message-ID: <CAN+1HbqKXXc+20yaSkkQuGCn-H0zGenZZFdTH3Ts=LT+QyTMGQ@HIDDEN>
Subject: [PATCH] Improve vtable--limit-string performance
To: bug-gnu-emacs@HIDDEN
Content-Type: multipart/mixed; boundary="0000000000009d8f9006462a6ab0"
Received-SPF: pass client-ip=2607:f8b0:4864:20::a2b;
 envelope-from=shipmints@HIDDEN; helo=mail-vk1-xa2b.google.com
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,
 HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,
 SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: submit
Cc: Spencer Baugh <sbaugh@HIDDEN>,
 Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 Visuwesh <visuweshm@HIDDEN>, Adam Porter <adam@HIDDEN>,
 Lars Ingebrigtsen <larsi@HIDDEN>, Augusto Stoffel <arstoffel@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: -0.0 (/)

--0000000000009d8f9006462a6ab0
Content-Type: multipart/alternative; boundary="0000000000009d8f8e06462a6aae"

--0000000000009d8f8e06462a6aae
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

This implements a simple heuristic to limit the number of times
`string-pixel-width` gets called by estimating the string's truncation
position in advance.  This is overridable column-by-column should some
strings in the vtable be composed of widely varying font widths that
necessitates minor adjustments to the heuristic.  This approach performs
well in testing (and I tested several approaches) and has been tested by
more than one vtable user.

-St=C3=A9phane

--0000000000009d8f8e06462a6aae
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div class=3D"gmail_default" style=3D"font-family:monospac=
e">This implements a simple heuristic to limit the number of times `string-=
pixel-width` gets called by estimating the string&#39;s truncation position=
 in advance.=C2=A0 This is overridable column-by-column should some strings=
 in the vtable be composed of widely varying font widths that necessitates =
minor adjustments to the heuristic.=C2=A0 This approach performs well in te=
sting (and I tested several approaches) and has been tested by more than on=
e vtable user.</div><div class=3D"gmail_default" style=3D"font-family:monos=
pace"><br></div><div class=3D"gmail_default" style=3D"font-family:monospace=
">-St=C3=A9phane=C2=A0</div></div>

--0000000000009d8f8e06462a6aae--

--0000000000009d8f9006462a6ab0
Content-Type: application/octet-stream; 
	name="0001-Improve-vtable-limit-string-performance.patch"
Content-Disposition: attachment; 
	filename="0001-Improve-vtable-limit-string-performance.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mjadcbln0>
X-Attachment-Id: f_mjadcbln0

RnJvbSAzMzQ3MmFjMTQwZTRhNzU4MzhlYTkwOGUxYzg5MTBmZjhkYmQ0NGY2IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo
aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMTcgRGVjIDIwMjUgMTM6NDU6NDkgLTA1MDAK
U3ViamVjdDogW1BBVENIXSBJbXByb3ZlIHZ0YWJsZS0tbGltaXQtc3RyaW5nIHBlcmZvcm1hbmNl
CgoqIGRvYy9taXNjL3Z0YWJsZS50ZXhpIChDb25jZXB0cyk6IERvY3VtZW50IHRoYXQgdnRhYmxl
IGNhbiBiZQppbnNlcnRlZCBpbnRvIGEgc2luZ2xlIGJ1ZmZlci4KKE1ha2luZyBBIFRhYmxlKTog
RG9jdW1lbnQgdGhlIG5ldyBsaW1pdC1hZGp1c3RtZW50IGNvbHVtbgpwcm9wZXJ0eS4KKiBsaXNw
L2VtYWNzLWxpc3AvdnRhYmxlLmVsICh2dGFibGUtY29sdW1uLCB2dGFibGUtLWluc2VydC1saW5l
KQoodnRhYmxlLS1pbnNlcnQtaGVhZGVyLWxpbmUpOiBDYWxsIHZ0YWJsZS0tbGltaXQtc3RyaW5n
IHdpdGgKZWFjaCBjb2x1bW4ncyBsaW1pdC1hZGp1c3RtZW50LgoodnRhYmxlLS1saW1pdC1zdHJp
bmcpOiBJbXBsZW1lbnQgc3RyaW5nIHRydW5jYXRpb24gaGV1cmlzdGljLgoqIHRlc3QvbGlzcC9l
bWFjcy1saXNwL3Z0YWJsZS10ZXN0cy5lbAoodGVzdC12dGFibGUtLWxpbWl0LXN0cmluZy13aXRo
LWZhY2UtcmVtYXBwZWQtYnVmZmVyKTogQWRkCmxpbWl0LWFkanVzdG1lbnQgYXJndW1lbnQuCi0t
LQogZG9jL21pc2MvdnRhYmxlLnRleGkgICAgICAgICAgICAgICAgIHwgMTYgKysrKysrKystLQog
bGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgNDcgKysrKysrKysrKysrKysr
KysrKysrKystLS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsIHwgIDIg
Ky0KIDMgZmlsZXMgY2hhbmdlZCwgNTQgaW5zZXJ0aW9ucygrKSwgMTEgZGVsZXRpb25zKC0pCgpk
aWZmIC0tZ2l0IGEvZG9jL21pc2MvdnRhYmxlLnRleGkgYi9kb2MvbWlzYy92dGFibGUudGV4aQpp
bmRleCBkZDJmNzk1MTJjMS4uMTY4ZmI4Y2YxYmEgMTAwNjQ0Ci0tLSBhL2RvYy9taXNjL3Z0YWJs
ZS50ZXhpCisrKyBiL2RvYy9taXNjL3Z0YWJsZS50ZXhpCkBAIC0yMDgsOCArMjA4LDEwIEBAIENv
bmNlcHRzCiBAY2hhcHRlciBDb25jZXB0cwogCiBAY2luZGV4IHZ0YWJsZQotQSB2dGFibGUgbGlz
dHMgZGF0YSBhYm91dCBhIG51bWJlciBvZiBAZGZue29iamVjdHN9LiAgRWFjaCBvYmplY3QgY2Fu
Ci1iZSBhIGxpc3Qgb3IgYSB2ZWN0b3IsIGJ1dCBpdCBjYW4gYWxzbyBiZSBhbnl0aGluZyBlbHNl
LgorQSB2dGFibGUgbGlzdHMgZGF0YSBhYm91dCBhIG51bWJlciBvZiBAZGZue29iamVjdHN9LiAg
RWFjaCBvYmplY3QgY2FuIGJlCithIGxpc3Qgb3IgYSB2ZWN0b3IsIGJ1dCBpdCBjYW4gYWxzbyBi
ZSBhbnl0aGluZyBlbHNlLiAgTm90ZSB0aGF0IGEKK3Z0YWJsZSBjYW4gYmUgaW5zZXJ0ZWQgaW50
byBvbmx5IG9uZSBidWZmZXIgYXMgaXRzIHN0YXRlIGlzIHRpZWQgdG8gdGhhdAorYnVmZmVyLgog
CiBAY2luZGV4IGdldHRlciBvZiBhIHZ0YWJsZQogVG8gZ2V0IHRoZSBAZGZue3ZhbHVlfSBmb3Ig
YSBwYXJ0aWN1bGFyIGNvbHVtbiwgdGhlIEBkZm57Z2V0dGVyfQpAQCAtMzE1LDYgKzMxNywxNiBA
QCBNYWtpbmcgQSBUYWJsZQogZ2l2ZW4gYXMgYSBwZXJjZW50YWdlIG9mIHRoZSB3aW5kb3cgd2lk
dGgsIGFuZCB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdAogdGhlIGNvbHVtbiBkb2Vzbid0IGdyb3cg
cG9pbnRsZXNzbHkgbGFyZ2Ugb3IgdW5yZWFkYWJseSBuYXJyb3cuCiAKK0BpdGVtIGxpbWl0LWFk
anVzdG1lbnQKK3Z0YWJsZSB0cnVuY2F0ZXMgc3RyaW5ncyB0byBmaXQgaW50byBlYWNoIGNvbHVt
bidzIGFsbG90dGVkIHBpeGVsIHdpZHRoLgorQSBoZXVyaXN0aWMgaXMgdXNlZCB0byByZWR1Y2Ug
Y29tcHV0YXRpb24gY29zdCBvbiBsb25nIHN0cmluZ3MuICBJbiByYXJlCitjYXNlcyB3aGVyZSBh
IHN0cmluZyBjb250YWlucyBmb250cyBvZiB3aWRlbHkgdmFyeWluZyB3aWR0aHMsIHVzZSB0aGUK
K0Bjb2Rle2xpbWl0LWFkanVzdG1lbnR9IHByb3BlcnR5IHRvIGFkanVzdCB0aGUgaGV1cmlzdGlj
IGJ5IHNwZWNpZnlpbmcKK3RoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBhZGQgdG8gdGhlIGhl
dXJpc3RpYydzIGluaXRpYWwgdHJ1bmNhdGlvbgorZXN0aW1hdGUuICBAY29kZXtsaW1pdC1hZGp1
c3RtZW50fSBkZWZhdWx0cyB0byAwIHdoaWNoIGVuYWJsZXMgdGhlCitoZXVyaXN0aWMgd2l0aCBu
byBjaGFyYWN0ZXIgYWRqdXN0bWVudC4gIElmIEBjb2Rle2xpbWl0LWFkanVzdG1lbnR9IGlzCitu
aWwsIG5vIGhldXJpc3RpYyBpcyBhcHBsaWVkLgorCiBAaXRlbSBwcmltYXJ5CiBXaGV0aGVyIHRo
aXMgaXMgdGhlIHByaW1hcnkgY29sdW1uLS0tdGhpcyB3aWxsIGJlIHVzZWQgZm9yIGluaXRpYWwK
IHNvcnRpbmcuICBUaGlzIHNob3VsZCBiZSBlaXRoZXIgQGNvZGV7YXNjZW5kfSBvciBAY29kZXtk
ZXNjZW5kfSB0byBzYXkKZGlmZiAtLWdpdCBhL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwgYi9s
aXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVsCmluZGV4IDI5NzkxZTJhYWEwLi43ZWQ3ODlhMTdhNiAx
MDA2NDQKLS0tIGEvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbAorKysgYi9saXNwL2VtYWNzLWxp
c3AvdnRhYmxlLmVsCkBAIC00MCw2ICs0MCw3IEBAIHZ0YWJsZS1jb2x1bW4KICAgd2lkdGgKICAg
bWluLXdpZHRoCiAgIG1heC13aWR0aAorICAobGltaXQtYWRqdXN0bWVudCAwKQogICBwcmltYXJ5
CiAgIGFsaWduCiAgIGdldHRlcgpAQCAtNjM2LDcgKzYzNyw4IEBAIHZ0YWJsZS0taW5zZXJ0LWxp
bmUKICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGltaXQtc3RyaW5nCiAgICAgICAg
ICAgICAgICAgICAgICAgICBwcmUtY29tcHV0ZWQgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIGVsbGlwc2lzLXdpZHRoIDAp
KQotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAg
ICAgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLWNvbHVtbi1saW1pdC1h
ZGp1c3RtZW50IGNvbHVtbikpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsbGlwc2lzKQogICAg
ICAgICAgICAgICAgICAgICBwcmUtY29tcHV0ZWQpKQogICAgICAgICAgICAgICAgICA7OyBSZWNv
bXB1dGUgd2lkdGhzLgpAQCAtNjQ2LDcgKzY0OCw4IEBAIHZ0YWJsZS0taW5zZXJ0LWxpbmUKICAg
ICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGltaXQtc3RyaW5nCiAgICAgICAgICAgICAg
ICAgICAgICAgICB2YWx1ZSAoLSAoZWx0IHdpZHRocyBpbmRleCkKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChvciBlbGxpcHNpcy13aWR0aCAwKSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcgorICAgICAgICAg
ICAgICAgICAgICAgICAgKHZ0YWJsZS1jb2x1bW4tbGltaXQtYWRqdXN0bWVudCBjb2x1bW4pKQog
ICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpcykKICAgICAgICAgICAgICAgICAgICAgdmFs
dWUpKSkpCiAgICAgICAgICAgICAgICAoc3RhcnQgKHBvaW50KSkKQEAgLTc2Nyw3ICs3NzAsOCBA
QCB2dGFibGUtLWluc2VydC1oZWFkZXItbGluZQogICAgICAgICAgICAgICAgICAgICAgICgtIChl
bHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpKQogICAgICAgICAgICAgICAgICAgICh2
dGFibGUtLWxpbWl0LXN0cmluZwogICAgICAgICAgICAgICAgICAgICBuYW1lICgtIChlbHQgd2lk
dGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikK
KyAgICAgICAgICAgICAgICAgICAgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICh2dGFibGUt
Y29sdW1uLWxpbWl0LWFkanVzdG1lbnQgY29sdW1uKSkKICAgICAgICAgICAgICAgICAgbmFtZSkp
CiAgICAgICAgICAobGV0KiAoKGluZGljYXRvci1sZWFkLXdpZHRoCiAgICAgICAgICAgICAgICAg
IDs7IFdlIHdhbnQgdGhlIGluZGljYXRvciB0byBub3QgYmUgcXVpdGUgZmx1c2ggcmlnaHQuCkBA
IC04NzUsMTEgKzg3OSwzOCBAQCB2dGFibGUtLXNldC1oZWFkZXItbGluZQogICAodnRhYmxlLWhl
YWRlci1tb2RlIDEpKQogCiAKLShkZWZ1biB2dGFibGUtLWxpbWl0LXN0cmluZyAoc3RyaW5nIHBp
eGVscyBidWZmZXIpCi0gICh3aGlsZSAoYW5kIChsZW5ndGg+IHN0cmluZyAwKQotICAgICAgICAg
ICAgICAoPiAoc3RyaW5nLXBpeGVsLXdpZHRoIHN0cmluZyBidWZmZXIpIHBpeGVscykpCi0gICAg
KHNldHEgc3RyaW5nIChzdWJzdHJpbmcgc3RyaW5nIDAgKDEtIChsZW5ndGggc3RyaW5nKSkpKSkK
LSAgc3RyaW5nKQorKGRlZnVuIHZ0YWJsZS0tbGltaXQtc3RyaW5nIChzdHJpbmcgcGl4ZWxzIGJ1
ZmZlciBsaW1pdC1hZGp1c3RtZW50KQorICAiVHJ1bmNhdGUgU1RSSU5HIHRvIGZpdCBpbnRvIHdp
ZHRoIFBJWEVMUy4KK0NvbnN1bHQgQlVGRkVSIHRvIGRlcml2ZSB0ZXh0LXNjYWxlIGFkanVzdGVk
IGZvbnRzLgorCitUbyBpbXByb3ZlIHBlcmZvcm1hbmNlIG9uIGxvbmcgc3RyaW5ncywgY29tcHV0
ZSBhIGxpbWl0IGhldXJpc3RpYyBiYXNlZAorb24gU1RSSU5HJ3MgZXN0aW1hdGVkIGF2ZXJhZ2Ug
cGl4ZWwgd2lkdGggcmVsYXRpdmUgdG8gUElYRUxTLCBjb25zdWx0aW5nCitMSU1JVC1BREpVU1RN
RU5ULgorSWYgTElNSVQtQURKVVNUTUVOVCBpcyBuaWwsIGRvIG5vdCBhcHBseSB0aGUgaGV1cmlz
dGljLgorSWYgTElNSVQtQURKVVNUTUVOVCBpcyBhbiBpbnRlZ2VyLCBpdCBpcyB0aGUgbnVtYmVy
IG9mIGFkZGl0aW9uYWwKK2NoYXJhY3RlcnMgYWRkZWQgdG8gdGhlIGVzdGltYXRlLiAgVGhpcyBt
YXkgYmUgbmVlZGVkIGZvciBwcm9wZXJ0aXplZAorc3RyaW5ncyB0aGF0IGhhdmUgd2lkZWx5IHZh
cnlpbmcgZm9udCBzaXplcy4gIEluY3JlYXNlIHRoZSBlc3RpbWF0ZSBieQorb25lIGNoYXJhY3Rl
ciBhdCBhIHRpbWUgdW50aWwgdGhlIGRlc2lyZWQgcmVzdWx0IGlzIGFjaGlldmVkLiIKKyAgKGxl
dCAoKHN0cmluZy1sZW4gKGxlbmd0aCBzdHJpbmcpKQorICAgICAgICAoc3RyaW5nLXBpeGVscykp
CisgICAgKHdoZW4gKGFuZCAoPiBzdHJpbmctbGVuIDApCisgICAgICAgICAgICAgICAoaW50ZWdl
cnAgbGltaXQtYWRqdXN0bWVudCkpCisgICAgICAoc2V0cSBzdHJpbmctcGl4ZWxzIChzdHJpbmct
cGl4ZWwtd2lkdGggc3RyaW5nIGJ1ZmZlcikpCisgICAgICAod2hlbiAoPiBzdHJpbmctcGl4ZWxz
IHBpeGVscykKKyAgICAgICAgOzsgVXNlIGF2ZXJhZ2UgcGl4ZWxzL2NoYXJhY3RlciBmcm9tIFNU
UklORyB0byBzZWVkIHRoZSBndWVzcy4KKyAgICAgICAgKGxldCAoKGd1ZXNzICgrIDEKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGxpbWl0LWFkanVzdG1lbnQKKyAgICAgICAgICAgICAgICAgICAg
ICAgIChjZWlsaW5nICgvIHBpeGVscyAoLyBzdHJpbmctcGl4ZWxzIHN0cmluZy1sZW4pKSkpKSkK
KyAgICAgICAgICAod2hlbiAoPCBndWVzcyBzdHJpbmctbGVuKQorICAgICAgICAgICAgKHNldHEg
c3RyaW5nIChzdWJzdHJpbmcgc3RyaW5nIDAgZ3Vlc3MpKSkpKSkKKyAgICAod2hpbGUgKGFuZCAo
bGVuZ3RoPiBzdHJpbmcgMCkKKyAgICAgICAgICAgICAgICA7OyBSZXVzZSB0aGUgaW5pdGlhbCBz
dHJpbmctcGl4ZWxzIGZvciB0aGUgZmFzdCBwYXRoLgorICAgICAgICAgICAgICAgIChpZiBzdHJp
bmctcGl4ZWxzIChwcm9nMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
PiBzdHJpbmctcGl4ZWxzIHBpeGVscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChzZXRxIHN0cmluZy1waXhlbHMgbmlsKSkKKyAgICAgICAgICAgICAgICAgICg+IChzdHJp
bmctcGl4ZWwtd2lkdGggc3RyaW5nIGJ1ZmZlcikgcGl4ZWxzKSkpCisgICAgICAoc2V0cSBzdHJp
bmcgKHN1YnN0cmluZyBzdHJpbmcgMCAoMS0gKGxlbmd0aCBzdHJpbmcpKSkpKQorICAgIHN0cmlu
ZykpCiAKIChkZWZ1biB2dGFibGUtLWNoYXItd2lkdGggKHRhYmxlKQogICAoc3RyaW5nLXBpeGVs
LXdpZHRoIChwcm9wZXJ0aXplICJ4IiAnZmFjZSAodnRhYmxlLWZhY2UgdGFibGUpKQpkaWZmIC0t
Z2l0IGEvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsIGIvdGVzdC9saXNwL2Vt
YWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsCmluZGV4IGUwMzI4ZTMxYmM1Li41OGFhMGE3ZjgxYSAx
MDA2NDQKLS0tIGEvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsCisrKyBiL3Rl
c3QvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS10ZXN0cy5lbApAQCAtMTM4LDcgKzEzOCw3IEBAIHRl
c3QtdnRhYmxlLS1saW1pdC1zdHJpbmctd2l0aC1mYWNlLXJlbWFwcGVkLWJ1ZmZlcgogICAgICAg
KGlmICg+IGVtYWNzLW1ham9yLXZlcnNpb24gMzApCiAgICAgICAgICAgKHNob3VsZCAoZXEKICAg
ICAgICAgICAgICAgICAgICAyCi0gICAgICAgICAgICAgICAgICAgKGxlbmd0aCAodnRhYmxlLS1s
aW1pdC1zdHJpbmcgdGV4dCA1MCAoY3VycmVudC1idWZmZXIpKSkpKQorICAgICAgICAgICAgICAg
ICAgIChsZW5ndGggKHZ0YWJsZS0tbGltaXQtc3RyaW5nIHRleHQgNTAgKGN1cnJlbnQtYnVmZmVy
KSAwKSkpKQogICAgICAgICAoc2hvdWxkIChlcQogICAgICAgICAgICAgICAgICAyCiAgICAgICAg
ICAgICAgICAgIChsZW5ndGggKHZ0YWJsZS0tbGltaXQtc3RyaW5nIHRleHQgNTApKSkpKSkpKQot
LSAKMi40Ny4xCgo=
--0000000000009d8f9006462a6ab0--




Acknowledgement sent to Stéphane Marks <shipmints@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#80026; 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: Fri, 19 Dec 2025 13:30:02 UTC

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