>From 7f41f1d5b93b9cf4c0270d0e6b36ab30df77528a Mon Sep 17 00:00:00 2001
From: Evan Hanson
Date: Wed, 9 Aug 2017 20:39:03 +1200
Subject: [PATCH] Move call chain procedures out of (chicken condition)
Call chains are a general feature not specifically related to
conditions, so we move this back out into the bare "chicken" module.
Eventually these will be moved into "chicken.base" (once it exists).
---
chicken.condition.import.scm | 2 -
chicken.import.scm | 4 +-
library.scm | 136 ++++++++++++++++++++++---------------------
types.db | 5 +-
4 files changed, 74 insertions(+), 73 deletions(-)
diff --git a/chicken.condition.import.scm b/chicken.condition.import.scm
index 6f669be7..6ab6ce8b 100644
--- a/chicken.condition.import.scm
+++ b/chicken.condition.import.scm
@@ -29,8 +29,6 @@
'((abort . chicken.condition#abort)
(signal . chicken.condition#signal)
(current-exception-handler . chicken.condition#current-exception-handler)
- (get-call-chain . chicken.condition#get-call-chain)
- (print-call-chain . chicken.condition#print-call-chain)
(print-error-message . chicken.condition#print-error-message)
(with-exception-handler . chicken.condition#with-exception-handler)
(make-property-condition . chicken.condition#make-property-condition)
diff --git a/chicken.import.scm b/chicken.import.scm
index c81b8304..a812d0d9 100644
--- a/chicken.import.scm
+++ b/chicken.import.scm
@@ -109,7 +109,7 @@
(fxxor . chicken.fixnum#fxxor)
(fxlen . chicken.fixnum#fxlen)
gensym
- (get-call-chain . chicken.condition#get-call-chain)
+ get-call-chain
(get-condition-property . chicken.condition#get-condition-property)
get-environment-variable
(get-line-number . chicken.syntax#get-line-number)
@@ -147,7 +147,7 @@
(provide . chicken.load#provide)
(provided? . chicken.load#provided?)
print
- (print-call-chain . chicken.condition#print-call-chain)
+ print-call-chain
print*
procedure-information
program-name
diff --git a/library.scm b/library.scm
index 99c32b7a..07bebe1f 100644
--- a/library.scm
+++ b/library.scm
@@ -4380,6 +4380,70 @@ EOF
(string-append "#string (##sys#pointer->address x) 16) ">") ) ) ) )
+;;; Access backtrace:
+
+(define-constant +trace-buffer-entry-slot-count+ 4)
+
+(define get-call-chain
+ (let ((extract
+ (foreign-lambda* nonnull-c-string ((scheme-object x)) "C_return((C_char *)x);")))
+ (lambda (#!optional (start 0) (thread ##sys#current-thread))
+ (let* ((tbl (foreign-value "C_trace_buffer_size" int))
+ ;; 4 slots: "raw" string, cooked1, cooked2, thread
+ (c +trace-buffer-entry-slot-count+)
+ (vec (##sys#make-vector (fx* c tbl) #f))
+ (r (##core#inline "C_fetch_trace" start vec))
+ (n (if (fixnum? r) r (fx* c tbl))))
+ (let loop ((i 0))
+ (if (fx>= i n)
+ '()
+ (let ((t (##sys#slot vec (fx+ i 3)))) ; thread
+ (if (or (not t) (not thread) (eq? thread t))
+ (cons (vector
+ (extract (##sys#slot vec i)) ; raw
+ (##sys#slot vec (fx+ i 1)) ; cooked1
+ (##sys#slot vec (fx+ i 2))) ; cooked2
+ (loop (fx+ i c)))
+ (loop (fx+ i c))))))))))
+
+(define (##sys#really-print-call-chain port chain header)
+ (when (pair? chain)
+ (##sys#print header #f port)
+ (for-each
+ (lambda (info)
+ (let* ((more1 (##sys#slot info 1)) ; cooked1 (expr/form)
+ (more2 (##sys#slot info 2)) ; cooked2 (cntr/frameinfo)
+ (fi (##sys#structure? more2 'frameinfo)))
+ (##sys#print "\n\t" #f port)
+ (##sys#print (##sys#slot info 0) #f port) ; raw (mode)
+ (##sys#print "\t " #f port)
+ (when (and more2 (if fi (##sys#slot more2 1)))
+ (##sys#write-char-0 #\[ port)
+ (##sys#print
+ (if fi
+ (##sys#slot more2 1) ; cntr
+ more2)
+ #f port)
+ (##sys#print "] " #f port))
+ (when more1
+ (##sys#with-print-length-limit
+ 100
+ (lambda ()
+ (##sys#print more1 #t port))))))
+ chain)
+ (##sys#print "\t<--\n" #f port)))
+
+(define (print-call-chain #!optional (port ##sys#standard-output) (start 0)
+ (thread ##sys#current-thread)
+ (header "\n\tCall history:\n"))
+ (##sys#check-output-port port #t 'print-call-chain)
+ (##sys#check-fixnum start 'print-call-chain)
+ (##sys#check-string header 'print-call-chain)
+ (let ((ct (get-call-chain start thread)))
+ (##sys#really-print-call-chain port ct header)
+ ct))
+
+
;;; Interrupt handling:
(define (##sys#user-interrupt-hook)
@@ -4447,8 +4511,8 @@ EOF
(module chicken.condition
;; NOTE: We don't emit the import lib. Due to syntax exports, it
;; has to be a hardcoded primitive module.
- (abort signal current-exception-handler get-call-chain
- print-call-chain print-error-message with-exception-handler
+ (abort signal current-exception-handler
+ print-error-message with-exception-handler
;; [syntax] condition-case handle-exceptions
@@ -4460,71 +4524,9 @@ EOF
(import scheme)
(import chicken.fixnum)
(import chicken.foreign)
-(import (only chicken get-output-string open-output-string when unless
- define-constant fixnum? let-optionals make-parameter))
-
-;;; Access backtrace:
-
-(define-constant +trace-buffer-entry-slot-count+ 4)
-
-(define get-call-chain
- (let ((extract
- (foreign-lambda* nonnull-c-string ((scheme-object x)) "C_return((C_char *)x);")))
- (lambda (#!optional (start 0) (thread ##sys#current-thread))
- (let* ((tbl (foreign-value "C_trace_buffer_size" int))
- ;; 4 slots: "raw" string, cooked1, cooked2, thread
- (c +trace-buffer-entry-slot-count+)
- (vec (##sys#make-vector (fx* c tbl) #f))
- (r (##core#inline "C_fetch_trace" start vec))
- (n (if (fixnum? r) r (fx* c tbl))))
- (let loop ((i 0))
- (if (fx>= i n)
- '()
- (let ((t (##sys#slot vec (fx+ i 3)))) ; thread
- (if (or (not t) (not thread) (eq? thread t))
- (cons (vector
- (extract (##sys#slot vec i)) ; raw
- (##sys#slot vec (fx+ i 1)) ; cooked1
- (##sys#slot vec (fx+ i 2))) ; cooked2
- (loop (fx+ i c)))
- (loop (fx+ i c))))))))))
-
-(define (##sys#really-print-call-chain port chain header)
- (when (pair? chain)
- (##sys#print header #f port)
- (for-each
- (lambda (info)
- (let* ((more1 (##sys#slot info 1)) ; cooked1 (expr/form)
- (more2 (##sys#slot info 2)) ; cooked2 (cntr/frameinfo)
- (fi (##sys#structure? more2 'frameinfo)))
- (##sys#print "\n\t" #f port)
- (##sys#print (##sys#slot info 0) #f port) ; raw (mode)
- (##sys#print "\t " #f port)
- (when (and more2 (if fi (##sys#slot more2 1)))
- (##sys#write-char-0 #\[ port)
- (##sys#print
- (if fi
- (##sys#slot more2 1) ; cntr
- more2)
- #f port)
- (##sys#print "] " #f port))
- (when more1
- (##sys#with-print-length-limit
- 100
- (lambda ()
- (##sys#print more1 #t port))))))
- chain)
- (##sys#print "\t<--\n" #f port)))
-
-(define (print-call-chain #!optional (port ##sys#standard-output) (start 0)
- (thread ##sys#current-thread)
- (header "\n\tCall history:\n"))
- (##sys#check-output-port port #t 'print-call-chain)
- (##sys#check-fixnum start 'print-call-chain)
- (##sys#check-string header 'print-call-chain)
- (let ((ct (get-call-chain start thread)))
- (##sys#really-print-call-chain port ct header)
- ct))
+(import (only chicken get-call-chain print-call-chain when unless
+ get-output-string open-output-string let-optionals
+ make-parameter))
(define (##sys#signal-hook mode msg . args)
(##core#inline "C_dbg_hook" #f)
diff --git a/types.db b/types.db
index 9ac85708..e62c82db 100644
--- a/types.db
+++ b/types.db
@@ -965,7 +965,6 @@
(let ((#(tmp2) (set! ##sys#current-exception-handler #(tmp1))))
#(tmp1))))
(() ##sys#current-exception-handler))
-(chicken.condition#get-call-chain (#(procedure #:clean #:enforce) chicken.condition#get-call-chain (#!optional fixnum (struct thread)) (list-of vector)))
(chicken.condition#get-condition-property (#(procedure #:clean #:enforce) chicken.condition#get-condition-property ((struct condition) * * #!optional *) *))
(chicken.condition#make-composite-condition (#(procedure #:clean #:enforce) chicken.condition#make-composite-condition (#!rest (struct condition)) (struct condition)))
(chicken.condition#make-property-condition (#(procedure #:clean #:enforce) chicken.condition#make-property-condition (* #!rest *) (struct condition)))
@@ -1281,8 +1280,10 @@
(port-closed? (#(procedure #:clean #:enforce) port-closed? (port) boolean)
((port) (eq? (##sys#slot #(1) '8) '0)))
-(print (procedure print (#!rest *) undefined))
+(get-call-chain (#(procedure #:clean #:enforce) get-call-chain (#!optional fixnum (struct thread)) (list-of vector)))
(print-call-chain (#(procedure #:clean #:enforce) print-call-chain (#!optional output-port fixnum * string) undefined))
+
+(print (procedure print (#!rest *) undefined))
(print* (procedure print* (#!rest) undefined))
(procedure-information (#(procedure #:clean #:enforce) procedure-information (procedure) *))
(program-name (#(procedure #:clean #:enforce) program-name (#!optional string) string))
--
2.11.0