From 64c7c7e92d8f00da6573937ba8aca5e31b6ef773 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Tue, 13 Jan 2026 05:15:18 +0300 Subject: [PATCH] Don't mutate MPZ_Object in MPZ_to_str (by zz_neg) Closes #292 --- gmp.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/gmp.c b/gmp.c index 3ec55f44..dec32c6f 100644 --- a/gmp.c +++ b/gmp.c @@ -62,7 +62,7 @@ PyObject * MPZ_to_str(MPZ_Object *u, int base, int options) { size_t len; - bool negative = zz_isneg(&u->z), cast_abs = false; + bool negative = zz_isneg(&u->z); if (zz_sizeinbase(&u->z, base, &len)) { PyErr_SetString(PyExc_ValueError, @@ -78,7 +78,7 @@ MPZ_to_str(MPZ_Object *u, int base, int options) } len++; - char *buf = malloc(len), *p = buf; + char *buf = malloc(len), *p = buf, saved_char = 0; if (!buf) { return PyErr_NoMemory(); /* LCOV_EXCL_LINE */ @@ -90,7 +90,7 @@ MPZ_to_str(MPZ_Object *u, int base, int options) if (options & OPT_PREFIX) { if (negative) { *(p++) = '-'; - cast_abs = true; + saved_char = '-'; } if (base == 2) { *(p++) = '0'; @@ -109,14 +109,15 @@ MPZ_to_str(MPZ_Object *u, int base, int options) *(p++) = 'X'; } } - if (cast_abs) { - (void)zz_abs(&u->z, &u->z); + if (saved_char) { + saved_char = *(--p); + assert(saved_char); } zz_err ret = zz_get_str(&u->z, base, p, &len); - if (cast_abs) { - (void)zz_neg(&u->z, &u->z); + if (saved_char) { + *p = saved_char; } if (ret) { /* LCOV_EXCL_START */