~ chicken-core (chicken-5) ae6af2c1894b8ab8178f21f8169a98c3b5e0327a


commit ae6af2c1894b8ab8178f21f8169a98c3b5e0327a
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Tue Jun 19 19:46:26 2012 +0200
Commit:     Peter Bex <peter.bex@xs4all.nl>
CommitDate: Thu Jun 21 20:56:53 2012 +0200

    smash types in implicit global type-declarations; added test
    
    Signed-off-by: Peter Bex <peter.bex@xs4all.nl>

diff --git a/distribution/manifest b/distribution/manifest
index 6c02c346..d4b641b9 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -143,6 +143,7 @@ tests/module-tests-compiled.scm
 tests/scrutiny-tests.scm
 tests/typematch-tests.scm
 tests/scrutiny-tests-2.scm
+tests/scrutiny-tests-3.scm
 tests/scrutiny.expected
 tests/syntax-rule-stress-test.scm
 tests/syntax-tests.scm
diff --git a/scrutinizer.scm b/scrutinizer.scm
index dbf64814..8069ac60 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -614,12 +614,15 @@
 				   (or (not (variable-visible? var))
 				       (not (eq? (variable-mark var '##compiler#inline) 
 						 'no))))
-			  (debugging '|I| (sprintf "(: ~s ~s)" var rt))
-			  ;; [2] sets property, but lambda has already been walked,
-			  ;; so no type-checks are generated (see also [1], above)
-			  ;; note that implicit declarations are not enforcing
-			  (mark-variable var '##compiler#declared-type)
-			  (mark-variable var '##compiler#type rt))))
+			  (let ((rtlst (list (cons #f (tree-copy rt)))))
+			    (smash-component-types! rtlst "global")
+			    (let ((rt (cdar rtlst)))
+			      (debugging '|I| (sprintf "(: ~s ~s)" var rt))
+			      ;; [2] sets property, but lambda has already been walked,
+			      ;; so no type-checks are generated (see also [1], above)
+			      ;; note that implicit declarations are not enforcing
+			      (mark-variable var '##compiler#declared-type)
+			      (mark-variable var '##compiler#type rt))))))
 		    (when b
 		      (cond ((eq? 'undefined (cdr b)) (set-cdr! b rt))
 			    #;(strict-variable-types
@@ -834,6 +837,7 @@
 ;;  into "pair", since mutation may take place
 
 (define (smash-component-types! lst where)
+  ;; assumes list of the form "((_ . T1) ...)"
   (do ((lst lst (cdr lst)))
       ((null? lst))
     (let loop ((t (cdar lst))
diff --git a/tests/runtests.sh b/tests/runtests.sh
index 9f9f7ee5..d21b7044 100755
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -96,6 +96,9 @@ fi
 
 diff -bu scrutiny-2.expected scrutiny-2.out
 
+$compile scrutiny-tests-3.scm -specialize -block -ignore-repository -types $TYPESDB
+./a.out
+
 echo "======================================== specialization tests ..."
 rm -f foo.types foo.import.*
 $compile specialization-test-1.scm -emit-type-file foo.types -specialize \
diff --git a/tests/scrutiny-tests-3.scm b/tests/scrutiny-tests-3.scm
new file mode 100644
index 00000000..41b46fb7
--- /dev/null
+++ b/tests/scrutiny-tests-3.scm
@@ -0,0 +1,12 @@
+;;;; scrutiny-tests-3.scm - scrutinizer-tests, compiled in block mode and executed
+
+
+;;; ensure implicit global type-declarations are "smashed" (i.e. have
+;;; their component types invalidated, due to possible mutation)
+
+(define vec (make-vector 10 #f))
+(vector-set! vec 0 99)
+(assert
+ (compiler-typecase vec
+   ((vector-of boolean) #f)
+   (vector #t)))
Trap