* module/system/repl/debug.scm: <debug> stores the error string in a new field. * module/system/repl/error-handling.scm: use the error string to construct the <debug> instance. * module/system/repl/command.scm: new debug command `error' that extracts the new <debug> field.
Signed-off-by: Jose A. Ortega Ruiz <j...@gnu.org> --- module/system/repl/command.scm | 12 +++++++++--- module/system/repl/debug.scm | 4 ++-- module/system/repl/error-handling.scm | 26 ++++++++++++++++---------- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/module/system/repl/command.scm b/module/system/repl/command.scm index 8a62a16..52b0708 100644 --- a/module/system/repl/command.scm +++ b/module/system/repl/command.scm @@ -6,12 +6,12 @@ ;; modify it under the terms of the GNU Lesser General Public ;; License as published by the Free Software Foundation; either ;; version 3 of the License, or (at your option) any later version. -;; +;; ;; This library is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; Lesser General Public License for more details. -;; +;; ;; You should have received a copy of the GNU Lesser General Public ;; License along with this library; if not, write to the Free Software ;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA @@ -55,7 +55,7 @@ (disassemble x) (disassemble-file xx)) (profile (time t) (profile pr) (trace tr)) (debug (backtrace bt) (up) (down) (frame fr) - (procedure proc) (locals)) + (procedure proc) (locals) (error e)) (inspect (inspect i) (pretty-print pp)) (system (gc) (statistics stat) (option o) (quit q continue cont)))) @@ -474,6 +474,12 @@ Trace execution." body body* ...) (format #t "Nothing to debug.~%")))))))) +(define-meta-command (error repl) + "error +Display the original error message." + (let ((debug (repl-debug repl))) + (format #t "~a~%" (if debug (debug-error-message debug) "")))) + (define-stack-command (backtrace repl #:optional count #:key (width 72) full?) "backtrace [COUNT] [#:width W] [#:full? F] diff --git a/module/system/repl/debug.scm b/module/system/repl/debug.scm index 293b790..1876d31 100644 --- a/module/system/repl/debug.scm +++ b/module/system/repl/debug.scm @@ -30,7 +30,7 @@ #:use-module ((system vm inspect) #:select ((inspect . %inspect))) #:use-module (system vm program) #:export (<debug> - make-debug debug? debug-frames debug-index + make-debug debug? debug-frames debug-index debug-error-message print-locals print-frame print-frames frame->module stack->vector narrow-stack->vector)) @@ -66,7 +66,7 @@ ;;; accessors, and provides some helper functions. ;;; -(define-record <debug> frames index) +(define-record <debug> frames index error-message) diff --git a/module/system/repl/error-handling.scm b/module/system/repl/error-handling.scm index db0beeb..e77ea96 100644 --- a/module/system/repl/error-handling.scm +++ b/module/system/repl/error-handling.scm @@ -32,6 +32,16 @@ ;;; Error handling via repl debugging ;;; +(define (error-string stack key args) + (with-output-to-string + (lambda () + (pmatch args + ((,subr ,msg ,args . ,rest) + (display-error (vector-ref stack 0) (current-output-port) + subr msg args rest)) + (else + (format #t "Throw to key `~a' with args `~s'." key args)))))) + (define* (call-with-error-handling thunk #:key (on-error 'debug) (post-error 'catch) (pass-keys '(quit))) @@ -45,7 +55,7 @@ (lambda () (with-error-to-port err thunk)))))) - + (catch #t (lambda () (%start-stack #t thunk)) @@ -75,7 +85,7 @@ (if (procedure? post-error) post-error ; a handler proc (error "Unknown post-error strategy" post-error)))) - + (case on-error ((debug) (lambda (key . args) @@ -85,22 +95,18 @@ (make-stack #t) ;; Cut three frames from the top of the stack: ;; make-stack, this one, and the throw handler. - 3 + 3 ;; Narrow the end of the stack to the most recent ;; start-stack. tag ;; And one more frame, because %start-stack invoking ;; the start-stack thunk has its own frame too. 0 (and tag 1))) - (debug (make-debug stack 0))) + (error-msg (error-string stack key args)) + (debug (make-debug stack 0 error-msg))) (with-saved-ports (lambda () - (pmatch args - ((,subr ,msg ,args . ,rest) - (display-error (vector-ref stack 0) (current-output-port) - subr msg args rest)) - (else - (format #t "Throw to key `~a' with args `~s'." key args))) + (format #t error-msg) (format #t "Entering a new prompt. ") (format #t "Type `,bt' for a backtrace or `,q' to continue.\n") ((@ (system repl repl) start-repl) #:debug debug)))))) -- 1.7.1