~ chicken-core (chicken-5) 45874a8badda0b19f6a0c5f52b3824c4a0022c6a


commit 45874a8badda0b19f6a0c5f52b3824c4a0022c6a
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Fri Feb 6 22:18:40 2015 +0100
Commit:     Peter Bex <peter@more-magic.net>
CommitDate: Sun May 31 14:18:25 2015 +0200

    Fix srfi-4 integer vectors so they operate on exact integers.  Add better arg checking and improve tests.
    
    TODO: Add s64vectors and u64vectors.

diff --git a/c-platform.scm b/c-platform.scm
index b59a87c0..1286844b 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -184,7 +184,7 @@
     ##sys#check-port ##sys#check-input-port ##sys#check-output-port
     ##sys#check-open-port
     ##sys#check-char ##sys#check-vector ##sys#check-byte-vector ##sys#list ##sys#cons
-    ##sys#call-with-values ##sys#fits-in-int? ##sys#fits-in-unsigned-int? ##sys#flonum-in-fixnum-range? 
+    ##sys#call-with-values ##sys#flonum-in-fixnum-range? 
     ##sys#fudge ##sys#immediate? ##sys#direct-return ##sys#context-switch
     ##sys#make-structure ##sys#apply ##sys#apply-values ##sys#continuation-graft
     ##sys#bytevector? ##sys#make-vector ##sys#setter ##sys#car ##sys#cdr ##sys#pair?
