@@ -483,11 +483,18 @@ 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 ) {
490
- * overflow = tmp < 0 ? -1 : 1 ;
486
+ #if SIZEOF_LONG < SIZEOF_SIZE_T
487
+ Py_ssize_t tmp = _PyLong_CompactValue (v );
488
+ if (tmp < LONG_MIN ) {
489
+ * overflow = -1 ;
490
+ res = -1 ;
491
+ }
492
+ else if (tmp > LONG_MAX ) {
493
+ * overflow = 1 ;
494
+ res = -1 ;
495
+ }
496
+ else {
497
+ res = (long )tmp ;
491
498
}
492
499
#else
493
500
res = _PyLong_CompactValue (v );
@@ -632,14 +639,15 @@ PyLong_AsUnsignedLong(PyObject *vv)
632
639
633
640
v = (PyLongObject * )vv ;
634
641
if (_PyLong_IsNonNegativeCompact (v )) {
635
- #if SIZEOF_LONG < SIZEOF_VOID_P
636
- intptr_t tmp = _PyLong_CompactValue (v );
642
+ #if SIZEOF_LONG < SIZEOF_SIZE_T
643
+ size_t tmp = ( size_t ) _PyLong_CompactValue (v );
637
644
unsigned long res = (unsigned long )tmp ;
638
645
if (res != tmp ) {
639
646
goto overflow ;
640
647
}
648
+ return res ;
641
649
#else
642
- return _PyLong_CompactValue (v );
650
+ return ( unsigned long )( size_t ) _PyLong_CompactValue (v );
643
651
#endif
644
652
}
645
653
if (_PyLong_IsNegative (v )) {
@@ -685,7 +693,7 @@ PyLong_AsSize_t(PyObject *vv)
685
693
686
694
v = (PyLongObject * )vv ;
687
695
if (_PyLong_IsNonNegativeCompact (v )) {
688
- return _PyLong_CompactValue (v );
696
+ return ( size_t ) _PyLong_CompactValue (v );
689
697
}
690
698
if (_PyLong_IsNegative (v )) {
691
699
PyErr_SetString (PyExc_OverflowError ,
@@ -722,7 +730,11 @@ _PyLong_AsUnsignedLongMask(PyObject *vv)
722
730
}
723
731
v = (PyLongObject * )vv ;
724
732
if (_PyLong_IsCompact (v )) {
725
- return (unsigned long )_PyLong_CompactValue (v );
733
+ #if SIZEOF_LONG < SIZEOF_SIZE_T
734
+ return (unsigned long )(size_t )_PyLong_CompactValue (v );
735
+ #else
736
+ return (unsigned long )(long )_PyLong_CompactValue (v );
737
+ #endif
726
738
}
727
739
i = _PyLong_DigitCount (v );
728
740
int sign = _PyLong_NonCompactSign (v );
@@ -1528,7 +1540,18 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
1528
1540
v = (PyLongObject * )vv ;
1529
1541
if (_PyLong_IsNonNegativeCompact (v )) {
1530
1542
res = 0 ;
1531
- bytes = _PyLong_CompactValue (v );
1543
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1544
+ size_t tmp = (size_t )_PyLong_CompactValue (v );
1545
+ bytes = (unsigned long long )tmp ;
1546
+ if (bytes != tmp ) {
1547
+ PyErr_SetString (PyExc_OverflowError ,
1548
+ "Python int too large to convert "
1549
+ "to C unsigned long long" );
1550
+ res = -1 ;
1551
+ }
1552
+ #else
1553
+ bytes = (unsigned long long )(size_t )_PyLong_CompactValue (v );
1554
+ #endif
1532
1555
}
1533
1556
else {
1534
1557
res = _PyLong_AsByteArray ((PyLongObject * )vv , (unsigned char * )& bytes ,
@@ -1559,7 +1582,11 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv)
1559
1582
}
1560
1583
v = (PyLongObject * )vv ;
1561
1584
if (_PyLong_IsCompact (v )) {
1562
- return (unsigned long long )(signed long long )_PyLong_CompactValue (v );
1585
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1586
+ return (unsigned long long )(size_t )_PyLong_CompactValue (v );
1587
+ #else
1588
+ return (unsigned long long )(long long )_PyLong_CompactValue (v );
1589
+ #endif
1563
1590
}
1564
1591
i = _PyLong_DigitCount (v );
1565
1592
sign = _PyLong_NonCompactSign (v );
@@ -1631,7 +1658,22 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
1631
1658
do_decref = 1 ;
1632
1659
}
1633
1660
if (_PyLong_IsCompact (v )) {
1661
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1662
+ Py_ssize_t tmp = _PyLong_CompactValue (v );
1663
+ if (tmp < LLONG_MIN ) {
1664
+ * overflow = -1 ;
1665
+ res = -1 ;
1666
+ }
1667
+ else if (tmp > LLONG_MAX ) {
1668
+ * overflow = 1 ;
1669
+ res = -1 ;
1670
+ }
1671
+ else {
1672
+ res = (long long )tmp ;
1673
+ }
1674
+ #else
1634
1675
res = _PyLong_CompactValue (v );
1676
+ #endif
1635
1677
}
1636
1678
else {
1637
1679
i = _PyLong_DigitCount (v );
@@ -3568,7 +3610,7 @@ long_hash(PyLongObject *v)
3568
3610
int sign ;
3569
3611
3570
3612
if (_PyLong_IsCompact (v )) {
3571
- x = _PyLong_CompactValue (v );
3613
+ x = ( Py_uhash_t ) _PyLong_CompactValue (v );
3572
3614
if (x == (Py_uhash_t )- 1 ) {
3573
3615
x = (Py_uhash_t )- 2 ;
3574
3616
}
0 commit comments