Subject: Re: bug#37415: Asserting failure setting frame parameters to non-fixnum values in early-init.el

From: Juanma Barranquero <[email-masked]>
Date: Sun, 22 Sep 2019 07:54:07 +0200

Curiouser and curiouser.

With no init.el or early-init.el:

   emacs --eval "(let ((default-frame-alist '((left . 1000))))
(make-frame-command))"

works (it creates an additional frame, displaced to the right).

   emacs --eval "(let ((default-frame-alist '((left . (- 0)))))
(make-frame-command))"

lisp.h:1231: Emacs fatal error: assertion failed: FIXNUMP (a)

Or, equivalently,

  emacs -Q --no-site-file

  M-: (let ((default-frame-alist '((left . (- 0))))) (make-frame-command))
<RET>

so the bit about early-init.el seems like a red herring.

On Sat, Sep 21, 2019 at 2:27 PM Eli Zaretskii <[email-masked]> wrote:

> > From: Juanma Barranquero <[email-masked]>
> > Date: Sat, 21 Sep 2019 12:02:51 +0200
> > Cc: martin rudalics <[email-masked]>, [email-masked]
> >
> > Before 572fe798cd0a00ad4a9050a7962cf8e8fbcc209b (from 2014-09-30), the
> computation of left and top
> > was done in w32_createwindow:
> >
> >       /* When called with RES_TYPE_NUMBER, w32_get_arg will return zero
> >         for anything that is not a number and is not Qunbound.  */
> >       left = x_get_arg (dpyinfo, Qnil, Qleft, "left", "Left",
> RES_TYPE_NUMBER);
> >       top = x_get_arg (dpyinfo, Qnil, Qtop, "top", "Top",
> RES_TYPE_NUMBER);
> >
> > and anything not a number was turned to 0.
> >
> > In that commit you moved the code to my_create_window and used XINT:
> >
> >  +  /* When called with RES_TYPE_NUMBER, x_get_arg will return zero for
> >  +     anything that is not a number and is not Qunbound.  */
> >  +  left = x_get_arg (dpyinfo, Qnil, Qleft, "left", "Left",
> RES_TYPE_NUMBER);
> >  +  top = x_get_arg (dpyinfo, Qnil, Qtop, "top", "Top", RES_TYPE_NUMBER);
> >  +  if (EQ (left, Qunbound))
> >  +    coords[0] = CW_USEDEFAULT;
> >  +  else
> >  +    coords[0] = XINT (left);
> >  +  if (EQ (top, Qunbound))
> >  +    coords[1] = CW_USEDEFAULT;
> >  +  else
> >  +    coords[1] = XINT (top);
> >  +
>
> Yes, but contrary to the comment, in the case in point we don't get
> zero from x_get_arg.  Which is why I asked all those questions.
>