GNU bug report logs - #63838
28.2; 'wid-edit.el' problems with 'integer' (and 'sexp') widgets.

Previous Next

Package: emacs;

Reported by: Marco Antoniotti <marcoxa <at> gmail.com>

Date: Fri, 2 Jun 2023 11:13:01 UTC

Severity: normal

Tags: patch

Found in version 28.2

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 63838 in the body.
You can then email your comments to 63838 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#63838; Package emacs. (Fri, 02 Jun 2023 11:13:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Marco Antoniotti <marcoxa <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Fri, 02 Jun 2023 11:13:01 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Marco Antoniotti <marcoxa <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 28.2; 'wid-edit.el' problems with 'integer' (and 'sexp') widgets.
Date: Fri, 2 Jun 2023 11:49:10 +0200
[Message part 1 (text/plain, inline)]
Hi

The issue is with the following code that tries to use the Widget
library.  The slots of the widget are actually not necessary to see the
problem.

 (widget-create 'integer
                :help-echo "Enter an integer..."
                :notify (lambda (w1 &rest ws)
                           (ignore ws)
                           (message "WIFT: IF: %s"
                                    (widget-value w1)
                           ))
                :size 4
  )

If you set up a widget buffer, the field will appear as expected with a 0
as initial value.  The problem starts if you try to clear the field and
then enter a new value, say by hitting C-k, and the problem is in the
:value-to-external functions in the in sexp and restricted-sexp widgets
(the number, float and natnum widgets must also be fixed).

The library :value-to-external functions eventually do a (read value) where
value is the widget value; alas, value can be "" if you edit the field in a
pretty standard way, as, as I said above, if you had tried to kill the
field line (C-k); this causes the traditional minor demons to fly out of
the nose, as a 'End of file during parsing' error gets signaled.  After
that, the buffer with the widgets is pretty much in a random state.

Specializing the widget with a hack like the function below fixes the
problem, but a
good solution may need some more work to get all the corner cases.  Note
that setting a "widget buffer" in overwrite mode goes a long way to
mitigate these problems: maybe having widget-setup switch to it would be
another good thing to do.

  :value-to-external
  (lambda (widget value)
    ;; Lifted, and fixed, from `:value-to-external' in
    ;; `restricted-sexp'.

    (unless (stringp value)
      (display-warning
       'widget-bad-default-value
       (format-message
        "\nA widget of type %S has a bad default value.
value: %S
match function: %S
match-alternatives: %S"
        (widget-type widget)
        value
        (widget-get widget :match)
        (widget-get widget :match-alternatives))
       :warning))
    (if (and (stringp value) (string-equal "" value))
        ;; Oooops, we cannot just `read'.
        (widget-get widget :default-value)
      (read value))
    )

Note: this goes back, at least, to 25.x.

Thanks for the attention

Marco Antoniotti





In GNU Emacs 28.2 (build 2, x86_64-w64-mingw32)
 of 2022-09-13 built on AVALON
Windowing system distributor 'Microsoft Corp.', version 10.0.22621
System Description: Microsoft Windows 10 Pro (v10.0.2009.22621.1778)

Configured using:
 'configure --with-modules --without-dbus --with-native-compilation
 --without-compress-install CFLAGS=-O2'

Configured features:
ACL GIF GMP GNUTLS HARFBUZZ JPEG JSON LCMS2 LIBXML2 MODULES NATIVE_COMP
NOTIFY W32NOTIFY PDUMPER PNG RSVG SOUND THREADS TIFF TOOLKIT_SCROLL_BARS
XPM ZLIB

(NATIVE_COMP present but libgccjit not available)

Important settings:
  value of $LANG: ENG
  locale-coding-system: cp1252

Major mode: Fundamental

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
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  buffer-read-only: t
  line-number-mode: t
  transient-mark-mode: t

Features:
(shadow sort mail-extr emacsbug message rmc puny dired dired-loaddefs
rfc822 mml mml-sec epa derived gnus-util rmail rmail-loaddefs
text-property-search mm-decode mm-bodies mm-encode mail-parse rfc2231
mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums
mm-util mail-prsvr mail-utils time-date wombat-theme finder-inf tex-site
epg rfc6068 epg-config gnu-elpa-keyring-update slime-autoloads rx info
package browse-url url url-proxy url-privacy url-expand url-methods
url-history url-cookie url-domsuf url-util mailcap url-handlers
url-parse auth-source cl-seq eieio eieio-core cl-macs eieio-loaddefs
password-cache json subr-x map url-vars seq byte-opt gv bytecomp
byte-compile cconv cl-loaddefs cl-lib iso-transl tooltip eldoc paren
electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
dos-w32 ls-lisp disp-table term/w32-win w32-win w32-vars term/common-win
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 cl-generic
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite emoji-zwj charscript
charprop case-table epa-hook jka-cmpr-hook help simple abbrev obarray
cl-preloaded nadvice button loaddefs faces cus-face macroexp files
window text-properties overlay sha1 md5 base64 format env code-pages
mule custom widget hashtable-print-readable backquote threads w32notify
w32 lcms2 multi-tty make-network-process native-compile emacs)

Memory information:
((conses 16 246351 7879)
 (symbols 48 14548 1)
 (strings 32 84982 2407)
 (string-bytes 1 2218067)
 (vectors 16 24066)
 (vector-slots 8 414464 16368)
 (floats 8 28 222)
 (intervals 56 377 9)
 (buffers 992 12))


-- 
Marco Antoniotti
Somewhere over the Rainbow
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#63838; Package emacs. (Sun, 16 Jul 2023 11:51:02 GMT) Full text and rfc822 format available.

Message #8 received at 63838 <at> debbugs.gnu.org (full text, mbox):

From: Mauro Aranda <maurooaranda <at> gmail.com>
To: Marco Antoniotti <marcoxa <at> gmail.com>
Cc: 63838 <at> debbugs.gnu.org
Subject: Re: bug#63838: 28.2; 'wid-edit.el' problems with 'integer' (and
 'sexp') widgets.
Date: Sun, 16 Jul 2023 08:50:28 -0300
Marco Antoniotti <marcoxa <at> gmail.com> writes:

> Hi

Thanks for the bug report!

> The issue is with the following code that tries to use the Widget
> library.  The slots of the widget are actually not necessary to see the
> problem.
>
>  (widget-create 'integer
>                 :help-echo "Enter an integer..."
>                 :notify (lambda (w1 &rest ws)
>                            (ignore ws)
>                            (message "WIFT: IF: %s"
>                                     (widget-value w1)
>                            ))
>                 :size 4
>   )

The :notify value is kind of necessary, right? I mean, the bug doesn't
manifest as long as code doesn't try to access the value of a
restricted-sexp widget while its empty.

> Specializing the widget with a hack like the function below fixes the
> problem, but a
> good solution may need some more work to get all the corner cases.
> Note that setting a "widget buffer" in overwrite mode goes a long way to
> mitigate these problems: maybe having widget-setup switch to it would
> be another good thing to do.

I don't think we want to do that.

>  :value-to-external
>   (lambda (widget value)
>     ;; Lifted, and fixed, from `:value-to-external' in
>     ;; `restricted-sexp'.
>
>     (unless (stringp value)
>       (display-warning
>        'widget-bad-default-value
>        (format-message
>         "\nA widget of type %S has a bad default value.
> value: %S
> match function: %S
> match-alternatives: %S"
>         (widget-type widget)
>         value
>         (widget-get widget :match)
>         (widget-get widget :match-alternatives))
>        :warning))
>     (if (and (stringp value) (string-equal "" value))
>         ;; Oooops, we cannot just `read'.
>         (widget-get widget :default-value)
>       (read value))
>     )

