~ chicken-core (chicken-5) 5efc89a4687e0a11fbcb5342b07d1d8cf1a7de49


commit 5efc89a4687e0a11fbcb5342b07d1d8cf1a7de49
Author:     felix <felix@y.(none)>
AuthorDate: Sun Aug 22 23:41:42 2010 +0200
Commit:     felix <felix@y.(none)>
CommitDate: Sun Aug 22 23:41:42 2010 +0200

    fetch call-chain in exception-handler and print that one in the REPL's error message (suggested by Commander Keen)

diff --git a/csi.scm b/csi.scm
index 704cb6cc..d70301ab 100644
--- a/csi.scm
+++ b/csi.scm
@@ -670,7 +670,11 @@ EOF
 		(let loop ((props (##sys#slot x 2)))
 		  (unless (null? props)
 		    (when (eq? k (caar props))
-		      (fprintf out "\t~s: ~s~%" (cdar props) (cadr props)) )
+		      (##sys#with-print-length-limit
+		       100
+		       (lambda ()
+			 (fprintf out "\t~s: ~s" (cdar props) (cadr props)) ))
+		      (newline out))
 		    (loop (cddr props)) ) ) )
 	      (##sys#slot x 1) ) ]
 	    [(and (##sys#structure? x 'meroon-instance) (provided? 'meroon)) ; XXX put this into meroon egg (really!)
diff --git a/eval.scm b/eval.scm
index 400b60e2..4b724679 100644
--- a/eval.scm
+++ b/eval.scm
@@ -1540,7 +1540,15 @@
 		    (##sys#write-char-0 #\newline ##sys#standard-error)
 		    (write-err args) ) )
 	      (set! ##sys#repl-recent-call-chain
-		(print-call-chain ##sys#standard-error))
+		(or (and-let* ((lexn ##sys#last-exception) ;XXX not really right
+			       ((##sys#structure? lexn 'condition))
+			       (a (member '(exn . call-chain) (##sys#slot lexn 2))))
+		      (let ((ct (cadr a)))
+			(##sys#really-print-call-chain
+			 ##sys#standard-error ct
+			 "\n\tCall history:\n")
+			ct))
+		    (print-call-chain ##sys#standard-error)))
 	      (flush-output ##sys#standard-error) ) ) )
 	 (lambda ()
 	   (let loop ()
diff --git a/library.scm b/library.scm
index a6961e6f..dc019efb 100644
--- a/library.scm
+++ b/library.scm
@@ -3579,6 +3579,7 @@ EOF
 	   [else			'(exn)] )
 	 (list '(exn . message) msg
 	       '(exn . arguments) args
+	       '(exn . call-chain) (##sys#get-call-chain)
 	       '(exn . location) loc) ) ) ) ] ) )
 
 (define (##sys#abort x)
Trap