From: Alan Mackenzie <acm@muc.de>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: acm@muc.de, 66912@debbugs.gnu.org
Subject: bug#66912: With `require', the byte compiler reports the wrong file for errors.
Date: Mon, 4 Nov 2024 12:52:10 +0000 [thread overview]
Message-ID: <ZyjDerzdpdMJwO5d@MAC.fritz.box> (raw)
In-Reply-To: <jwvo72v92aa.fsf-monnier+emacs@gnu.org>
Hello, Stefan.
Thanks for such a rapid response!
On Sun, Nov 03, 2024 at 21:46:42 -0500, Stefan Monnier wrote:
> Hi Alan,
> I couldn't properly review your code because I had trouble
> understanding it. So instead, it's mostly questions.
> > +static Lisp_Object
> > +internal_cc_hb (enum handlertype handlertype,
> > + Lisp_Object (*bfun) (void), Lisp_Object handlers,
> > + Lisp_Object (*hfun) (Lisp_Object))
> > +{
> > + struct handler *c = push_handler (handlers, handlertype);
> > +
> > + if (handlertype == HANDLER_BIND)
> > + {
> > + c->val = Qnil;
> > + c->bin_handler = hfun;
> > + c->bytecode_dest = 0;
> > + }
> > + if (sys_setjmp (c->jmp))
> > + {
> > + Lisp_Object val = handlerlist->val;
> > + clobbered_eassert (handlerlist == c);
> > + handlerlist = handlerlist->next;
> > + return hfun (val);
> > + }
> > + else
> > + {
> > + Lisp_Object val = bfun ();
> > + eassert (handlerlist == c);
> > + handlerlist = c->next;
> > + return val;
> > + }
> > +}
> I don't understand the above code: `handler-bind` is not supposed to
> call setjmp/longjmp: when the handler of a `handler-bind` gets called,
> the stack is not unwound.
I started off by just making the HANDLER_BIND case use the same code as
CONDITION_CASE, and got segfaults. I've tried to find the places where
a longjmp gets called for condition-case, but my brain's tired after a
weekend of heavy coding.
Given HANDLER_BIND doesn't need the setjmp/longjmp mechanism, it would
seem there's no sense in combining the HANDLER_BIND and CONDITION_CASE
cases in internal_cc_hb and friends. I should just restore the
condition-case functions to what they were, and add separate new ones
for handler-bind.
> So what is the `sys_setjmp` for when `handlertype == HANDLER_BIND`?
After reading your previous paragraph, probably nothing.
[ .... ]
> [ We don't need parens around `h->bin_handler`. ]
They've gone.
> > + else
> > + call1 (h->val, error);
> > + unbind_to (count, Qnil); /* Removes SKIP_CONDITIONS handler. */
> > + pop_handler (); /* Discards HANDLER_BIND handler. */
> These comments don't match my understanding of the code: IIRC the
> `pop_handler` pops the `SKIP_CONDITIONS` handler.
I think I see now you're right. push_handler doesn't push an entry onto
the binding stack. I'll amend these comments as soon as I understand
the code. I think these lines definitely need comments.
> Also there's no reason to presume the HANDLER_BIND handler is at the
> top, so if we wanted to remove it, we'd have to work harder.
This code is difficult to understand. What is the purpose of the
binding block around the call of the handler function? I think a
comment here would help.
> > +/* Handle errors signalled by the above function. */
> > +static Lisp_Object
> > +rel_error_handler (Lisp_Object err)
> > +{
> > + if (!NILP (Vdebug_on_error))
> > + {
> > + call_debugger (err);
> > + Fthrow (Qtop_level, Qt);
> > + }
> > + else
> > + return err;
> > +}
> I don't understand that.
> AFAICT, this is the only HANDLER_BIND handler you install from
> C code, right? So this is the thing that motivates all the changes like
> `internal_cc_hb`, etc... so clearly it must do something worthwhile, but
> I don't see what it is.
rel_error_handler is currently the only such handler, yes. All this
code (once it's debugged) will fix the inconsistency that
condition-case, unwind-protect, catch and throw, ... can all be used
from C code, but handler-bind can't be.
rel_error_handler, in particular, allows the debugger to be called
regardless of any active condition_cases which would otherwise block it.
In the byte compiler, there is such a blocking condition-case set up by
bytecomp--displaying-warnings when byte-compile-debug is nil. This
mechanism is currently only used in Fload.
> How is this related to `Fprefix_load_file_names`?
Not closely. I think I should have propsed two separate patches, rather
than the big one I did. Fprefix_load_file_names is what puts the "While
loading foo.el... " in front of an error message.
> Stefan
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2024-11-04 12:52 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-03 11:32 bug#66912: With `require', the byte compiler reports the wrong file for errors Alan Mackenzie
2023-11-03 16:09 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-11-12 16:30 ` Alan Mackenzie
2023-11-12 17:28 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-11-12 20:41 ` Alan Mackenzie
2023-11-12 21:19 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-11-12 23:00 ` Drew Adams
2024-10-29 18:59 ` Alan Mackenzie
2024-10-30 19:33 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-10-30 21:52 ` Alan Mackenzie
2024-10-30 22:31 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-02 13:47 ` Alan Mackenzie
2024-11-02 14:51 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-03 22:34 ` Alan Mackenzie
2024-11-04 2:46 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-04 12:52 ` Alan Mackenzie [this message]
2024-11-04 16:12 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-04 21:08 ` Alan Mackenzie
2024-11-05 3:27 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-05 4:15 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-05 14:54 ` Alan Mackenzie
2024-11-05 19:00 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-05 20:33 ` Alan Mackenzie
2024-11-05 23:20 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-06 16:23 ` Alan Mackenzie
2024-11-06 18:51 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-06 20:12 ` Alan Mackenzie
2024-11-06 23:14 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-07 12:37 ` Alan Mackenzie
2024-11-07 16:09 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-07 17:15 ` Alan Mackenzie
2024-11-08 13:42 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-08 20:01 ` Alan Mackenzie
2024-11-08 20:26 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-09 12:35 ` Alan Mackenzie
2024-11-09 16:45 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-10 10:40 ` Alan Mackenzie
2024-11-10 16:45 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-10 17:48 ` Alan Mackenzie
2024-11-10 21:37 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-12 14:53 ` Alan Mackenzie
2024-11-12 15:38 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-07 15:04 ` Alan Mackenzie
2024-11-05 12:18 ` Eli Zaretskii
2024-11-05 14:04 ` Alan Mackenzie
2024-11-05 14:06 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-04 16:35 ` Alan Mackenzie
2024-11-04 12:20 ` Eli Zaretskii
2024-11-04 13:13 ` Alan Mackenzie
2024-11-04 13:34 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZyjDerzdpdMJwO5d@MAC.fritz.box \
--to=acm@muc.de \
--cc=66912@debbugs.gnu.org \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.