Add upstream patch for python 3.12 compatibility

This commit is contained in:
Jerry James 2023-06-15 12:23:23 -06:00
parent 584fe3f6e5
commit 558b6b8622
2 changed files with 212 additions and 2 deletions

View File

@ -0,0 +1,202 @@
--- gmpy2-2.1.5/src/gmpy2_convert_gmp.c.orig 2022-11-19 22:18:47.000000000 -0700
+++ gmpy2-2.1.5/src/gmpy2_convert_gmp.c 2023-06-15 12:20:05.896716046 -0600
@@ -59,33 +59,24 @@ GMPy_MPZ_From_PyIntOrLong(PyObject *obj,
}
#endif
- switch (Py_SIZE(templong)) {
- case -1:
- mpz_set_si(result->z, -(sdigit)templong->ob_digit[0]);
+ len = templong->long_value.lv_tag >> 3;
+ negative = (templong->long_value.lv_tag & 3) == 2;
+
+ switch (len) {
+ case 1:
+ mpz_set_si(result->z, (sdigit)templong->long_value.ob_digit[0]);
break;
case 0:
mpz_set_si(result->z, 0);
break;
- case 1:
- mpz_set_si(result->z, templong->ob_digit[0]);
- break;
default:
- mpz_set_si(result->z, 0);
-
- if (Py_SIZE(templong) < 0) {
- len = - Py_SIZE(templong);
- negative = 1;
- } else {
- len = Py_SIZE(templong);
- negative = 0;
- }
-
- mpz_import(result->z, len, -1, sizeof(templong->ob_digit[0]), 0,
- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit);
+ mpz_import(result->z, len, -1, sizeof(templong->long_value.ob_digit[0]), 0,
+ sizeof(templong->long_value.ob_digit[0])*8 - PyLong_SHIFT,
+ templong->long_value.ob_digit);
+ }
- if (negative) {
- mpz_neg(result->z, result->z);
- }
+ if (negative) {
+ mpz_neg(result->z, result->z);
}
return result;
}
@@ -105,33 +96,24 @@ mpz_set_PyIntOrLong(mpz_t z, PyObject *o
}
#endif
- switch (Py_SIZE(templong)) {
- case -1:
- mpz_set_si(z, -(sdigit)templong->ob_digit[0]);
+ len = templong->long_value.lv_tag >> 3;
+ negative = (templong->long_value.lv_tag & 3) == 2;
+
+ switch (len) {
+ case 1:
+ mpz_set_si(z, (sdigit)templong->long_value.ob_digit[0]);
break;
case 0:
mpz_set_si(z, 0);
break;
- case 1:
- mpz_set_si(z, templong->ob_digit[0]);
- break;
default:
- mpz_set_si(z, 0);
-
- if (Py_SIZE(templong) < 0) {
- len = - Py_SIZE(templong);
- negative = 1;
- } else {
- len = Py_SIZE(templong);
- negative = 0;
- }
-
- mpz_import(z, len, -1, sizeof(templong->ob_digit[0]), 0,
- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit);
+ mpz_import(z, len, -1, sizeof(templong->long_value.ob_digit[0]), 0,
+ sizeof(templong->long_value.ob_digit[0])*8 - PyLong_SHIFT,
+ templong->long_value.ob_digit);
+ }
- if (negative) {
- mpz_neg(z, z);
- }
+ if (negative) {
+ mpz_neg(z, z);
}
return;
}
@@ -186,12 +168,7 @@ GMPy_PyLong_From_MPZ(MPZ_Object *obj, CT
/* Assume gmp uses limbs as least as large as the builtin longs do */
- if (mpz_sgn(obj->z) < 0) {
- negative = 1;
- } else {
- negative = 0;
- }
-
+ negative = mpz_sgn(obj->z) < 0;
size = (mpz_sizeinbase(obj->z, 2) + PyLong_SHIFT - 1) / PyLong_SHIFT;
if (!(result = _PyLong_New(size))) {
@@ -200,31 +177,20 @@ GMPy_PyLong_From_MPZ(MPZ_Object *obj, CT
/* LCOV_EXCL_STOP */
}
- mpz_export(result->ob_digit, &count, -1, sizeof(result->ob_digit[0]), 0,
- sizeof(result->ob_digit[0])*8 - PyLong_SHIFT, obj->z);
+ mpz_export(result->long_value.ob_digit, &count, -1, sizeof(result->long_value.ob_digit[0]), 0,
+ sizeof(result->long_value.ob_digit[0])*8 - PyLong_SHIFT, obj->z);
if (count == 0) {
- result->ob_digit[0] = 0;
+ result->long_value.ob_digit[0] = 0;
}
/* long_normalize() is file-static so we must reimplement it */
/* longobjp = long_normalize(longobjp); */
- while ((size>0) && (result->ob_digit[size-1] == 0)) {
+ while ((size>0) && (result->long_value.ob_digit[size-1] == 0)) {
size--;
}
-#if PY_VERSION_HEX >= 0x030900A4
- Py_SET_SIZE(result, size);
-#else
- Py_SIZE(result) = size;
-#endif
- if (negative) {
-#if PY_VERSION_HEX >= 0x030900A4
- Py_SET_SIZE(result, - Py_SIZE(result));
-#else
- Py_SIZE(result) = - Py_SIZE(result);
-#endif
- }
+ result->long_value.lv_tag = (negative?2:(size==0)) | (((size_t)size) << 3);
return (PyObject*)result;
}
@@ -476,33 +442,24 @@ GMPy_XMPZ_From_PyIntOrLong(PyObject *obj
}
#endif
- switch (Py_SIZE(templong)) {
- case -1:
- mpz_set_si(result->z, -(sdigit)templong->ob_digit[0]);
+ len = templong->long_value.lv_tag >> 3;
+ negative = (templong->long_value.lv_tag & 3) == 2;
+
+ switch (len) {
+ case 1:
+ mpz_set_si(result->z, (sdigit)templong->long_value.ob_digit[0]);
break;
case 0:
mpz_set_si(result->z, 0);
break;
- case 1:
- mpz_set_si(result->z, templong->ob_digit[0]);
- break;
default:
- mpz_set_si(result->z, 0);
-
- if (Py_SIZE(templong) < 0) {
- len = - Py_SIZE(templong);
- negative = 1;
- } else {
- len = Py_SIZE(templong);
- negative = 0;
- }
-
- mpz_import(result->z, len, -1, sizeof(templong->ob_digit[0]), 0,
- sizeof(templong->ob_digit[0])*8 - PyLong_SHIFT, templong->ob_digit);
+ mpz_import(result->z, len, -1, sizeof(templong->long_value.ob_digit[0]), 0,
+ sizeof(templong->long_value.ob_digit[0])*8 - PyLong_SHIFT,
+ templong->long_value.ob_digit);
+ }
- if (negative) {
- mpz_neg(result->z, result->z);
- }
+ if (negative) {
+ mpz_neg(result->z, result->z);
}
return result;
}
--- gmpy2-2.1.5/src/gmpy2_convert_utils.c.orig 2022-09-23 22:12:17.000000000 -0600
+++ gmpy2-2.1.5/src/gmpy2_convert_utils.c 2023-06-15 11:02:21.992578057 -0600
@@ -123,7 +123,7 @@ static unsigned long
GMPy_Integer_AsUnsignedLongWithType_v2(PyObject *x, int xtype)
{
if IS_TYPE_PyInteger(xtype) {
- if (Py_SIZE(x) < 0) {
+ if ((((PyLongObject*)x)->long_value.lv_tag & 3) == 2) {
VALUE_ERROR("n must be > 0");
return (unsigned long)-1;
}

View File

@ -7,6 +7,11 @@ License: LGPL-3.0-or-later
URL: https://pypi.python.org/pypi/gmpy2
Source0: %pypi_source gmpy2
# Compatibility with python 3.12. Upstream patch which does not apply cleanly
# to version 2.1.5:
# https://github.com/aleaxit/gmpy/commit/b2236fc26fe48572acdae2c6598be8b02a78edee
Patch0: %{name}-python3.12.patch
BuildRequires: gcc
BuildRequires: gmp-devel
BuildRequires: libmpc-devel
@ -53,7 +58,7 @@ Provides: bundled(js-jquery)
This package contains API documentation for gmpy2.
%prep
%autosetup -n gmpy2-%{version}
%autosetup -n gmpy2-%{version} -p1
# Update the sphinx theme name
sed -i "s/'default'/'classic'/" docs/conf.py
@ -73,7 +78,7 @@ make -C docs html
%pyproject_save_files gmpy2
%check
PYTHONPATH=%{buildroot}%{python3_sitearch} %{python3} test/runtests.py
%{py3_test_envvars} %{python3} test/runtests.py
%files -n python3-gmpy2 -f %{pyproject_files}
@ -81,6 +86,9 @@ PYTHONPATH=%{buildroot}%{python3_sitearch} %{python3} test/runtests.py
%doc docs/_build/html/*
%changelog
* Thu Jun 15 2023 Jerry James <loganjerry@gmail.com> - 2.1.5-3
- Add upstream patch for python 3.12 compatibility
* Wed Jun 14 2023 Python Maint <python-maint@redhat.com> - 2.1.5-3
- Rebuilt for Python 3.12