@@ -483,11 +483,14 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
483
483
do_decref = 1 ;
484
484
}
485
485
if (_PyLong_IsCompact (v )) {
486
- #if SIZEOF_LONG < SIZEOF_VOID_P
487
- intptr_t tmp = _PyLong_CompactValue (v );
488
- res = (long )tmp ;
489
- if (res != tmp ) {
486
+ #if SIZEOF_LONG < SIZEOF_SIZE_T
487
+ Py_ssize_t tmp = _PyLong_CompactValue (v );
488
+ if ((unsigned long )(size_t )tmp != (size_t )tmp ) {
490
489
* overflow = tmp < 0 ? -1 : 1 ;
490
+ res = -1 ;
491
+ }
492
+ else {
493
+ res = (long )tmp ;
491
494
}
492
495
#else
493
496
res = _PyLong_CompactValue (v );
@@ -632,14 +635,14 @@ PyLong_AsUnsignedLong(PyObject *vv)
632
635
633
636
v = (PyLongObject * )vv ;
634
637
if (_PyLong_IsNonNegativeCompact (v )) {
635
- #if SIZEOF_LONG < SIZEOF_VOID_P
636
- intptr_t tmp = _PyLong_CompactValue (v );
638
+ #if SIZEOF_LONG < SIZEOF_SIZE_T
639
+ size_t tmp = ( size_t ) _PyLong_CompactValue (v );
637
640
unsigned long res = (unsigned long )tmp ;
638
641
if (res != tmp ) {
639
642
goto overflow ;
640
643
}
641
644
#else
642
- return _PyLong_CompactValue (v );
645
+ return ( unsigned long )( size_t ) _PyLong_CompactValue (v );
643
646
#endif
644
647
}
645
648
if (_PyLong_IsNegative (v )) {
@@ -685,7 +688,7 @@ PyLong_AsSize_t(PyObject *vv)
685
688
686
689
v = (PyLongObject * )vv ;
687
690
if (_PyLong_IsNonNegativeCompact (v )) {
688
- return _PyLong_CompactValue (v );
691
+ return ( size_t ) _PyLong_CompactValue (v );
689
692
}
690
693
if (_PyLong_IsNegative (v )) {
691
694
PyErr_SetString (PyExc_OverflowError ,
@@ -722,7 +725,11 @@ _PyLong_AsUnsignedLongMask(PyObject *vv)
722
725
}
723
726
v = (PyLongObject * )vv ;
724
727
if (_PyLong_IsCompact (v )) {
725
- return (unsigned long )_PyLong_CompactValue (v );
728
+ #if SIZEOF_LONG < SIZEOF_SIZE_T
729
+ return (unsigned long )(size_t )_PyLong_CompactValue (v );
730
+ #else
731
+ return (unsigned long )(long )_PyLong_CompactValue (v );
732
+ #endif
726
733
}
727
734
i = _PyLong_DigitCount (v );
728
735
int sign = _PyLong_NonCompactSign (v );
@@ -1540,7 +1547,18 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
1540
1547
v = (PyLongObject * )vv ;
1541
1548
if (_PyLong_IsNonNegativeCompact (v )) {
1542
1549
res = 0 ;
1543
- bytes = _PyLong_CompactValue (v );
1550
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1551
+ size_t tmp = (size_t )_PyLong_CompactValue (v );
1552
+ bytes = (unsigned long long )tmp ;
1553
+ if (bytes != tmp ) {
1554
+ PyErr_SetString (PyExc_OverflowError ,
1555
+ "Python int too large to convert "
1556
+ "to C unsigned long long" );
1557
+ res = -1 ;
1558
+ }
1559
+ #else
1560
+ bytes = (unsigned long long )(size_t )_PyLong_CompactValue (v );
1561
+ #endif
1544
1562
}
1545
1563
else {
1546
1564
res = _PyLong_AsByteArray ((PyLongObject * )vv , (unsigned char * )& bytes ,
@@ -1571,7 +1589,11 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv)
1571
1589
}
1572
1590
v = (PyLongObject * )vv ;
1573
1591
if (_PyLong_IsCompact (v )) {
1574
- return (unsigned long long )(signed long long )_PyLong_CompactValue (v );
1592
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1593
+ return (unsigned long long )(size_t )_PyLong_CompactValue (v );
1594
+ #else
1595
+ return (unsigned long long )(long long )_PyLong_CompactValue (v );
1596
+ #endif
1575
1597
}
1576
1598
i = _PyLong_DigitCount (v );
1577
1599
sign = _PyLong_NonCompactSign (v );
@@ -1643,7 +1665,18 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
1643
1665
do_decref = 1 ;
1644
1666
}
1645
1667
if (_PyLong_IsCompact (v )) {
1668
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1669
+ Py_ssize_t tmp = _PyLong_CompactValue (v );
1670
+ if ((unsigned long long )(size_t )tmp != (size_t )tmp ) {
1671
+ * overflow = tmp < 0 ? -1 : 1 ;
1672
+ res = -1 ;
1673
+ }
1674
+ else {
1675
+ res = (long long )tmp ;
1676
+ }
1677
+ #else
1646
1678
res = _PyLong_CompactValue (v );
1679
+ #endif
1647
1680
}
1648
1681
else {
1649
1682
i = _PyLong_DigitCount (v );
@@ -3579,7 +3612,7 @@ long_hash(PyLongObject *v)
3579
3612
int sign ;
3580
3613
3581
3614
if (_PyLong_IsCompact (v )) {
3582
- x = _PyLong_CompactValue (v );
3615
+ x = ( Py_uhash_t ) _PyLong_CompactValue (v );
3583
3616
if (x == (Py_uhash_t )- 1 ) {
3584
3617
x = (Py_uhash_t )- 2 ;
3585
3618
}
0 commit comments