~ chicken-core (chicken-5) 2d9ddc537e0a2777ea6560c118ce0b385d67acb0
commit 2d9ddc537e0a2777ea6560c118ce0b385d67acb0 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Mar 28 09:45:42 2011 -0400 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Mar 28 09:45:42 2011 -0400 added predicate handling to scrutinizer diff --git a/scrutinizer.scm b/scrutinizer.scm index 81a79536..df018c19 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -482,6 +482,11 @@ (or (eq? 'procedure (car t)) (and (eq? 'or (car t)) (every procedure-type? (cdr t))))))) + (define (procedure-name t) + (and (pair? t) + (eq? 'procedure (car t)) + (symbol? (cadr t)) + (cadr t))) (define (procedure-argument-types t n) (cond ((or (memq t '(* procedure)) (not-pair? t) @@ -652,11 +657,15 @@ (for-each (lambda (arg argr) (when (eq? '##core#variable (node-class arg)) - ;;XXX figure out procedure name and check for "##compiler#predicate" - ;; property, then push blist entry for car of ctags and argument - ;; variable - (let* ((var (first (node-parameters arg))) + (let* ((pn (procedure-name fn)) + (var (first (node-parameters arg))) + (pt (and pn (##sys#get pn '##compiler#predicate))) (a (assq var e))) + (when (and pt ctags) + (d "predicate `~a' indicates `~a' is ~a in flow ~a" pn var pt + (car ctags)) + (set! blist + (alist-cons (cons var (car ctags)) pt blist))) (when a (let ((ar (cond ((get db var 'assigned) '*) ((eq? '* argr) (cdr a)) @@ -682,14 +691,16 @@ (printf "loading type database ~a ...~%" dbfile)) (for-each (lambda (e) - (let* ((name (car e)) - (old (##sys#get name '##compiler#type)) - (new (cadr e))) - (when (and old (not (equal? old new))) - (##sys#notice - (sprintf - "type-definition `~a' for toplevel binding `~a' conflicts with previously loaded type `~a'" - name new old))) - ;;XXX detect predicate declarations - (##sys#put! name '##compiler#type new))) + (cond ((eq? 'predicate (car e)) + (##sys#put! (cadr e) '##compiler#predicate (caddr e))) + (else + (let* ((name (car e)) + (old (##sys#get name '##compiler#type)) + (new (cadr e))) + (when (and old (not (equal? old new))) + (##sys#notice + (sprintf + "type-definition `~a' for toplevel binding `~a' conflicts with previously loaded type `~a'" + name new old))) + (##sys#put! name '##compiler#type new))))) (read-file dbfile))))Trap