Fix bug in INTEGER->FLONUM primitive on 64-bit systems.
authorTaylor R Campbell <campbell@mumble.net>
Wed, 7 Jul 2010 18:50:37 +0000 (18:50 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Wed, 7 Jul 2010 18:50:37 +0000 (18:50 +0000)
Not all fixnums can be converted losslessly into flonums.

src/microcode/intprm.c

index 26e5c0aef1a2eb135502826fd5fcd88ee82029cf..22d40bfcadf33d8d86e23359e501e4b8e96d9b9a 100644 (file)
@@ -142,7 +142,16 @@ DEFINE_PRIMITIVE ("INTEGER->FLONUM", Prim_integer_to_flonum, 2, 2, 0)
     SCHEME_OBJECT integer = (ARG_REF (1));
     long control = (arg_index_integer (2, 4));
     if (FIXNUM_P (integer))
-      PRIMITIVE_RETURN (FIXNUM_TO_FLONUM (integer));
+      {
+       double d = (FIXNUM_TO_DOUBLE (integer));
+       if ((0 == (control & 1))
+           || ((DOUBLE_TO_FIXNUM_P (d))
+               && (integer == (DOUBLE_TO_FIXNUM (d)))))
+         PRIMITIVE_RETURN (double_to_flonum (d));
+       if ((control & 2) != 0)
+         error_bad_range_arg (1);
+       PRIMITIVE_RETURN (SHARP_F);
+      }
     if (((control & 1) != 0)
        ? (LOSSLESS_BIGNUM_TO_DOUBLE_P (integer))
        : (BIGNUM_TO_DOUBLE_P (integer)))