Subject: bug#59710: Wrong type argument when editing a multisession variable

From: Eli Zaretskii <[email-masked]>
Date: Fri, 02 Dec 2022 15:07:02 +0200

> Cc: "lars ingebrigtsen" <[email-masked]>
> From: Juanma Barranquero <[email-masked]>
> Date: Wed, 30 Nov 2022 02:49:15 +0100
> 
> Debugger entered--Lisp error: (wrong-type-argument symbolp (intern (cdr id)))
>   multisession-edit-value(("test" . "test-var"))
>   funcall-interactively(multisession-edit-value ("test" . "test-var"))
>   command-execute(multisession-edit-value)
> 
> The problem comes from this change
> 
>   commit bd586121ac21e046f60f75eeb0200866c38d6f9f
>   Author: Lars Ingebrigtsen <[email-masked]>
>   Date:   2022-01-22 11:56:13 +0100
> 
>       Make the test for existing multisession variables more sensible
> 
>       * lisp/emacs-lisp/multisession.el (multisession-edit-value):
>       Unconfuse the code.
> 
>   diff --git a/lisp/emacs-lisp/multisession.el b/lisp/emacs-lisp/multisession.el
>   index 4a293796a8..25307594c6 100644
>   --- a/lisp/emacs-lisp/multisession.el
>   +++ b/lisp/emacs-lisp/multisession.el
>   @@ -437,8 +437,8 @@ multisession-edit-value
>      (let* ((object (or
>                      ;; If the multisession variable already exists, use
>                      ;; it (so that we update it).
>   -                  (and (boundp (intern-soft (cdr id)))
>   -                       (symbol-value (intern (cdr id))))
>   +                  (and (intern-soft (cdr id))
>   +                       (bound-and-true-p (intern (cdr id))))
>                      ;; Create a new object.
>                      (make-multisession
>                       :package (car id)
> 
> because `bound-and-true-p' is a macro that requires as argument a symbol, which (intern ...) is not.
> 
> ELISP> (bound-and-true-p (intern "whatever"))
> *** Eval error ***  Wrong type argument: symbolp, (intern "whatever")
> 
> so I'm afraid this change was never tested.
> 
> The fix is reverting the change, doing perhaps this
> 
> diff --git a/lisp/emacs-lisp/multisession.el b/lisp/emacs-lisp/multisession.el
> index 9d6e8c0d88..78d4137317 100644
> --- a/lisp/emacs-lisp/multisession.el
> +++ b/lisp/emacs-lisp/multisession.el
> @@ -447,8 +447,9 @@ multisession-edit-value
>    (let* ((object (or
>                    ;; If the multisession variable already exists, use
>                    ;; it (so that we update it).
> -                  (and (intern-soft (cdr id))
> -                       (bound-and-true-p (intern (cdr id))))
> +                  (if-let (sym (intern-soft (cdr id)))
> +                      (and (boundp sym) (symbol-value sym))
> +                    nil)
>                    ;; Create a new object.
>                    (make-multisession
>                     :package (car id)

This makes sense to me, so please go ahead and install (assuming that the
multisession tests still all pass after this change).

Thanks.