~ chicken-core (chicken-5) 2817709c1d58e220fa2e29fc265ece3547c2597a


commit 2817709c1d58e220fa2e29fc265ece3547c2597a
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Aug 19 13:27:06 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Fri Aug 19 13:27:06 2011 +0200

    countless tests and fixes

diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index 47d597ac..284b6ddb 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -1267,7 +1267,7 @@
  'compiler-typecase '()
  (##sys#er-transformer
   (lambda (x r c)
-    (##sys#check-syntax 'compiler-typecase x '(_ _ . #((_ . #(_ 1)) 0)))
+    (##sys#check-syntax 'compiler-typecase x '(_ _ . #((_ . #(_ 1)) 1)))
     (let ((var (gensym)))
       `(##core#let ((,var ,(cadr x)))
 		   (##core#typecase 
diff --git a/eval.scm b/eval.scm
index b47228b3..35a45f8f 100644
--- a/eval.scm
+++ b/eval.scm
@@ -50,6 +50,9 @@
 
 (include "common-declarations.scm")
 
+(define-syntax d (syntax-rules () ((_ . _) (void))))
+
+
 (define-foreign-variable install-egg-home c-string "C_INSTALL_EGG_HOME")
 (define-foreign-variable installation-home c-string "C_INSTALL_SHARE_HOME")
 (define-foreign-variable binary-version int "C_BINARY_VERSION")
diff --git a/scrutinizer.scm b/scrutinizer.scm
index d63e42ba..02229131 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -398,9 +398,9 @@
 				  (and (pair? specs)
 				       (let* ((spec (car specs))
 					      (stype (first spec))
-					      (tenv2 (append (type-typeenv stype) typeenv)))
+					      (tenv2 (append (append-map type-typeenv stype) typeenv)))
 					   (cond ((match-argument-types
-						   (first (car specs)) (cdr args) tenv2
+						   stype (cdr args) tenv2
 						   #t)
 						  (set! op (cons pn (car spec)))
 						  (set! typeenv tenv2)
@@ -1387,7 +1387,12 @@
   (let resolve ((t t))
     (cond ((not t) '*)			; unbound type-variable
 	  ((assq t typeenv) => (lambda (a) (resolve (cdr a))))
-	  ((not (pair? t)) t)
+	  ((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)))
 	  (else 
 	   (case (car t)
 	     ((or) `(or ,@(map resolve (cdr t))))
@@ -1403,7 +1408,11 @@
 		  ,(let loop ((args argtypes))
 		     (cond ((null? args) '())
 			   ((eq? '#!rest (car args))
-			    (cons '#!rest (loop (cdr args))))
+			    (if (equal? '(values) (cdr args))
+				args
+				(cons (car args) (loop (cdr args)))))
+			   ((eq? '#!optional (car args))
+			    (cons (car args) (loop (cdr args))))
 			   (else (cons (resolve (car args)) (loop (cdr args))))))
 		  ,@(if (eq? '* rtypes)
 			'*
@@ -1563,16 +1572,17 @@
 			 deprecated noreturn values))
 	     t)
 	    ((not (pair? t)) 
-	     (when (memq t typevars)
-	       (set! usedvars (cons t usedvars)))
-	     t)
+	     (cond ((memq t typevars)
+		    (set! usedvars (cons t usedvars))
+		    t)
+		   (else #f)))
 	    ((eq? 'forall (car t))
 	     (and (= 3 (length t))
 		  (list? (second t))
 		  (every symbol? (second t))
 		  (begin
 		    (set! typevars (append (second t) typevars))
-		    (validate (third t)))))
+		    (validate (third t) rec))))
 	    ((eq? 'or (car t)) 
 	     (and (list? t)
 		  (let ((ts (map validate (cdr t))))
@@ -1582,14 +1592,30 @@
 	     (and (= 2 (length t))
 		  (symbol? (cadr t))
 		  t))
-	    ((eq? 'pair (car t))
-	     (and (= 3 (length t))
-		  (let ((ts (map validate (cdr t))))
-		    (and ts `(pair ,@ts)))))
+	    ((memq '-> t) =>
+	     (lambda (p)
+	       (let ((cp (memq ': (cdr p))))
+		 (cond ((not cp) 
+			(validate
+			 `(procedure ,(upto t p) ,@(cdr p))
+			 rec))
+		       ((and (= 5 (length t))
+			     (eq? p (cdr t))
+			     (eq? cp (cdddr t)))
+			(set! t (validate `(procedure (,(first t)) ,(third t)) rec))
+			;; we do it this way to distinguish the "outermost" predicate
+			;; procedure type
+			(set! ptype (cons t (validate (cadr cp))))
+			t)
+		       (else #f)))))
 	    ((memq (car t) '(vector list))
 	     (and (= 2 (length t))
 		  (let ((t2 (validate (second t))))
 		    (and t2 `(,(car t) ,t2)))))
+	    ((eq? 'pair (car t))
+	     (and (= 3 (length t))
+		  (let ((ts (map validate (cdr t))))
+		    (and ts `(pair ,@ts)))))
 	    ((eq? 'procedure (car t))
 	     (and (pair? (cdr t))
 		  (let* ((name (if (symbol? (cadr t))
@@ -1613,32 +1639,18 @@
 					 ,@(if (and name (not rec)) (list name) '())
 					 ,ts
 					 ,@rt)))))))))
-	    ((and (pair? (cdr t)) (memq '-> (cdr t))) =>
-	     (lambda (p)
-	       (let ((cp (memq ': (cdr t))))
-		 (cond ((not cp) 
-			(validate
-			 `(procedure ,(upto t p) ,@(cdr p))
-			 rec))
-		       ((and (= 5 (length t))
-			     (eq? p (cdr t))
-			     (eq? cp (cdddr t)))
-			(set! t (validate `(procedure (,(first t)) ,(third t)) rec))
-			;; we do it this way to distinguish the "outermost" predicate
-			;; procedure type
-			(set! ptype (cons t (validate (cadr cp))))
-			t)
-		       (else #f)))))
 	    (else #f)))
-    (let ((type (validate type #f)))
-      (when (pair? typevars)
-	(set! type
-	  `(forall ,(filter-map
-		     (lambda (v) (and (memq v usedvars) v))
-		     (delete-duplicates typevars eq?))
-		   ,type)))
-      (let ((type (simplify-type type)))
-	(values type (and ptype (eq? (car ptype) type) (cdr ptype)))))))
+    (cond ((validate type #f) =>
+	   (lambda (type)
+	     (when (pair? typevars)
+	       (set! type
+		 `(forall ,(filter-map
+			    (lambda (v) (and (memq v usedvars) v))
+			    (delete-duplicates typevars eq?))
+			  ,type)))
+	     (let ((type (simplify-type type)))
+	       (values type (and ptype (eq? (car ptype) type) (cdr ptype))))))
+	  (else (values #f #f)))))
 
 
 ;;; hardcoded result types for certain primitives
diff --git a/tests/runtests.sh b/tests/runtests.sh
index 05532ae9..4f1304f6 100644
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -70,8 +70,9 @@ $compile inlining-tests.scm -optimize-level 3
 ./a.out
 
 echo "======================================== scrutiny tests ..."
-$compile typematch-tests.scm -scrutinize -analyze-only
-$compile scrutiny-tests.scm -scrutinize -analyze-only -ignore-repository -types ../types.db 2>scrutiny.out -verbose
+$compile typematch-tests.scm -scrutinize
+./a.out
+$compile scrutiny-tests.scm -scrutinize -ignore-repository -types ../types.db 2>scrutiny.out -verbose
 
 if test -n "$MSYSTEM"; then
     dos2unix scrutiny.out
diff --git a/tests/typematch-tests.scm b/tests/typematch-tests.scm
index e735bbde..d05af2de 100644
--- a/tests/typematch-tests.scm
+++ b/tests/typematch-tests.scm
@@ -8,7 +8,8 @@
        (compiler-typecase x
 	 (t 'ok))
        (compiler-typecase not-x
-	 ((not t) 'ok))))))
+	 ((not t) 'ok))
+       (ms t x not-x)))))
 
 (define-syntax checkp
   (syntax-rules ()
@@ -20,6 +21,70 @@
        (compiler-typecase (##sys#make-structure 'foo)
 	 ((not t) 'ok))))))
 
+(define (bar) 42)
+
+(define-syntax m
+  (er-macro-transformer
+   (lambda (x r c)
+     (let ((t1 (cadr x))
+	   (t2 (caddr x))
+	   (foo1 (gensym 'foo1))
+	   (foo2 (gensym 'foo2)))
+       `(begin
+	  (print t1 " = " t2)
+	  (: ,foo1 (-> ,t1))
+	  (: ,foo2 (-> ,t2))
+	  (define (,foo1) (bar))
+	  (define (,foo2) (bar))
+	  (compiler-typecase (,foo1)
+	    (,t2 'ok))
+	  (print t2 " = " t1)
+	  (compiler-typecase (,foo2)
+	    (,t1 'ok)))))))
+
+(define-syntax mn
+  (er-macro-transformer
+   (lambda (x r c)
+     (let ((t1 (cadr x))
+	   (t2 (caddr x))
+	   (foo1 (gensym 'foo1))
+	   (foo2 (gensym 'foo2)))
+       `(begin
+	  (print t1 " != " t2)
+	  (: ,foo1 (-> ,t1))
+	  (: ,foo2 (-> ,t2))
+	  (define (,foo1) (bar))
+	  (define (,foo2) (bar))
+	  (compiler-typecase (,foo1)
+	    (,t2 (bomb))
+	    (else 'ok))
+	  (print t2 " != " t1)
+	  (compiler-typecase (,foo2)
+	    (,t1 (bomb))
+	    (else 'ok)))))))
+
+(define-syntax ms
+  (er-macro-transformer
+   (lambda (x r c)
+     (let ((fname (gensym))
+	   (fname2 (gensym))
+	   (type (cadr x))
+	   (val (caddr x))
+	   (nval (cadddr x)))
+       `(begin
+	  (print "specialize " type)
+	  (: ,fname (,type -> *)
+	     ((,type) 'ok)
+	     (((not ,type)) 'ok-too))
+	  (define (,fname x) (bomb))
+	  (assert (eq? 'ok (,fname ,val)))
+	  (assert (eq? 'ok-too (,fname ,nval)))
+	  (: ,fname2 (* -> *)
+	     (((not ,type)) (bomb)))
+	  (define (,fname2 x) 'ok)
+	  (print "specialize not " type)
+	  (,fname2 ,val))))))
+
 
 ;;;
 
@@ -73,3 +138,12 @@
 (checkp pointer-vector? (make-pointer-vector 1) pointer-vector)
 (checkp pointer? (address->pointer 1) pointer)
 
+(m number fixnum)
+(m number float)
+(m list null)
+(mn list pair)
+(m pair (pair number string))
+(m procedure (procedure () *))
+(mn (procedure (*) *) (procedure () *))
+(m (procedure (#!rest) . *) (procedure (*) . *))
+(mn (procedure () *) (procedure () * *))
Trap