|
|
07c50e4 |
--- src/_fastmath.c
|
|
|
07c50e4 |
+++ src/_fastmath.c
|
|
|
07c50e4 |
@@ -134,12 +134,18 @@ longObjToMPZ (mpz_t m, PyLongObject * p)
|
|
|
07c50e4 |
static PyObject *
|
|
|
07c50e4 |
mpzToLongObj (mpz_t m)
|
|
|
07c50e4 |
{
|
|
|
07c50e4 |
- /* borrowed from gmpy */
|
|
|
07c50e4 |
#ifdef IS_PY3K
|
|
|
07c50e4 |
- int size = (mpz_sizeinbase (m, 2) + PyLong_SHIFT - 1) / PyLong_SHIFT;
|
|
|
07c50e4 |
+ PyObject *retval;
|
|
|
07c50e4 |
+ int size = mpz_sizeinbase(m, 10) + 2;
|
|
|
07c50e4 |
+ char *str = malloc(size);
|
|
|
07c50e4 |
+ if (!str)
|
|
|
07c50e4 |
+ return NULL;
|
|
|
07c50e4 |
+ retval = PyLong_FromString(mpz_get_str(str, 10, m), NULL, 10);
|
|
|
07c50e4 |
+ free(str);
|
|
|
07c50e4 |
+ return retval;
|
|
|
07c50e4 |
#else
|
|
|
07c50e4 |
+ /* borrowed from gmpy */
|
|
|
07c50e4 |
int size = (mpz_sizeinbase (m, 2) + SHIFT - 1) / SHIFT;
|
|
|
07c50e4 |
-#endif
|
|
|
07c50e4 |
int sgn;
|
|
|
07c50e4 |
int i;
|
|
|
07c50e4 |
mpz_t temp;
|
|
|
07c50e4 |
@@ -151,36 +157,16 @@ mpzToLongObj (mpz_t m)
|
|
|
07c50e4 |
mpz_mul_si(temp, m, sgn);
|
|
|
07c50e4 |
for (i = 0; i < size; i++)
|
|
|
07c50e4 |
{
|
|
|
07c50e4 |
-#ifdef IS_PY3K
|
|
|
07c50e4 |
-#if PY_VERSION_HEX < 0x030C0000
|
|
|
07c50e4 |
- l->ob_digit[i] = (digit) (mpz_get_ui (temp) & PyLong_MASK);
|
|
|
07c50e4 |
-#else
|
|
|
07c50e4 |
- l->long_value.ob_digit[i] = (digit) (mpz_get_ui (temp) & PyLong_MASK);
|
|
|
07c50e4 |
-#endif
|
|
|
07c50e4 |
- mpz_fdiv_q_2exp (temp, temp, PyLong_SHIFT);
|
|
|
07c50e4 |
-#else
|
|
|
07c50e4 |
l->ob_digit[i] = (digit) (mpz_get_ui (temp) & MASK);
|
|
|
07c50e4 |
mpz_fdiv_q_2exp (temp, temp, SHIFT);
|
|
|
07c50e4 |
-#endif
|
|
|
07c50e4 |
}
|
|
|
07c50e4 |
i = size;
|
|
|
07c50e4 |
-#if PY_VERSION_HEX < 0x030C0000
|
|
|
07c50e4 |
while ((i > 0) && (l->ob_digit[i - 1] == 0))
|
|
|
07c50e4 |
-#else
|
|
|
07c50e4 |
- while ((i > 0) && (l->long_value.ob_digit[i - 1] == 0))
|
|
|
07c50e4 |
-#endif
|
|
|
07c50e4 |
i--;
|
|
|
07c50e4 |
-#ifdef IS_PY3K
|
|
|
07c50e4 |
-#if PY_VERSION_HEX < 0x030C0000
|
|
|
07c50e4 |
- l->ob_base.ob_size = i * sgn;
|
|
|
07c50e4 |
-#else
|
|
|
07c50e4 |
- l->long_value.lv_tag = TAG_FROM_SIGN_AND_SIZE(sgn, (size_t)i);
|
|
|
07c50e4 |
-#endif
|
|
|
07c50e4 |
-#else
|
|
|
07c50e4 |
l->ob_size = i * sgn;
|
|
|
07c50e4 |
-#endif
|
|
|
07c50e4 |
mpz_clear (temp);
|
|
|
07c50e4 |
return (PyObject *) l;
|
|
|
07c50e4 |
+#endif
|
|
|
07c50e4 |
}
|
|
|
07c50e4 |
|
|
|
07c50e4 |
typedef struct
|