@@ -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,19 @@ 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
+ bytes = (unsigned long long )(size_t )_PyLong_CompactValue (v );
1551
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1552
+ size_t tmp = (size_t )_PyLong_CompactValue (v );
1553
+ bytes = (unsigned long long )tmp ;
1554
+ if (bytes != tmp ) {
1555
+ PyErr_SetString (PyExc_OverflowError ,
1556
+ "Python int too large to convert "
1557
+ "to C unsigned long long" );
1558
+ res = -1 ;
1559
+ }
1560
+ #else
1561
+ bytes = (unsigned long long )(size_t )_PyLong_CompactValue (v );
1562
+ #endif
1544
1563
}
1545
1564
else {
1546
1565
res = _PyLong_AsByteArray ((PyLongObject * )vv , (unsigned char * )& bytes ,
@@ -1571,7 +1590,11 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv)
1571
1590
}
1572
1591
v = (PyLongObject * )vv ;
1573
1592
if (_PyLong_IsCompact (v )) {
1574
- return (unsigned long long )(signed long long )_PyLong_CompactValue (v );
1593
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1594
+ return (unsigned long long )(size_t )_PyLong_CompactValue (v );
1595
+ #else
1596
+ return (unsigned long long )(long long )_PyLong_CompactValue (v );
1597
+ #endif
1575
1598
}
1576
1599
i = _PyLong_DigitCount (v );
1577
1600
sign = _PyLong_NonCompactSign (v );
@@ -1643,7 +1666,18 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
1643
1666
do_decref = 1 ;
1644
1667
}
1645
1668
if (_PyLong_IsCompact (v )) {
1669
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1670
+ Py_ssize_t tmp = _PyLong_CompactValue (v );
1671
+ if ((unsigned long long )(size_t )tmp != (size_t )tmp ) {
1672
+ * overflow = tmp < 0 ? -1 : 1 ;
1673
+ res = -1 ;
1674
+ }
1675
+ else {
1676
+ res = (long long )tmp ;
1677
+ }
1678
+ #else
1646
1679
res = _PyLong_CompactValue (v );
1680
+ #endif
1647
1681
}
1648
1682
else {
1649
1683
i = _PyLong_DigitCount (v );
@@ -3579,7 +3613,7 @@ long_hash(PyLongObject *v)
3579
3613
int sign ;
3580
3614
3581
3615
if (_PyLong_IsCompact (v )) {
3582
- x = _PyLong_CompactValue (v );
3616
+ x = ( Py_uhash_t ) _PyLong_CompactValue (v );
3583
3617
if (x == (Py_uhash_t )- 1 ) {
3584
3618
x = (Py_uhash_t )- 2 ;
3585
3619
}
0 commit comments