@@ -332,49 +332,51 @@ _PyLong_Negate(PyLongObject **x_p)
332
332
Py_DECREF (x );
333
333
}
334
334
335
+ #define PYLONG_FROM_INT (UINT_TYPE , INT_TYPE , ival ) \
336
+ do { \
337
+ /* Handle small and medium cases. */ \
338
+ if (IS_SMALL_INT (ival )) { \
339
+ return get_small_int ((sdigit )(ival )); \
340
+ } \
341
+ if (- (INT_TYPE )PyLong_MASK <= (ival ) && (ival ) <= (INT_TYPE )PyLong_MASK ) { \
342
+ return _PyLong_FromMedium ((sdigit )(ival )); \
343
+ } \
344
+ UINT_TYPE abs_ival = (ival ) < 0 ? 0U - (UINT_TYPE )(ival ) : (UINT_TYPE )(ival ); \
345
+ /* Do shift in two steps to avoid possible undefined behavior. */ \
346
+ UINT_TYPE t = abs_ival >> PyLong_SHIFT >> PyLong_SHIFT ; \
347
+ /* Count digits (at least two - smaller cases were handled above). */ \
348
+ Py_ssize_t ndigits = 2 ; \
349
+ while (t ) { \
350
+ ++ ndigits ; \
351
+ t >>= PyLong_SHIFT ; \
352
+ } \
353
+ /* Construct output value. */ \
354
+ PyLongObject * v = long_alloc (ndigits ); \
355
+ if (v == NULL ) { \
356
+ return NULL ; \
357
+ } \
358
+ digit * p = v -> long_value .ob_digit ; \
359
+ _PyLong_SetSignAndDigitCount (v , (ival ) < 0 ? -1 : 1 , ndigits ); \
360
+ t = abs_ival ; \
361
+ while (t ) { \
362
+ * p ++ = (digit )(t & PyLong_MASK ); \
363
+ t >>= PyLong_SHIFT ; \
364
+ } \
365
+ return (PyObject * )v ; \
366
+ } while (0 )
367
+
368
+
335
369
/* Create a new int object from a C long int */
336
370
337
371
PyObject *
338
372
PyLong_FromLong (long ival )
339
373
{
340
- PyLongObject * v ;
341
- unsigned long abs_ival , t ;
342
- int ndigits ;
343
-
344
- /* Handle small and medium cases. */
345
- if (IS_SMALL_INT (ival )) {
346
- return get_small_int ((sdigit )ival );
347
- }
348
- if (- (long )PyLong_MASK <= ival && ival <= (long )PyLong_MASK ) {
349
- return _PyLong_FromMedium ((sdigit )ival );
350
- }
351
-
352
- /* Count digits (at least two - smaller cases were handled above). */
353
- abs_ival = ival < 0 ? 0U - (unsigned long )ival : (unsigned long )ival ;
354
- /* Do shift in two steps to avoid possible undefined behavior. */
355
- t = abs_ival >> PyLong_SHIFT >> PyLong_SHIFT ;
356
- ndigits = 2 ;
357
- while (t ) {
358
- ++ ndigits ;
359
- t >>= PyLong_SHIFT ;
360
- }
361
-
362
- /* Construct output value. */
363
- v = long_alloc (ndigits );
364
- if (v != NULL ) {
365
- digit * p = v -> long_value .ob_digit ;
366
- _PyLong_SetSignAndDigitCount (v , ival < 0 ? -1 : 1 , ndigits );
367
- t = abs_ival ;
368
- while (t ) {
369
- * p ++ = (digit )(t & PyLong_MASK );
370
- t >>= PyLong_SHIFT ;
371
- }
372
- }
373
- return (PyObject * )v ;
374
+ PYLONG_FROM_INT (unsigned long, long , ival );
374
375
}
375
376
376
377
#define PYLONG_FROM_UINT (INT_TYPE , ival ) \
377
378
do { \
379
+ /* Handle small and medium cases. */ \
378
380
if (IS_SMALL_UINT (ival )) { \
379
381
return get_small_int ((sdigit )(ival )); \
380
382
} \
@@ -383,12 +385,13 @@ PyLong_FromLong(long ival)
383
385
} \
384
386
/* Do shift in two steps to avoid possible undefined behavior. */ \
385
387
INT_TYPE t = (ival ) >> PyLong_SHIFT >> PyLong_SHIFT ; \
386
- /* Count the number of Python digits . */ \
388
+ /* Count digits (at least two - smaller cases were handled above) . */ \
387
389
Py_ssize_t ndigits = 2 ; \
388
390
while (t ) { \
389
391
++ ndigits ; \
390
392
t >>= PyLong_SHIFT ; \
391
393
} \
394
+ /* Construct output value. */ \
392
395
PyLongObject * v = long_alloc (ndigits ); \
393
396
if (v == NULL ) { \
394
397
return NULL ; \
@@ -1482,83 +1485,15 @@ PyLong_AsVoidPtr(PyObject *vv)
1482
1485
PyObject *
1483
1486
PyLong_FromLongLong (long long ival )
1484
1487
{
1485
- PyLongObject * v ;
1486
- unsigned long long abs_ival , t ;
1487
- int ndigits ;
1488
-
1489
- /* Handle small and medium cases. */
1490
- if (IS_SMALL_INT (ival )) {
1491
- return get_small_int ((sdigit )ival );
1492
- }
1493
- if (- (long long )PyLong_MASK <= ival && ival <= (long long )PyLong_MASK ) {
1494
- return _PyLong_FromMedium ((sdigit )ival );
1495
- }
1496
-
1497
- /* Count digits (at least two - smaller cases were handled above). */
1498
- abs_ival = ival < 0 ? 0U - (unsigned long long )ival : (unsigned long long )ival ;
1499
- /* Do shift in two steps to avoid possible undefined behavior. */
1500
- t = abs_ival >> PyLong_SHIFT >> PyLong_SHIFT ;
1501
- ndigits = 2 ;
1502
- while (t ) {
1503
- ++ ndigits ;
1504
- t >>= PyLong_SHIFT ;
1505
- }
1506
-
1507
- /* Construct output value. */
1508
- v = long_alloc (ndigits );
1509
- if (v != NULL ) {
1510
- digit * p = v -> long_value .ob_digit ;
1511
- _PyLong_SetSignAndDigitCount (v , ival < 0 ? -1 : 1 , ndigits );
1512
- t = abs_ival ;
1513
- while (t ) {
1514
- * p ++ = (digit )(t & PyLong_MASK );
1515
- t >>= PyLong_SHIFT ;
1516
- }
1517
- }
1518
- return (PyObject * )v ;
1488
+ PYLONG_FROM_INT (unsigned long long, long long, ival );
1519
1489
}
1520
1490
1521
1491
/* Create a new int object from a C Py_ssize_t. */
1522
1492
1523
1493
PyObject *
1524
1494
PyLong_FromSsize_t (Py_ssize_t ival )
1525
1495
{
1526
- PyLongObject * v ;
1527
- size_t abs_ival ;
1528
- size_t t ; /* unsigned so >> doesn't propagate sign bit */
1529
- int ndigits = 0 ;
1530
- int negative = 0 ;
1531
-
1532
- if (IS_SMALL_INT (ival )) {
1533
- return get_small_int ((sdigit )ival );
1534
- }
1535
-
1536
- if (ival < 0 ) {
1537
- /* avoid signed overflow when ival = SIZE_T_MIN */
1538
- abs_ival = (size_t )(-1 - ival )+ 1 ;
1539
- negative = 1 ;
1540
- }
1541
- else {
1542
- abs_ival = (size_t )ival ;
1543
- }
1544
-
1545
- /* Count the number of Python digits. */
1546
- t = abs_ival ;
1547
- while (t ) {
1548
- ++ ndigits ;
1549
- t >>= PyLong_SHIFT ;
1550
- }
1551
- v = long_alloc (ndigits );
1552
- if (v != NULL ) {
1553
- digit * p = v -> long_value .ob_digit ;
1554
- _PyLong_SetSignAndDigitCount (v , negative ? -1 : 1 , ndigits );
1555
- t = abs_ival ;
1556
- while (t ) {
1557
- * p ++ = (digit )(t & PyLong_MASK );
1558
- t >>= PyLong_SHIFT ;
1559
- }
1560
- }
1561
- return (PyObject * )v ;
1496
+ PYLONG_FROM_INT (size_t , Py_ssize_t , ival );
1562
1497
}
1563
1498
1564
1499
/* Get a C long long int from an int object or any object that has an
0 commit comments