inferior: '&inferior-exception' includes a stack trace.
* guix/inferior.scm (port->inferior): Bump protocol to (0 1 1). (&inferior-exception)[stack]: New field. (read-repl-response): Recognize 'exception' form for protocol (0 1 1). * tests/inferior.scm ("&inferior-exception"): Check the value returned by 'inferior-exception-stack'.
This commit is contained in:
parent
2b0a370d00
commit
1dca6aaafa
@ -66,6 +66,7 @@
|
|||||||
inferior-exception?
|
inferior-exception?
|
||||||
inferior-exception-arguments
|
inferior-exception-arguments
|
||||||
inferior-exception-inferior
|
inferior-exception-inferior
|
||||||
|
inferior-exception-stack
|
||||||
read-repl-response
|
read-repl-response
|
||||||
|
|
||||||
inferior-packages
|
inferior-packages
|
||||||
@ -164,7 +165,7 @@ inferior."
|
|||||||
(match rest
|
(match rest
|
||||||
((n _ ...)
|
((n _ ...)
|
||||||
(when (>= n 1)
|
(when (>= n 1)
|
||||||
(send-inferior-request '(() repl-version 0 1) result)))
|
(send-inferior-request '(() repl-version 0 1 1) result)))
|
||||||
(_
|
(_
|
||||||
#t))
|
#t))
|
||||||
|
|
||||||
@ -211,7 +212,8 @@ equivalent. Return #f if the inferior could not be launched."
|
|||||||
(define-condition-type &inferior-exception &error
|
(define-condition-type &inferior-exception &error
|
||||||
inferior-exception?
|
inferior-exception?
|
||||||
(arguments inferior-exception-arguments) ;key + arguments
|
(arguments inferior-exception-arguments) ;key + arguments
|
||||||
(inferior inferior-exception-inferior)) ;<inferior> | #f
|
(inferior inferior-exception-inferior) ;<inferior> | #f
|
||||||
|
(stack inferior-exception-stack)) ;list of (FILE COLUMN LINE)
|
||||||
|
|
||||||
(define* (read-repl-response port #:optional inferior)
|
(define* (read-repl-response port #:optional inferior)
|
||||||
"Read a (guix repl) response from PORT and return it as a Scheme object.
|
"Read a (guix repl) response from PORT and return it as a Scheme object.
|
||||||
@ -226,10 +228,19 @@ Raise '&inferior-exception' when an exception is read from PORT."
|
|||||||
(match (read port)
|
(match (read port)
|
||||||
(('values objects ...)
|
(('values objects ...)
|
||||||
(apply values (map sexp->object objects)))
|
(apply values (map sexp->object objects)))
|
||||||
(('exception key objects ...)
|
(('exception ('arguments key objects ...)
|
||||||
|
('stack frames ...))
|
||||||
|
;; Protocol (0 1 1) and later.
|
||||||
(raise (condition (&inferior-exception
|
(raise (condition (&inferior-exception
|
||||||
(arguments (cons key (map sexp->object objects)))
|
(arguments (cons key (map sexp->object objects)))
|
||||||
(inferior inferior)))))))
|
(inferior inferior)
|
||||||
|
(stack frames)))))
|
||||||
|
(('exception key objects ...)
|
||||||
|
;; Protocol (0 0).
|
||||||
|
(raise (condition (&inferior-exception
|
||||||
|
(arguments (cons key (map sexp->object objects)))
|
||||||
|
(inferior inferior)
|
||||||
|
(stack '())))))))
|
||||||
|
|
||||||
(define (read-inferior-response inferior)
|
(define (read-inferior-response inferior)
|
||||||
(read-repl-response (inferior-socket inferior)
|
(read-repl-response (inferior-socket inferior)
|
||||||
|
@ -68,6 +68,9 @@
|
|||||||
(guard (c ((inferior-exception? c)
|
(guard (c ((inferior-exception? c)
|
||||||
(close-inferior inferior)
|
(close-inferior inferior)
|
||||||
(and (eq? inferior (inferior-exception-inferior c))
|
(and (eq? inferior (inferior-exception-inferior c))
|
||||||
|
(match (inferior-exception-stack c)
|
||||||
|
(((_ (files lines columns)) ..1)
|
||||||
|
(member "guix/repl.scm" files)))
|
||||||
(inferior-exception-arguments c))))
|
(inferior-exception-arguments c))))
|
||||||
(inferior-eval '(throw 'a 'b 'c 'd) inferior)
|
(inferior-eval '(throw 'a 'b 'c 'd) inferior)
|
||||||
'badness)))
|
'badness)))
|
||||||
|
Loading…
Reference in New Issue
Block a user