printing debug output on OOM

This commit is contained in:
Alex Shinn 2012-06-24 14:07:59 -07:00
parent d11ededc50
commit bad54b143c
4 changed files with 70 additions and 32 deletions

4
gc.c
View file

@ -535,8 +535,10 @@ void* sexp_alloc (sexp ctx, size_t size) {
&& ((!h->max_size) || (total_size < h->max_size))) && ((!h->max_size) || (total_size < h->max_size)))
sexp_grow_heap(ctx, size); sexp_grow_heap(ctx, size);
res = sexp_try_alloc(ctx, size); res = sexp_try_alloc(ctx, size);
if (! res) if (! res) {
res = sexp_global(ctx, SEXP_G_OOM_ERROR); res = sexp_global(ctx, SEXP_G_OOM_ERROR);
sexp_debug_printf("ran out of memory allocating %lu bytes => %p", size, res);
}
} }
return res; return res;
} }

View file

@ -3,6 +3,8 @@
(export make-line-editor edit-line edit-line-repl (export make-line-editor edit-line edit-line-repl
make-history history-insert! make-history history-insert!
history-commit! history->list list->history buffer->string history-commit! history->list list->history buffer->string
make-buffer buffer-make-completer buffer-row buffer-col) make-buffer buffer-make-completer
buffer-clear buffer-refresh buffer-draw
buffer-row buffer-col)
(import (scheme) (chibi stty) (srfi 9)) (import (scheme) (chibi stty) (srfi 9))
(include "edit-line.scm")) (include "edit-line.scm"))

View file

