@@ -272,44 +272,40 @@ _PyLong_Negate(PyLongObject **x_p)
272
272
}
273
273
274
274
/* Create a new int object from a C long int */
275
+
275
276
PyObject *
276
277
PyLong_FromLong (long ival )
277
278
{
279
+ PyLongObject * v ;
280
+ unsigned long abs_ival , t ;
281
+ int ndigits ;
282
+
283
+ /* Handle small and medium cases. */
278
284
if (IS_SMALL_INT (ival )) {
279
285
return get_small_int ((sdigit )ival );
280
286
}
281
- unsigned long abs_ival ;
282
- int sign ;
283
- if (ival < 0 ) {
284
- /* negate: can't write this as abs_ival = -ival since that
285
- invokes undefined behaviour when ival is LONG_MIN */
286
- abs_ival = 0U - (twodigits )ival ;
287
- sign = -1 ;
288
- }
289
- else {
290
- abs_ival = (unsigned long )ival ;
291
- sign = 1 ;
292
- }
293
- /* Fast path for single-digit ints */
294
- if (!(abs_ival >> PyLong_SHIFT )) {
287
+ if (- (long )PyLong_MASK <= ival && ival <= (long )PyLong_MASK ) {
295
288
return _PyLong_FromMedium ((sdigit )ival );
296
289
}
297
- /* Must be at least two digits.
298
- * Do shift in two steps to avoid undefined behavior. */
299
- unsigned long t = (abs_ival >> PyLong_SHIFT ) >> PyLong_SHIFT ;
300
- Py_ssize_t ndigits = 2 ;
290
+
291
+ /* Count digits (at least two - smaller cases were handled above). */
292
+ abs_ival = ival < 0 ? 0U - (unsigned long )ival : (unsigned long )ival ;
293
+ /* Do shift in two steps to avoid possible undefined behavior. */
294
+ t = abs_ival >> PyLong_SHIFT >> PyLong_SHIFT ;
295
+ ndigits = 2 ;
301
296
while (t ) {
302
297
++ ndigits ;
303
298
t >>= PyLong_SHIFT ;
304
299
}
305
- PyLongObject * v = _PyLong_New (ndigits );
300
+
301
+ /* Construct output value. */
302
+ v = _PyLong_New (ndigits );
306
303
if (v != NULL ) {
307
304
digit * p = v -> ob_digit ;
308
- Py_SET_SIZE (v , ndigits * sign );
305
+ Py_SET_SIZE (v , ival < 0 ? - ndigits : ndigits );
309
306
t = abs_ival ;
310
307
while (t ) {
311
- * p ++ = Py_SAFE_DOWNCAST (
312
- t & PyLong_MASK , unsigned long , digit );
308
+ * p ++ = (digit )(t & PyLong_MASK );
313
309
t >>= PyLong_SHIFT ;
314
310
}
315
311
}
@@ -1105,38 +1101,32 @@ PyObject *
1105
1101
PyLong_FromLongLong (long long ival )
1106
1102
{
1107
1103
PyLongObject * v ;
1108
- unsigned long long abs_ival ;
1109
- unsigned long long t ; /* unsigned so >> doesn't propagate sign bit */
1110
- int ndigits = 0 ;
1111
- int negative = 0 ;
1104
+ unsigned long long abs_ival , t ;
1105
+ int ndigits ;
1112
1106
1107
+ /* Handle small and medium cases. */
1113
1108
if (IS_SMALL_INT (ival )) {
1114
1109
return get_small_int ((sdigit )ival );
1115
1110
}
1116
-
1117
- if (ival < 0 ) {
1118
- /* avoid signed overflow on negation; see comments
1119
- in PyLong_FromLong above. */
1120
- abs_ival = (unsigned long long )(-1 - ival ) + 1 ;
1121
- negative = 1 ;
1122
- }
1123
- else {
1124
- abs_ival = (unsigned long long )ival ;
1111
+ if (- (long long )PyLong_MASK <= ival && ival <= (long long )PyLong_MASK ) {
1112
+ return _PyLong_FromMedium ((sdigit )ival );
1125
1113
}
1126
1114
1127
- /* Count the number of Python digits.
1128
- We used to pick 5 ("big enough for anything"), but that's a
1129
- waste of time and space given that 5*15 = 75 bits are rarely
1130
- needed. */
1131
- t = abs_ival ;
1115
+ /* Count digits (at least two - smaller cases were handled above). */
1116
+ abs_ival = ival < 0 ? 0U - ( unsigned long long ) ival : ( unsigned long long ) ival ;
1117
+ /* Do shift in two steps to avoid possible undefined behavior. */
1118
+ t = abs_ival >> PyLong_SHIFT >> PyLong_SHIFT ;
1119
+ ndigits = 2 ;
1132
1120
while (t ) {
1133
1121
++ ndigits ;
1134
1122
t >>= PyLong_SHIFT ;
1135
1123
}
1124
+
1125
+ /* Construct output value. */
1136
1126
v = _PyLong_New (ndigits );
1137
1127
if (v != NULL ) {
1138
1128
digit * p = v -> ob_digit ;
1139
- Py_SET_SIZE (v , negative ? - ndigits : ndigits );
1129
+ Py_SET_SIZE (v , ival < 0 ? - ndigits : ndigits );
1140
1130
t = abs_ival ;
1141
1131
while (t ) {
1142
1132
* p ++ = (digit )(t & PyLong_MASK );
0 commit comments