~ chicken-core (chicken-5) ce3eb589552465c7898271a6515512d65bb09725
commit ce3eb589552465c7898271a6515512d65bb09725 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Sat Apr 21 15:51:38 2012 +0200 Commit: Peter Bex <peter.bex@xs4all.nl> CommitDate: Sat Apr 21 18:59:49 2012 +0200 when calling a possibly mutating procedure, invalidate list-of/list types by converting them to type pair (fixes #803) Signed-off-by: Peter Bex <peter.bex@xs4all.nl> diff --git a/scrutinizer.scm b/scrutinizer.scm index 782cd607..3492a886 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -829,7 +829,9 @@ rn))) -;;; replace pair/vector types with components to component-less variants in env or blist +;;; replace pair/vector types with components to variants with undetermined +;; component types (used for env or blist); also convert "list[-of]" types +;; into "pair", since mutation may take place (define (smash-component-types! lst where) (do ((lst lst (cdr lst))) @@ -838,11 +840,15 @@ (change! (cute set-cdr! (car lst) <>))) (when (pair? t) (case (car t) - ((list-of vector-of) + ((vector-of) (dd " smashing `~s' in ~a" (caar lst) where) - (change! (if (eq? 'list-of (car t)) 'list 'vector)) + (change! 'vector) (car t)) - ((pair vector list) + ((list-of list) + (dd " smashing `~s' in ~a" (caar lst) where) + (change! 'pair) + (car t)) + ((pair vector) (dd " smashing `~s' in ~a" (caar lst) where) (change! (car t)) (car t)) diff --git a/tests/specialization-test-1.scm b/tests/specialization-test-1.scm index 9d380fcc..01574204 100644 --- a/tests/specialization-test-1.scm +++ b/tests/specialization-test-1.scm @@ -36,4 +36,9 @@ return n;} (assert (= 2 (spec 1))) +;; "smash-component-types!" had to convert "list[-of]" types to "pair" (#803) +(let ((x (list 'a))) + (set-cdr! x x) + (assert (not (list? x)))) + )Trap