~ chicken-core (chicken-5) 90c0d08e032d71f2633dfa9271e93ecad0adf95e


commit 90c0d08e032d71f2633dfa9271e93ecad0adf95e
Author:     felix <felix@z.(none)>
AuthorDate: Sat Mar 12 14:03:17 2011 +0100
Commit:     felix <felix@z.(none)>
CommitDate: Sat Mar 12 14:03:17 2011 +0100

    : allows rewrite rules; specialization tests

diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index b889f7d3..2b2659e5 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -1116,7 +1116,7 @@
  ': '()
  (##sys#er-transformer
   (lambda (x r c)
-    (##sys#check-syntax ': x '(_ symbol _))
+    (##sys#check-syntax ': x '(_ symbol _ . _))
     (let* ((name (##sys#globalize (cadr x)))
 	   (type1 (##sys#strip-syntax (caddr x)))
 	   (name1 (##sys#strip-syntax (cadr x)))
@@ -1125,7 +1125,8 @@
 	     (syntax-error ': "invalid type syntax" name1 type1))
 	    ((memq #:csi ##sys#features) '(##core#undefined))
 	    (else
-	     `(##core#declare (type (,name ,type)))))))))
+	     `(##core#declare 
+	       (type (,name ,type ,@(cdddr x)))))))))
 
 
 (##sys#macro-subset me0 ##sys#default-macro-environment)))
diff --git a/chicken.scm b/chicken.scm
index efe52fb1..b84cf647 100644
--- a/chicken.scm
+++ b/chicken.scm
@@ -89,18 +89,24 @@
 			     options)) ) 
 		   ((3)
 		    (set! options
-		      (cons* 'optimize-leaf-routines 'inline 'inline-global 'unboxing 'local
+		      (cons* 'optimize-leaf-routines 'inline 'inline-global
+			     'unboxing 'local
+			     ;;XXX 'specialize
 			     options) ) )
 		   ((4)
 		    (set! options
-		      (cons* 'optimize-leaf-routines 'inline 'inline-global 'unboxing 
+		      (cons* 'optimize-leaf-routines 'inline 'inline-global
+			     'unboxing 
+			     ;;XXX 'specialize
 			     'local 'unsafe
 			     options) ) )
 		   (else
 		    (when (>= level 5)
 		      (set! options 
 			(cons* 'disable-interrupts 'no-trace 'unsafe 'block
-			       'optimize-leaf-routines 'lambda-lift 'no-lambda-info
+			       'optimize-leaf-routines 'lambda-lift 
+			       'no-lambda-info
+			       ;;XXX 'specialize
 			       'inline 'inline-global 'unboxing
 			       options) ) ) ) )
 		 (loop (cdr rest)) ) )
diff --git a/compiler.scm b/compiler.scm
index 277b5f92..6cb63f89 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -1466,7 +1466,9 @@
        ((type)
 	(for-each
 	 (lambda (spec)
-	   (if (not (and (list? spec) (>= 2 (length spec)) (symbol? (car spec))))
+	   (if (not (and (list? spec)
+			 (>= 2 (length spec))
+			 (symbol? (car spec))))
 	       (warning "illegal type declaration" (##sys#strip-syntax spec))
 	       (let ((name (globalize (car spec)))
 		     (type (##sys#strip-syntax (cadr spec))))
diff --git a/distribution/manifest b/distribution/manifest
index abdc28fe..709d9d9d 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -156,6 +156,8 @@ tests/test.scm
 tests/loopy-test.scm
 tests/loopy-loop.scm
 tests/r5rs_pitfalls.scm
+tests/specialization-test-1.scm
+tests/specialization-test-2.scm
 tests/test-irregex.scm
 tests/re-tests.txt
 tests/lolevel-tests.scm
diff --git a/support.scm b/support.scm
index e79395a8..6753e746 100644
--- a/support.scm
+++ b/support.scm
@@ -747,7 +747,8 @@
        (lambda (sym plist)
 	 (when (variable-visible? sym)
 	   (and-let* ((type (variable-mark sym '##core#declared-type)))
-	     (let ((specs (or (variable-mark sym '##core#specializations) '())))
+	     (let ((specs
+		    (or (variable-mark sym '##core#specializations) '())))
 	       (pp (cons* sym type specs))))))
        db)
       (print "; END OF FILE"))))
diff --git a/tests/runtests.sh b/tests/runtests.sh
index e544c7d9..2e4bcfc9 100644
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -73,6 +73,14 @@ fi
 
 diff -bu scrutiny.out scrutiny.expected
 
+echo "======================================== specialization tests ..."
+rm foo.types
+$compile specialization-test-1.scm -emit-type-file foo.types -specialize \
+  -debug ox
+./a.out
+$compile specialization-test-2.scm -types foo.types -specialize -debug ox
+./a.out
+
 echo "======================================== callback tests ..."
 $compile callback-tests.scm
 ./a.out
diff --git a/tests/specialization-test-1.scm b/tests/specialization-test-1.scm
new file mode 100644
index 00000000..41e7ea37
--- /dev/null
+++ b/tests/specialization-test-1.scm
@@ -0,0 +1,23 @@
+;;;; specialization-test-1.scm
+
+
+(module main ()
+(import scheme chicken foreign)
+
+#>
+static int inlined(int i) {
+static int n = 0;
+n += i;
+return n;}
+<#
+
+(: foo (fixnum -> fixnum)
+   ((fixnum) (##core#inline "inlined" #(1))))
+(define (foo i)
+  (print "foo: " i)
+  0)
+
+(assert (zero? (foo 1.0)))
+(assert (= 1 (foo 1)))
+
+)
diff --git a/tests/specialization-test-2.scm b/tests/specialization-test-2.scm
new file mode 100644
index 00000000..82763f40
--- /dev/null
+++ b/tests/specialization-test-2.scm
@@ -0,0 +1,21 @@
+;;;; specialization-test-2.scm
+
+
+(module main ()
+(import scheme chicken foreign)
+
+#>
+static int inlined(int i) {
+static int n = 0;
+n += i;
+return n;}
+<#
+
+(define (foo i)
+  (print "foo: " i)
+  0)
+
+(assert (zero? (foo 1.0)))
+(assert (= 1 (foo 1)))
+
+)
Trap