* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name @ 2023-04-14 23:04 Gustavo Barros 2023-04-15 9:38 ` Ihor Radchenko 2023-04-16 12:38 ` Daniel Mendler 0 siblings, 2 replies; 29+ messages in thread From: Gustavo Barros @ 2023-04-14 23:04 UTC (permalink / raw) To: 62847 Hi All, I've reported this some time ago at the Org bugtracker (https://list.orgmode.org/878rtv9kx6.fsf@gmail.com/T/#u) and, since I was testing the pre-release this week and the issue is still around, I reiterated it. But I was asked to report it to the Emacs bug tracker instead, thus this report. I met a particularly strange issue related to Org Agenda's `mode-name'. And one space in particular, the one that is added before `org-agenda-current-span'. The `mode-name' for the Agenda is set by `org-agenda-set-mode-name', and inside it we find: #+begin_src emacs-lisp " " '(:eval (org-agenda-span-name org-agenda-current-span)) #+end_src Now, this space somehow gets propertized. A recipe for it. Start `emacs -Q'. Set things up: #+begin_src emacs-lisp (setq org-agenda-files '("~/agenda.org")) (setq eval-expression-print-level nil) (setq eval-expression-print-length nil) #+end_src Let's say =agenda.org= contains: #+begin_src org ,* TODO Task SCHEDULED: <2023-04-14 Fri> #+end_src Call `M-x org-agenda RET a'. Now examine `mode-name' with `M-: mode-name RET' to get: #+begin_src emacs-lisp ("Org-Agenda" "" #(" " 0 1 (org-category "agenda" tags nil org-priority-highest 65 org-priority-lowest 67 time-of-day nil duration nil breadcrumbs nil txt #("TODO Task" 0 9 (org-heading t effort-minutes nil effort nil fontified nil)) level " " time "" extra "Scheduled: " format (((org-prefix-has-time t) (org-prefix-has-tag nil) (org-prefix-category-length 12) (org-prefix-has-effort nil) (org-prefix-has-breadcrumbs nil)) (format " %s %s%s%s" (format "%s" (if (member category-icon '("" nil)) "" (concat category-icon "" (get-text-property 0 'extra-space category-icon)))) (format "%-12s" (if (member category '("" nil)) "" (concat category ":" (get-text-property 0 'extra-space category)))) (if (member time '("" nil)) "" (format "%-12s" (concat time ""))) (format "%s" (if (member extra '("" nil)) "" (concat extra " " (get-text-property 0 'extra-space extra)))))) dotime time org-not-done-regexp "\\(TODO\\)" org-todo-regexp "\\(DONE\\|TODO\\)" org-complex-heading-regexp "^\\(\\*+\\)\\(?: +\\(DONE\\|TODO\\)\\)?\\(?: +\\(\\[#.\\]\\)\\)?\\(?: +\\(.*?\\)\\)??\\(?:[ ]+\\(:[[:alnum:]_@#%:]+:\\)\\)?[ ]*$" done-face org-agenda-done mouse-face highlight help-echo "mouse-2 or RET jump to Org file ~/agenda.org" undone-face org-scheduled-today face org-scheduled-today org-marker #<marker (moves after insertion) at 24 in agenda.org> org-hd-marker #<marker (moves after insertion) at 1 in agenda.org> type "scheduled" date (4 14 2023) ts-date 738624 warntime nil effort nil effort-minutes nil priority 1099 org-habit-p nil todo-state #("TODO" 0 4 (fontified nil)))) (:eval (org-agenda-span-name org-agenda-current-span)) "" "" "" " Ddl" " Grid" "" "" "" "" "" "" "" "" "") #+end_src So, it appears that the Org Agenda buffer's properties are somehow getting to that particular space in `mode-name'. It completely beats me how it is so but, alas, it is there. This is a problem because, depending on what the content of your agenda is, this might result in this space getting some visually distinctive property. In my case, I get a blank gap in the mode-line at this point. I couldn't generate a simple ECM that gets this effect. But, at this point, it should be clear it can happen, given these properties are there. Best regards, Gustavo. In GNU Emacs 29.0.90 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.33, cairo version 1.16.0) of 2023-04-10 built on gusbrs-desktop Windowing system distributor 'The X.Org Foundation', version 11.0.12101003 System Description: Linux Mint 21.1 Configured using: 'configure --with-mailutils --with-xwidgets --with-native-compilation --without-compress-install' Configured features: ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP X11 XDBE XIM XINPUT2 XPM XWIDGETS GTK3 ZLIB Important settings: value of $LC_MONETARY: pt_BR.UTF-8 value of $LC_NUMERIC: pt_BR.UTF-8 value of $LANG: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: Messages Minor modes in effect: tooltip-mode: t global-eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t buffer-read-only: t line-number-mode: t indent-tabs-mode: t transient-mark-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t Load-path shadows: None found. Features: (shadow sort mail-extr emacsbug diary-lib diary-loaddefs cal-iso oc-basic ol-eww eww url-queue thingatpt mm-url ol-rmail ol-mhe ol-irc ol-info ol-gnus nnselect gnus-art mm-uu mml2015 mm-view mml-smime smime gnutls dig gnus-sum shr pixel-fill kinsoku url-file svg dom browse-url url url-proxy url-privacy url-expand url-methods url-history url-cookie generate-lisp-file url-domsuf url-util url-parse auth-source eieio eieio-core json map byte-opt url-vars gnus-group gnus-undo gnus-start gnus-dbus dbus xml gnus-cloud nnimap nnmail mail-source utf7 nnoo parse-time gnus-spec gnus-int gnus-range message sendmail mailcap yank-media puny rfc822 mml mml-sec password-cache epa derived epg rfc6068 epg-config mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 ietf-drums mailabbrev gmm-utils mailheader gnus-win gnus nnheader gnus-util text-property-search mail-utils range mm-util mail-prsvr wid-edit ol-docview doc-view filenotify jka-compr image-mode exif dired dired-loaddefs ol-bibtex bibtex iso8601 ol-bbdb ol-w3m ol-doi org-link-doi face-remap org-agenda org-element org-persist xdg org-id avl-tree generator org-refile org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-src ob-comint org-pcomplete pcomplete comint ansi-osc ansi-color ring org-list org-footnote org-faces org-entities noutline outline ob-emacs-lisp ob-core ob-eval org-cycle org-table org-keys oc org-loaddefs find-func cal-menu calendar cal-loaddefs ol org-fold org-fold-core org-compat org-version org-macs format-spec time-date cl-loaddefs comp comp-cstr warnings icons subr-x rx cl-seq cl-macs gv cl-extra help-mode bytecomp byte-compile cl-lib rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads xwidget-internal dbusbind inotify lcms2 dynamic-setting system-font-setting font-render-setting cairo move-toolbar gtk x-toolkit xinput2 x multi-tty make-network-process native-compile emacs) Memory information: ((conses 16 258488 14637) (symbols 48 21279 0) (strings 32 72219 2491) (string-bytes 1 2252850) (vectors 16 39079) (vector-slots 8 711251 27711) (floats 8 337 81) (intervals 56 389 0) (buffers 984 13)) ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-14 23:04 bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name Gustavo Barros @ 2023-04-15 9:38 ` Ihor Radchenko 2023-04-15 9:49 ` Eli Zaretskii 2023-04-16 12:38 ` Daniel Mendler 1 sibling, 1 reply; 29+ messages in thread From: Ihor Radchenko @ 2023-04-15 9:38 UTC (permalink / raw) To: Gustavo Barros; +Cc: 62847 Gustavo Barros <gusbrs.2016@gmail.com> writes: > Call `M-x org-agenda RET a'. Now examine `mode-name' with `M-: > mode-name RET' to get: > > #+begin_src emacs-lisp > ("Org-Agenda" "" #(" " 0 1 (org-category "agenda" tags nil... I suspect that it is Emacs-related because I see nothing wrong done on Org side. The code setting `mode-name' is (defun org-agenda-set-mode-name () "Set the mode name to indicate all the small mode settings." (setq mode-name (list "Org-Agenda" (if (get 'org-agenda-files 'org-restrict) " []" "") " " '(:eval (org-agenda-span-name org-agenda-current-span)) ...))) Note the third " " in `mode-name' list. Org does not modify the mode-name by side effect. This bug is only reproducible when using built-in Org. When I tried to reproduce with Git version of Org (the same release tag), no extra properties are present in `mode-name'. -- 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> ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 9:38 ` Ihor Radchenko @ 2023-04-15 9:49 ` Eli Zaretskii 2023-04-15 10:02 ` Ihor Radchenko 0 siblings, 1 reply; 29+ messages in thread From: Eli Zaretskii @ 2023-04-15 9:49 UTC (permalink / raw) To: Ihor Radchenko; +Cc: 62847, gusbrs.2016 > Cc: 62847@debbugs.gnu.org > From: Ihor Radchenko <yantar92@posteo.net> > Date: Sat, 15 Apr 2023 09:38:43 +0000 > > Gustavo Barros <gusbrs.2016@gmail.com> writes: > > > Call `M-x org-agenda RET a'. Now examine `mode-name' with `M-: > > mode-name RET' to get: > > > > #+begin_src emacs-lisp > > ("Org-Agenda" "" #(" " 0 1 (org-category "agenda" tags nil... > > I suspect that it is Emacs-related because I see nothing wrong done on > Org side. > > The code setting `mode-name' is > > (defun org-agenda-set-mode-name () > "Set the mode name to indicate all the small mode settings." > (setq mode-name > (list "Org-Agenda" > (if (get 'org-agenda-files 'org-restrict) " []" "") > " " > '(:eval (org-agenda-span-name org-agenda-current-span)) > ...))) > > Note the third " " in `mode-name' list. > Org does not modify the mode-name by side effect. > > This bug is only reproducible when using built-in Org. When I tried to > reproduce with Git version of Org (the same release tag), no extra > properties are present in `mode-name'. I'm afraid I don't understand this bug report, and cannot reproduce what I thought I understood from it. Any chance of presenting a recipe starting from "emacs -Q", for someone who doesn't use org-agenda? ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 9:49 ` Eli Zaretskii @ 2023-04-15 10:02 ` Ihor Radchenko 2023-04-15 10:24 ` Eli Zaretskii 0 siblings, 1 reply; 29+ messages in thread From: Ihor Radchenko @ 2023-04-15 10:02 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 62847, gusbrs.2016 Eli Zaretskii <eliz@gnu.org> writes: > I'm afraid I don't understand this bug report, and cannot reproduce > what I thought I understood from it. Any chance of presenting a > recipe starting from "emacs -Q", for someone who doesn't use > org-agenda? 1. emacs -Q 2. Create and open a new Org file with the following contents: * TODO Task SCHEDULED: <2023-04-14 Fri> 3. M-x org-agenda <RET> < a 4. M-: mode-name <RET> 5. Observe the third element (" ") in the list propertized unexpectedly, despite `org-agenda-set-mode-name' using " " without properties. I suspect some compiled shared " " object, but it should not happen with strings, AFAIK. And it does not happen when I compile the same Org version from Git. -- 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> ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 10:02 ` Ihor Radchenko @ 2023-04-15 10:24 ` Eli Zaretskii 2023-04-15 10:40 ` Ihor Radchenko 0 siblings, 1 reply; 29+ messages in thread From: Eli Zaretskii @ 2023-04-15 10:24 UTC (permalink / raw) To: Ihor Radchenko; +Cc: 62847, gusbrs.2016 > From: Ihor Radchenko <yantar92@posteo.net> > Cc: gusbrs.2016@gmail.com, 62847@debbugs.gnu.org > Date: Sat, 15 Apr 2023 10:02:34 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > > I'm afraid I don't understand this bug report, and cannot reproduce > > what I thought I understood from it. Any chance of presenting a > > recipe starting from "emacs -Q", for someone who doesn't use > > org-agenda? > > 1. emacs -Q > 2. Create and open a new Org file with the following contents: > > * TODO Task > SCHEDULED: <2023-04-14 Fri> > > 3. M-x org-agenda <RET> < a > 4. M-: mode-name <RET> > 5. Observe the third element (" ") in the list propertized unexpectedly, > despite `org-agenda-set-mode-name' using " " without properties. Thanks, but it isn't propertized here, I see a literal " " with no properties. What happens if you display mode-name inside org-agenda-set-mode-name: does it have the properties there already? ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 10:24 ` Eli Zaretskii @ 2023-04-15 10:40 ` Ihor Radchenko 2023-04-15 10:55 ` Eli Zaretskii 2023-04-15 11:38 ` Eli Zaretskii 0 siblings, 2 replies; 29+ messages in thread From: Ihor Radchenko @ 2023-04-15 10:40 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 62847, gusbrs.2016 Eli Zaretskii <eliz@gnu.org> writes: > Thanks, but it isn't propertized here, I see a literal " " with no > properties. Note: I tried with Emacs from Git - also cannot reproduce. Only using installed version of Emacs 28, 29, and master. Not Emacs 27. > What happens if you display mode-name inside org-agenda-set-mode-name: > does it have the properties there already? First time, it does not. From the second agenda rebuild onward, the properties are there. -- 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> ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 10:40 ` Ihor Radchenko @ 2023-04-15 10:55 ` Eli Zaretskii 2023-04-15 11:28 ` Gustavo Barros 2023-04-15 11:44 ` Ihor Radchenko 2023-04-15 11:38 ` Eli Zaretskii 1 sibling, 2 replies; 29+ messages in thread From: Eli Zaretskii @ 2023-04-15 10:55 UTC (permalink / raw) To: Ihor Radchenko; +Cc: 62847, gusbrs.2016 > From: Ihor Radchenko <yantar92@posteo.net> > Cc: gusbrs.2016@gmail.com, 62847@debbugs.gnu.org > Date: Sat, 15 Apr 2023 10:40:36 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > > Thanks, but it isn't propertized here, I see a literal " " with no > > properties. > > Note: I tried with Emacs from Git - also cannot reproduce. On the emacs-29 branch as well? That's what I tried. > Only using installed version of Emacs 28, 29, and master. Not Emacs 27. > > > What happens if you display mode-name inside org-agenda-set-mode-name: > > does it have the properties there already? > > First time, it does not. From the second agenda rebuild onward, the > properties are there. I've now tried the installed Emacs 29.0.90, and I cannot reproduce there, either. Not even if I invoke org-agenda twice in a row. So this sounds like some weird heisenbug. ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 10:55 ` Eli Zaretskii @ 2023-04-15 11:28 ` Gustavo Barros 2023-04-15 11:44 ` Ihor Radchenko 1 sibling, 0 replies; 29+ messages in thread From: Gustavo Barros @ 2023-04-15 11:28 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Ihor Radchenko, 62847 Hi Eli, thanks for looking into this. On Sat, 15 Apr 2023 at 07:55, Eli Zaretskii <eliz@gnu.org> wrote: > So this sounds like some weird heisenbug. I'm not sure it helps much, but I do have a functioning workaround, which doesn't do much but may offer some hint on the source of the problem. It basically "replaces" the space with a space in `mode-name` with an `:after` advice: (defun gb/org-agenda-set-mode-name-advice () (let ((before (butlast mode-name (length (member " " mode-name)))) (after (cdr (member " " mode-name)))) (when (= (length before) 2) (setq mode-name (append before (list " ") after)) (force-mode-line-update)))) (advice-add 'org-agenda-set-mode-name :after #'gb/org-agenda-set-mode-name-advice) I don't know why the space set in my init file is different from the one set in `org-agenda.el`. But Ihor's insight that the problem only happens on an installed version suggests a compilation related issue, as he says. Best, Gustavo. ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 10:55 ` Eli Zaretskii 2023-04-15 11:28 ` Gustavo Barros @ 2023-04-15 11:44 ` Ihor Radchenko 2023-04-15 11:49 ` Gustavo Barros 1 sibling, 1 reply; 29+ messages in thread From: Ihor Radchenko @ 2023-04-15 11:44 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 62847, gusbrs.2016 Eli Zaretskii <eliz@gnu.org> writes: >> > Thanks, but it isn't propertized here, I see a literal " " with no >> > properties. >> >> Note: I tried with Emacs from Git - also cannot reproduce. > > On the emacs-29 branch as well? That's what I tried. Same for me, when using Emacs git - origin/emacs-29 branch. Cannot reproduce. Only the installed Emacs. I also tried using the same ./configure options. No luck. > I've now tried the installed Emacs 29.0.90, and I cannot reproduce > there, either. Not even if I invoke org-agenda twice in a row. So > this sounds like some weird heisenbug. Maybe someone who is using Linux Mint can try to reproduce? Or Gentoo. Gustavo, what happens if you put (load "org-agenda.el") in your init.el? -- 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> ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 11:44 ` Ihor Radchenko @ 2023-04-15 11:49 ` Gustavo Barros 2023-04-15 12:08 ` Ihor Radchenko 0 siblings, 1 reply; 29+ messages in thread From: Gustavo Barros @ 2023-04-15 11:49 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Eli Zaretskii, 62847 On Sat, 15 Apr 2023 at 08:41, Ihor Radchenko <yantar92@posteo.net> wrote: > Gustavo, what happens if you put (load "org-agenda.el") in your init.el? Problem gone, the space is not propertized. ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 11:49 ` Gustavo Barros @ 2023-04-15 12:08 ` Ihor Radchenko 2023-04-15 13:21 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors 0 siblings, 1 reply; 29+ messages in thread From: Ihor Radchenko @ 2023-04-15 12:08 UTC (permalink / raw) To: Gustavo Barros; +Cc: Eli Zaretskii, 62847 [-- Attachment #1: Type: text/plain, Size: 1031 bytes --] Gustavo Barros <gusbrs.2016@gmail.com> writes: > On Sat, 15 Apr 2023 at 08:41, Ihor Radchenko <yantar92@posteo.net> 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... [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-lisp-org-agenda.el-Try-not-to-modify-string-constant.patch --] [-- Type: text/x-patch, Size: 2771 bytes --] From 6e74e7746936a5584fce9c8539dd1ad96b37bb7e Mon Sep 17 00:00:00 2001 Message-Id: <6e74e7746936a5584fce9c8539dd1ad96b37bb7e.1681560403.git.yantar92@posteo.net> From: Ihor Radchenko <yantar92@posteo.net> 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 <gusbrs.2016@gmail.com> Link: https://orgmode.org/list/CAM9ALR95F_ZHV2_WsqAz0-35-S2rwxbHqsA5VGftvq51Yz3ZAQ@mail.gmail.com --- 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 [-- Attachment #3: Type: text/plain, Size: 224 bytes --] -- 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> ^ permalink raw reply related [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 12:08 ` Ihor Radchenko @ 2023-04-15 13:21 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors 2023-04-16 11:23 ` Ihor Radchenko 0 siblings, 1 reply; 29+ messages in thread From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-04-15 13:21 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Eli Zaretskii, 62847, Gustavo Barros > 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. Indeed, since it modifies the object, it's "undefined behavior" territory. > - (propertize "ALL" 'face 'org-agenda-structure-filter) > + (propertize > + (copy-sequence "ALL") ; Avoid modifying `eq' string constants. > + 'face 'org-agenda-structure-filter) `propertize` does not modify its string argument (it returns a new string instead), so the `copy-sequence` here is a pure waste. > - (propertize " " 'display category-icon) > + (propertize > + (copy-sequence " ") ; Avoid modifying `eq' " ". > + 'display category-icon) Same here. > - (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))) This hunk fixes a real bug, OTOH. Maybe you should use `(apply #'propertize` instead or `org-add-props`? Stefan ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 13:21 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-04-16 11:23 ` Ihor Radchenko 2023-04-16 11:49 ` Gustavo Barros 0 siblings, 1 reply; 29+ messages in thread From: Ihor Radchenko @ 2023-04-16 11:23 UTC (permalink / raw) To: Stefan Monnier; +Cc: Eli Zaretskii, 62847, Gustavo Barros Stefan Monnier <monnier@iro.umontreal.ca> writes: >> - (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))) > > This hunk fixes a real bug, OTOH. > Maybe you should use `(apply #'propertize` instead or `org-add-props`? Indeed. Done. https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=a8a95b6c2 Gustavo, AFAIU, your issue might be "fixed" if you use Org version from ELPA. If not, you will need to wait until the next bugfix release or use git version of Org. -- 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> ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-16 11:23 ` Ihor Radchenko @ 2023-04-16 11:49 ` Gustavo Barros 0 siblings, 0 replies; 29+ messages in thread From: Gustavo Barros @ 2023-04-16 11:49 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Eli Zaretskii, 62847, Stefan Monnier On Sun, 16 Apr 2023 at 08:21, Ihor Radchenko <yantar92@posteo.net> wrote: > Indeed. > Done. > https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=a8a95b6c2 > > Gustavo, AFAIU, your issue might be "fixed" if you use Org version from > ELPA. If not, you will need to wait until the next bugfix release or use > git version of Org. I thank you (all) for looking into this and for the possible fix. I've been opting for the built-in Org for some time to keep things sane here, and I'll be happy to get it when it comes. And since the commit went to the bugfix branch, it won't be too long. Good reason to try the prerelease. :) Best, Gustavo. ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 10:40 ` Ihor Radchenko 2023-04-15 10:55 ` Eli Zaretskii @ 2023-04-15 11:38 ` Eli Zaretskii 2023-04-15 11:44 ` Ihor Radchenko 1 sibling, 1 reply; 29+ messages in thread From: Eli Zaretskii @ 2023-04-15 11:38 UTC (permalink / raw) To: Ihor Radchenko; +Cc: 62847, gusbrs.2016 > From: Ihor Radchenko <yantar92@posteo.net> > Cc: gusbrs.2016@gmail.com, 62847@debbugs.gnu.org > Date: Sat, 15 Apr 2023 10:40:36 +0000 > > > What happens if you display mode-name inside org-agenda-set-mode-name: > > does it have the properties there already? > > First time, it does not. From the second agenda rebuild onward, the > properties are there. So maybe replace " " with (copy-sequence " "). ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 11:38 ` Eli Zaretskii @ 2023-04-15 11:44 ` Ihor Radchenko 2023-04-15 11:45 ` Eli Zaretskii 0 siblings, 1 reply; 29+ messages in thread From: Ihor Radchenko @ 2023-04-15 11:44 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 62847, gusbrs.2016 Eli Zaretskii <eliz@gnu.org> writes: >> First time, it does not. From the second agenda rebuild onward, the >> properties are there. > > So maybe replace " " with (copy-sequence " "). But that should not be necessary, right? -- 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> ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 11:44 ` Ihor Radchenko @ 2023-04-15 11:45 ` Eli Zaretskii 2023-04-15 13:15 ` Mattias Engdegård 0 siblings, 1 reply; 29+ messages in thread From: Eli Zaretskii @ 2023-04-15 11:45 UTC (permalink / raw) To: Ihor Radchenko, Stefan Monnier, Mattias Engdegård; +Cc: 62847, gusbrs.2016 > From: Ihor Radchenko <yantar92@posteo.net> > Cc: gusbrs.2016@gmail.com, 62847@debbugs.gnu.org > Date: Sat, 15 Apr 2023 11:44:52 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > > So maybe replace " " with (copy-sequence " "). > > But that should not be necessary, right? I'll let the byte-compilation experts (CC'ed) comment on that. ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 11:45 ` Eli Zaretskii @ 2023-04-15 13:15 ` Mattias Engdegård 2023-04-16 11:29 ` Ihor Radchenko 0 siblings, 1 reply; 29+ messages in thread From: Mattias Engdegård @ 2023-04-15 13:15 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Ihor Radchenko, 62847, Stefan Monnier, gusbrs.2016 15 apr. 2023 kl. 13.45 skrev Eli Zaretskii <eliz@gnu.org>: >>> So maybe replace " " with (copy-sequence " "). >> >> But that should not be necessary, right? Ideally not -- setting properties on literal strings should indeed be avoided for a variety of reasons, one being that the byte compiler shares equal string literals: (defun ff () (list "abc" (let ((s "abc")) (put-text-property 0 3 'aa 'bb s) s))) (ff) -> ("abc" #("abc" 0 3 (aa bb))) ; interpreted -> (#("abc" 0 3 (aa bb)) #("abc" 0 3 (aa bb))) ; byte-compiled `org-agenda-set-mode-name` uses the literal " " twice so if either is modified the other will appear to be, too. Where this setting of properties is done I have no idea There is currently no automatic sharing of string literals between byte-code functions but this may change, and I've no idea what the native compiler is up to in this respect. `propertize` is safe because it makes a copy of its string argument, so there shouldn't be any reason to copy that argument explicitly. `org-add-props` calls `add-text-properties` and is clearly destructive. Interpreted code is less affected by the problem because literals aren't shared throughout a function, but trouble can still occur: (defun hh (x) (let ((s "abc")) (when x (put-text-property 0 3 'aa 'bb s)) s)) (hh nil) -> "abc" (hh t) -> #("abc" 0 3 (aa bb)) (hh nil) -> #("abc" 0 3 (aa bb)) ... ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-15 13:15 ` Mattias Engdegård @ 2023-04-16 11:29 ` Ihor Radchenko 2023-04-16 12:02 ` Mattias Engdegård 0 siblings, 1 reply; 29+ messages in thread From: Ihor Radchenko @ 2023-04-16 11:29 UTC (permalink / raw) To: Mattias Engdegård; +Cc: Eli Zaretskii, 62847, Stefan Monnier, gusbrs.2016 Mattias Engdegård <mattiase@acm.org> writes: > 15 apr. 2023 kl. 13.45 skrev Eli Zaretskii <eliz@gnu.org>: >>>> So maybe replace " " with (copy-sequence " "). >>> >>> But that should not be necessary, right? > > Ideally not -- setting properties on literal strings should indeed be avoided for a variety of reasons, one being that the byte compiler shares equal string literals: Thanks for the clarification! I am wondering if there is any relevant warning raised by the byte compiler when doing something like (let ((str " ")) (add-text-properties 0 1 '(foo bar) str)) -- 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> ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-16 11:29 ` Ihor Radchenko @ 2023-04-16 12:02 ` Mattias Engdegård 2023-04-16 12:17 ` Ihor Radchenko 2023-04-16 14:51 ` Mattias Engdegård 0 siblings, 2 replies; 29+ messages in thread From: Mattias Engdegård @ 2023-04-16 12:02 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Eli Zaretskii, 62847, Stefan Monnier, gusbrs.2016 16 apr. 2023 kl. 13.29 skrev Ihor Radchenko <yantar92@posteo.net>: > I am wondering if there is any relevant warning raised by the byte > compiler when doing something like > (let ((str " ")) (add-text-properties 0 1 '(foo bar) str)) No, but it wouldn't be very hard to add one, but it would miss a lot of code that has no idea whether it is working on a string literal or not. Counter to my usual preference for static checks I'd prefer a dynamic warning in this case because it would be precise and the run-time cost would likely be acceptable. That requires a 'literal' flag for string objects and there's no obvious space for one, but perhaps we can grab the LSB of the `intervals` pointer. Even if such a check defaults to off, it could be enabled selectively to root out bugs like this one. I'll see what I can do. ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-16 12:02 ` Mattias Engdegård @ 2023-04-16 12:17 ` Ihor Radchenko 2023-04-16 12:58 ` Eli Zaretskii 2023-04-16 14:51 ` Mattias Engdegård 1 sibling, 1 reply; 29+ messages in thread From: Ihor Radchenko @ 2023-04-16 12:17 UTC (permalink / raw) To: Mattias Engdegård; +Cc: Eli Zaretskii, 62847, Stefan Monnier, gusbrs.2016 Mattias Engdegård <mattiase@acm.org> writes: > Counter to my usual preference for static checks I'd prefer a dynamic warning in this case because it would be precise and the run-time cost would likely be acceptable. > > That requires a 'literal' flag for string objects and there's no obvious space for one, but perhaps we can grab the LSB of the `intervals` pointer. Side note: It might be interesting to have something similar to `add-variable-watcher' and `debug-on-variable-change', but for mutable objects being modified. -- 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> ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-16 12:17 ` Ihor Radchenko @ 2023-04-16 12:58 ` Eli Zaretskii 2023-04-16 13:14 ` Ihor Radchenko 0 siblings, 1 reply; 29+ messages in thread From: Eli Zaretskii @ 2023-04-16 12:58 UTC (permalink / raw) To: Ihor Radchenko; +Cc: mattiase, 62847, monnier, gusbrs.2016 > From: Ihor Radchenko <yantar92@posteo.net> > Cc: Eli Zaretskii <eliz@gnu.org>, Stefan Monnier <monnier@iro.umontreal.ca>, > gusbrs.2016@gmail.com, 62847@debbugs.gnu.org > Date: Sun, 16 Apr 2023 12:17:31 +0000 > > Side note: It might be interesting to have something similar to > `add-variable-watcher' and `debug-on-variable-change', but for mutable > objects being modified. Propertizing a string doesn't mutate the string itself, though. ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-16 12:58 ` Eli Zaretskii @ 2023-04-16 13:14 ` Ihor Radchenko 2023-04-16 14:43 ` Eli Zaretskii 0 siblings, 1 reply; 29+ messages in thread From: Ihor Radchenko @ 2023-04-16 13:14 UTC (permalink / raw) To: Eli Zaretskii; +Cc: mattiase, 62847, monnier, gusbrs.2016 Eli Zaretskii <eliz@gnu.org> writes: >> Side note: It might be interesting to have something similar to >> `add-variable-watcher' and `debug-on-variable-change', but for mutable >> objects being modified. > > Propertizing a string doesn't mutate the string itself, though. You mean the char vector representing a string? But doesn't the real string object also include the plist? -- 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> ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-16 13:14 ` Ihor Radchenko @ 2023-04-16 14:43 ` Eli Zaretskii 2023-04-16 14:52 ` Ihor Radchenko 0 siblings, 1 reply; 29+ messages in thread From: Eli Zaretskii @ 2023-04-16 14:43 UTC (permalink / raw) To: Ihor Radchenko; +Cc: mattiase, 62847, monnier, gusbrs.2016 > From: Ihor Radchenko <yantar92@posteo.net> > Cc: mattiase@acm.org, monnier@iro.umontreal.ca, gusbrs.2016@gmail.com, > 62847@debbugs.gnu.org > Date: Sun, 16 Apr 2023 13:14:51 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > >> Side note: It might be interesting to have something similar to > >> `add-variable-watcher' and `debug-on-variable-change', but for mutable > >> objects being modified. > > > > Propertizing a string doesn't mutate the string itself, though. > > You mean the char vector representing a string? But doesn't the real > string object also include the plist? It includes a pointer to the string's intervals, which is where the properties are recorded. ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-16 14:43 ` Eli Zaretskii @ 2023-04-16 14:52 ` Ihor Radchenko 2023-04-16 15:17 ` Eli Zaretskii 0 siblings, 1 reply; 29+ messages in thread From: Ihor Radchenko @ 2023-04-16 14:52 UTC (permalink / raw) To: Eli Zaretskii; +Cc: mattiase, 62847, monnier, gusbrs.2016 Eli Zaretskii <eliz@gnu.org> writes: >> You mean the char vector representing a string? But doesn't the real >> string object also include the plist? > > It includes a pointer to the string's intervals, which is where the > properties are recorded. That's internal implementation detail. From Elisp perspective, string vector + string plist constitute string object. Or do I miss something? -- 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> ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-16 14:52 ` Ihor Radchenko @ 2023-04-16 15:17 ` Eli Zaretskii 0 siblings, 0 replies; 29+ messages in thread From: Eli Zaretskii @ 2023-04-16 15:17 UTC (permalink / raw) To: Ihor Radchenko; +Cc: mattiase, 62847, monnier, gusbrs.2016 > From: Ihor Radchenko <yantar92@posteo.net> > Cc: mattiase@acm.org, monnier@iro.umontreal.ca, gusbrs.2016@gmail.com, > 62847@debbugs.gnu.org > Date: Sun, 16 Apr 2023 14:52:02 +0000 > > Eli Zaretskii <eliz@gnu.org> writes: > > >> You mean the char vector representing a string? But doesn't the real > >> string object also include the plist? > > > > It includes a pointer to the string's intervals, which is where the > > properties are recorded. > > That's internal implementation detail. > >From Elisp perspective, string vector + string plist constitute string > object. Or do I miss something? I don't necessarily agree. We have equal-including-properties for a reason. ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-16 12:02 ` Mattias Engdegård 2023-04-16 12:17 ` Ihor Radchenko @ 2023-04-16 14:51 ` Mattias Engdegård 2023-04-16 14:53 ` Mattias Engdegård 1 sibling, 1 reply; 29+ messages in thread From: Mattias Engdegård @ 2023-04-16 14:51 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Eli Zaretskii, 62847, Stefan Monnier, gusbrs.2016 16 apr. 2023 kl. 14.02 skrev Mattias Engdegård <mattiase@acm.org>: > Even if such a check defaults to off, it could be enabled selectively to root out bugs like this one. I'll see what I can do. Here's a patch suitable for debugging (applies to master). It's not proposed for inclusion in Emacs. Attempts to change properties of literal strings result in an error by default. You can also make it warn or do nothing. The patch does not attempt to be very subtle or efficient about it but it should be sound. If you find it hard to find where the problem is, attach a debugger and set a breakpoint on the function `string_literal_prop_change`. ^ permalink raw reply [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-16 14:51 ` Mattias Engdegård @ 2023-04-16 14:53 ` Mattias Engdegård 0 siblings, 0 replies; 29+ messages in thread From: Mattias Engdegård @ 2023-04-16 14:53 UTC (permalink / raw) To: Mattias Engdegård Cc: gusbrs.2016, Ihor Radchenko, 62847, Eli Zaretskii, Stefan Monnier [-- Attachment #1: Type: text/plain, Size: 67 bytes --] > Here's a patch And here's one that I actually attached. Sorry! [-- Attachment #2: string-literal-prop-change.diff --] [-- Type: application/octet-stream, Size: 6743 bytes --] diff --git a/src/alloc.c b/src/alloc.c index d09fc41dec6..616b4fa7a66 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -2606,6 +2606,9 @@ make_clear_multibyte_string (EMACS_INT nchars, EMACS_INT nbytes, bool clearit) s = allocate_string (); s->u.s.intervals = NULL; +#ifdef CHECK_STRING_LITERALS + s->u.s.literal = false; +#endif allocate_string_data (s, nchars, nbytes, clearit, false); XSETSTRING (string, s); string_chars_consed += nbytes; diff --git a/src/lisp.h b/src/lisp.h index 4e17e369312..30c0a001c34 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1560,6 +1560,8 @@ CDR_SAFE (Lisp_Object c) return CONSP (c) ? XCDR (c) : Qnil; } +#define CHECK_STRING_LITERALS 1 + /* In a string or vector, the sign bit of u.s.size is the gc mark bit. */ struct Lisp_String @@ -1579,6 +1581,10 @@ CDR_SAFE (Lisp_Object c) INTERVAL intervals; /* Text properties in this string. */ unsigned char *data; +#ifdef CHECK_STRING_LITERALS + /* Whether this string originated as a string literal in Lisp code. */ + bool literal; +#endif } s; struct Lisp_String *next; GCALIGNED_UNION_MEMBER diff --git a/src/lread.c b/src/lread.c index 273120315df..23d8a1489c1 100644 --- a/src/lread.c +++ b/src/lread.c @@ -1411,6 +1411,10 @@ DEFUN ("load", Fload, Sload, 1, 5, 0, specbind (Qlread_unescaped_character_literals, Qnil); record_unwind_protect (load_warn_unescaped_character_literals, file); +#ifdef CHECK_STRING_LITERALS + specbind (Qlread_unescaped_character_literals, Qnil); +#endif + bool is_elc = suffix_p (found, ".elc"); if (is_elc /* version = 1 means the file is empty, in which case we can @@ -2230,6 +2234,10 @@ readevalloop (Lisp_Object readcharfun, ? Qnil : list1 (Qt))); specbind (Qmacroexp__dynvars, Vmacroexp__dynvars); +#ifdef CHECK_STRING_LITERALS + specbind (Qread_string_literals, Qt); +#endif + /* Ensure sourcename is absolute, except whilst preloading. */ if (!will_dump_p () && !NILP (sourcename) && !NILP (Ffile_name_absolute_p (sourcename))) @@ -3163,6 +3171,10 @@ read_string_literal (Lisp_Object readcharfun) Lisp_Object obj = make_specified_string (read_buffer, nchars, p - read_buffer, (force_multibyte || (p - read_buffer != nchars))); +#ifdef CHECK_STRING_LITERALS + if (!NILP (Vread_string_literals)) + XSTRING (obj)->u.s.literal = true; +#endif return unbind_to (count, obj); } @@ -3363,7 +3375,14 @@ string_props_from_rev_list (Lisp_Object elems, Lisp_Object readcharfun) invalid_syntax ("Invalid string property list", readcharfun); Lisp_Object plist = XCAR (tl); tl = XCDR (tl); +#ifdef CHECK_STRING_LITERALS + bool lit = XSTRING (obj)->u.s.literal; + XSTRING (obj)->u.s.literal = false; +#endif Fset_text_properties (beg, end, plist, obj); +#ifdef CHECK_STRING_LITERALS + XSTRING (obj)->u.s.literal = lit; +#endif } return obj; } @@ -5452,6 +5471,21 @@ syms_of_lread (void) doc: /* Non-nil means read recursive structures using #N= and #N# syntax. */); Vread_circle = Qt; +#ifdef CHECK_STRING_LITERALS + DEFVAR_LISP ("read-string-literals", Vread_string_literals, + doc: /* Non-nil means read string literals as literals. */); + Vread_string_literals = Qnil; + DEFSYM (Qread_string_literals, "read-string-literals"); + DEFVAR_LISP ("string-literal-property-change", + Vstring_literal_property_change, + doc: /* How to handle changes to properties in literal strings. +If `error', raise an error. +If `warn', emit a warning. +If `nil', do nothing. */); + Vstring_literal_property_change = Qerror; + DEFSYM (Qwarn, "warn"); +#endif + DEFVAR_LISP ("load-path", Vload_path, doc: /* List of directories to search for files to load. Each element is a string (directory file name) or nil (meaning diff --git a/src/textprop.c b/src/textprop.c index f88fff19c59..2a57262ec67 100644 --- a/src/textprop.c +++ b/src/textprop.c @@ -1164,6 +1164,36 @@ DEFUN ("previous-single-property-change", Fprevious_single_property_change, return make_fixnum (previous->position + LENGTH (previous)); } \f + +#ifdef CHECK_STRING_LITERALS +__attribute__((noinline)) void +string_literal_prop_change (Lisp_Object object); + +__attribute__((noinline)) void +string_literal_prop_change (Lisp_Object object) +{ + Lisp_Object how = Vstring_literal_property_change; + if (EQ (how, Qerror)) + error ("Attempt to modify properties of literal string \"%s\"", + SSDATA (object)); + else if (EQ (how, Qwarn)) + call2 (intern ("warn"), + build_string + ("Attempt to modify properties of literal string %S"), + object); +} +#endif + +static void +check_string_literal_prop_change (Lisp_Object object) +{ +#ifdef CHECK_STRING_LITERALS + if (STRINGP (object) && XSTRING (object)->u.s.literal + && SCHARS (object) > 0) + string_literal_prop_change (object); +#endif +} + /* Used by add-text-properties and add-face-text-property. */ static Lisp_Object @@ -1184,6 +1214,8 @@ add_text_properties_1 (Lisp_Object start, Lisp_Object end, destructive)); } + check_string_literal_prop_change (object); + INTERVAL i, unchanged; ptrdiff_t s, len; bool modified = false; @@ -1399,6 +1431,15 @@ set_text_properties (Lisp_Object start, Lisp_Object end, Lisp_Object properties, object, coherent_change_p)); } +#ifdef CHECK_STRING_LITERALS + // Don't complain about removal of properties from a string without any. + if (STRINGP (object) && !(!string_intervals (object) + && NILP (properties) + && BASE_EQ (start, make_fixnum (0)) + && BASE_EQ (end, make_fixnum (SCHARS (object))))) + check_string_literal_prop_change (object); +#endif + INTERVAL i; bool first_time = true; @@ -1483,6 +1524,8 @@ set_text_properties_1 (Lisp_Object start, Lisp_Object end, return; } + check_string_literal_prop_change (object); + INTERVAL prev_changed = NULL; ptrdiff_t s = XFIXNUM (start); ptrdiff_t len = XFIXNUM (end) - s; @@ -1578,6 +1621,8 @@ DEFUN ("remove-text-properties", Fremove_text_properties, object)); } + check_string_literal_prop_change (object); + INTERVAL i, unchanged; ptrdiff_t s, len; bool modified = false; @@ -1704,6 +1749,8 @@ DEFUN ("remove-list-of-text-properties", Fremove_list_of_text_properties, object)); } + check_string_literal_prop_change (object); + INTERVAL i, unchanged; ptrdiff_t s, len; bool modified = false; ^ permalink raw reply related [flat|nested] 29+ messages in thread
* bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name 2023-04-14 23:04 bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name Gustavo Barros 2023-04-15 9:38 ` Ihor Radchenko @ 2023-04-16 12:38 ` Daniel Mendler 1 sibling, 0 replies; 29+ messages in thread From: Daniel Mendler @ 2023-04-16 12:38 UTC (permalink / raw) To: 62847; +Cc: mattiase, Stefan Monnier Hello Mattias! > That requires a 'literal' flag for string objects and there's no obvious space for one, but perhaps we can grab the LSB of the `intervals` pointer. There was a recent report where I pointed out a segfault for `aset` on "literal strings" (symbol names which are C strings located in the read-only memory of the process). If you consider adding such a literal string flag or read-only check, could this please be added there too? I am in favor of adding immutable strings to Elisp. This would certainly open up optimization potential for the bytecode compiler, in addition to guarding against bugs like the one being discussed here. Daniel ^ permalink raw reply [flat|nested] 29+ messages in thread
end of thread, other threads:[~2023-04-16 15:17 UTC | newest] Thread overview: 29+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-04-14 23:04 bug#62847: 29.0.90; Propertized space in Org Agenda's mode-name Gustavo Barros 2023-04-15 9:38 ` Ihor Radchenko 2023-04-15 9:49 ` Eli Zaretskii 2023-04-15 10:02 ` Ihor Radchenko 2023-04-15 10:24 ` Eli Zaretskii 2023-04-15 10:40 ` Ihor Radchenko 2023-04-15 10:55 ` Eli Zaretskii 2023-04-15 11:28 ` Gustavo Barros 2023-04-15 11:44 ` Ihor Radchenko 2023-04-15 11:49 ` Gustavo Barros 2023-04-15 12:08 ` Ihor Radchenko 2023-04-15 13:21 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors 2023-04-16 11:23 ` Ihor Radchenko 2023-04-16 11:49 ` Gustavo Barros 2023-04-15 11:38 ` Eli Zaretskii 2023-04-15 11:44 ` Ihor Radchenko 2023-04-15 11:45 ` Eli Zaretskii 2023-04-15 13:15 ` Mattias Engdegård 2023-04-16 11:29 ` Ihor Radchenko 2023-04-16 12:02 ` Mattias Engdegård 2023-04-16 12:17 ` Ihor Radchenko 2023-04-16 12:58 ` Eli Zaretskii 2023-04-16 13:14 ` Ihor Radchenko 2023-04-16 14:43 ` Eli Zaretskii 2023-04-16 14:52 ` Ihor Radchenko 2023-04-16 15:17 ` Eli Zaretskii 2023-04-16 14:51 ` Mattias Engdegård 2023-04-16 14:53 ` Mattias Engdegård 2023-04-16 12:38 ` Daniel Mendler
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).