~ chicken-core (chicken-5) f88c56121555f66c6892808c7b946b2f73fe126a


commit f88c56121555f66c6892808c7b946b2f73fe126a
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Dec 18 11:16:50 2009 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Fri Dec 18 11:16:50 2009 +0100

    added fpinteger?; unboxing fixes; renamed unboxing types; removed rewrite-parameters related to obsolete rest-arg-as-vector optimization

diff --git a/NEWS b/NEWS
index aabd1d0a..415b2b23 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,8 @@
+4.2.15
+
+- added `fpinteger?'
+- added unboxing pass to compiler
+
 4.2.14
 
 - `move-memory!' catches negative offsets now (Thanks to Jim Ursetto)
diff --git a/c-backend.scm b/c-backend.scm
index a1cad4dd..c851520e 100644
--- a/c-backend.scm
+++ b/c-backend.scm
@@ -725,10 +725,11 @@
 
     (define (utype t)
       (case t
-	((fix) "int")
-	((flo) "double")
-	((chr) "char")
-	((ptr) "void *")
+	((fixnum) "int")
+	((flonum) "double")
+	((char) "char")
+	((pointer) "void *")
+	((bool) "int")
 	(else (bomb "invalid unboxed type" t))))
 
     (define (procedures)
diff --git a/c-platform.scm b/c-platform.scm
index fb4e2c5b..19781b8e 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -128,7 +128,7 @@
     fx= fx> fx< fx>= fx<= fixnum? fxneg fxmax fxmin identity fp+ fp- fp* fp/ fpmin fpmax fpneg
     fp> fp< fp= fp>= fp<= fxand fxnot fxior fxxor fxshr fxshl bit-set?
     fpfloor fpceiling fptruncate fpround fpsin fpcos fptan fpasin fpacos fpatan
-    fpatan2 fpexp fpexpt fplog fpsqrt fpabs
+    fpatan2 fpexp fpexpt fplog fpsqrt fpabs fpinteger?
     arithmetic-shift void flush-output thread-specific thread-specific-set!
     not-pair? atom? null-list? print print* error cpu-time proper-list? call/cc
     blob-size u8vector->blob/shared s8vector->blob/shared u16vector->blob/shared
@@ -506,133 +506,134 @@
 (rewrite 'locative-ref 13 "C_locative_ref" #t)
 (rewrite '##sys#continuation-graft 13 "C_continuation_graft" #t)
 
-(rewrite 'caar 2 1 "C_u_i_caar" #f #f)
-(rewrite 'cdar 2 1 "C_u_i_cdar" #f #f)
-(rewrite 'cddr 2 1 "C_u_i_cddr" #f #f)
-(rewrite 'caaar 2 1 "C_u_i_caaar" #f #f)
-(rewrite 'cadar 2 1 "C_u_i_cadar" #f #f)
-(rewrite 'caddr 2 1 "C_u_i_caddr" #f #f)
-(rewrite 'cdaar 2 1 "C_u_i_cdaar" #f #f)
-(rewrite 'cdadr 2 1 "C_u_i_cdadr" #f #f)
-(rewrite 'cddar 2 1 "C_u_i_cddar" #f #f)
-(rewrite 'cdddr 2 1 "C_u_i_cdddr" #f #f)
-(rewrite 'caaaar 2 1 "C_u_i_caaaar" #f #f)
-(rewrite 'caadar 2 1 "C_u_i_caadar" #f #f)
-(rewrite 'caaddr 2 1 "C_u_i_caaddr" #f #f)
-(rewrite 'cadaar 2 1 "C_u_i_cadaar" #f #f)
-(rewrite 'cadadr 2 1 "C_u_i_cadadr" #f #f)
-(rewrite 'caddar 2 1 "C_u_i_caddar" #f #f)
-(rewrite 'cadddr 2 1 "C_u_i_cadddr" #f #f)
-(rewrite 'cdaaar 2 1 "C_u_i_cdaaar" #f #f)
-(rewrite 'cdaadr 2 1 "C_u_i_cdaadr" #f #f)
-(rewrite 'cdadar 2 1 "C_u_i_cdadar" #f #f)
-(rewrite 'cdaddr 2 1 "C_u_i_cdaddr" #f #f)
-(rewrite 'cddaar 2 1 "C_u_i_cddaar" #f #f)
-(rewrite 'cddadr 2 1 "C_u_i_cddadr" #f #f)
-(rewrite 'cdddar 2 1 "C_u_i_cdddar" #f #f)
-(rewrite 'cddddr 2 1 "C_u_i_cddddr" #f #f)
-
-(rewrite 'cddr 2 1 "C_i_cddr" #t #f)
-(rewrite 'cdddr 2 1 "C_i_cdddr" #t #f)
-(rewrite 'cddddr 2 1 "C_i_cddddr" #t #f)
+(rewrite 'caar 2 1 "C_u_i_caar" #f)
+(rewrite 'cdar 2 1 "C_u_i_cdar" #f)
+(rewrite 'cddr 2 1 "C_u_i_cddr" #f)
+(rewrite 'caaar 2 1 "C_u_i_caaar" #f)
+(rewrite 'cadar 2 1 "C_u_i_cadar" #f)
+(rewrite 'caddr 2 1 "C_u_i_caddr" #f)
+(rewrite 'cdaar 2 1 "C_u_i_cdaar" #f)
+(rewrite 'cdadr 2 1 "C_u_i_cdadr" #f)
+(rewrite 'cddar 2 1 "C_u_i_cddar" #f)
+(rewrite 'cdddr 2 1 "C_u_i_cdddr" #f)
+(rewrite 'caaaar 2 1 "C_u_i_caaaar" #f)
+(rewrite 'caadar 2 1 "C_u_i_caadar" #f)
+(rewrite 'caaddr 2 1 "C_u_i_caaddr" #f)
+(rewrite 'cadaar 2 1 "C_u_i_cadaar" #f)
+(rewrite 'cadadr 2 1 "C_u_i_cadadr" #f)
+(rewrite 'caddar 2 1 "C_u_i_caddar" #f)
+(rewrite 'cadddr 2 1 "C_u_i_cadddr" #f)
+(rewrite 'cdaaar 2 1 "C_u_i_cdaaar" #f)
+(rewrite 'cdaadr 2 1 "C_u_i_cdaadr" #f)
+(rewrite 'cdadar 2 1 "C_u_i_cdadar" #f)
+(rewrite 'cdaddr 2 1 "C_u_i_cdaddr" #f)
+(rewrite 'cddaar 2 1 "C_u_i_cddaar" #f)
+(rewrite 'cddadr 2 1 "C_u_i_cddadr" #f)
+(rewrite 'cdddar 2 1 "C_u_i_cdddar" #f)
+(rewrite 'cddddr 2 1 "C_u_i_cddddr" #f)
+
+(rewrite 'cddr 2 1 "C_i_cddr" #t)
+(rewrite 'cdddr 2 1 "C_i_cdddr" #t)
+(rewrite 'cddddr 2 1 "C_i_cddddr" #t)
 
 (rewrite 'cdr 7 1 "C_slot" 1 #f)
-(rewrite 'cdr 2 1 "C_i_cdr" #t #f)
+(rewrite 'cdr 2 1 "C_i_cdr" #t)
 
 (rewrite 'eq? 1 2 "C_eqp")
 (rewrite '##sys#eq? 1 2 "C_eqp")
 (rewrite 'eqv? 1 2 "C_i_eqvp")
 (rewrite '##sys#eqv? 1 2 "C_i_eqvp")
 
-(rewrite 'list-ref 2 2 "C_u_i_list_ref" #f "C_slot")
-(rewrite 'list-ref 2 2 "C_i_list_ref" #t "C_i_vector_ref")
-(rewrite 'null? 2 1 "C_i_nullp" #t "C_vemptyp")
-(rewrite '##sys#null? 2 1 "C_i_nullp" #t "C_vemptyp")
-(rewrite 'length 2 1 "C_i_length" #t "C_block_size")
-(rewrite 'not 2 1 "C_i_not" #t #f)
-(rewrite 'char? 2 1 "C_charp" #t #f)
-(rewrite 'string? 2 1 "C_i_stringp" #t #f)
-(rewrite 'locative? 2 1 "C_i_locativep" #t #f)
-(rewrite 'symbol? 2 1 "C_i_symbolp" #t #f)
-(rewrite 'vector? 2 1 "C_i_vectorp" #t #f)
-(rewrite '##sys#vector? 2 1 "C_i_vectorp" #t #f)
-(rewrite 'pair? 2 1 "C_i_pairp" #t "C_notvemptyp")
-(rewrite '##sys#pair? 2 1 "C_i_pairp" #t "C_notvemptyp")
-(rewrite 'procedure? 2 1 "C_i_closurep" #t #f)
-(rewrite 'port? 2 1 "C_i_portp" #t #f)
-(rewrite 'boolean? 2 1 "C_booleanp" #t #f)
-(rewrite 'number? 2 1 "C_i_numberp" #t #f)
-(rewrite 'complex? 2 1 "C_i_numberp" #t #f)
-(rewrite 'rational? 2 1 "C_i_rationalp" #t #f)
-(rewrite 'real? 2 1 "C_i_numberp" #t #f)
-(rewrite 'integer? 2 1 "C_i_integerp" #t #f)
-(rewrite 'flonum? 2 1 "C_i_flonump" #t #f)
-(rewrite 'fixnum? 2 1 "C_fixnump" #t #f)
-(rewrite 'finite? 2 1 "C_i_finitep" #f #f)
-(rewrite '##sys#pointer? 2 1 "C_anypointerp" #t #f)
-(rewrite '##sys#generic-structure? 2 1 "C_structurep" #t #f)
-(rewrite 'exact? 2 1 "C_fixnump" #f #f)
-(rewrite 'exact? 2 1 "C_i_exactp" #t #f)
-(rewrite 'exact? 2 1 "C_u_i_exactp" #f #f)
-(rewrite 'inexact? 2 1 "C_nfixnump" #f #f)
-(rewrite 'inexact? 2 1 "C_i_inexactp" #t #f)
-(rewrite 'inexact? 2 1 "C_u_i_inexactp" #f #f)
-(rewrite 'list? 2 1 "C_i_listp" #t #f)
-(rewrite 'proper-list? 2 1 "C_i_listp" #t #f)
-(rewrite 'eof-object? 2 1 "C_eofp" #t #f)
-(rewrite 'string-ref 2 2 "C_subchar" #f #f)
-(rewrite 'string-ref 2 2 "C_i_string_ref" #t #f)
-(rewrite 'string-set! 2 3 "C_setsubchar" #f #f)
-(rewrite 'string-set! 2 3 "C_i_string_set" #t #f)
-(rewrite 'vector-ref 2 2 "C_slot" #f #f)
-(rewrite 'vector-ref 2 2 "C_i_vector_ref" #t #f)
-(rewrite 'char=? 2 2 "C_eqp" #t #f)
-(rewrite 'char>? 2 2 "C_fixnum_greaterp" #t #f)
-(rewrite 'char<? 2 2 "C_fixnum_lessp" #t #f)
-(rewrite 'char>=? 2 2 "C_fixnum_greater_or_equal_p" #t #f)
-(rewrite 'char<=? 2 2 "C_fixnum_less_or_equal_p" #t #f)
-(rewrite '##sys#slot 2 2 "C_slot" #t #f)		; consider as safe, the primitive is unsafe anyway.
-(rewrite '##sys#block-ref 2 2 "C_i_block_ref" #t #f) ;*** must be safe for pattern matcher (anymore?)
-(rewrite '##sys#size 2 1 "C_block_size" #t #f)
-(rewrite 'fxnot 2 1 "C_fixnum_not" #t #f)
-(rewrite 'fx* 2 2 "C_fixnum_times" #t #f)
-(rewrite 'fx/ 2 2 "C_fixnum_divide" #f #f)
-(rewrite 'fxmod 2 2 "C_fixnum_modulo" #f #f)
-(rewrite 'fx= 2 2 "C_eqp" #t #f)
-(rewrite 'fx> 2 2 "C_fixnum_greaterp" #t #f)
-(rewrite 'fx< 2 2 "C_fixnum_lessp" #t #f)
-(rewrite 'fx>= 2 2 "C_fixnum_greater_or_equal_p" #t #f)
-(rewrite 'fx<= 2 2 "C_fixnum_less_or_equal_p" #t #f)
-(rewrite 'fp= 2 2 "C_flonum_equalp" #t #f)
-(rewrite 'fp> 2 2 "C_flonum_greaterp" #t #f)
-(rewrite 'fp< 2 2 "C_flonum_lessp" #t #f)
-(rewrite 'fp>= 2 2 "C_flonum_greater_or_equal_p" #t #f)
-(rewrite 'fp<= 2 2 "C_flonum_less_or_equal_p" #t #f)
-(rewrite 'fxmax 2 2 "C_i_fixnum_max" #t #f)
-(rewrite 'fxmin 2 2 "C_i_fixnum_min" #t #f)
-(rewrite 'fpmax 2 2 "C_i_flonum_max" #t #f)
-(rewrite 'fpmin 2 2 "C_i_flonum_min" #t #f)
-(rewrite 'char-numeric? 2 1 "C_u_i_char_numericp" #t #f)
-(rewrite 'char-alphabetic? 2 1 "C_u_i_char_alphabeticp" #t #f)
-(rewrite 'char-whitespace? 2 1 "C_u_i_char_whitespacep" #t #f)
-(rewrite 'char-upper-case? 2 1 "C_u_i_char_upper_casep" #t #f)
-(rewrite 'char-lower-case? 2 1 "C_u_i_char_lower_casep" #t #f)
-(rewrite 'char-upcase 2 1 "C_u_i_char_upcase" #t #f)
-(rewrite 'char-downcase 2 1 "C_u_i_char_downcase" #t #f)
-(rewrite 'list-tail 2 2 "C_i_list_tail" #t #f)
-(rewrite '##sys#structure? 2 2 "C_i_structurep" #t #f)
-(rewrite '##sys#bytevector? 2 2 "C_bytevectorp" #t #f)
-(rewrite 'block-ref 2 2 "C_slot" #f #f)	; ok to be unsafe, lolevel is anyway
-(rewrite 'number-of-slots 2 1 "C_block_size" #f #f)
+(rewrite 'list-ref 2 2 "C_u_i_list_ref" #f)
+(rewrite 'list-ref 2 2 "C_i_list_ref" #t)
+(rewrite 'null? 2 1 "C_i_nullp" #t)
+(rewrite '##sys#null? 2 1 "C_i_nullp" #t)
+(rewrite 'length 2 1 "C_i_length" #t)
+(rewrite 'not 2 1 "C_i_not"#t )
+(rewrite 'char? 2 1 "C_charp" #t)
+(rewrite 'string? 2 1 "C_i_stringp" #t)
+(rewrite 'locative? 2 1 "C_i_locativep" #t)
+(rewrite 'symbol? 2 1 "C_i_symbolp" #t)
+(rewrite 'vector? 2 1 "C_i_vectorp" #t)
+(rewrite '##sys#vector? 2 1 "C_i_vectorp" #t)
+(rewrite 'pair? 2 1 "C_i_pairp" #t)
+(rewrite '##sys#pair? 2 1 "C_i_pairp" #t)
+(rewrite 'procedure? 2 1 "C_i_closurep" #t)
+(rewrite 'port? 2 1 "C_i_portp" #t)
+(rewrite 'boolean? 2 1 "C_booleanp" #t)
+(rewrite 'number? 2 1 "C_i_numberp" #t)
+(rewrite 'complex? 2 1 "C_i_numberp" #t)
+(rewrite 'rational? 2 1 "C_i_rationalp" #t)
+(rewrite 'real? 2 1 "C_i_numberp" #t)
+(rewrite 'integer? 2 1 "C_i_integerp" #t)
+(rewrite 'flonum? 2 1 "C_i_flonump" #t)
+(rewrite 'fixnum? 2 1 "C_fixnump" #t)
+(rewrite 'finite? 2 1 "C_i_finitep" #f)
+(rewrite 'fpinteger? 2 1 "C_u_i_fpintegerp" #f)
+(rewrite '##sys#pointer? 2 1 "C_anypointerp" #t)
+(rewrite '##sys#generic-structure? 2 1 "C_structurep" #t)
+(rewrite 'exact? 2 1 "C_fixnump" #f)
+(rewrite 'exact? 2 1 "C_i_exactp" #t)
+(rewrite 'exact? 2 1 "C_u_i_exactp" #f)
+(rewrite 'inexact? 2 1 "C_nfixnump" #f)
+(rewrite 'inexact? 2 1 "C_i_inexactp" #t)
+(rewrite 'inexact? 2 1 "C_u_i_inexactp" #f)
+(rewrite 'list? 2 1 "C_i_listp" #t)
+(rewrite 'proper-list? 2 1 "C_i_listp" #t)
+(rewrite 'eof-object? 2 1 "C_eofp" #t)
+(rewrite 'string-ref 2 2 "C_subchar" #f)
+(rewrite 'string-ref 2 2 "C_i_string_ref" #t)
+(rewrite 'string-set! 2 3 "C_setsubchar" #f)
+(rewrite 'string-set! 2 3 "C_i_string_set" #t)
+(rewrite 'vector-ref 2 2 "C_slot" #f)
+(rewrite 'vector-ref 2 2 "C_i_vector_ref" #t)
+(rewrite 'char=? 2 2 "C_eqp" #t)
+(rewrite 'char>? 2 2 "C_fixnum_greaterp" #t)
+(rewrite 'char<? 2 2 "C_fixnum_lessp" #t)
+(rewrite 'char>=? 2 2 "C_fixnum_greater_or_equal_p" #t)
+(rewrite 'char<=? 2 2 "C_fixnum_less_or_equal_p" #t)
+(rewrite '##sys#slot 2 2 "C_slot" #t)		; consider as safe, the primitive is unsafe anyway.
+(rewrite '##sys#block-ref 2 2 "C_i_block_ref" #t) ;*** must be safe for pattern matcher (anymore?)
+(rewrite '##sys#size 2 1 "C_block_size" #t)
+(rewrite 'fxnot 2 1 "C_fixnum_not" #t)
+(rewrite 'fx* 2 2 "C_fixnum_times" #t)
+(rewrite 'fx/ 2 2 "C_fixnum_divide" #f)
+(rewrite 'fxmod 2 2 "C_fixnum_modulo" #f)
+(rewrite 'fx= 2 2 "C_eqp" #t)
+(rewrite 'fx> 2 2 "C_fixnum_greaterp" #t)
+(rewrite 'fx< 2 2 "C_fixnum_lessp" #t)
+(rewrite 'fx>= 2 2 "C_fixnum_greater_or_equal_p" #t)
+(rewrite 'fx<= 2 2 "C_fixnum_less_or_equal_p" #t)
+(rewrite 'fp= 2 2 "C_flonum_equalp" #t)
+(rewrite 'fp> 2 2 "C_flonum_greaterp" #t)
+(rewrite 'fp< 2 2 "C_flonum_lessp" #t)
+(rewrite 'fp>= 2 2 "C_flonum_greater_or_equal_p" #t)
+(rewrite 'fp<= 2 2 "C_flonum_less_or_equal_p" #t)
+(rewrite 'fxmax 2 2 "C_i_fixnum_max" #t)
+(rewrite 'fxmin 2 2 "C_i_fixnum_min" #t)
+(rewrite 'fpmax 2 2 "C_i_flonum_max" #t)
+(rewrite 'fpmin 2 2 "C_i_flonum_min" #t)
+(rewrite 'char-numeric? 2 1 "C_u_i_char_numericp" #t)
+(rewrite 'char-alphabetic? 2 1 "C_u_i_char_alphabeticp" #t)
+(rewrite 'char-whitespace? 2 1 "C_u_i_char_whitespacep" #t)
+(rewrite 'char-upper-case? 2 1 "C_u_i_char_upper_casep" #t)
+(rewrite 'char-lower-case? 2 1 "C_u_i_char_lower_casep" #t)
+(rewrite 'char-upcase 2 1 "C_u_i_char_upcase" #t)
+(rewrite 'char-downcase 2 1 "C_u_i_char_downcase" #t)
+(rewrite 'list-tail 2 2 "C_i_list_tail" #t)
+(rewrite '##sys#structure? 2 2 "C_i_structurep" #t)
+(rewrite '##sys#bytevector? 2 2 "C_bytevectorp" #t)
+(rewrite 'block-ref 2 2 "C_slot" #f)	; ok to be unsafe, lolevel is anyway
+(rewrite 'number-of-slots 2 1 "C_block_size" #f)
 
 (rewrite 'assv 14 'fixnum 2 "C_i_assq" "C_u_i_assq")
-(rewrite 'assv 2 2 "C_i_assv" #t #f)
+(rewrite 'assv 2 2 "C_i_assv" #t)
 (rewrite 'memv 14 'fixnum 2 "C_i_memq" "C_u_i_memq")
-(rewrite 'memv 2 2 "C_i_memv" #t #f)
+(rewrite 'memv 2 2 "C_i_memv" #t)
 (rewrite 'assq 17 2 "C_i_assq" "C_u_i_assq")
 (rewrite 'memq 17 2 "C_i_memq" "C_u_i_memq")
-(rewrite 'assoc 2 2 "C_i_assoc" #t #f)
-(rewrite 'member 2 2 "C_i_member" #t #f)
+(rewrite 'assoc 2 2 "C_i_assoc" #t)
+(rewrite 'member 2 2 "C_i_member" #t)
 
 (rewrite 'set-car! 4 '##sys#setslot 0)
 (rewrite 'set-cdr! 4 '##sys#setslot 1)
@@ -666,47 +667,47 @@
 (rewrite 'atan 16 2 "C_a_i_atan2" #t words-per-flonum)
 
 (rewrite 'zero? 5 "C_eqp" 0 'fixnum)
-(rewrite 'zero? 2 1 "C_i_zerop" #t #f)
-(rewrite 'zero? 2 1 "C_u_i_zerop" #f #f)
+(rewrite 'zero? 2 1 "C_i_zerop" #t)
+(rewrite 'zero? 2 1 "C_u_i_zerop" #f)
 (rewrite 'positive? 5 "C_fixnum_greaterp" 0 'fixnum)
 (rewrite 'positive? 5 "C_flonum_greaterp" 0 'flonum)
-(rewrite 'positive? 2 1 "C_i_positivep" #t #f)
-(rewrite 'positive? 2 1 "C_u_i_positivep" #f #f)
+(rewrite 'positive? 2 1 "C_i_positivep" #t)
+(rewrite 'positive? 2 1 "C_u_i_positivep" #f)
 (rewrite 'negative? 5 "C_fixnum_lessp" 0 'fixnum)
 (rewrite 'negative? 5 "C_flonum_lessp" 0 'flonum)
-(rewrite 'negative? 2 1 "C_i_negativep" #t #f)
-(rewrite 'negative? 2 1 "C_u_i_negativep" #f #f)
+(rewrite 'negative? 2 1 "C_i_negativep" #t)
+(rewrite 'negative? 2 1 "C_u_i_negativep" #f)
 
 (rewrite 'vector-length 6 "C_fix" "C_header_size" #f)
 (rewrite 'string-length 6 "C_fix" "C_header_size" #f)
 (rewrite 'char->integer 6 "C_fix" "C_character_code" #t)
 (rewrite 'integer->char 6 "C_make_character" "C_unfix" #t)
 
-(rewrite 'vector-length 2 1 "C_i_vector_length" #t #f)
-(rewrite '##sys#vector-length 2 1 "C_i_vector_length" #t #f)
-(rewrite 'string-length 2 1 "C_i_string_length" #t #f)
-(rewrite 'inexact->exact 2 1 "C_i_inexact_to_exact" #t #f)
-
-(rewrite '##sys#check-exact 2 1 "C_i_check_exact" #t #f)
-(rewrite '##sys#check-number 2 1 "C_i_check_number" #t #f)
-(rewrite '##sys#check-list 2 1 "C_i_check_list" #t #f)
-(rewrite '##sys#check-pair 2 1 "C_i_check_pair" #t #f)
-(rewrite '##sys#check-symbol 2 1 "C_i_check_symbol" #t #f)
-(rewrite '##sys#check-string 2 1 "C_i_check_string" #t #f)
-(rewrite '##sys#check-byte-vector 2 1 "C_i_check_bytevector" #t #f)
-(rewrite '##sys#check-vector 2 1 "C_i_check_vector" #t #f)
-(rewrite '##sys#check-structure 2 2 "C_i_check_structure" #t #f)
-(rewrite '##sys#check-char 2 1 "C_i_check_char" #t #f)
-(rewrite '##sys#check-exact 2 2 "C_i_check_exact_2" #t #f)
-(rewrite '##sys#check-number 2 2 "C_i_check_number_2" #t #f)
-(rewrite '##sys#check-list 2 2 "C_i_check_list_2" #t #f)
-(rewrite '##sys#check-pair 2 2 "C_i_check_pair_2" #t #f)
-(rewrite '##sys#check-symbol 2 2 "C_i_check_symbol_2" #t #f)
-(rewrite '##sys#check-string 2 2 "C_i_check_string_2" #t #f)
-(rewrite '##sys#check-byte-vector 2 2 "C_i_check_bytevector_2" #t #f)
-(rewrite '##sys#check-vector 2 2 "C_i_check_vector_2" #t #f)
-(rewrite '##sys#check-structure 2 3 "C_i_check_structure_2" #t #f)
-(rewrite '##sys#check-char 2 2 "C_i_check_char_2" #t #f)
+(rewrite 'vector-length 2 1 "C_i_vector_length" #t)
+(rewrite '##sys#vector-length 2 1 "C_i_vector_length" #t)
+(rewrite 'string-length 2 1 "C_i_string_length" #t)
+(rewrite 'inexact->exact 2 1 "C_i_inexact_to_exact" #t)
+
+(rewrite '##sys#check-exact 2 1 "C_i_check_exact" #t)
+(rewrite '##sys#check-number 2 1 "C_i_check_number" #t)
+(rewrite '##sys#check-list 2 1 "C_i_check_list" #t)
+(rewrite '##sys#check-pair 2 1 "C_i_check_pair" #t)
+(rewrite '##sys#check-symbol 2 1 "C_i_check_symbol" #t)
+(rewrite '##sys#check-string 2 1 "C_i_check_string" #t)
+(rewrite '##sys#check-byte-vector 2 1 "C_i_check_bytevector" #t)
+(rewrite '##sys#check-vector 2 1 "C_i_check_vector" #t)
+(rewrite '##sys#check-structure 2 2 "C_i_check_structure" #t)
+(rewrite '##sys#check-char 2 1 "C_i_check_char" #t)
+(rewrite '##sys#check-exact 2 2 "C_i_check_exact_2" #t)
+(rewrite '##sys#check-number 2 2 "C_i_check_number_2" #t)
+(rewrite '##sys#check-list 2 2 "C_i_check_list_2" #t)
+(rewrite '##sys#check-pair 2 2 "C_i_check_pair_2" #t)
+(rewrite '##sys#check-symbol 2 2 "C_i_check_symbol_2" #t)
+(rewrite '##sys#check-string 2 2 "C_i_check_string_2" #t)
+(rewrite '##sys#check-byte-vector 2 2 "C_i_check_bytevector_2" #t)
+(rewrite '##sys#check-vector 2 2 "C_i_check_vector_2" #t)
+(rewrite '##sys#check-structure 2 3 "C_i_check_structure_2" #t)
+(rewrite '##sys#check-char 2 2 "C_i_check_char_2" #t)
 
 (rewrite '= 9 "C_eqp" "C_i_equalp" #t #t)
 (rewrite '> 9 "C_fixnum_greaterp" "C_flonum_greaterp" #t #f)
@@ -726,7 +727,7 @@
 (rewrite 'list->string 11 1 '##sys#list->string #t)
 
 (rewrite 'vector-set! 11 3 '##sys#setslot #f)
-(rewrite 'vector-set! 2 3 "C_i_vector_set" #t #f)
+(rewrite 'vector-set! 2 3 "C_i_vector_set" #t)
 
 (rewrite '##sys#vector->list 11 1 'vector->list #t)
 (rewrite '##sys#list->vector 11 1 'list->vector #t)
@@ -778,10 +779,10 @@
 (rewrite 'odd? 14 'fixnum 1 "C_i_fixnumoddp" "C_i_fixnumoddp")
 (rewrite 'remainder 14 'fixnum 2 "C_fixnum_modulo" "C_fixnum_modulo")
 
-(rewrite 'even? 2 1 "C_i_evenp" #t #f)
-(rewrite 'even? 2 1 "C_u_i_evenp" #f #f)
-(rewrite 'odd? 2 1 "C_i_oddp" #t #f)
-(rewrite 'odd? 2 1 "C_u_i_oddp" #f #f)
+(rewrite 'even? 2 1 "C_i_evenp" #t)
+(rewrite 'even? 2 1 "C_u_i_evenp" #f)
+(rewrite 'odd? 2 1 "C_i_oddp" #t)
+(rewrite 'odd? 2 1 "C_u_i_oddp" #f)
 
 (rewrite 'floor 15 'flonum 'fixnum 'fpfloor #f)
 (rewrite 'ceiling 15 'flonum 'fixnum 'fpceiling #f)
@@ -901,12 +902,12 @@
 (rewrite '##sys#foreign-unsigned-integer-argument 17 1 "C_i_foreign_unsigned_integer_argumentp")
 (rewrite '##sys#direct-return 17 2 "C_direct_return")
 
-(rewrite 'blob-size 2 1 "C_block_size" #f #f)
+(rewrite 'blob-size 2 1 "C_block_size" #f)
 
-(rewrite 'u8vector-ref 2 2 "C_u_i_u8vector_ref" #f #f)
-(rewrite 's8vector-ref 2 2 "C_u_i_s8vector_ref" #f #f)
-(rewrite 'u16vector-ref 2 2 "C_u_i_u16vector_ref" #f #f)
-(rewrite 's16vector-ref 2 2 "C_u_i_s16vector_ref" #f #f)
+(rewrite 'u8vector-ref 2 2 "C_u_i_u8vector_ref" #f)
+(rewrite 's8vector-ref 2 2 "C_u_i_s8vector_ref" #f)
+(rewrite 'u16vector-ref 2 2 "C_u_i_u16vector_ref" #f)
+(rewrite 's16vector-ref 2 2 "C_u_i_s16vector_ref" #f)
 
 (rewrite 'f32vector-ref 16 2 "C_a_i_f32vector_ref" #f words-per-flonum)
 (rewrite 'f64vector-ref 16 2 "C_a_i_f64vector_ref" #f words-per-flonum)
@@ -914,23 +915,23 @@
 (rewrite 'u32vector-ref 22 2 "C_a_i_u32vector_ref" #f words-per-flonum "C_u_i_u32vector_ref")
 (rewrite 's32vector-ref 22 2 "C_a_i_s32vector_ref" #f words-per-flonum "C_u_i_s32vector_ref")
 
-(rewrite 'u8vector-set! 2 3 "C_u_i_u8vector_set" #f #f)
-(rewrite 's8vector-set! 2 3 "C_u_i_s8vector_set" #f #f)
-(rewrite 'u16vector-set! 2 3 "C_u_i_u16vector_set" #f #f)
-(rewrite 's16vector-set! 2 3 "C_u_i_s16vector_set" #f #f)
-(rewrite 'u32vector-set! 2 3 "C_u_i_u32vector_set" #f #f)
-(rewrite 's32vector-set! 2 3 "C_u_i_s32vector_set" #f #f)
-(rewrite 'f32vector-set! 2 3 "C_u_i_f32vector_set" #f #f)
-(rewrite 'f64vector-set! 2 3 "C_u_i_f64vector_set" #f #f)
-
-(rewrite 'u8vector-length 2 1 "C_u_i_8vector_length" #f #f)
-(rewrite 's8vector-length 2 1 "C_u_i_8vector_length" #f #f)
-(rewrite 'u16vector-length 2 1 "C_u_i_16vector_length" #f #f)
-(rewrite 's16vector-length 2 1 "C_u_i_16vector_length" #f #f)
-(rewrite 'u32vector-length 2 1 "C_u_i_32vector_length" #f #f)
-(rewrite 's32vector-length 2 1 "C_u_i_32vector_length" #f #f)
-(rewrite 'f32vector-length 2 1 "C_u_i_32vector_length" #f #f)
-(rewrite 'f64vector-length 2 1 "C_u_i_64vector_length" #f #f)
+(rewrite 'u8vector-set! 2 3 "C_u_i_u8vector_set" #f)
+(rewrite 's8vector-set! 2 3 "C_u_i_s8vector_set" #f)
+(rewrite 'u16vector-set! 2 3 "C_u_i_u16vector_set" #f)
+(rewrite 's16vector-set! 2 3 "C_u_i_s16vector_set" #f)
+(rewrite 'u32vector-set! 2 3 "C_u_i_u32vector_set" #f)
+(rewrite 's32vector-set! 2 3 "C_u_i_s32vector_set" #f)
+(rewrite 'f32vector-set! 2 3 "C_u_i_f32vector_set" #f)
+(rewrite 'f64vector-set! 2 3 "C_u_i_f64vector_set" #f)
+
+(rewrite 'u8vector-length 2 1 "C_u_i_8vector_length" #f)
+(rewrite 's8vector-length 2 1 "C_u_i_8vector_length" #f)
+(rewrite 'u16vector-length 2 1 "C_u_i_16vector_length" #f)
+(rewrite 's16vector-length 2 1 "C_u_i_16vector_length" #f)
+(rewrite 'u32vector-length 2 1 "C_u_i_32vector_length" #f)
+(rewrite 's32vector-length 2 1 "C_u_i_32vector_length" #f)
+(rewrite 'f32vector-length 2 1 "C_u_i_32vector_length" #f)
+(rewrite 'f64vector-length 2 1 "C_u_i_64vector_length" #f)
 
 (rewrite 'not-pair? 17 1 "C_i_not_pair_p")
 (rewrite 'atom? 17 1 "C_i_not_pair_p")
diff --git a/chicken.h b/chicken.h
index b6506e1c..d8941748 100644
--- a/chicken.h
+++ b/chicken.h
@@ -887,6 +887,7 @@ DECL_C_PROC_p0 (128,  1,0,0,0,0,0,0,0)
 # define C_round                    round
 # define C_trunc                    trunc
 # define C_fabs                     fabs
+# define C_modf                     modf
 # ifdef __linux__
 extern double round(double);
 extern double trunc(double);
@@ -1766,7 +1767,7 @@ C_inline C_word C_double_to_number(C_word n)
   double m, f = C_flonum_magnitude(n);
 
   if(f <= (double)C_MOST_POSITIVE_FIXNUM
-     && f >= (double)C_MOST_NEGATIVE_FIXNUM && modf(f, &m) == 0.0) 
+     && f >= (double)C_MOST_NEGATIVE_FIXNUM && C_modf(f, &m) == 0.0) 
     return C_fix(f);
   else return n;
 }
@@ -1779,7 +1780,7 @@ C_inline C_word C_fits_in_int_p(C_word x)
   if(x & C_FIXNUM_BIT) return C_SCHEME_TRUE;
 
   n = C_flonum_magnitude(x);
-  return C_mk_bool(modf(n, &m) == 0.0 && n >= C_WORD_MIN && n <= C_WORD_MAX);
+  return C_mk_bool(C_modf(n, &m) == 0.0 && n >= C_WORD_MIN && n <= C_WORD_MAX);
 }
 
 
@@ -1790,7 +1791,7 @@ C_inline C_word C_fits_in_unsigned_int_p(C_word x)
   if(x & C_FIXNUM_BIT) return C_SCHEME_TRUE;
 
   n = C_flonum_magnitude(x);
-  return C_mk_bool(modf(n, &m) == 0.0 && n >= 0 && n <= C_UWORD_MAX);
+  return C_mk_bool(C_modf(n, &m) == 0.0 && n >= 0 && n <= C_UWORD_MAX);
 }
 
 
@@ -1993,13 +1994,21 @@ C_inline C_word C_i_rationalp(C_word x)
 }
 
 
+C_inline C_word C_u_i_fpintegerp(C_word x)
+{
+  double dummy;
+
+  return C_mk_bool(C_modf(C_flonum_magnitude(x), &dummy) == 0.0);
+}
+
+
 C_inline C_word C_i_integerp(C_word x)
 {
   double dummy;
 
   return C_mk_bool((x & C_FIXNUM_BIT) || 
 		   ((!C_immediatep(x) && C_block_header(x) == C_FLONUM_TAG) &&
-		    modf(C_flonum_magnitude(x), &dummy) == 0.0 ) );
+		    C_modf(C_flonum_magnitude(x), &dummy) == 0.0 ) );
 }
 
 
diff --git a/library.scm b/library.scm
index fe6da61f..3742fc9b 100644
--- a/library.scm
+++ b/library.scm
@@ -1,7 +1,7 @@
 ;;;; library.scm - R5RS library for the CHICKEN compiler
 ;
-; Copyright (c) 2000-2007, Felix L. Winkelmann
 ; Copyright (c) 2008-2009, The Chicken Team
+; Copyright (c) 2000-2007, Felix L. Winkelmann
 ; All rights reserved.
 ;
 ; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
@@ -967,6 +967,11 @@ EOF
   (fp-check-flonum x 'fpabs)
   (##core#inline_allocate ("C_a_i_flonum_abs" 4) x))
 
+(define (fpinteger? x)
+  #+(not unsafe)
+  (fp-check-flonum x 'fpinteger?)
+  (##core#inline "C_u_i_fpintegerp" x))
+
 (define * (##core#primitive "C_times"))
 (define - (##core#primitive "C_minus"))
 (define + (##core#primitive "C_plus"))
diff --git a/manual/Unit library b/manual/Unit library
index 89d16720..9c4705b5 100644
--- a/manual/Unit library	
+++ b/manual/Unit library	
@@ -89,11 +89,11 @@ Returns {{#t}} if {{X}} is a fixnum, or {{#f}} otherwise.
 
 ==== Arithmetic floating-point operations
 
-arguments (except {{flonum?}}, which returns {{#f}}). In unsafe mode,
-these procedures do not check their arguments. A non-flonum argument
-in unsafe mode can crash the system.
+In safe mode, these procedures throw a type error when given non-float
+arguments. In unsafe mode, these procedures do not check their
+arguments. A non-flonum argument in unsafe mode can crash the
+application.
 
-<procedure>(flonum? X)</procedure>
 <procedure>(fp+ X Y)</procedure>
 <procedure>(fp- X Y)</procedure>
 <procedure>(fp* X Y)</procedure>
@@ -122,6 +122,7 @@ in unsafe mode can crash the system.
 <procedure>(fpexpt X Y)</procedure>
 <procedure>(fpsqrt X)</procedure>
 <procedure>(fpabs X)</procedure>
+<procedure>(fpinteger? X)</procedure>
 
 Note: {{fpround}} implements POSIX, which is different from R5RS.
 
diff --git a/optimizer.scm b/optimizer.scm
index edcc685f..415e7009 100644
--- a/optimizer.scm
+++ b/optimizer.scm
@@ -812,23 +812,17 @@
 		    (list cont (make-node '##core#inline (list (second classargs)) callargs)) ) ) ) ) )
 
     ;; (<op> ...) -> (##core#inline <iop> ...)
-    ;; (<op> <rest-vector>) -> (##core#inline <iopv> <rest-vector>)
-    ((2) ; classargs = (<argc> <iop> <safe> <iopv>)
+    ((2) ; classargs = (<argc> <iop> <safe>)
      (and inline-substitutions-enabled
 	  (= (length callargs) (first classargs))
 	  (intrinsic? name)
 	  (or (third classargs) unsafe)
-	  (let ([arg1 (first callargs)]
-		[iopv (fourth classargs)] )
+	  (let ((arg1 (first callargs)))
 	    (make-node
 	     '##core#call '(#t)
 	     (list 
 	      cont
-	      (cond [(and iopv
-			  (eq? '##core#variable (node-class arg1))
-			  (eq? 'vector (get db (first (node-parameters arg1)) 'rest-parameter)) )
-		     (make-node '##core#inline (list iopv) callargs) ]
-		    [else (make-node '##core#inline (list (second classargs)) callargs)] ) ) ) ) ) )
+	      (make-node '##core#inline (list (second classargs)) callargs) ) ) ) ) )
 
     ;; (<op>) -> <var>
     ((3) ; classargs = (<var>)
diff --git a/types.db b/types.db
index aad41ea8..39a0fa5e 100644
--- a/types.db
+++ b/types.db
@@ -307,7 +307,8 @@
 (fpcos (procedure fpcos (float) float))
 (fpexp (procedure fpexp (float) float))
 (fpexpt (procedure fpexpt (float float) float))
-(fpfloot (procedure fpfloor (float) float))
+(fpfloor (procedure fpfloor (float) float))
+(fpinteger? (procedure fpinteger? (float) boolean))
 (fplog (procedure fplog (float) float))
 (fpmax (procedure fpmax (float float) float))
 (fpmin (procedure fpmin (float float) float))
diff --git a/unboxing.scm b/unboxing.scm
index 86ec0093..e6975c4e 100644
--- a/unboxing.scm
+++ b/unboxing.scm
@@ -111,21 +111,25 @@
 			     (list
 			      n2
 			      (case rtype
-				((flo)
+				((flonum)
 				 (make-node
 				  '##core#inline_allocate (list "C_a_i_flonum" 4) ; hardcoded size
 				  (list (make-node '##core#unboxed_ref (list tmp rtype) '()))))
-				((ptr)
+				((pointer)
 				 (make-node
 				  '##core#inline_allocate (list "C_a_i_mpointer" 2) ; hardcoded size
 				  (list (make-node '##core#unboxed_ref (list tmp rtype) '()))))
-				((chr fix)
+				((char fixnum)
 				 (make-node
 				   '##core#inline
-				   (list (if (eq? rtype 'chr) "C_make_character" "C_fix"))
+				   (list (if (eq? rtype 'char) "C_make_character" "C_fix"))
 				   (list (make-node
 					  '##core#unboxed_ref
 					  (list tmp rtype) '()))))
+				((bool)
+				 (make-node
+				  '##core#inline '("C_mk_bool")
+				  (list (make-node '##core#unboxed_ref (list tmp rtype) '()))))
 				((*) (bomb "unboxed type `*' not allowed as result"))
 				(else (bomb "invalid unboxed type" rtype))))))))) 
 		   ((or (eq? (car atypes) '*) 
@@ -142,12 +146,13 @@
 		       (list (make-node
 			      '##core#inline 
 			      (list (case (car atypes)
-				      ((chr) "C_character_code")
-				      ((fix) "C_unfix")
-				      ((flo) "C_flonum_magnitude")
-				      ((ptr) "C_pointer_address")
+				      ((char) "C_character_code")
+				      ((fixnum) "C_unfix")
+				      ((flonum) "C_flonum_magnitude")
+				      ((pointer) "C_pointer_address")
+				      ((bool) "C_truep")
 				      ((*) "C_id")
-				      (else (bomb "invalid unboxed type" (car atypes)))))
+				      (else (bomb "invalid unboxed argument type" (car atypes)))))
 			      (list (car anodes)))
 			     (loop (cdr args)
 				   (cdr anodes)
@@ -327,7 +332,7 @@
 		       (if (eq? r 'none)
 			   (walk (second clauses) dest udest pass2?)
 			   (merge r (walk (second clauses) dest udest pass2?)))))
-		   ((null? (cddr clauses)) 
+		   ((null? (cdr clauses))
 		    (merge r (walk (car clauses) dest udest pass2?))) ) )
 
 	      ((##core#call ##core#direct_call)
@@ -371,28 +376,31 @@
 ;; unboxed rewrites
 
 (define-unboxed-ops 
-  (C_a_i_flonum_plus (flo flo) flo "C_ub_i_flonum_plus")
-  (C_a_i_flonum_difference (flo flo) flo "C_ub_i_flonum_difference")
-  (C_a_i_flonum_times (flo flo) flo "C_ub_i_flonum_times") 
-  (C_a_i_flonum_quotient (flo flo) flo "C_ub_i_flonum_quotient") 
-  (C_a_i_flonum_sin (flo) flo "C_sin")
-  (C_a_i_flonum_cos (flo) flo "C_cos")
-  (C_a_i_flonum_tan (flo) flo "C_tab")
-  (C_a_i_flonum_asin (flo) flo "C_asin")
-  (C_a_i_flonum_acos (flo) flo "C_acos")
-  (C_a_i_flonum_atan (flo) flo "C_atan")
-  (C_a_i_flonum_atan2 (flo flo) flo "C_atan2")
-  (C_a_i_flonum_exp (flo) flo "C_exp")
-  (C_a_i_flonum_expt (flo flo) flo "C_pow")
-  (C_a_i_flonum_log (flo) flo "C_log")
-  (C_a_i_flonum_sqrt (flo) flo "C_sqrt")
-  (C_a_i_flonum_abs (flo) flo "C_fabs")
-  (C_a_i_flonum_truncate (flo) flo "C_trunc")
-  (C_a_i_flonum_ceiling (flo) flo "C_ceil")
-  (C_a_i_flonum_floor (flo) flo "C_floor")
-  (C_a_i_flonum_round (flo) flo "C_round")
-  (C_u_i_f32vector_set (* fix flo) fix "C_ub_i_f32vector_set")
-  (C_u_i_f64vector_set (* fix flo) fix "C_ub_i_f64vector_set")
-  (C_a_i_f32vector_ref (* fix) flo "C_ub_i_f32vector_ref")
-  (C_a_i_f64vector_ref (* fix) flo "C_ub_i_f64vector_ref")
+  (C_a_i_flonum_plus (flonum flonum) flonum "C_ub_i_flonum_plus")
+  (C_a_i_flonum_difference (flonum flonum) flonum "C_ub_i_flonum_difference")
+  (C_a_i_flonum_times (flonum flonum) flonum "C_ub_i_flonum_times") 
+  (C_a_i_flonum_quotient (flonum flonum) flonum "C_ub_i_flonum_quotient") 
+  (C_a_i_flonum_sin (flonum) flonum "C_sin")
+  (C_a_i_flonum_cos (flonum) flonum "C_cos")
+  (C_a_i_flonum_tan (flonum) flonum "C_tab")
+  (C_a_i_flonum_asin (flonum) flonum "C_asin")
+  (C_a_i_flonum_acos (flonum) flonum "C_acos")
+  (C_a_i_flonum_atan (flonum) flonum "C_atan")
+  (C_a_i_flonum_atan2 (flonum flonum) flonum "C_atan2")
+  (C_a_i_flonum_exp (flonum) flonum "C_exp")
+  (C_a_i_flonum_expt (flonum flonum) flonum "C_pow")
+  (C_a_i_flonum_log (flonum) flonum "C_log")
+  (C_a_i_flonum_sqrt (flonum) flonum "C_sqrt")
+  (C_a_i_flonum_abs (flonum) flonum "C_fabs")
+  (C_a_i_flonum_truncate (flonum) flonum "C_trunc")
+  (C_a_i_flonum_ceiling (flonum) flonum "C_ceil")
+  (C_a_i_flonum_floor (flonum) flonum "C_floor")
+  (C_a_i_flonum_round (flonum) flonum "C_round")
+  (C_u_i_f32vector_set (* fixnum flonum) fixnum "C_ub_i_f32vector_set")
+  (C_u_i_f64vector_set (* fixnum flonum) fixnum "C_ub_i_f64vector_set")
+  (C_a_i_f32vector_ref (* fixnum) flonum "C_ub_i_f32vector_ref")
+  (C_a_i_f64vector_ref (* fixnum) flonum "C_ub_i_f64vector_ref")
+  ; fpinteger?
+  ; finite?
+  ; fp= fp> fp< fp>= fp<=
   )
Trap