~ chicken-core (chicken-5) d127450d6e574427a3dccf1531e908135eed2bac


commit d127450d6e574427a3dccf1531e908135eed2bac
Author:     Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Sat Apr 21 00:13:49 2012 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat Apr 21 15:59:15 2012 +0200

    Two types.db fixes:
    
    - finite?, exact? and inexact? raise an error on non-numbers.  They are not pure predicates and shouldn't be rewritten to "pure" C functions.
    - The "base" (aka "radix") argument for string->number and number->string can only be a fixnum.
    
    Signed-off-by: felix <felix@call-with-current-continuation.org>

diff --git a/tests/library-tests.scm b/tests/library-tests.scm
index 1268bd46..fab5f002 100644
--- a/tests/library-tests.scm
+++ b/tests/library-tests.scm
@@ -2,6 +2,10 @@
 
 (use srfi-1 extras)
 
+(define-syntax assert-fail
+  (syntax-rules ()
+    ((_ exp)
+     (assert (handle-exceptions ex #t exp #f)))))
 
 ;; numbers
 
@@ -20,6 +24,7 @@
 (assert (= 1.0 (round 0.6)))
 (assert (rational? 1))
 (assert (finite? 1))
+(assert-fail (finite? 'foo))
 (assert (rational? 1.0))
 (assert (finite? 1.0))
 (assert (not (rational? +inf.0)))
@@ -40,10 +45,14 @@
 (assert (not (integer? "foo")))
 ; XXX number missing
 
-(define-syntax assert-fail
-  (syntax-rules ()
-    ((_ exp)
-     (assert (handle-exceptions ex #t exp #f)))))
+(assert (exact? 1))
+(assert (not (exact? 1.0)))
+(assert (not (exact? 1.1)))
+(assert-fail (exact? 'foo))
+(assert (not (inexact? 1)))
+(assert (inexact? 1.0))
+(assert (inexact? 1.1))
+(assert-fail (inexact? 'foo))
 
 (assert-fail (/ 1 1 0))
 (assert-fail (/ 1 1 0.0))
diff --git a/tests/scrutiny-2.expected b/tests/scrutiny-2.expected
index 4bea4dfe..1985dac1 100644
--- a/tests/scrutiny-2.expected
+++ b/tests/scrutiny-2.expected
@@ -59,14 +59,6 @@ Note: at toplevel:
   (scrutiny-tests-2.scm:23) in procedure call to `fixnum?', the predicate is called with an argument of type
   `float' and will always return false
 
-Note: at toplevel:
-  (scrutiny-tests-2.scm:24) in procedure call to `exact?', the predicate is called with an argument of type
-  `fixnum' and will always return true
-
-Note: at toplevel:
-  (scrutiny-tests-2.scm:24) in procedure call to `exact?', the predicate is called with an argument of type
-  `float' and will always return false
-
 Note: at toplevel:
   (scrutiny-tests-2.scm:25) in procedure call to `flonum?', the predicate is called with an argument of type
   `float' and will always return true
@@ -75,14 +67,6 @@ Note: at toplevel:
   (scrutiny-tests-2.scm:25) in procedure call to `flonum?', the predicate is called with an argument of type
   `fixnum' and will always return false
 
-Note: at toplevel:
-  (scrutiny-tests-2.scm:26) in procedure call to `inexact?', the predicate is called with an argument of type
-  `float' and will always return true
-
-Note: at toplevel:
-  (scrutiny-tests-2.scm:26) in procedure call to `inexact?', the predicate is called with an argument of type
-  `fixnum' and will always return false
-
 Note: at toplevel:
   (scrutiny-tests-2.scm:27) in procedure call to `number?', the predicate is called with an argument of type
   `fixnum' and will always return true
diff --git a/types.db b/types.db
index 7aed56f9..61a3dd1f 100644
--- a/types.db
+++ b/types.db
@@ -218,10 +218,14 @@
 	  ((fixnum) (let ((#(tmp) #(1))) '#t))
 	  ((float) (##core#inline "C_u_i_fpintegerp" #(1))))
 
-(exact? (#(procedure #:pure #:predicate fixnum) exact? (*) boolean))
 (real? (#(procedure #:pure #:predicate number) real? (*) boolean))
 (complex? (#(procedure #:pure #:predicate number) complex? (*) boolean))
-(inexact? (#(procedure #:pure #:predicate float) inexact? (*) boolean))
+(exact? (#(procedure #:clean #:enforce) exact? (number) boolean)
+        ((fixnum) (let ((#(tmp) #(1))) '#t))
+        ((float) (let ((#(tmp) #(1))) '#f)))
+(inexact? (#(procedure #:clean #:enforce) inexact? (number) boolean)
+          ((fixnum) (let ((#(tmp) #(1))) '#f))
+          ((float) (let ((#(tmp) #(1))) '#t)))
 
 ;;XXX predicate?
 (rational? (#(procedure #:pure) rational? (*) boolean)
@@ -474,10 +478,10 @@
 			       #(2)))
       ((float float) (##core#inline_allocate ("C_a_i_flonum_atan2" 4) #(1) #(2))))
 
-(number->string (#(procedure #:clean #:enforce) number->string (number #!optional number) string)
+(number->string (#(procedure #:clean #:enforce) number->string (number #!optional fixnum) string)
 		((fixnum) (##sys#fixnum->string #(1))))
 
-(string->number (#(procedure #:clean #:enforce) string->number (string #!optional number) 
+(string->number (#(procedure #:clean #:enforce) string->number (string #!optional fixnum) 
 		 (or number boolean)))
 
 (char? (#(procedure #:pure #:predicate char) char? (*) boolean))
@@ -802,9 +806,9 @@
 (file-exists? (#(procedure #:clean #:enforce) file-exists? (string) (or boolean string)))
 (directory-exists? (#(procedure #:clean #:enforce) directory-exists? (string) (or boolean string)))
 
-(finite? (#(procedure #:pure) finite? (*) boolean)
+(finite? (#(procedure #:clean #:enforce) finite? (number) boolean)
 	 ((fixnum) (let ((#(tmp) #(1))) '#t))
-	 ((*) (##core#inline "C_i_finitep" #(1))))
+	 (((or float number)) (##core#inline "C_i_finitep" #(1))))
 
 (fixnum-bits fixnum)
 (fixnum-precision fixnum)
Trap