~ chicken-core (chicken-5) 42c869949f893baba40c9b0d5e4832eb2004b20e


commit 42c869949f893baba40c9b0d5e4832eb2004b20e
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sun Dec 23 16:08:31 2012 +0100
Commit:     Peter Bex <peter.bex@xs4all.nl>
CommitDate: Sun Dec 23 17:14:50 2012 +0100

    Bugfix for foreign-argument-check routine for 64-bit unsigned longs. The function returned a raw floating-point value (coerced to C_word) instead of the original number.
    
    Reported by Kon Lovett.
    
    Signed-off-by: Peter Bex <peter.bex@xs4all.nl>

diff --git a/runtime.c b/runtime.c
index f4babdff..7da117d5 100644
--- a/runtime.c
+++ b/runtime.c
@@ -5912,8 +5912,11 @@ C_regparm C_word C_fcall C_i_foreign_unsigned_integer64_argumentp(C_word x)
 
   if((x & C_FIXNUM_BIT) != 0) return x;
 
-  if(!C_immediatep(x) && C_block_header(x) == C_FLONUM_TAG)
-    return C_flonum_magnitude(x);
+  if(!C_immediatep(x) && C_block_header(x) == C_FLONUM_TAG) {
+    m = C_flonum_magnitude(x);
+
+    if(m >= 0 && m <= C_UWORD_MAX) return x;
+  }
 
   barf(C_BAD_ARGUMENT_TYPE_NO_UINTEGER_ERROR, NULL, x);
   return C_SCHEME_UNDEFINED;
Trap