Subject: bug#46232: ‘Wrong type argument ...’ exception when printing backtrace after interrupt

From: Maxime Devos <[email-masked]>
Date: Mon, 01 Feb 2021 11:52:36 +0100

Hi guilers!

When entering sleeping code in the REPL, then interrupting it
(C-c) and entering ,bt twice, I receive an error message from ,bt:

GNU Guile 3.0.5
[...]
Enter `,help' for help.
scheme@(guile-user)> (let ((mu (make-mutex))) (with-mutex mu (wait-condition-variable (make-condition-variable) mu)))
^Cice-9/boot-9.scm:1669:16: In procedure raise-exception:
User interrupt

Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]> ,bt
In current input:
     1:40  4 (_)
In unknown file:
While executing meta-command:
In procedure program-code: Wrong type argument in position 1 (expecting PROGRAM_P): #t
scheme@(guile-user) [1]> 

I've found two variants so far, sleep/0 and sleep/1:

For sleep/1, the error message is different:
scheme@(guile-user)> (sleep/1)
^Cice-9/boot-9.scm:1669:16: In procedure raise-exception:
User interrupt

Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]> ,bt
In system/repl/repl.scm:
   159:22  4 (_)
In ice-9/boot-9.scm:
   2170:4  3 (%start-stack _ _)
In unknown file:
While executing meta-command:
In procedure frame-local-ref: Argument 2 out of range: 0
scheme@(guile-user) [1]> 

Could folks familiar with interrupts, the REPL and backtraces
take a look?

Maxime.
P.S. I'm not subscribed to bug-guile, please add me to To:
or CC:.