~ chicken-core (chicken-5) 58f504192dbefbdb0e2ff7b4faec33c16526e2a6
commit 58f504192dbefbdb0e2ff7b4faec33c16526e2a6 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Sun Aug 28 19:23:01 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Sun Aug 28 19:23:01 2011 +0200 handle circularities in resolve diff --git a/scrutinizer.scm b/scrutinizer.scm index 16ab2938..0597fbe0 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -770,7 +770,7 @@ (trail-restore trail0 typeenv) (loop (cdr types) (cdr subs))))))) ((##core#switch ##core#cond) - (bomb "unexpected node class" class)) + (bomb "scrutinize: unexpected node class" class)) (else (for-each (lambda (n) (walk n e loc #f #f flow #f)) subs) '*)))) @@ -869,8 +869,8 @@ (sprintf "a vector with element type ~a" (typename (second t)))) ((list) (sprintf "a list with element type ~a" (typename (second t)))) - (else (bomb "invalid type" t)))) - (else (bomb "invalid type" t)))))) + (else (bomb "typename: invalid type" t)))) + (else (bomb "typename: invalid type" t)))))) ;;; Type-matching @@ -1489,22 +1489,27 @@ (set-cdr! a #f)))) (define (resolve t typeenv) - (let resolve ((t t)) + (let resolve ((t t) (done '())) (cond ((not t) '*) ; unbound type-variable - ((assq t typeenv) => (lambda (a) (resolve (cdr a)))) + ((assq t typeenv) => + (lambda (a) + (let ((t (cdr a))) + (if (memq t done) + '* ; circular reference + (resolve t (cons t done)))))) ((not (pair? t)) (if (memq t '(* fixnum eof char string symbol float number list vector pair undefined blob port pointer locative boolean pointer-vector null procedure noreturn)) t - (bomb "can't resolve unknown type-variable" t))) + (bomb "resolve: can't resolve unknown type-variable" t))) (else (case (car t) - ((or) `(or ,@(map resolve (cdr t)))) - ((not) `(not ,(resolve (second t)))) - ((forall) `(forall ,(second t) ,(resolve (third t)))) + ((or) `(or ,@(map (cut resolve <> done) (cdr t)))) + ((not) `(not ,(resolve (second t) done))) + ((forall) `(forall ,(second t) ,(resolve (third t) done))) ((pair list vector) - (cons (car t) (map resolve (cdr t)))) + (cons (car t) (map (cut resolve <> done) (cdr t)))) ((procedure) (let* ((argtypes (procedure-arguments t)) (rtypes (procedure-results t))) @@ -1517,10 +1522,10 @@ (cons (car args) (loop (cdr args))))) ((eq? '#!optional (car args)) (cons (car args) (loop (cdr args)))) - (else (cons (resolve (car args)) (loop (cdr args)))))) + (else (cons (resolve (car args) done) (loop (cdr args)))))) ,@(if (eq? '* rtypes) '* - (map resolve rtypes))))) + (map (cut resolve <> done) rtypes))))) (else t))))))Trap