summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-08-07 14:27:48 +0000
committerDamien George <damien.p.george@gmail.com>2014-08-07 14:27:48 +0000
commit5d9b816449311ab50304c4fa2ffe792e224df8ff (patch)
treed30bf4f9ae108f6842294901a1568f7298bec81b
parent3ef911345c94a6d612ab50c1e912e81cb2cc3f71 (diff)
downloadmicropython-5d9b816449311ab50304c4fa2ffe792e224df8ff.tar.gz
micropython-5d9b816449311ab50304c4fa2ffe792e224df8ff.zip
py: Fix bug in mpn_shl (multi-prec int shift left).
Before this patch, eg, 1 << 75 (or any large multiple of 15) was setting the MSB in the digits, which is outside the valid range of DIG_MASK.
-rw-r--r--py/mpz.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/py/mpz.c b/py/mpz.c
index cf02aa2420..106e66aaf9 100644
--- a/py/mpz.c
+++ b/py/mpz.c
@@ -89,12 +89,12 @@ STATIC uint mpn_shl(mpz_dig_t *idig, mpz_dig_t *jdig, uint jlen, uint n) {
mpz_dbl_dig_t d = 0;
for (uint i = jlen; i > 0; i--, idig--, jdig--) {
d |= *jdig;
- *idig = d >> (DIG_SIZE - n_part);
+ *idig = (d >> (DIG_SIZE - n_part)) & DIG_MASK;
d <<= DIG_SIZE;
}
// store remaining bits
- *idig = d >> (DIG_SIZE - n_part);
+ *idig = (d >> (DIG_SIZE - n_part)) & DIG_MASK;
idig -= n_whole - 1;
memset(idig, 0, (n_whole - 1) * sizeof(mpz_dig_t));
@@ -1132,12 +1132,9 @@ mpz_t *mpz_gcd(const mpz_t *z1, const mpz_t *z2) {
lcm(0, 0) = 0
lcm(z, 0) = 0
*/
-mpz_t *mpz_lcm(const mpz_t *z1, const mpz_t *z2)
-{
- // braces below are required for compilation to succeed with CL, see bug report
- // https://connect.microsoft.com/VisualStudio/feedback/details/864169/compilation-error-when-braces-are-left-out-of-single-line-if-statement
- if (z1->len == 0 || z2->len == 0) {
- return mpz_zero();
+mpz_t *mpz_lcm(const mpz_t *z1, const mpz_t *z2) {
+ if (z1->len == 0 || z2->len == 0) {
+ return mpz_zero();
}
mpz_t *gcd = mpz_gcd(z1, z2);