~ chicken-core (chicken-5) c752a153c006d6ef9854b37c96807d0d91a0903b
commit c752a153c006d6ef9854b37c96807d0d91a0903b
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Jul 14 22:11:17 2010 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Wed Jul 14 22:11:17 2010 +0200
assert shows line-number information, if available (suggested by Alejandro Forero Cuervo)
diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index 80a1fe63..088e1178 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -149,20 +149,26 @@
(##sys#extend-macro-environment
'assert '()
(##sys#er-transformer
- (lambda (form r c)
- (##sys#check-syntax 'assert form '#(_ 1))
- (let* ((exp (cadr form))
- (msg-and-args (cddr form))
- (msg (if (eq? '() msg-and-args)
- `(##core#immutable '"assertion failed")
- (car msg-and-args) ) ) )
- `(##core#if (##core#check ,exp)
- (##core#undefined)
- (##sys#error
- ,msg
- ,@(if (fx> (length msg-and-args) 1)
- (cdr msg-and-args)
- `((##core#quote ,(##sys#strip-syntax exp))))))))))
+ (let ((string-append string-append)
+ (get-line-number get-line-number))
+ (lambda (form r c)
+ (##sys#check-syntax 'assert form '#(_ 1))
+ (let* ((exp (cadr form))
+ (ln (get-line-number form))
+ (msg-and-args (cddr form))
+ (msg (if (null? msg-and-args)
+ "assertion failed"
+ (car msg-and-args)))
+ (msg (if ln
+ (string-append "(" ln ") " msg)
+ msg)))
+ `(##core#if (##core#check ,exp)
+ (##core#undefined)
+ (##sys#error
+ ,msg
+ ,@(if (fx> (length msg-and-args) 1)
+ (cdr msg-and-args)
+ `((##core#quote ,(##sys#strip-syntax exp)))))))))))
(##sys#extend-macro-environment
'ensure
diff --git a/eval.scm b/eval.scm
index 5655070d..f5d4e322 100644
--- a/eval.scm
+++ b/eval.scm
@@ -891,7 +891,11 @@
(or (and fname
(or (##sys#dload (##sys#make-c-string fname 'load) topentry #t)
(and (not (has-sep? fname))
- (##sys#dload (##sys#make-c-string (##sys#string-append "./" fname) 'load) topentry #t) ) ) )
+ (##sys#dload
+ (##sys#make-c-string
+ (##sys#string-append "./" fname)
+ 'load)
+ topentry #t) ) ) )
(call-with-current-continuation
(lambda (abrt)
(fluid-let ((##sys#read-error-with-line-number #t)
diff --git a/library.scm b/library.scm
index 7a3be610..c166abeb 100644
--- a/library.scm
+++ b/library.scm
@@ -3354,23 +3354,29 @@ EOF
;;; Access backtrace:
+(define-constant +trace-buffer-entry-slot-count+ 4)
+
(define ##sys#get-call-chain
- (let ((extract (foreign-lambda* nonnull-c-string ((scheme-object x)) "return((C_char *)x);")))
+ (let ((extract
+ (foreign-lambda* nonnull-c-string ((scheme-object x)) "return((C_char *)x);")))
(lambda (#!optional (start 0) (thread ##sys#current-thread))
(let* ((tbl (foreign-value "C_trace_buffer_size" int))
- (vec (##sys#make-vector (fx* 4 tbl) #f))
+ ;; 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* 4 tbl))) )
+ (n (if (fixnum? r) r (fx* c tbl))) )
(let loop ((i 0))
(if (fx>= i n)
'()
(let ((t (##sys#slot vec (fx+ i 3))))
(if (or (not t) (not thread) (eq? thread t))
- (cons (vector (extract (##sys#slot vec i))
- (##sys#slot vec (fx+ i 1))
- (##sys#slot vec (fx+ i 2)) )
- (loop (fx+ i 4)) )
- (loop (fx+ i 4))) ) ) ) ) ) ) )
+ (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)
diff --git a/manual/Unit expand b/manual/Unit expand
index 7f863b33..61fbceba 100644
--- a/manual/Unit expand
+++ b/manual/Unit expand
@@ -14,10 +14,11 @@ option.
<procedure>(get-line-number EXPR)</procedure>
If {{EXPR}} is a pair with the car being a symbol, and line-number
-information is available for this expression, then this procedure returns
-the associated line number. If line-number information is not available,
-then {{#f}} is returned. Note that line-number information for
-expressions is only available in the compiler.
+information is available for this expression, then this procedure
+returns the associated source file and line number as a string. If
+line-number information is not available, then {{#f}} is returned.
+Note that line-number information for expressions is only available in
+the compiler.
==== expand
diff --git a/runtime.c b/runtime.c
index b6e2c46b..4de9bdd2 100644
--- a/runtime.c
+++ b/runtime.c
@@ -184,12 +184,12 @@ extern void _C_do_apply_hack(void *proc, C_word *args, int count) C_noret;
# define ALIGNMENT_HOLE_MARKER ((C_word)0xfffffffffffffffeL)
# define FORWARDING_BIT_SHIFT 63
# define UWORD_FORMAT_STRING "0x%016x"
-# define UWORD_COUNT_FORMAT_STRING "%ud"
+# define UWORD_COUNT_FORMAT_STRING "%u"
#else
# define ALIGNMENT_HOLE_MARKER ((C_word)0xfffffffe)
# define FORWARDING_BIT_SHIFT 31
# define UWORD_FORMAT_STRING "0x%08x"
-# define UWORD_COUNT_FORMAT_STRING "%ud"
+# define UWORD_COUNT_FORMAT_STRING "%u"
#endif
#define GC_MINOR 0
@@ -3721,6 +3721,8 @@ C_word C_fetch_trace(C_word starti, C_word buffer)
/* outside-pointer, will be ignored by GC */
C_mutate(&C_block_item(buffer, p++), (C_word)ptr->raw);
+
+ /* subject to GC */
C_mutate(&C_block_item(buffer, p++), ptr->cooked1);
C_mutate(&C_block_item(buffer, p++), ptr->cooked2);
C_mutate(&C_block_item(buffer, p++), ptr->thread);
Trap