@ -1,4 +1,4 @@
;; Copyright (c) 2010-2011 Alex Shinn. All rights reserved. ;; Copyright (c) 2010-2012 Alex Shinn. All rights reserved.
;; BSD-style license: http://synthcode.com/license.txt ;; BSD-style license: http://synthcode.com/license.txt
;;> Simple testing framework adapted from the Chicken @scheme{test} ;;> Simple testing framework adapted from the Chicken @scheme{test}
@ -51,16 +51,27 @@
(define-syntax test (define-syntax test
(syntax-rules () (syntax-rules ()
((test expect expr) ((test expect expr)
(test #f expect expr)) (let ((x 'expr))
(write x (current-error-port))
(display " => " (current-error-port))
(write (cond ((pair? x) (pair-source x))
((syntactic-closure? x)
(if (pair? (syntactic-closure-expr x))
(pair-source (syntactic-closure-expr x))
'N/A-sc))
(else 'N/A))
(current-error-port))
(newline (current-error-port))
(test #f expect expr)))
((test name expect (expr ...)) ((test name expect (expr ...))
(test-info name expect (expr ...) ())) (test-propagate-info name expect (expr ...) ()))
((test name (expect ...) expr) ((test name (expect ...) expr)
(test-syntax-error (test-syntax-error
'test 'test
"the test expression should come last " "the test expression should come last "
(test name (expect ...) expr))) (test name (expect ...) expr)))
((test name expect expr) ((test name expect expr)
(test-info name expect expr ())) (test-propagate-info name expect expr ()))
((test a ...) ((test a ...)
(test-syntax-error 'test "2 or 3 arguments required" (test-syntax-error 'test "2 or 3 arguments required"
(test a ...))))) (test a ...)))))
@ -74,7 +85,7 @@
((_ expr) ((_ expr)
(test-assert #f expr)) (test-assert #f expr))
((_ name expr) ((_ name expr)
(test-info name #f expr ((assertion . #t)))) (test-propagate-info name #f expr ((assertion . #t))))
((test a ...) ((test a ...)
(test-syntax-error 'test-assert "1 or 2 arguments required" (test-syntax-error 'test-assert "1 or 2 arguments required"
(test a ...))))) (test a ...)))))
@ -111,11 +122,29 @@
((_ expr) ((_ expr)
(test-error #f expr)) (test-error #f expr))
((_ name expr) ((_ name expr)
(test-info name #f expr ((expect-error . #t)))) (test-propagate-info name #f expr ((expect-error . #t))))
((test a ...) ((test a ...)
(test-syntax-error 'test-error "1 or 2 arguments required" (test-syntax-error 'test-error "1 or 2 arguments required"
(test a ...))))) (test a ...)))))
;; TODO: Extract interesting variables so we can show their values on
;; failure.
(define-syntax test-propagate-info
(syntax-rules ()
((test-propagate-info name expect expr info)
(test-vars () name expect expr info))))
(define-syntax test-vars
(syntax-rules ()
((_ (vars ...) n expect expr ((key . val) ...))
(test-run (lambda () expect)
(lambda () expr)
(cons (cons 'name n)
'((source . expr)
;;(var-names . (vars ...))
;;(var-values . ,(list vars))
(key . val) ...))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; group interface ;; group interface
@ -148,22 +177,6 @@
(syntax-rules () (syntax-rules ()
((_) (syntax-error "invalid use of test-syntax-error")))) ((_) (syntax-error "invalid use of test-syntax-error"))))
(define-syntax test-info
(syntax-rules ()
((test-info name expect expr info)
(test-vars () name expect expr ((source . expr) . info)))))
(define-syntax test-vars
(syntax-rules ()
((_ (vars ...) n expect expr ((key . val) ...))
(test-run (lambda () expect)
(lambda () expr)
(cons (cons 'name n)
'((source . expr)
;;(var-names . (vars ...))
;;(var-values . ,(list vars))
(key . val) ...))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; test-group representation ;; test-group representation
@ -269,6 +282,9 @@
(truncate-source src (- (current-column-width) 12)))) (truncate-source src (- (current-column-width) 12))))
((current-test-group) ((current-test-group)
=> (lambda (g) => (lambda (g)
(display "no source in: " (current-error-port))
(write info (current-error-port))
(display "\n" (current-error-port))
(string-append (string-append
"test-" "test-"
(number->string (test-group-ref g 'count 0))))) (number->string (test-group-ref g 'count 0)))))
@ -312,13 +328,31 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (test-expand-info info)
(let ((expr (assq-ref info 'source)))
(display "test-expand-info: " (current-error-port))
(write info (current-error-port))
(display " => " (current-error-port))
(write expr (current-error-port))
(display " => " (current-error-port))
(write (if (pair? expr) (pair-source expr) 'N/A) (current-error-port))
(display "\n" (current-error-port))
(if (and (pair? expr)
(pair-source expr)
(not (assq-ref info 'line-number)))
`((file-name . ,(car (pair-source expr)))
(line-number . ,(cdr (pair-source expr)))
,@info)
info)))
(define (test-run expect expr info) (define (test-run expect expr info)
(let ((info (test-expand-info info)))
(if (and (cond ((current-test-group) (if (and (cond ((current-test-group)
=> (lambda (g) (not (test-group-ref g 'skip-group?)))) => (lambda (g) (not (test-group-ref g 'skip-group?))))
(else #t)) (else #t))
(every (lambda (f) (f info)) (current-test-filters))) (every (lambda (f) (f info)) (current-test-filters)))
((current-test-applier) expect expr info) ((current-test-applier) expect expr info)
((current-test-skipper) expect expr info))) ((current-test-skipper) expect expr info))))
(define (test-default-applier expect expr info) (define (test-default-applier expect expr info)
(let* ((group (current-test-group)) (let* ((group (current-test-group))
@ -423,7 +457,7 @@
(cond (cond
((assq-ref info 'line-number) ((assq-ref info 'line-number)
=> (lambda (line) => (lambda (line)
(display " in line ") (display " on line ")
(write line) (write line)
(cond ((assq-ref info 'file-name) (cond ((assq-ref info 'file-name)
=> (lambda (file) (display " of file ") (write file)))) => (lambda (file) (display " of file ") (write file))))

View file

@ -3,7 +3,7 @@
(export (export
test test-error test-assert test-not test-values test test-error test-assert test-not test-values
test-group current-test-group test-group current-test-group
test-begin test-end ;; test-syntax-error ;; test-info test-begin test-end ;; test-syntax-error ;; test-propagate-info
;; test-vars test-run ;; test-exit ;; test-vars test-run ;; test-exit
current-test-verbosity current-test-epsilon current-test-comparator current-test-verbosity current-test-epsilon current-test-comparator
current-test-applier current-test-handler current-test-skipper current-test-applier current-test-handler current-test-skipper