Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0c05044

Browse files
gh-121153: Fix some errors with use of _PyLong_CompactValue()
* The result has type Py_ssize_t, not intptr_t. * Type cast between unsigned and signdet integer types should be explicit. * Downcasting should be explicit.
1 parent 2cb84b1 commit 0c05044

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

Objects/longobject.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,8 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
483483
do_decref = 1;
484484
}
485485
if (_PyLong_IsCompact(v)) {
486-
#if SIZEOF_LONG < SIZEOF_VOID_P
487-
intptr_t tmp = _PyLong_CompactValue(v);
486+
#if SIZEOF_LONG < SIZEOF_SIZE_T
487+
Py_ssize_t tmp = _PyLong_CompactValue(v);
488488
res = (long)tmp;
489489
if (res != tmp) {
490490
*overflow = tmp < 0 ? -1 : 1;
@@ -632,14 +632,14 @@ PyLong_AsUnsignedLong(PyObject *vv)
632632

633633
v = (PyLongObject *)vv;
634634
if (_PyLong_IsNonNegativeCompact(v)) {
635-
#if SIZEOF_LONG < SIZEOF_VOID_P
636-
intptr_t tmp = _PyLong_CompactValue(v);
635+
#if SIZEOF_LONG < SIZEOF_SIZE_T
636+
Py_ssize_t tmp = _PyLong_CompactValue(v);
637637
unsigned long res = (unsigned long)tmp;
638638
if (res != tmp) {
639639
goto overflow;
640640
}
641641
#else
642-
return _PyLong_CompactValue(v);
642+
return (unsigned long)(size_t)_PyLong_CompactValue(v);
643643
#endif
644644
}
645645
if (_PyLong_IsNegative(v)) {
@@ -685,7 +685,7 @@ PyLong_AsSize_t(PyObject *vv)
685685

686686
v = (PyLongObject *)vv;
687687
if (_PyLong_IsNonNegativeCompact(v)) {
688-
return _PyLong_CompactValue(v);
688+
return (size_t)_PyLong_CompactValue(v);
689689
}
690690
if (_PyLong_IsNegative(v)) {
691691
PyErr_SetString(PyExc_OverflowError,
@@ -722,7 +722,7 @@ _PyLong_AsUnsignedLongMask(PyObject *vv)
722722
}
723723
v = (PyLongObject *)vv;
724724
if (_PyLong_IsCompact(v)) {
725-
return (unsigned long)_PyLong_CompactValue(v);
725+
return (unsigned long)(size_t)_PyLong_CompactValue(v);
726726
}
727727
i = _PyLong_DigitCount(v);
728728
int sign = _PyLong_NonCompactSign(v);
@@ -1540,7 +1540,7 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
15401540
v = (PyLongObject*)vv;
15411541
if (_PyLong_IsNonNegativeCompact(v)) {
15421542
res = 0;
1543-
bytes = _PyLong_CompactValue(v);
1543+
bytes = (unsigned long long)(size_t)_PyLong_CompactValue(v);
15441544
}
15451545
else {
15461546
res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes,
@@ -1571,7 +1571,7 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv)
15711571
}
15721572
v = (PyLongObject *)vv;
15731573
if (_PyLong_IsCompact(v)) {
1574-
return (unsigned long long)(signed long long)_PyLong_CompactValue(v);
1574+
return (unsigned long long)(size_t)_PyLong_CompactValue(v);
15751575
}
15761576
i = _PyLong_DigitCount(v);
15771577
sign = _PyLong_NonCompactSign(v);
@@ -3579,7 +3579,7 @@ long_hash(PyLongObject *v)
35793579
int sign;
35803580

35813581
if (_PyLong_IsCompact(v)) {
3582-
x = _PyLong_CompactValue(v);
3582+
x = (Py_uhash_t)(size_t)_PyLong_CompactValue(v);
35833583
if (x == (Py_uhash_t)-1) {
35843584
x = (Py_uhash_t)-2;
35853585
}

0 commit comments

Comments
 (0)