@@ -200,13 +200,10 @@
 (for-each
  (cut mark-variable <> '##compiler#pure '#t)
  '(##sys#slot ##sys#block-ref ##sys#size ##sys#byte
-    ##sys#pointer? ##sys#generic-structure? ##sys#fits-in-int? ##sys#fits-in-unsigned-int? ##sys#flonum-in-fixnum-range? 
-    ##sys#fudge ##sys#immediate?
-    ##sys#bytevector? ##sys#pair?
-    ##sys#eq? ##sys#list? ##sys#vector? ##sys#eqv? 
+    ##sys#pointer? ##sys#generic-structure? ##sys#fudge ##sys#immediate?
+    ##sys#bytevector? ##sys#pair? ##sys#eq? ##sys#list? ##sys#vector? ##sys#eqv? 
     ##sys#get-keyword			; ok it isn't, but this is only used for ext. llists
-    ##sys#void
-    ##sys#permanent?))
+    ##sys#void ##sys#permanent?))
 
 
 ;;; Rewriting-definitions for this platform:
@@ -733,9 +730,6 @@
 (rewrite 'string=? 17 2 "C_i_string_equal_p" "C_u_i_string_equal_p")
 (rewrite 'string-ci=? 17 2 "C_i_string_ci_equal_p")
 (rewrite '##sys#fudge 17 1 "C_fudge")
-(rewrite '##sys#fits-in-int? 17 1 "C_fits_in_int_p")
-(rewrite '##sys#fits-in-unsigned-int? 17 1 "C_fits_in_unsigned_int_p")
-(rewrite '##sys#flonum-in-fixnum-range? 17 1 "C_flonum_in_fixnum_range_p")
 (rewrite '##sys#permanent? 17 1 "C_permanentp")
 (rewrite '##sys#null-pointer? 17 1 "C_null_pointerp" "C_null_pointerp")
 (rewrite '##sys#immediate? 17 1 "C_immp")
diff --git a/chicken.h b/chicken.h
index 52a4805f..ff85bca7 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1437,6 +1437,7 @@ extern double trunc(double);
 #define C_pointer_eqp(x, y)             C_mk_bool(C_c_pointer_nn(x) == C_c_pointer_nn(y))
 #define C_a_int_to_num(ptr, n, i)       C_int_to_num(ptr, i)
 #define C_a_unsigned_int_to_num(ptr, n, i)  C_unsigned_int_to_num(ptr, i)
+/* XXX TODO OBSOLETE: This can be removed after recompiling c-backend.scm */
 #define C_a_double_to_num(ptr, n)       C_double_to_number(C_flonum(ptr, n))
 #define C_a_i_vector                    C_vector
 #define C_list                          C_a_i_list
@@ -2247,6 +2248,7 @@ C_inline C_word C_string_to_pbytevector(C_word s)
 }
 
 
+/* XXX TODO OBSOLETE: This can be removed after recompiling c-platform.scm */
 C_inline C_word C_flonum_in_fixnum_range_p(C_word n)
 {
   double f = C_flonum_magnitude(n);
@@ -2254,7 +2256,7 @@ C_inline C_word C_flonum_in_fixnum_range_p(C_word n)
   return C_mk_bool(f <= (double)C_MOST_POSITIVE_FIXNUM && f >= (double)C_MOST_NEGATIVE_FIXNUM);
 }
 
-
+/* XXX TODO OBSOLETE: This can be removed after recompiling c-backend.scm */
 C_inline C_word C_double_to_number(C_word n)
 {
   double m, f = C_flonum_magnitude(n);
@@ -2305,6 +2307,7 @@ C_inline C_word C_bignum2(C_word **ptr, int negp, C_uword d1, C_uword d2)
 }
 
 
+/* XXX TODO OBSOLETE: This can be removed after recompiling c-platform.scm */
 C_inline C_word C_fits_in_int_p(C_word x)
 {
   double n, m;
@@ -2317,12 +2320,12 @@ C_inline C_word C_fits_in_int_p(C_word x)
                       !(C_bignum_digits(x)[0] & C_INT_SIGN_BIT)));
   }
 
-  /* XXX OBSOLETE remove on the next round, remove check above */
   n = C_flonum_magnitude(x);
   return C_mk_bool(C_modf(n, &m) == 0.0 && n >= C_WORD_MIN && n <= C_WORD_MAX);
 }
 
 
+/* XXX TODO OBSOLETE: This can be removed after recompiling c-platform.scm */
 C_inline C_word C_fits_in_unsigned_int_p(C_word x)
 {
   double n, m;
@@ -2345,6 +2348,11 @@ C_inline double C_c_double(C_word x)
   else return C_flonum_magnitude(x);
 }
 
+C_inline C_word C_a_u_i_int_to_flo(C_word **ptr, int n, C_word x)
+{
+  if(x & C_FIXNUM_BIT) return C_a_i_fix_to_flo(ptr, n, x);
+  else return C_a_u_i_big_to_flo(ptr, n, x);
+}
 
 C_inline C_word C_num_to_int(C_word x)
 {
diff --git a/library.scm b/library.scm
index 2544fc56..9e94bf32 100644
--- a/library.scm
+++ b/library.scm
@@ -971,9 +971,6 @@ EOF
 (define (inexact? x) (##core#inline "C_i_inexactp" x))
 (define ##sys#exact? exact?)
 (define ##sys#inexact? inexact?)
-(define (##sys#fits-in-int? n) (##core#inline "C_fits_in_int_p" n))
-(define (##sys#fits-in-unsigned-int? n) (##core#inline "C_fits_in_unsigned_int_p" n))
-(define (##sys#flonum-in-fixnum-range? n) (##core#inline "C_flonum_in_fixnum_range_p" n))
 (define (zero? n) (##core#inline "C_i_zerop" n))
 (define (positive? n) (##core#inline "C_i_positivep" n))
 (define (negative? n) (##core#inline "C_i_negativep" n))
diff --git a/srfi-4.scm b/srfi-4.scm
index dea9441a..d00137cf 100644
--- a/srfi-4.scm
+++ b/srfi-4.scm
@@ -41,14 +41,10 @@ EOF
 
 ;;; Helper routines:
 
-(declare (hide ##sys#check-fixnum-interval))
-
-(define ##sys#check-fixnum-interval
-  (lambda (n from to loc)
-    (##sys#check-fixnum n loc)
-    (if (or (##core#inline "C_fixnum_lessp" n from)
-	    (##core#inline "C_fixnum_greaterp" n to) )
-	(##sys#error loc "numeric value is not in expected range" n from to) ) ) )
+(define-inline (check-int/flonum x loc)
+  (unless (or (##core#inline "C_i_exact_integerp" x)
+	      (##core#inline "C_i_flonump" x))
+    (##sys#error-hook (foreign-value "C_BAD_ARGUMENT_TYPE_NO_FLONUM_ERROR" int) loc x) ) )
 
 (define-inline (check-range i from to loc)
   (##sys#check-fixnum i loc)
@@ -57,6 +53,18 @@ EOF
      (foreign-value "C_OUT_OF_RANGE_ERROR" int)
      loc i from to) ) )
 
+(define-inline (check-uint-length obj len loc)
+  (##sys#check-exact-uinteger obj loc)
+  (when (fx> (integer-length obj) len)
+    (##sys#error-hook
+     (foreign-value "C_OUT_OF_RANGE_ERROR" int) loc obj 0 (expt 2 len))))
+
+(define-inline (check-int-length obj len loc)
+  (##sys#check-exact-integer obj loc)
+  (when (fx> (integer-length obj) (fx- len 1))
+    (##sys#error-hook
+     (foreign-value "C_OUT_OF_RANGE_ERROR" int)
+     loc obj (- (expt 2 len)) (sub1 (expt 2 len)))))
 
 ;;; Get vector length:
 
@@ -92,84 +100,75 @@ EOF
   (##sys#check-structure x 'f64vector 'f64vector-length)
   (##core#inline "C_u_i_64vector_length" x))
 
+;; XXX TODO: u64/s64-vectors
 
 ;;; Safe accessors:
 
 (define (u8vector-set! x i y)
   (##sys#check-structure x 'u8vector 'u8vector-set!)
   (let ((len (##core#inline "C_u_i_8vector_length" x)))
-    (##sys#check-fixnum y 'u8vector-set!)
-    (when (fx< y 0)
-      (##sys#error 'u8vector-set! "argument may not be negative" y))
+    (check-uint-length y 8 'u8vector-set!)
     (check-range i 0 len 'u8vector-set!)
     (##core#inline "C_u_i_u8vector_set" x i y)))
 
 (define (s8vector-set! x i y)
   (##sys#check-structure x 's8vector 's8vector-set!)
   (let ((len (##core#inline "C_u_i_8vector_length" x)))
-    (##sys#check-fixnum y 's8vector-set!)
+    (check-int-length y 8 's8vector-set!)
     (check-range i 0 len 's8vector-set!)
     (##core#inline "C_u_i_s8vector_set" x i y)))
 
 (define (u16vector-set! x i y)
   (##sys#check-structure x 'u16vector 'u16vector-set!)
   (let ((len (##core#inline "C_u_i_16vector_length" x)))
-    (##sys#check-fixnum y 'u16vector-set!)
-    (when (fx< y 0)
-      (##sys#error 'u16vector-set! "argument may not be negative" y))
+    (check-uint-length y 16 'u16vector-set!)
     (check-range i 0 len 'u16vector-set!)
     (##core#inline "C_u_i_u16vector_set" x i y)))
 
 (define (s16vector-set! x i y)
   (##sys#check-structure x 's16vector 's16vector-set!)
   (let ((len (##core#inline "C_u_i_16vector_length" x)))
-    (##sys#check-fixnum y 's16vector-set!)
+    (check-int-length y 16 's16vector-set!)
     (check-range i 0 len 's16vector-set!)
     (##core#inline "C_u_i_s16vector_set" x i y)))
 
 (define (u32vector-set! x i y)
   (##sys#check-structure x 'u32vector 'u32vector-set!)
   (let ((len (##core#inline "C_u_i_32vector_length" x)))
-    (##sys#check-integer y 'u32vector-set!)
-    (cond ((negative? y)
-	   (##sys#error 'u32vector-set! "argument may not be negative" y) )
-	  ((not (##sys#fits-in-unsigned-int? y))
-	   (##sys#error 'u32vector-set! "argument exceeds integer range" y) ) )
+    (check-uint-length y 32 'u32vector-set!)
     (check-range i 0 len 'u32vector-set!)
     (##core#inline "C_u_i_u32vector_set" x i y)))
 
 (define (s32vector-set! x i y)
   (##sys#check-structure x 's32vector 's32vector-set!)
   (let ((len (##core#inline "C_u_i_32vector_length" x)))
-    (##sys#check-integer y 's32vector-set!)
-    (unless (##sys#fits-in-int? y)
-      (##sys#error 's32vector-set! "argument exceeds integer range" y) )
+    (check-int-length y 32 's32vector-set!)
     (check-range i 0 len 's32vector-set!)
     (##core#inline "C_u_i_s32vector_set" x i y)))
 
 (define (f32vector-set! x i y)
   (##sys#check-structure x 'f32vector 'f32vector-set!)
   (let ((len (##core#inline "C_u_i_32vector_length" x)))
-    (##sys#check-number y 'f32vector-set!)
+    (check-int/flonum y 'f32vector-set!)
     (check-range i 0 len 'f32vector-set!)
     (##core#inline
      "C_u_i_f32vector_set"
      x i 
-     (if (##core#inline "C_blockp" y)
+     (if (##core#inline "C_i_flonump" y)
 	 y
-	 (##core#inline_allocate ("C_a_i_fix_to_flo" 4) y)))))
+	 (##core#inline_allocate ("C_a_u_i_int_to_flo" 4) y)))))
 
 (define (f64vector-set! x i y)
   (##sys#check-structure x 'f64vector 'f64vector-set!)
   (let ((len (##core#inline "C_u_i_64vector_length" x)))
-    (##sys#check-number y 'f64vector-set!)
+    (check-int/flonum y 'f64vector-set!)
     (check-range i 0 len 'f64vector-set!)
     (##core#inline
      "C_u_i_f64vector_set"
      x i 
-     (if (##core#inline "C_blockp" y)
+     (if (##core#inline "C_i_flonump" y)
 	 y
-	 (##core#inline_allocate ("C_a_i_fix_to_flo" 4) y)))))
+	 (##core#inline_allocate ("C_a_u_i_int_to_flo" 4) y)))))
 
 (define u8vector-ref
   (getter-with-setter
@@ -287,7 +286,7 @@ EOF
 	(if (not init)
 	    v
 	    (begin
-	      (##sys#check-fixnum-interval init 0 #xff 'make-u8vector)
+	      (check-uint-length init 8 'make-u8vector)
 	      (do ((i 0 (##core#inline "C_fixnum_plus" i 1)))
 		  ((##core#inline "C_fixnum_greater_or_equal_p" i len) v)
 		(##core#inline "C_u_i_u8vector_set" v i init) ) ) ) ) ) )
@@ -300,7 +299,7 @@ EOF
 	(if (not init)
 	    v
 	    (begin
-	      (##sys#check-fixnum-interval init -128 127 'make-s8vector)
+	      (check-uint-length init 8 'make-s8vector)
 	      (do ((i 0 (##core#inline "C_fixnum_plus" i 1)))
 		  ((##core#inline "C_fixnum_greater_or_equal_p" i len) v)
 		(##core#inline "C_u_i_s8vector_set" v i init) ) ) ) ) ) )
@@ -313,7 +312,7 @@ EOF
 	(if (not init)
 	    v
 	    (begin
-	      (##sys#check-fixnum-interval init 0 #xffff 'make-u16vector)
+	      (check-uint-length init 16 'make-u16vector)
 	      (do ((i 0 (##core#inline "C_fixnum_plus" i 1)))
 		  ((##core#inline "C_fixnum_greater_or_equal_p" i len) v)
 		(##core#inline "C_u_i_u16vector_set" v i init) ) ) ) ) ) )
@@ -326,7 +325,7 @@ EOF
 	(if (not init)
 	    v
 	    (begin
-	      (##sys#check-fixnum-interval init -32768 32767 'make-s16vector)
+	      (check-int-length init 16 'make-s16vector)
 	      (do ((i 0 (##core#inline "C_fixnum_plus" i 1)))
 		  ((##core#inline "C_fixnum_greater_or_equal_p" i len) v)
 		(##core#inline "C_u_i_s16vector_set" v i init) ) ) ) ) ) )
@@ -339,7 +338,7 @@ EOF
 	(if (not init)
 	    v
 	    (begin
-	      (##sys#check-fixnum init 'make-u32vector)
+	      (check-uint-length init 32 'make-u32vector)
 	      (do ((i 0 (##core#inline "C_fixnum_plus" i 1)))
 		  ((##core#inline "C_fixnum_greater_or_equal_p" i len) v)
 		(##core#inline "C_u_i_u32vector_set" v i init) ) ) ) ) ) )
@@ -352,7 +351,7 @@ EOF
 	(if (not init)
 	    v
 	    (begin
-	      (##sys#check-fixnum init 'make-s32vector)
+	      (check-int-length init 32 'make-s32vector)
 	      (do ((i 0 (##core#inline "C_fixnum_plus" i 1)))
 		  ((##core#inline "C_fixnum_greater_or_equal_p" i len) v)
 		(##core#inline "C_u_i_s32vector_set" v i init) ) ) ) ) ) )
@@ -365,9 +364,9 @@ EOF
 	(if (not init)
 	    v
 	    (begin
-	      (##sys#check-number init 'make-f32vector)
-	      (unless (##core#inline "C_blockp" init)
-		(set! init (##core#inline_allocate ("C_a_i_fix_to_flo" 4) init)) )
+	      (check-int/flonum init 'make-f32vector)
+	      (unless (##core#inline "C_i_flonump" init)
+		(set! init (##core#inline_allocate ("C_a_u_i_int_to_flo" 4) init)))
 	      (do ((i 0 (##core#inline "C_fixnum_plus" i 1)))
 		  ((##core#inline "C_fixnum_greater_or_equal_p" i len) v)
 		(##core#inline "C_u_i_f32vector_set" v i init) ) ) ) ) ) )
@@ -382,9 +381,9 @@ EOF
 	(if (not init)
 	    v
 	    (begin
-	      (##sys#check-number init 'make-f64vector)
-	      (unless (##core#inline "C_blockp" init)
-		(set! init (##core#inline_allocate ("C_a_i_fix_to_flo" 4) init)) )
+	      (check-int/flonum init 'make-f64vector)
+	      (unless (##core#inline "C_i_flonump" init)
+		(set! init (##core#inline_allocate ("C_a_u_i_int_to_flo" 4) init)) )
 	      (do ((i 0 (##core#inline "C_fixnum_plus" i 1)))
 		  ((##core#inline "C_fixnum_greater_or_equal_p" i len) v)
 		(##core#inline "C_u_i_f64vector_set" v i init) ) ) ) ) ) ) )
diff --git a/tests/srfi-4-tests.scm b/tests/srfi-4-tests.scm
index addbf56d..7d4eabff 100644
--- a/tests/srfi-4-tests.scm
+++ b/tests/srfi-4-tests.scm
@@ -2,36 +2,58 @@
 
 
 (use srfi-4 ports)
-
+(import-for-syntax chicken)
 
 (define-syntax test1
   (er-macro-transformer
    (lambda (x r c)
      (let* ((t (strip-syntax (cadr x)))
-	    (name (symbol->string (strip-syntax t))))
+	    (name (symbol->string (strip-syntax t)))
+	    (min (caddr x))
+	    (max (cadddr x)))
        (define (conc op)
 	 (string->symbol (string-append name op)))
        `(let ((x (,(conc "vector") 100 101)))
-	  (print x)
-	  (assert (= 100 (,(conc "vector-ref") x 0)))
-          (assert (,(conc "vector?") x))
-          (assert (number-vector? x))
+	  (assert (eqv? 100 (,(conc "vector-ref") x 0)))
+	  (assert (,(conc "vector?") x))
+	  (assert (number-vector? x))
 	  (,(conc "vector-set!") x 1 99)
-	  (assert (= 99 (,(conc "vector-ref") x 1)))
+	  (assert (eqv? 99 (,(conc "vector-ref") x 1)))
 	  (assert (= 2 (,(conc "vector-length") x)))
 	  (assert
 	   (let ((result (,(conc "vector->list") x)))
-	     (and (= 100 (car result))
-		  (= 99 (cadr result))))))))))
+	     (and (eqv? 100 (car result))
+		  (eqv? 99 (cadr result))))))))))
+
+(test1 u8 0 255)
+(test1 u16 0 65535)
+(test1 u32 0 4294967295)
+(test1 s8 -128 127)
+(test1 s16 -32768 32767)
+(test1 s32 -2147483648 2147483647)
+
+(define-syntax test2
+  (er-macro-transformer
+   (lambda (x r c)
+     (let* ((t (strip-syntax (cadr x)))
+	    (name (symbol->string (strip-syntax t))))
+       (define (conc op)
+	 (string->symbol (string-append name op)))
+       `(let ((x (,(conc "vector") 100 101.0)))
+	  (assert (eqv? 100.0 (,(conc "vector-ref") x 0)))
+	  (assert (eqv? 101.0 (,(conc "vector-ref") x 1)))
+	  (assert (,(conc "vector?") x))
+	  (assert (number-vector? x))
+	  (,(conc "vector-set!") x 1 99)
+	  (assert (eqv? 99.0 (,(conc "vector-ref") x 1)))
+	  (assert (= 2 (,(conc "vector-length") x)))
+          (assert
+	   (let ((result (,(conc "vector->list") x)))
+	     (and (eqv? 100.0 (car result))
+		  (eqv? 99.0 (cadr result))))))))))
 
-(test1 u8)
-(test1 u16)
-(test1 u32)
-(test1 s8)
-(test1 s16)
-(test1 s32)
-(test1 f32)
-(test1 f64)
+(test2 f32)
+(test2 f64)
 
 ;; Test implicit quoting/self evaluation
 (assert (equal? #u8(1 2 3) '#u8(1 2 3)))
diff --git a/types.db b/types.db
index 1a4d949a..334e5cf6 100644
--- a/types.db
+++ b/types.db
@@ -2020,7 +2020,7 @@
 (blob->u32vector/shared (#(procedure #:clean #:enforce) blob->u32vector/shared (blob) (struct u32vector)))
 (blob->u8vector (#(procedure #:clean #:enforce) blob->u8vector (blob) (struct u8vector)))
 (blob->u8vector/shared (#(procedure #:clean #:enforce) blob->u8vector/shared (blob) (struct u8vector)))
-(f32vector (#(procedure #:clean #:enforce) f32vector (#!rest number) (struct f32vector)))
+(f32vector (#(procedure #:clean #:enforce) f32vector (#!rest (or integer float)) (struct f32vector)))
 (f32vector->blob (#(procedure #:clean #:enforce) f32vector->blob ((struct f32vector)) blob))
 (f32vector->blob/shared (#(procedure #:clean #:enforce) f32vector->blob/shared ((struct f32vector)) blob))
 (f32vector->list (#(procedure #:clean #:enforce) f32vector->list ((struct f32vector)) (list-of float)))
@@ -2029,11 +2029,11 @@
 		  (((struct f32vector)) (##core#inline "C_u_i_32vector_length" #(1))))
 
 (f32vector-ref (#(procedure #:clean #:enforce) f32vector-ref ((struct f32vector) fixnum) float))
-(f32vector-set! (#(procedure #:clean #:enforce) f32vector-set! ((struct f32vector) fixnum number) undefined))
+(f32vector-set! (#(procedure #:clean #:enforce) f32vector-set! ((struct f32vector) fixnum (or integer float)) undefined))
 
 (f32vector? (#(procedure #:pure #:predicate (struct f32vector)) f32vector? (*) boolean))
 
-(f64vector (#(procedure #:clean #:enforce) f64vector (#!rest number) (struct f64vector)))
+(f64vector (#(procedure #:clean #:enforce) f64vector (#!rest (or integer float)) (struct f64vector)))
 (f64vector->blob (#(procedure #:clean #:enforce) f64vector->blob ((struct f32vector)) blob))
 (f64vector->blob/shared (#(procedure #:clean #:enforce) f64vector->blob/shared ((struct f64vector)) blob))
 (f64vector->list (#(procedure #:clean #:enforce) f64vector->list ((struct f64vector)) (list-of float)))
@@ -2042,28 +2042,28 @@
 		  (((struct f32vector)) (##core#inline "C_u_i_64vector_length" #(1))))
 
 (f64vector-ref (#(procedure #:clean #:enforce) f64vector-ref ((struct f64vector) fixnum) float))
-(f64vector-set! (#(procedure #:clean #:enforce) f64vector-set! ((struct f64vector) fixnum number) undefined))
+(f64vector-set! (#(procedure #:clean #:enforce) f64vector-set! ((struct f64vector) fixnum (or integer float)) undefined))
 
 (f64vector? (#(procedure #:pure #:predicate (struct f64vector)) f64vector? (*) boolean))
 
-(list->f32vector (#(procedure #:clean #:enforce) list->f32vector ((list-of number)) (struct f32vector)))
-(list->f64vector (#(procedure #:clean #:enforce) list->f64vector ((list-of number)) (struct f64vector)))
+(list->f32vector (#(procedure #:clean #:enforce) list->f32vector ((list-of (or float integer))) (struct f32vector)))
+(list->f64vector (#(procedure #:clean #:enforce) list->f64vector ((list-of (or float integer))) (struct f64vector)))
 (list->s16vector (#(procedure #:clean #:enforce) list->s16vector ((list-of fixnum)) (struct s16vector)))
-(list->s32vector (#(procedure #:clean #:enforce) list->s32vector ((list-of number)) (struct s32vector)))
+(list->s32vector (#(procedure #:clean #:enforce) list->s32vector ((list-of integer)) (struct s32vector)))
 (list->s8vector (#(procedure #:clean #:enforce) list->s8vector ((list-of fixnum)) (struct s8vector)))
 (list->u16vector (#(procedure #:clean #:enforce) list->u16vector ((list-of fixnum)) (struct u16vector)))
-(list->u32vector (#(procedure #:clean #:enforce) list->u32vector ((list-of number)) (struct u32vector)))
+(list->u32vector (#(procedure #:clean #:enforce) list->u32vector ((list-of integer)) (struct u32vector)))
 (list->u8vector (#(procedure #:clean #:enforce) list->u8vector ((list-of fixnum)) (struct u8vector)))
-(make-f32vector (#(procedure #:clean #:enforce) make-f32vector (fixnum #!optional * * *) (struct f32vector)))
-(make-f64vector (#(procedure #:clean #:enforce) make-f64vector (fixnum #!optional * * *) (struct f64vector)))
-(make-s16vector (#(procedure #:clean #:enforce) make-s16vector (fixnum #!optional * * *) (struct s16vector)))
-(make-s32vector (#(procedure #:clean #:enforce) make-s32vector (fixnum #!optional * * *) (struct s32vector)))
-(make-s8vector (#(procedure #:clean #:enforce) make-s8vector (fixnum #!optional * * *) (struct s8vector)))
-(make-u16vector (#(procedure #:clean #:enforce) make-u16vector (fixnum #!optional * * *) (struct u16vector)))
-(make-u32vector (#(procedure #:clean #:enforce) make-u32vector (fixnum #!optional * * *) (struct u32vector)))
-(make-u8vector (#(procedure #:clean #:enforce) make-u8vector (fixnum #!optional * * *) (struct u8vector)))
+(make-f32vector (#(procedure #:clean #:enforce) make-f32vector (fixnum #!optional (or integer float false) boolean boolean) (struct f32vector)))
+(make-f64vector (#(procedure #:clean #:enforce) make-f64vector (fixnum #!optional (or integer float false) boolean) (struct f64vector)))
+(make-s16vector (#(procedure #:clean #:enforce) make-s16vector (fixnum #!optional (or fixnum false) boolean boolean) (struct s16vector)))
+(make-s32vector (#(procedure #:clean #:enforce) make-s32vector (fixnum #!optional (or integer false) boolean boolean) (struct s32vector)))
+(make-s8vector (#(procedure #:clean #:enforce) make-s8vector (fixnum #!optional (or fixnum false) boolean boolean) (struct s8vector)))
+(make-u16vector (#(procedure #:clean #:enforce) make-u16vector (fixnum #!optional (or fixnum false) boolean boolean) (struct u16vector)))
+(make-u32vector (#(procedure #:clean #:enforce) make-u32vector (fixnum #!optional (or integer false) boolean boolean) (struct u32vector)))
+(make-u8vector (#(procedure #:clean #:enforce) make-u8vector (fixnum #!optional (or fixnum false) boolean boolean) (struct u8vector)))
 (read-u8vector (#(procedure #:enforce) read-u8vector (#!optional fixnum input-port) (struct u8vector)))
-(read-u8vector! (#(procedure #:enforce) read-u8vector! ((or fixnum false) (struct u8vector) #!optional input-port fixnum) number))
+(read-u8vector! (#(procedure #:enforce) read-u8vector! ((or fixnum false) (struct u8vector) #!optional input-port fixnum) integer))
 (release-number-vector (procedure release-number-vector (*) undefined))
 (s16vector (#(procedure #:clean #:enforce) s16vector (#!rest fixnum) (struct s16vector)))
 (s16vector->blob (#(procedure #:clean #:enforce) s16vector->blob ((struct s16vector)) blob))
@@ -2078,16 +2078,16 @@
 
 (s16vector? (#(procedure #:pure #:predicate (struct s16vector)) s16vector? (*) boolean))
 
-(s32vector (#(procedure #:clean #:enforce) s32vector (#!rest number) (struct s32vector)))
+(s32vector (#(procedure #:clean #:enforce) s32vector (#!rest integer) (struct s32vector)))
 (s32vector->blob (#(procedure #:clean #:enforce) s32vector->blob ((struct 32vector)) blob))
 (s32vector->blob/shared (#(procedure #:clean #:enforce) s32vector->blob/shared ((struct s32vector)) blob))
-(s32vector->list (#(procedure #:clean #:enforce) s32vector->list ((struct s32vector)) (list-of number)))
+(s32vector->list (#(procedure #:clean #:enforce) s32vector->list ((struct s32vector)) (list-of integer)))
 
 (s32vector-length (#(procedure #:clean #:enforce) s32vector-length ((struct s32vector)) fixnum)
 		  (((struct s32vector)) (##core#inline "C_u_i_32vector_length" #(1))))
 
-(s32vector-ref (#(procedure #:clean #:enforce) s32vector-ref ((struct s32vector) fixnum) number))
-(s32vector-set! (#(procedure #:clean #:enforce) s32vector-set! ((struct s32vector) fixnum number) undefined))
+(s32vector-ref (#(procedure #:clean #:enforce) s32vector-ref ((struct s32vector) fixnum) integer))
+(s32vector-set! (#(procedure #:clean #:enforce) s32vector-set! ((struct s32vector) fixnum integer) undefined))
 
 (s32vector? (#(procedure #:pure #:predicate (struct s32vector)) s32vector? (*) boolean))
 
@@ -2125,16 +2125,16 @@
 
 (u16vector? (#(procedure #:pure #:predicate (struct u16vector)) u16vector? (*) boolean))
 
-(u32vector (#(procedure #:clean #:enforce) u32vector (#!rest number) (struct u32vector)))
+(u32vector (#(procedure #:clean #:enforce) u32vector (#!rest integer) (struct u32vector)))
 (u32vector->blob (#(procedure #:clean #:enforce) u32vector->blob ((struct u32vector)) blob))
 (u32vector->blob/shared (#(procedure #:clean #:enforce) u32vector->blob/shared ((struct u32vector)) blob))
-(u32vector->list (#(procedure #:clean #:enforce) u32vector->list ((struct u32vector)) (list-of number)))
+(u32vector->list (#(procedure #:clean #:enforce) u32vector->list ((struct u32vector)) (list-of integer)))
 
 (u32vector-length (#(procedure #:clean #:enforce) u32vector-length ((struct u32vector)) fixnum)
 		  (((struct u32vector)) (##core#inline "C_u_i_32vector_length" #(1))))
 
-(u32vector-ref (#(procedure #:clean #:enforce) u32vector-ref ((struct u32vector) fixnum) number))
-(u32vector-set! (#(procedure #:clean #:enforce) u32vector-set! ((struct u32vector) fixnum number) undefined))
+(u32vector-ref (#(procedure #:clean #:enforce) u32vector-ref ((struct u32vector) fixnum) integer))
+(u32vector-set! (#(procedure #:clean #:enforce) u32vector-set! ((struct u32vector) fixnum integer) undefined))
 
 (u32vector? (#(procedure #:pure #:predicate (struct u32vector)) u32vector? (*) boolean))
 
Trap