~ chicken-core (chicken-5) 108fef13b40dc150cdc6ac2f096a35c83756edaa
commit 108fef13b40dc150cdc6ac2f096a35c83756edaa Author: felix <felix@call-with-current-continuation.org> AuthorDate: Sun Aug 21 12:44:18 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Sun Aug 21 12:44:18 2011 +0200 various scrutiny bugfixes diff --git a/TODO b/TODO index ee63a1e4..48e41113 100644 --- a/TODO +++ b/TODO @@ -2,6 +2,7 @@ TODO -*- Outline -*- * replace "types.db" with "types.db.new" +** rm ./xchicken * enable specialization in "common-declarations.scm" and "tweaks.scm" diff --git a/scrutinizer.scm b/scrutinizer.scm index 17c2ca6a..5d997ef7 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -377,7 +377,6 @@ (else (trail-restore trail0 typeenv))))) ((and specialize (get-specializations pn)) => (lambda (specs) - (dd " specializing: ~s" pn) (let loop ((specs specs)) (and (pair? specs) (let* ((spec (car specs)) @@ -514,7 +513,8 @@ (cond (nor1 r2) (nor2 r1) (else - (map (lambda (t1 t2) (simplify-type `(or ,t1 ,t2))) + (map (lambda (t1 t2) + (simplify-type `(or ,t1 ,t2))) r1 r2)))) (else '*)))))) ((let) @@ -1034,6 +1034,13 @@ (define (simplify-type t) (let ((typeenv '())) ; ((VAR1 . NEWVAR1) ...) + (define (subst x) + (cond ((symbol? x) + (cond ((assq x typeenv) => cdr) + (else x))) + ((pair? x) + (cons (subst (car x)) (subst (cdr x)))) + (else x))) (define (rename v) (cond ((assq v typeenv) => cdr) (else @@ -1041,6 +1048,7 @@ (set! typeenv (alist-cons v new typeenv)) new)))) (define (simplify t) + ;;(dd "simplify/rec: ~s" t) (call/cc (lambda (return) (cond ((pair? t) @@ -1050,49 +1058,50 @@ (append (map (lambda (v) (cons v (gensym v))) (second t)) typeenv)) (simplify (third t))) ((or) - (cond ((= 2 (length t)) (simplify (second t))) - ((every procedure-type? (cdr t)) - (if (any (cut eq? 'procedure <>) (cdr t)) - 'procedure - (reduce - (lambda (t pt) - (let* ((name1 (and (named? t) (cadr t))) - (atypes1 (if name1 (third t) (second t))) - (rtypes1 (if name1 (cdddr t) (cddr t))) - (name2 (and (named? pt) (cadr pt))) - (atypes2 (if name2 (third pt) (second pt))) - (rtypes2 (if name2 (cdddr pt) (cddr pt)))) - (append - '(procedure) - (if (and name1 name2 (eq? name1 name2)) (list name1) '()) - (list (merge-argument-types atypes1 atypes2)) - (merge-result-types rtypes1 rtypes2)))) - #f - (cdr t)))) - ((lset= eq? '(fixnum float) (cdr t)) 'number) - (else - (let* ((ts (append-map - (lambda (t) - (let ((t (simplify t))) - (cond ((and (pair? t) (eq? 'or (car t))) - (cdr t)) - ((eq? t 'undefined) (return 'undefined)) - ((eq? t 'noreturn) '()) - (else (list t))))) - (cdr t))) - (ts2 (let loop ((ts ts) (done '())) - (cond ((null? ts) (reverse done)) - ((eq? '* (car ts)) (return '*)) - ((any (cut type<=? (car ts) <>) (cdr ts)) - (loop (cdr ts) done)) - ((any (cut type<=? (car ts) <>) done) - (loop (cdr ts) done)) - (else (loop (cdr ts) (cons (car ts) done))))))) - (cond ((equal? ts2 (cdr t)) t) - (else - (dd " or-simplify: ~a" ts2) - (simplify - `(or ,@(if (any (cut eq? <> '*) ts2) '(*) ts2)))))))) ) + (let ((ts (map simplify (cdr t)))) + (cond ((= 1 (length ts)) (simplify (car ts))) + ((every procedure-type? ts) + (if (any (cut eq? 'procedure <>) ts) + 'procedure + (reduce + (lambda (t pt) + (let* ((name1 (procedure-name t)) + (atypes1 (procedure-arguments t)) + (rtypes1 (procedure-results t)) + (name2 (procedure-name pt)) + (atypes2 (procedure-arguments pt)) + (rtypes2 (procedure-results pt))) + (append + '(procedure) + (if (and name1 name2 (eq? name1 name2)) (list name1) '()) + (list (merge-argument-types atypes1 atypes2)) + (merge-result-types rtypes1 rtypes2)))) + #f + (cdr t)))) + ((lset= eq? '(fixnum float) ts) 'number) + (else + (let* ((ts (append-map + (lambda (t) + (let ((t (simplify t))) + (cond ((and (pair? t) (eq? 'or (car t))) + (cdr t)) + ((eq? t 'undefined) (return 'undefined)) + ((eq? t 'noreturn) '()) + (else (list t))))) + ts)) + (ts2 (let loop ((ts ts) (done '())) + (cond ((null? ts) (reverse done)) + ((eq? '* (car ts)) (return '*)) + ((any (cut type<=? (car ts) <>) (cdr ts)) + (loop (cdr ts) done)) + ((any (cut type<=? (car ts) <>) done) + (loop (cdr ts) done)) + (else (loop (cdr ts) (cons (car ts) done))))))) + (cond ((equal? ts2 (cdr t)) t) + (else + (dd " or-simplify: ~a" ts2) + (simplify + `(or ,@(if (any (cut eq? <> '*) ts2) '(*) ts2)))))))) )) ((pair) (let ((tcar (simplify (second t))) (tcdr (simplify (third t)))) @@ -1122,7 +1131,7 @@ (else t))))) (let ((t2 (simplify t))) (when (pair? typeenv) - (set! t2 `(forall ,(map cdr typeenv) ,t2))) + (set! t2 `(forall ,(map cdr typeenv) ,(subst t2)))) (dd "simplify: ~a -> ~a" t t2) t2))) @@ -1299,6 +1308,28 @@ (else #f)))) (else #f)))) +(define (procedure-arguments t) + (and (pair? t) + (case (car t) + ((forall) (procedure-arguments (third t))) + ((procedure) + (let ((n (second t))) + (if (or (string? n) (symbol? n)) + (third t) + (second t)))) + (else (bomb "procedure-arguments: not a procedure type" t))))) + +(define (procedure-results t) + (and (pair? t) + (case (car t) + ((forall) (procedure-results (third t))) + ((procedure) + (let ((n (second t))) + (if (or (string? n) (symbol? n)) + (cdddr t) + (cddr t)))) + (else (bomb "procedure-results: not a procedure type" t))))) + (define (procedure-argument-types t n typeenv #!optional norest) (let loop1 ((t t)) (cond ((and (pair? t)Trap