unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#74294: Master: debug-on-error is ineffective whilst requiring a file from the byte compiler.
@ 2024-11-10 13:05 Alan Mackenzie
  2024-11-10 17:31 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 3+ messages in thread
From: Alan Mackenzie @ 2024-11-10 13:05 UTC (permalink / raw)
  To: 74294; +Cc: Stefan Monnier

Hello, Emacs.

In master (any recent version):

Create the following files:

1: ~/test-byte-compile-errors.el:
#########################################################################
;; -*- lexical-binding:t -*-
(require 'test-byte-compile-errors-2 "~/test-byte-compile-errors-2")
#########################################################################

2: ~/test-byte-compile-errors-2.el:
#########################################################################
;; -*- lexical-binding:t -*-
(car 'baz)

(provide 'test-byte-compile-errors-2)
#########################################################################

(Note the erroneous (car 'baz) in this file.)

(i) emacs -Q
(ii) M-: (setq debug-on-error t) RET
(iii) M-x byte-compile-file RET ~/test-byte-compile-errors.el RET

(iv) The error message:

    test-byte-compile-errors.el:2:11: Error: Wrong type argument: listp, baz

is displayed.  The debugger is not run.  This is surely a bug.

(Note also, the file name displayed is not that where the error is: See
bug#66912.)

#########################################################################

Diagnosis
---------

In the function bytecomp--displaying-warnings (bytecomp.el), a blocking
condition-case is set up, except when byte-compile-debug is non-nil.
This prevents the debugger running.  The problem is, the effect of this
condition-case prevails even outside the byte compiler whilst loading a
file with `require'.

#########################################################################

Proposed Resolution
-------------------

Set up one or more handler-binds around the parts of Fload that evaluate
the contents of the file being loaded.  In the event of an error, the
handler-bind handler would trigger, test debug-on-error, and if it's set
appropriately, call the debugger, then quit.  Otherwise, the handler
would return, and the error handling would eventually reach the
condition-case set up by bytecomp--displaying-warnings.

-- 
Alan Mackenzie (Nuremberg, Germany).





^ permalink raw reply	[flat|nested] 3+ messages in thread

* bug#74294: Master: debug-on-error is ineffective whilst requiring a file from the byte compiler.
  2024-11-10 13:05 bug#74294: Master: debug-on-error is ineffective whilst requiring a file from the byte compiler Alan Mackenzie
@ 2024-11-10 17:31 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-11-10 18:38   ` Alan Mackenzie
  0 siblings, 1 reply; 3+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-11-10 17:31 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: 74294

> Create the following files:
>
> 1: ~/test-byte-compile-errors.el:
> #########################################################################
> ;; -*- lexical-binding:t -*-
> (require 'test-byte-compile-errors-2 "~/test-byte-compile-errors-2")
> #########################################################################
>
> 2: ~/test-byte-compile-errors-2.el:
> #########################################################################
> ;; -*- lexical-binding:t -*-
> (car 'baz)
>
> (provide 'test-byte-compile-errors-2)
> #########################################################################
>
> (Note the erroneous (car 'baz) in this file.)
>
> (i) emacs -Q
> (ii) M-: (setq debug-on-error t) RET
> (iii) M-x byte-compile-file RET ~/test-byte-compile-errors.el RET
>
> (iv) The error message:
>
>     test-byte-compile-errors.el:2:11: Error: Wrong type argument: listp, baz
>
> is displayed.  The debugger is not run.  This is surely a bug.
>
> (Note also, the file name displayed is not that where the error is: See
> bug#66912.)
>
> #########################################################################
>
> Diagnosis
> ---------
>
> In the function bytecomp--displaying-warnings (bytecomp.el), a blocking
> condition-case is set up, except when byte-compile-debug is non-nil.
> This prevents the debugger running.  The problem is, the effect of this
> condition-case prevails even outside the byte compiler whilst loading a
> file with `require'.

Hmm... whether it's "outside the byte compiler" or not is debatable.
[ FWIW, I've been annoyed by the behavior as well, but just decided to set
  `byte-compile-debug` to t in my init file, and life is bliss since then.  ]

> Set up one or more handler-binds around the parts of Fload that evaluate
> the contents of the file being loaded.  In the event of an error, the
> handler-bind handler would trigger, test debug-on-error, and if it's set
> appropriately, call the debugger, then quit.  Otherwise, the handler
> would return, and the error handling would eventually reach the
> condition-case set up by bytecomp--displaying-warnings.

Is the problem specific to `load`, really?
What about errors within `eval-when-compile` or during the expansion of
one of the macros?

Also, do you really want to bring up the debugger in cases like

    (eval-when-compile
      (condition-case nil
          (require ...)
        (error ...)))

which I've seen used in a few packages out there?


        Stefan






^ permalink raw reply	[flat|nested] 3+ messages in thread

* bug#74294: Master: debug-on-error is ineffective whilst requiring a file from the byte compiler.
  2024-11-10 17:31 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-11-10 18:38   ` Alan Mackenzie
  0 siblings, 0 replies; 3+ messages in thread
From: Alan Mackenzie @ 2024-11-10 18:38 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: acm, 74294

Hello, Stefan.

On Sun, Nov 10, 2024 at 12:31:46 -0500, Stefan Monnier wrote:
> > Create the following files:

> > 1: ~/test-byte-compile-errors.el:
> > #########################################################################
> > ;; -*- lexical-binding:t -*-
> > (require 'test-byte-compile-errors-2 "~/test-byte-compile-errors-2")
> > #########################################################################

> > 2: ~/test-byte-compile-errors-2.el:
> > #########################################################################
> > ;; -*- lexical-binding:t -*-
> > (car 'baz)

> > (provide 'test-byte-compile-errors-2)
> > #########################################################################

> > (Note the erroneous (car 'baz) in this file.)

> > (i) emacs -Q
> > (ii) M-: (setq debug-on-error t) RET
> > (iii) M-x byte-compile-file RET ~/test-byte-compile-errors.el RET

> > (iv) The error message:

> >     test-byte-compile-errors.el:2:11: Error: Wrong type argument: listp, baz

> > is displayed.  The debugger is not run.  This is surely a bug.

> > (Note also, the file name displayed is not that where the error is: See
> > bug#66912.)

> > #########################################################################

> > Diagnosis
> > ---------

> > In the function bytecomp--displaying-warnings (bytecomp.el), a blocking
> > condition-case is set up, except when byte-compile-debug is non-nil.
> > This prevents the debugger running.  The problem is, the effect of this
> > condition-case prevails even outside the byte compiler whilst loading a
> > file with `require'.

> Hmm... whether it's "outside the byte compiler" or not is debatable.

Well for sure, we're not processing functions beginning "byte-compile-"
at the time.  And perhaps most pertinently, an error in Fload doesn't
(?can't be made to) invoke the byte compiler's error mechanism
satisfactorally.

> [ FWIW, I've been annoyed by the behavior as well, but just decided to set
>   `byte-compile-debug` to t in my init file, and life is bliss since then.  ]

That's fine for those who know about byte-compile-debug.  I suspect the
vast majority of users don't.  And it's a hassle to have to run something
THREE times to get a backtrace:  The first time the error happens, the
second time the user sets debug-on-error, then after considerable
frustration and looking up of the elisp manual, the third time with
byte-compile-debug set too.

There might be an argument here for removing byte-compile-debug and that
condition-case altogether, but that's not what I'm arguing at the moment.

> > Set up one or more handler-binds around the parts of Fload that evaluate
> > the contents of the file being loaded.  In the event of an error, the
> > handler-bind handler would trigger, test debug-on-error, and if it's set
> > appropriately, call the debugger, then quit.  Otherwise, the handler
> > would return, and the error handling would eventually reach the
> > condition-case set up by bytecomp--displaying-warnings.

> Is the problem specific to `load`, really?

Yes, I think it is.  Because it is precisely during Fload called from the
byte compiler when a signalled error gives no clue as to the source of
that error.

> What about errors within `eval-when-compile` or during the expansion of
> one of the macros?

Errors there will say where they have happened, more or less.

> Also, do you really want to bring up the debugger in cases like

>     (eval-when-compile
>       (condition-case nil
>           (require ...)
>         (error ...)))

> which I've seen used in a few packages out there?

When debug-on-error is enabled, yes.  To do everything the way we'd like,
we don't have enough control levers.  It is probably better to enter the
debugger in the above case (the user did set debug-on-error after all)
than not enter it when an error happens in a deep stack of `require's.

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).





^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-11-10 18:38 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-10 13:05 bug#74294: Master: debug-on-error is ineffective whilst requiring a file from the byte compiler Alan Mackenzie
2024-11-10 17:31 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-11-10 18:38   ` Alan Mackenzie

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).