Merge remote-tracking branch 'origin/stable-2.0'
authorMark H Weaver <mhw@netris.org>
Tue, 16 Jul 2013 10:49:20 +0000 (06:49 -0400)
committerMark H Weaver <mhw@netris.org>
Tue, 16 Jul 2013 10:49:20 +0000 (06:49 -0400)
Conflicts:
libguile/numbers.c

1  2 
libguile/numbers.c

@@@ -4144,8 -4145,10 +4144,10 @@@ scm_gcd (SCM x, SCM y
            SCM_SWAP (x, y);
            goto big_inum;
          }
+       else if (SCM_REALP (y) && scm_is_integer (y))
+         goto handle_inexacts;
        else
 -        SCM_WTA_DISPATCH_2 (g_gcd, x, y, SCM_ARG2, s_gcd);
 +        return scm_wta_dispatch_2 (g_gcd, x, y, SCM_ARG2, s_gcd);
      }
    else if (SCM_BIGP (x))
      {
            scm_remember_upto_here_2 (x, y);
            return scm_i_normbig (result);
          }
+       else if (SCM_REALP (y) && scm_is_integer (y))
+         goto handle_inexacts;
+       else
+         SCM_WTA_DISPATCH_2 (g_gcd, x, y, SCM_ARG2, s_gcd);
+     }
+   else if (SCM_REALP (x) && scm_is_integer (x))
+     {
+       if (SCM_I_INUMP (y) || SCM_BIGP (y)
+           || (SCM_REALP (y) && scm_is_integer (y)))
+         {
+         handle_inexacts:
+           return scm_exact_to_inexact (scm_gcd (scm_inexact_to_exact (x),
+                                                 scm_inexact_to_exact (y)));
+         }
        else
 -        SCM_WTA_DISPATCH_2 (g_gcd, x, y, SCM_ARG2, s_gcd);
 +        return scm_wta_dispatch_2 (g_gcd, x, y, SCM_ARG2, s_gcd);
      }
    else
 -    SCM_WTA_DISPATCH_2 (g_gcd, x, y, SCM_ARG1, s_gcd);
 +    return scm_wta_dispatch_2 (g_gcd, x, y, SCM_ARG1, s_gcd);
  }
  
  SCM_PRIMITIVE_GENERIC (scm_i_lcm, "lcm", 0, 2, 1,
@@@ -4239,8 -4246,12 +4245,12 @@@ scm_lcm (SCM n1, SCM n2
              return result;
            }
          }
 -        SCM_WTA_DISPATCH_2 (g_lcm, n1, n2, SCM_ARG2, s_lcm);
+       else if (SCM_REALP (n2) && scm_is_integer (n2))
+         goto handle_inexacts;
+       else
++        return scm_wta_dispatch_2 (g_lcm, n1, n2, SCM_ARG2, s_lcm);
      }
-   else
+   else if (SCM_LIKELY (SCM_BIGP (n1)))
      {
        /* big n1 */
        if (SCM_I_INUMP (n2))
            /* shouldn't need to normalize b/c lcm of 2 bigs should be big */
            return result;
          }
 -        SCM_WTA_DISPATCH_2 (g_lcm, n1, n2, SCM_ARG2, s_lcm);
+       else if (SCM_REALP (n2) && scm_is_integer (n2))
+         goto handle_inexacts;
+       else
++        return scm_wta_dispatch_2 (g_lcm, n1, n2, SCM_ARG2, s_lcm);
      }
 -        SCM_WTA_DISPATCH_2 (g_lcm, n1, n2, SCM_ARG2, s_lcm);
+   else if (SCM_REALP (n1) && scm_is_integer (n1))
+     {
+       if (SCM_I_INUMP (n2) || SCM_BIGP (n2)
+           || (SCM_REALP (n2) && scm_is_integer (n2)))
+         {
+         handle_inexacts:
+           return scm_exact_to_inexact (scm_lcm (scm_inexact_to_exact (n1),
+                                                 scm_inexact_to_exact (n2)));
+         }
+       else
 -    SCM_WTA_DISPATCH_2 (g_lcm, n1, n2, SCM_ARG1, s_lcm);
++        return scm_wta_dispatch_2 (g_lcm, n1, n2, SCM_ARG2, s_lcm);
+     }
+   else
++    return scm_wta_dispatch_2 (g_lcm, n1, n2, SCM_ARG1, s_lcm);
  }
  
  /* Emulating 2's complement bignums with sign magnitude arithmetic: