@@ -484,11 +484,18 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
484
484
do_decref = 1 ;
485
485
}
486
486
if (_PyLong_IsCompact (v )) {
487
- #if SIZEOF_LONG < SIZEOF_VOID_P
488
- intptr_t tmp = _PyLong_CompactValue (v );
489
- res = (long )tmp ;
490
- if (res != tmp ) {
491
- * overflow = tmp < 0 ? -1 : 1 ;
487
+ #if SIZEOF_LONG < SIZEOF_SIZE_T
488
+ Py_ssize_t tmp = _PyLong_CompactValue (v );
489
+ if (tmp < LONG_MIN ) {
490
+ * overflow = -1 ;
491
+ res = -1 ;
492
+ }
493
+ else if (tmp > LONG_MAX ) {
494
+ * overflow = 1 ;
495
+ res = -1 ;
496
+ }
497
+ else {
498
+ res = (long )tmp ;
492
499
}
493
500
#else
494
501
res = _PyLong_CompactValue (v );
@@ -633,14 +640,15 @@ PyLong_AsUnsignedLong(PyObject *vv)
633
640
634
641
v = (PyLongObject * )vv ;
635
642
if (_PyLong_IsNonNegativeCompact (v )) {
636
- #if SIZEOF_LONG < SIZEOF_VOID_P
637
- intptr_t tmp = _PyLong_CompactValue (v );
643
+ #if SIZEOF_LONG < SIZEOF_SIZE_T
644
+ size_t tmp = ( size_t ) _PyLong_CompactValue (v );
638
645
unsigned long res = (unsigned long )tmp ;
639
646
if (res != tmp ) {
640
647
goto overflow ;
641
648
}
649
+ return res ;
642
650
#else
643
- return _PyLong_CompactValue (v );
651
+ return ( unsigned long )( size_t ) _PyLong_CompactValue (v );
644
652
#endif
645
653
}
646
654
if (_PyLong_IsNegative (v )) {
@@ -686,7 +694,7 @@ PyLong_AsSize_t(PyObject *vv)
686
694
687
695
v = (PyLongObject * )vv ;
688
696
if (_PyLong_IsNonNegativeCompact (v )) {
689
- return _PyLong_CompactValue (v );
697
+ return ( size_t ) _PyLong_CompactValue (v );
690
698
}
691
699
if (_PyLong_IsNegative (v )) {
692
700
PyErr_SetString (PyExc_OverflowError ,
@@ -723,7 +731,11 @@ _PyLong_AsUnsignedLongMask(PyObject *vv)
723
731
}
724
732
v = (PyLongObject * )vv ;
725
733
if (_PyLong_IsCompact (v )) {
726
- return (unsigned long )_PyLong_CompactValue (v );
734
+ #if SIZEOF_LONG < SIZEOF_SIZE_T
735
+ return (unsigned long )(size_t )_PyLong_CompactValue (v );
736
+ #else
737
+ return (unsigned long )(long )_PyLong_CompactValue (v );
738
+ #endif
727
739
}
728
740
i = _PyLong_DigitCount (v );
729
741
int sign = _PyLong_NonCompactSign (v );
@@ -1267,7 +1279,18 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
1267
1279
v = (PyLongObject * )vv ;
1268
1280
if (_PyLong_IsNonNegativeCompact (v )) {
1269
1281
res = 0 ;
1270
- bytes = _PyLong_CompactValue (v );
1282
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1283
+ size_t tmp = (size_t )_PyLong_CompactValue (v );
1284
+ bytes = (unsigned long long )tmp ;
1285
+ if (bytes != tmp ) {
1286
+ PyErr_SetString (PyExc_OverflowError ,
1287
+ "Python int too large to convert "
1288
+ "to C unsigned long long" );
1289
+ res = -1 ;
1290
+ }
1291
+ #else
1292
+ bytes = (unsigned long long )(size_t )_PyLong_CompactValue (v );
1293
+ #endif
1271
1294
}
1272
1295
else {
1273
1296
res = _PyLong_AsByteArray ((PyLongObject * )vv , (unsigned char * )& bytes ,
@@ -1298,7 +1321,11 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv)
1298
1321
}
1299
1322
v = (PyLongObject * )vv ;
1300
1323
if (_PyLong_IsCompact (v )) {
1301
- return (unsigned long long )(signed long long )_PyLong_CompactValue (v );
1324
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1325
+ return (unsigned long long )(size_t )_PyLong_CompactValue (v );
1326
+ #else
1327
+ return (unsigned long long )(long long )_PyLong_CompactValue (v );
1328
+ #endif
1302
1329
}
1303
1330
i = _PyLong_DigitCount (v );
1304
1331
sign = _PyLong_NonCompactSign (v );
@@ -1370,7 +1397,22 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
1370
1397
do_decref = 1 ;
1371
1398
}
1372
1399
if (_PyLong_IsCompact (v )) {
1400
+ #if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1401
+ Py_ssize_t tmp = _PyLong_CompactValue (v );
1402
+ if (tmp < LLONG_MIN ) {
1403
+ * overflow = -1 ;
1404
+ res = -1 ;
1405
+ }
1406
+ else if (tmp > LLONG_MAX ) {
1407
+ * overflow = 1 ;
1408
+ res = -1 ;
1409
+ }
1410
+ else {
1411
+ res = (long long )tmp ;
1412
+ }
1413
+ #else
1373
1414
res = _PyLong_CompactValue (v );
1415
+ #endif
1374
1416
}
1375
1417
else {
1376
1418
i = _PyLong_DigitCount (v );
@@ -3308,7 +3350,7 @@ long_hash(PyLongObject *v)
3308
3350
int sign ;
3309
3351
3310
3352
if (_PyLong_IsCompact (v )) {
3311
- x = _PyLong_CompactValue (v );
3353
+ x = ( Py_uhash_t ) _PyLong_CompactValue (v );
3312
3354
if (x == (Py_uhash_t )- 1 ) {
3313
3355
x = (Py_uhash_t )- 2 ;
3314
3356
}
0 commit comments