@@ -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 );
@@ -1540,7 +1552,18 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
1540
1552
v = (PyLongObject * )vv ;
1541
1553
if (_PyLong_IsNonNegativeCompact (v )) {
1542
1554
res = 0 ;
1543
- bytes = _PyLong_CompactValue (v );
1555
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1556
+ size_t tmp = (size_t )_PyLong_CompactValue (v );
1557
+ bytes = (unsigned long long )tmp ;
1558
+ if (bytes != tmp ) {
1559
+ PyErr_SetString (PyExc_OverflowError ,
1560
+ "Python int too large to convert "
1561
+ "to C unsigned long long" );
1562
+ res = -1 ;
1563
+ }
1564
+ #else
1565
+ bytes = (unsigned long long )(size_t )_PyLong_CompactValue (v );
1566
+ #endif
1544
1567
}
1545
1568
else {
1546
1569
res = _PyLong_AsByteArray ((PyLongObject * )vv , (unsigned char * )& bytes ,
@@ -1571,7 +1594,11 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv)
1571
1594
}
1572
1595
v = (PyLongObject * )vv ;
1573
1596
if (_PyLong_IsCompact (v )) {
1574
- return (unsigned long long )(signed long long )_PyLong_CompactValue (v );
1597
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1598
+ return (unsigned long long )(size_t )_PyLong_CompactValue (v );
1599
+ #else
1600
+ return (unsigned long long )(long long )_PyLong_CompactValue (v );
1601
+ #endif
1575
1602
}
1576
1603
i = _PyLong_DigitCount (v );
1577
1604
sign = _PyLong_NonCompactSign (v );
@@ -1643,7 +1670,22 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
1643
1670
do_decref = 1 ;
1644
1671
}
1645
1672
if (_PyLong_IsCompact (v )) {
1673
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1674
+ Py_ssize_t tmp = _PyLong_CompactValue (v );
1675
+ if (tmp < LLONG_MIN ) {
1676
+ * overflow = -1 ;
1677
+ res = -1 ;
1678
+ }
1679
+ else if (tmp > LLONG_MAX ) {
1680
+ * overflow = 1 ;
1681
+ res = -1 ;
1682
+ }
1683
+ else {
1684
+ res = (long long )tmp ;
1685
+ }
1686
+ #else
1646
1687
res = _PyLong_CompactValue (v );
1688
+ #endif
1647
1689
}
1648
1690
else {
1649
1691
i = _PyLong_DigitCount (v );
@@ -3579,7 +3621,7 @@ long_hash(PyLongObject *v)
3579
3621
int sign ;
3580
3622
3581
3623
if (_PyLong_IsCompact (v )) {
3582
- x = _PyLong_CompactValue (v );
3624
+ x = ( Py_uhash_t ) _PyLong_CompactValue (v );
3583
3625
if (x == (Py_uhash_t )- 1 ) {
3584
3626
x = (Py_uhash_t )- 2 ;
3585
3627
}
0 commit comments