Subject: bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name

From: Ihor Radchenko <[email-masked]>
Date: Sat, 15 Apr 2023 12:08:17 +0000

Gustavo Barros <[email-masked]> writes:

> On Sat, 15 Apr 2023 at 08:41, Ihor Radchenko <[email-masked]> wrote:
>
>> Gustavo, what happens if you put (load "org-agenda.el") in your init.el?
>
> Problem gone, the space is not propertized.

So, it really looks like compilation problem.

I am now looking into Elisp manual

    2.9 Mutability
    
       When similar constants occur as parts of a program, the Lisp
    interpreter might save time or space by reusing existing constants or
    their components.  For example, ‘(eq "abc" "abc")’ returns ‘t’ if the
    interpreter creates only one instance of the string literal ‘"abc"’, and
    returns ‘nil’ if it creates two instances.  Lisp programs should be
    written so that they work regardless of whether this optimization is in
    use.

So, it should be a good idea to avoid setting text properties in string
constants in general.

See the attached patch.
Though I have no clue if this is enough to fix the bug...

>From 6e74e7746936a5584fce9c8539dd1ad96b37bb7e Mon Sep 17 00:00:00 2001
Message-Id: <[email-masked]>
From: Ihor Radchenko <[email-masked]>
Date: Sat, 15 Apr 2023 14:04:19 +0200
Subject: [PATCH] * lisp/org-agenda.el: Try not to modify string constants by
 side effect

(org-agenda-propertize-selected-todo-keywords):
(org-agenda-format-item):
(org-agenda-highlight-todo): Make sure that we use a fresh string
constant copy when adding properties.  This avoids race modifications
when compiler use shared object for several string constants in
org-agenda.

See Emacs bug#62847.

Reported-by: Gustavo Barros <[email-masked]>
Link: https://orgmode.org/list/[email-masked]
---
 lisp/org-agenda.el | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index 2ec2f4c00..8e6b84362 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -4923,7 +4923,9 @@ (defun org-agenda-propertize-selected-todo-keywords (keywords)
   "Use `org-todo-keyword-faces' for the selected todo KEYWORDS."
   (concat
    (if (or (equal keywords "ALL") (not keywords))
-       (propertize "ALL" 'face 'org-agenda-structure-filter)
+       (propertize
+        (copy-sequence "ALL") ; Avoid modifying `eq' string constants.
+        'face 'org-agenda-structure-filter)
      (mapconcat
       (lambda (kw)
         (propertize kw 'face (list (org-get-todo-face kw) 'org-agenda-structure)))
@@ -7251,7 +7253,9 @@         (defvar level) (defvar tag) (defvar time))
 			     "")))
 	     (category-icon (org-agenda-get-category-icon category))
 	     (category-icon (if category-icon
-				(propertize " " 'display category-icon)
+				(propertize
+                                 (copy-sequence " ") ; Avoid modifying `eq' " ".
+                                 'display category-icon)
 			      ""))
 	     (effort (and (not (string= txt ""))
 			  (get-text-property 1 'effort txt)))
@@ -7724,8 +7728,10 @@ (defun org-agenda-highlight-todo (x)
                    (unless (string= org-agenda-todo-keyword-format "")
                      ;; Remove `display' property as the icon could leak
                      ;; on the white space.
-                     (org-add-props " " (org-plist-delete (text-properties-at 0 x)
-                                                          'display)))
+                     (org-add-props
+                         (copy-sequence " ") ; Avoid modifying `eq' " ".
+                         (org-plist-delete (text-properties-at 0 x)
+                                           'display)))
                    (substring x (match-end 3)))))))
       x)))
 
-- 
2.40.0

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>