~ chicken-core (chicken-5) 5defd64d28e29060e2b4fbcf9418d6a4e41539c8


commit 5defd64d28e29060e2b4fbcf9418d6a4e41539c8
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Jul 4 12:21:09 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Mon Jul 4 12:21:09 2011 +0200

    moved type-simplification to toplevel

diff --git a/compiler-namespace.scm b/compiler-namespace.scm
index 47657b54..4373374d 100644
--- a/compiler-namespace.scm
+++ b/compiler-namespace.scm
@@ -260,6 +260,7 @@
  simplifications
  simplified-ops
  simplify-named-call
+ simplify-type
  sort-symbols
  source-filename
  source-info->string
diff --git a/scrutinizer.scm b/scrutinizer.scm
index 5a9331ed..e13278da 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -236,72 +236,6 @@
 		  len m m
 		  (map typename results))))))
 
-    (define (simplify t)
-      (let ((t2 (simplify1 t)))
-	(dd "simplify: ~a -> ~a" t t2)
-	t2))
-
-    (define (simplify1 t)
-      (call/cc 
-       (lambda (return)
-	 (if (pair? t)
-	     (case (car 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))))
-		      (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)))))))) )
-	       ((procedure)
-		(let* ((name (and (named? t) (cadr t)))
-		       (rtypes (if name (cdddr t) (cddr t))))
-		  (append
-		   '(procedure)
-		   (if name (list name) '())
-		   (list (map simplify (if name (third t) (second t))))
-		   (if (eq? '* rtypes)
-		       '*
-		       (map simplify rtypes)))))
-	       (else t))
-	     t))))
-
     ;;XXX this could be better done by combining non-matching arguments/llists
     ;;    into "(or (procedure ...) (procedure ...))"
     (define (merge-argument-types ts1 ts2) 
@@ -313,17 +247,17 @@
 	    ((eq? '#!rest (car ts1))
 	     (cond ((and (pair? ts2) (eq? '#!rest (car ts2)))
 		    `(#!rest
-		      ,(simplify 
+		      ,(simplify-type
 			`(or ,(rest-type (cdr ts1))
 			     ,(rest-type (cdr ts2))))))
 		   (else '(#!rest))))	;XXX giving up
 	    ((eq? '#!optional (car ts1))
 	     (cond ((and (pair? ts2) (eq? '#!optional (car ts2)))
 		    `(#!optional 
-		      ,(simplify `(or ,(cadr ts1) ,(cadr ts2)))
+		      ,(simplify-type `(or ,(cadr ts1) ,(cadr ts2)))
 		      ,@(merge-argument-types (cddr ts1) (cddr ts2))))
 		   (else '(#!rest))))	;XXX
-	    (else (cons (simplify `(or ,(car ts1) ,(car ts2)))
+	    (else (cons (simplify-type `(or ,(car ts1) ,(car ts2)))
 			(merge-argument-types (cdr ts1) (cdr ts2))))))
 
     (define (merge-result-types ts11 ts21) ;XXX possibly overly conservative
@@ -335,7 +269,7 @@
 		 ((or (atom? ts1) (atom? ts2)) (return '*))
 		 ((eq? 'noreturn (car ts1)) (loop (cdr ts1) ts2))
 		 ((eq? 'noreturn (car ts2)) (loop ts1 (cdr ts2)))
-		 (else (cons (simplify `(or ,(car ts1) ,(car ts2)))
+		 (else (cons (simplify-type `(or ,(car ts1) ,(car ts2)))
 			     (loop (cdr ts1) (cdr ts2)))))))))
 
     (define (match t1 t2)
@@ -672,7 +606,7 @@
 				  (sprintf
 				      "branches in conditional expression differ in the number of results:~%~%~a"
 				    (pp-fragment n))))
-			       (map (lambda (t1 t2) (simplify `(or ,t1 ,t2)))
+			       (map (lambda (t1 t2) (simplify-type `(or ,t1 ,t2)))
 				    r1 r2))
 			      (else '*))))))
 		 ((let)
@@ -921,6 +855,75 @@
 	(debugging 'x "dropped branches" dropped-branches)) ;XXX
       rn)))
 
+
+(define (simplify-type t)
+  (define (simplify t)
+    (let ((t2 (simplify1 t)))
+      (dd "simplify: ~a -> ~a" t t2)
+      t2))
+  (define (simplify1 t)
+    (call/cc 
+     (lambda (return)
+       (if (pair? t)
+	   (case (car 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))))
+		    (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)))))))) )
+	     ((procedure)
+	      (let* ((name (and (named? t) (cadr t)))
+		     (rtypes (if name (cdddr t) (cddr t))))
+		(append
+		 '(procedure)
+		 (if name (list name) '())
+		 (list (map simplify (if name (third t) (second t))))
+		 (if (eq? '* rtypes)
+		     '*
+		     (map simplify rtypes)))))
+	     (else t))
+	   t))))
+  (simplify t))
+
+
 (define (compatible-types? t1 t2)
   (or (type<=? t1 t2)
       (type<=? t2 t1)))
Trap