I don't think this is a good place to do this.  And there's no
:default-value property in the widget library, just :value.

I think it'd be much better if we specialize the :value-get function for
the restricted-sexp widget, defaulting to return :value when the widget
is empty.






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#63838; Package emacs. (Sat, 09 Sep 2023 15:15:01 GMT) Full text and rfc822 format available.

Message #11 received at 63838 <at> debbugs.gnu.org (full text, mbox):

From: Mauro Aranda <maurooaranda <at> gmail.com>
To: 63838 <at> debbugs.gnu.org
Cc: Marco Antoniotti <marcoxa <at> gmail.com>
Subject: Re: bug#63838: 28.2; 'wid-edit.el' problems with 'integer' (and
 'sexp') widgets.
Date: Sat, 9 Sep 2023 12:13:53 -0300
[Message part 1 (text/plain, inline)]
tags 63838 patch
quit


I attach a patch to handle an empty restricted sexp widget, together
with a test.
[0001-Avoid-errors-when-a-restricted-sexp-widget-is-empty.patch (text/x-patch, attachment)]

Added tag(s) patch. Request was from Mauro Aranda <maurooaranda <at> gmail.com> to control <at> debbugs.gnu.org. (Sat, 09 Sep 2023 15:15:02 GMT) Full text and rfc822 format available.

Reply sent to Eli Zaretskii <eliz <at> gnu.org>:
You have taken responsibility. (Sat, 16 Sep 2023 09:59:01 GMT) Full text and rfc822 format available.

Notification sent to Marco Antoniotti <marcoxa <at> gmail.com>:
bug acknowledged by developer. (Sat, 16 Sep 2023 09:59:02 GMT) Full text and rfc822 format available.

Message #18 received at 63838-done <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Mauro Aranda <maurooaranda <at> gmail.com>
Cc: marcoxa <at> gmail.com, 63838-done <at> debbugs.gnu.org
Subject: Re: bug#63838: 28.2;
 'wid-edit.el' problems with 'integer' (and 'sexp') widgets.
Date: Sat, 16 Sep 2023 12:58:31 +0300
> Cc: Marco Antoniotti <marcoxa <at> gmail.com>
> Date: Sat, 9 Sep 2023 12:13:53 -0300
> From: Mauro Aranda <maurooaranda <at> gmail.com>
> 
> I attach a patch to handle an empty restricted sexp widget, together
> with a test.

Thanks, installed on the master branch, and closing the bug.




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sat, 14 Oct 2023 11:24:09 GMT) Full text and rfc822 format available.

This bug report was last modified 189 days ago.

Previous Next


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