~ chicken-core (chicken-5) b1799c584e5aced59e342eb0b1f03b3d5ca3f47a


commit b1799c584e5aced59e342eb0b1f03b3d5ca3f47a
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Aug 20 14:54:56 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat Aug 20 14:54:56 2011 +0200

    small fixes; tests; new typedb update

diff --git a/scrutinizer.scm b/scrutinizer.scm
index 7c621355..9ed0916a 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -29,7 +29,8 @@
   (hide specialize-node! specialization-statistics
 	procedure-type? named? procedure-result-types procedure-argument-types
 	noreturn-type? rest-type procedure-name d-depth
-	noreturn-procedure-type? trail trail-restore typename
+	noreturn-procedure-type? trail trail-restore 
+	typename multiples
 	compatible-types? type<=? match-types resolve match-argument-types))
 
 
@@ -46,8 +47,8 @@
 
 (define dd d)
 
-(define-syntax d (syntax-rules () ((_ . _) (void))))
-(define-syntax dd (syntax-rules () ((_ . _) (void))))
+;(define-syntax d (syntax-rules () ((_ . _) (void))))
+;(define-syntax dd (syntax-rules () ((_ . _) (void))))
 
 
 ;;; Walk node tree, keeping type and binding information
@@ -102,6 +103,10 @@
 (define trail '())
 
 
+(define (multiples n)
+  (if (= n 1) "" "s"))
+
+
 (define (scrutinize node db complain specialize)
   (let ((blist '())
 	(aliased '())
@@ -212,31 +217,6 @@
 	     (pp-fragment x))))
 	f))
 
-    (define (argument-string args)
-      (let* ((len (length args))
-	     (m (multiples len)))
-	(if (zero? len)
-	    "zero arguments"
-	    (sprintf 
-		"~a argument~a of type~a ~a"
-	      len m m
-	      (map typename args)))))
-
-    (define (result-string results)
-      (if (eq? '* results) 
-	  "an unknown number of values"
-	  (let* ((len (length results))
-		 (m (multiples len)))
-	    (if (zero? len)
-		"zero values"
-		(sprintf 
-		    "~a value~a of type~a ~a"
-		  len m m
-		  (map typename results))))))
-
-    (define (multiples n)
-      (if (= n 1) "" "s"))
-
     (define (single what tv loc)
       (if (eq? '* tv)
 	  '*
@@ -753,21 +733,24 @@
 				  (first rt) t)))))
 		      (list t))))
 		 ((##core#typecase)
-		  (let ((ts (walk (first subs) e loc #f #f flow ctags))
-			(trail0 trail))
+		  (let* ((ts (walk (first subs) e loc #f #f flow ctags))
+			 (trail0 trail)
+			 (typeenv (type-typeenv (car ts))))
 		    ;; first exp is always a variable so ts must be of length 1
 		    (let loop ((types params) (subs (cdr subs)))
 		      (cond ((null? types)
 			     (quit "~ano clause applies in `compiler-typecase' for expression of type `~s':~a" 
 				   (location-name loc) (car ts)
 				   (string-concatenate
-				    (map (lambda (t) (string-append "\n   " (typename t)))
+				    (map (lambda (t) (string-sprintf "\n    ~a" t))
 					 params))))
-			    ((match-types (car types) (car ts) '())
+			    ((match-types (car types) (car ts) 
+					  (append (type-typeenv (car types)) typeenv))
 			     ;; drops exp
 			     (copy-node! (car subs) n)
 			     (walk n e loc dest tail flow ctags))
 			    (else
+			     (trail-restore trail0 typeenv)
 			     (loop (cdr types) (cdr subs)))))))
 		 ((##core#switch ##core#cond)
 		  (bomb "unexpected node class" class))
@@ -792,7 +775,32 @@
       rn)))
       
 
+;;; Converting type into string
+
 (define (typename t)
+  (define (argument-string args)
+    (let* ((len (length (delete args '#!optional) eq?))
+	   (m (multiples len)))
+      ;;XXX not quite right for test-arguments
+      (cond ((memq '#!rest args)
+	     (sprintf "~a or more arguments" len))
+	    ((zero? len) "zero arguments")
+	    (else
+	     (sprintf 
+		 "~a argument~a of type~a ~a"
+	       len m m
+	       (string-intersperse (map typename args) ", "))))))
+  (define (result-string results)
+    (if (eq? '* results) 
+	"an unknown number of values"
+	(let* ((len (length results))
+	       (m (multiples len)))
+	  (if (zero? len)
+	      "zero values"
+	      (sprintf 
+		  "~a value~a of type~a ~a"
+		len m m
+		(string-intersperse (map typename results) ", "))))))
   (case t
     ((*) "anything")
     ((char) "character")
@@ -887,6 +895,7 @@
 	     #f))))
 
   (define (match1 t1 t2)
+    ;(dd "   match1: ~s <-> ~s" t1 t2)
     (cond ((eq? t1 t2))
 	  ((and (symbol? t1) (assq t1 typeenv)) => 
 	   (lambda (e) 
@@ -997,7 +1006,7 @@
 			 (match1 (third t1) t2)))))
 	  (else #f)))
   (let ((m (match1 t1 t2)))
-    (dd "    match~a ~a <-> ~a -> ~a" (if exact " (exact)" "") t1 t2 m)
+    (dd "    match~a ~a <-> ~a -> ~a  (te: ~s)" (if exact " (exact)" "") t1 t2 m typeenv)
     m))
 
 (define (match-argument-types typelist atypes typeenv #!optional exact)
diff --git a/tests/typematch-tests.scm b/tests/typematch-tests.scm
index 031196c5..8de1f9b2 100644
--- a/tests/typematch-tests.scm
+++ b/tests/typematch-tests.scm
@@ -144,7 +144,7 @@
 (ms (##sys#make-structure 'promise) 1 (struct promise))
 (ms '(1 . 2.3) '(a) (pair fixnum float))
 (ms '#(a) 1 (vector symbol))
-(ms '(1) 'a (or pair symbol))
+(ms '(1) "a" (or pair symbol))
 (ms (list) 'a list)
 (ms '() 'a (or null pair))
 
@@ -181,6 +181,6 @@
 (m (procedure (#!rest) . *) (procedure (*) . *))
 (mn (procedure () *) (procedure () * *))
 
-(mx (forall (a) (procedure (#!rest a) a) +))
+(mx (forall (a) (procedure (#!rest a) a)) +)
 (mx (or pair null) '(1))
 (mx (or pair null) (list))
diff --git a/types.db.new b/types.db.new
index 6e717fa5..376a5923 100644
--- a/types.db.new
+++ b/types.db.new
@@ -1290,7 +1290,10 @@
 	      ((locative locative fixnum fixnum fixnum)
 	       (##core#inline "C_copy_ptr_memory" #(2) #(1) #(3) #(5) #(4))))
 
-(mutate-procedure (procedure! mutate-procedure (procedure (procedure (procedure) . *)) procedure))
+(mutate-procedure!
+ (procedure! mutate-procedure (procedure (procedure (procedure) . *)) procedure))
+
+(mutate-procedure (deprecated mutate-procedure!)
 (null-pointer deprecated)
 (null-pointer? deprecated)
 
Trap