Coverage Report

Created: 2026-09-01 06:32

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython3/Objects/longobject.c
Line
Count
Source
1
/* Long (arbitrary precision) integer object implementation */
2
3
/* XXX The functional organization of this file is terrible */
4
5
#include "Python.h"
6
#include "pycore_bitutils.h"      // _Py_popcount32()
7
#include "pycore_initconfig.h"    // _PyStatus_OK()
8
#include "pycore_call.h"          // _PyObject_MakeTpCall
9
#include "pycore_freelist.h"      // _Py_FREELIST_FREE, _Py_FREELIST_POP
10
#include "pycore_long.h"          // _Py_SmallInts
11
#include "pycore_object.h"        // _PyObject_Init()
12
#include "pycore_runtime.h"       // _PY_NSMALLPOSINTS
13
#include "pycore_stackref.h"
14
#include "pycore_structseq.h"     // _PyStructSequence_FiniBuiltin()
15
#include "pycore_tuple.h"         // _PyTuple_FromPairSteal
16
#include "pycore_unicodeobject.h" // _PyUnicode_Equal()
17
18
#include <float.h>                // DBL_MANT_DIG
19
#include <stddef.h>               // offsetof
20
21
#include "clinic/longobject.c.h"
22
/*[clinic input]
23
class int "PyObject *" "&PyLong_Type"
24
[clinic start generated code]*/
25
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ec0275e3422a36e3]*/
26
27
214M
#define medium_value(x) ((stwodigits)_PyLong_CompactValue(x))
28
29
246M
#define IS_SMALL_INT(ival) _PY_IS_SMALL_INT(ival)
30
173k
#define IS_SMALL_UINT(ival) ((ival) < _PY_NSMALLPOSINTS)
31
32
40
#define _MAX_STR_DIGITS_ERROR_FMT_TO_INT "Exceeds the limit (%d digits) for integer string conversion: value has %zd digits; use sys.set_int_max_str_digits() to increase the limit"
33
0
#define _MAX_STR_DIGITS_ERROR_FMT_TO_STR "Exceeds the limit (%d digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit"
34
35
/* If defined, use algorithms from the _pylong.py module */
36
#define WITH_PYLONG_MODULE 1
37
38
// Forward declarations
39
static PyLongObject* long_neg(PyLongObject *v);
40
static PyLongObject *x_divrem(PyLongObject *, PyLongObject *, PyLongObject **);
41
static PyObject* long_long(PyObject *v);
42
static PyObject* long_lshift_int64(PyLongObject *a, int64_t shiftby);
43
44
45
static inline void
46
_Py_DECREF_INT(PyLongObject *op)
47
5.81M
{
48
5.81M
    assert(PyLong_CheckExact(op));
49
5.81M
    _Py_DECREF_SPECIALIZED((PyObject *)op, _PyLong_ExactDealloc);
50
5.81M
}
51
52
static inline int
53
is_medium_int(stwodigits x)
54
68.1M
{
55
    /* Take care that we are comparing unsigned values. */
56
68.1M
    twodigits x_plus_mask = ((twodigits)x) + PyLong_MASK;
57
68.1M
    return x_plus_mask < ((twodigits)PyLong_MASK) + PyLong_BASE;
58
68.1M
}
59
60
static PyObject *
61
get_small_int(sdigit ival)
62
178M
{
63
178M
    assert(IS_SMALL_INT(ival));
64
178M
    return (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + ival];
65
178M
}
66
67
static PyLongObject *
68
maybe_small_long(PyLongObject *v)
69
2.61M
{
70
2.61M
    if (v && _PyLong_IsCompact(v)) {
71
2.04M
        stwodigits ival = medium_value(v);
72
2.04M
        if (IS_SMALL_INT(ival)) {
73
1.94M
            _Py_DECREF_INT(v);
74
1.94M
            return (PyLongObject *)get_small_int((sdigit)ival);
75
1.94M
        }
76
2.04M
    }
77
672k
    return v;
78
2.61M
}
79
80
/* For int multiplication, use the O(N**2) school algorithm unless
81
 * both operands contain more than KARATSUBA_CUTOFF digits (this
82
 * being an internal Python int digit, in base BASE).
83
 */
84
2.68M
#define KARATSUBA_CUTOFF 70
85
176k
#define KARATSUBA_SQUARE_CUTOFF (2 * KARATSUBA_CUTOFF)
86
87
/* For exponentiation, use the binary left-to-right algorithm unless the
88
 ^ exponent contains more than HUGE_EXP_CUTOFF bits.  In that case, do
89
 * (no more than) EXP_WINDOW_SIZE bits at a time.  The potential drawback is
90
 * that a table of 2**(EXP_WINDOW_SIZE - 1) intermediate results is
91
 * precomputed.
92
 */
93
178k
#define EXP_WINDOW_SIZE 5
94
31.5k
#define EXP_TABLE_LEN (1 << (EXP_WINDOW_SIZE - 1))
95
/* Suppose the exponent has bit length e. All ways of doing this
96
 * need e squarings. The binary method also needs a multiply for
97
 * each bit set. In a k-ary method with window width w, a multiply
98
 * for each non-zero window, so at worst (and likely!)
99
 * ceiling(e/w). The k-ary sliding window method has the same
100
 * worst case, but the window slides so it can sometimes skip
101
 * over an all-zero window that the fixed-window method can't
102
 * exploit. In addition, the windowing methods need multiplies
103
 * to precompute a table of small powers.
104
 *
105
 * For the sliding window method with width 5, 16 precomputation
106
 * multiplies are needed. Assuming about half the exponent bits
107
 * are set, then, the binary method needs about e/2 extra mults
108
 * and the window method about 16 + e/5.
109
 *
110
 * The latter is smaller for e > 53 1/3. We don't have direct
111
 * access to the bit length, though, so call it 60, which is a
112
 * multiple of a long digit's max bit length (15 or 30 so far).
113
 */
114
60.1k
#define HUGE_EXP_CUTOFF 60
115
116
#define SIGCHECK(PyTryBlock)                    \
117
29.4M
    do {                                        \
118
29.4M
        if (PyErr_CheckSignals()) PyTryBlock    \
119
29.4M
    } while(0)
120
121
/* Normalize (remove leading zeros from) an int object.
122
   Doesn't attempt to free the storage--in most cases, due to the nature
123
   of the algorithms used, this could save at most be one word anyway. */
124
125
static PyLongObject *
126
long_normalize(PyLongObject *v)
127
7.69M
{
128
7.69M
    Py_ssize_t j = _PyLong_DigitCount(v);
129
7.69M
    Py_ssize_t i = j;
130
131
12.8M
    while (i > 0 && v->long_value.ob_digit[i-1] == 0)
132
5.11M
        --i;
133
7.69M
    if (i != j) {
134
3.52M
        if (i == 0) {
135
182k
            _PyLong_SetSignAndDigitCount(v, 0, 0);
136
182k
        }
137
3.33M
        else {
138
3.33M
            _PyLong_SetDigitCount(v, i);
139
3.33M
        }
140
3.52M
    }
141
7.69M
    return v;
142
7.69M
}
143
144
/* Allocate a new int object with size digits.
145
   Return NULL and set exception if we run out of memory. */
146
147
#if SIZEOF_SIZE_T < 8
148
# define MAX_LONG_DIGITS \
149
    ((PY_SSIZE_T_MAX - offsetof(PyLongObject, long_value.ob_digit))/sizeof(digit))
150
#else
151
/* Guarantee that the number of bits fits in int64_t.
152
   This is more than an exbibyte, that is more than many of modern
153
   architectures support in principle.
154
   -1 is added to avoid overflow in _PyLong_Frexp(). */
155
11.7M
# define MAX_LONG_DIGITS ((INT64_MAX-1) / PyLong_SHIFT)
156
#endif
157
158
static PyLongObject *
159
long_alloc(Py_ssize_t size)
160
9.77M
{
161
9.77M
    assert(size >= 0);
162
9.77M
    PyLongObject *result = NULL;
163
9.77M
    if (size > (Py_ssize_t)MAX_LONG_DIGITS) {
164
0
        PyErr_SetString(PyExc_OverflowError,
165
0
                        "too many digits in integer");
166
0
        return NULL;
167
0
    }
168
    /* Fast operations for single digit integers (including zero)
169
     * assume that there is always at least one digit present. */
170
9.77M
    Py_ssize_t ndigits = size ? size : 1;
171
172
9.77M
    if (ndigits == 1) {
173
1.88M
        result = (PyLongObject *)_Py_FREELIST_POP(PyLongObject, ints);
174
1.88M
    }
175
9.77M
    if (result == NULL) {
176
        /* Number of bytes needed is: offsetof(PyLongObject, ob_digit) +
177
        sizeof(digit)*size.  Previous incarnations of this code used
178
        sizeof() instead of the offsetof, but this risks being
179
        incorrect in the presence of padding between the header
180
        and the digits. */
181
7.91M
        result = PyObject_Malloc(offsetof(PyLongObject, long_value.ob_digit) +
182
7.91M
                                ndigits*sizeof(digit));
183
7.91M
        if (!result) {
184
0
            PyErr_NoMemory();
185
0
            return NULL;
186
0
        }
187
7.91M
        _PyObject_Init((PyObject*)result, &PyLong_Type);
188
7.91M
        _PyLong_InitTag(result);
189
7.91M
    }
190
9.77M
    _PyLong_SetSignAndDigitCount(result, size != 0, size);
191
#ifdef Py_DEBUG
192
    // gh-147988: Fill digits with an invalid pattern to catch usage
193
    // of uninitialized digits.
194
    memset(result->long_value.ob_digit, 0xFF, ndigits * sizeof(digit));
195
#endif
196
9.77M
    return result;
197
9.77M
}
198
199
PyLongObject *
200
_PyLong_New(Py_ssize_t size)
201
0
{
202
0
    return long_alloc(size);
203
0
}
204
205
PyLongObject *
206
_PyLong_FromDigits(int negative, Py_ssize_t digit_count, digit *digits)
207
0
{
208
0
    assert(digit_count >= 0);
209
0
    if (digit_count == 0) {
210
0
        return (PyLongObject *)_PyLong_GetZero();
211
0
    }
212
0
    PyLongObject *result = long_alloc(digit_count);
213
0
    if (result == NULL) {
214
0
        return NULL;
215
0
    }
216
0
    _PyLong_SetSignAndDigitCount(result, negative?-1:1, digit_count);
217
0
    memcpy(result->long_value.ob_digit, digits, digit_count * sizeof(digit));
218
0
    return result;
219
0
}
220
221
PyObject *
222
_PyLong_Copy(PyLongObject *src)
223
39.7k
{
224
39.7k
    assert(src != NULL);
225
39.7k
    int sign;
226
227
39.7k
    if (_PyLong_IsCompact(src)) {
228
3.58k
        stwodigits ival = medium_value(src);
229
3.58k
        if (IS_SMALL_INT(ival)) {
230
3.58k
            return get_small_int((sdigit)ival);
231
3.58k
        }
232
0
        sign = _PyLong_CompactSign(src);
233
0
    }
234
36.1k
    else {
235
36.1k
        sign = _PyLong_NonCompactSign(src);
236
36.1k
    }
237
238
36.1k
    Py_ssize_t size = _PyLong_DigitCount(src);
239
36.1k
    PyLongObject *result = long_alloc(size);
240
241
36.1k
    if (result == NULL) {
242
0
        return NULL;
243
0
    }
244
36.1k
    _PyLong_SetSignAndDigitCount(result, sign, size);
245
36.1k
    memcpy(result->long_value.ob_digit, src->long_value.ob_digit,
246
36.1k
           size * sizeof(digit));
247
36.1k
    return (PyObject *)result;
248
36.1k
}
249
250
static PyObject *
251
_PyLong_FromMedium(sdigit x)
252
31.6M
{
253
31.6M
    assert(!IS_SMALL_INT(x));
254
31.6M
    assert(is_medium_int(x));
255
256
31.6M
    PyLongObject *v = (PyLongObject *)_Py_FREELIST_POP(PyLongObject, ints);
257
31.6M
    if (v == NULL) {
258
3.02M
        v = PyObject_Malloc(sizeof(PyLongObject));
259
3.02M
        if (v == NULL) {
260
0
            PyErr_NoMemory();
261
0
            return NULL;
262
0
        }
263
3.02M
        _PyObject_Init((PyObject*)v, &PyLong_Type);
264
3.02M
        _PyLong_InitTag(v);
265
3.02M
    }
266
31.6M
    digit abs_x = x < 0 ? -x : x;
267
31.6M
    _PyLong_SetSignAndDigitCount(v, x<0?-1:1, 1);
268
31.6M
    v->long_value.ob_digit[0] = abs_x;
269
31.6M
    return (PyObject*)v;
270
31.6M
}
271
272
static PyObject *
273
_PyLong_FromLarge(stwodigits ival)
274
60.7k
{
275
60.7k
    twodigits abs_ival;
276
60.7k
    int sign;
277
60.7k
    assert(!is_medium_int(ival));
278
279
60.7k
    if (ival < 0) {
280
        /* negate: can't write this as abs_ival = -ival since that
281
           invokes undefined behaviour when ival is LONG_MIN */
282
1.34k
        abs_ival = 0U-(twodigits)ival;
283
1.34k
        sign = -1;
284
1.34k
    }
285
59.3k
    else {
286
59.3k
        abs_ival = (twodigits)ival;
287
59.3k
        sign = 1;
288
59.3k
    }
289
    /* Must be at least two digits */
290
60.7k
    assert(abs_ival >> PyLong_SHIFT != 0);
291
60.7k
    twodigits t = abs_ival >> (PyLong_SHIFT * 2);
292
60.7k
    Py_ssize_t ndigits = 2;
293
60.7k
    while (t) {
294
0
        ++ndigits;
295
0
        t >>= PyLong_SHIFT;
296
0
    }
297
60.7k
    PyLongObject *v = long_alloc(ndigits);
298
60.7k
    if (v != NULL) {
299
60.7k
        digit *p = v->long_value.ob_digit;
300
60.7k
        _PyLong_SetSignAndDigitCount(v, sign, ndigits);
301
60.7k
        t = abs_ival;
302
182k
        while (t) {
303
121k
            *p++ = Py_SAFE_DOWNCAST(
304
121k
                t & PyLong_MASK, twodigits, digit);
305
121k
            t >>= PyLong_SHIFT;
306
121k
        }
307
60.7k
    }
308
60.7k
    return (PyObject *)v;
309
60.7k
}
310
311
/* Create a new int object from a C word-sized int */
312
static inline PyLongObject *
313
_PyLong_FromSTwoDigits(stwodigits x)
314
14.8M
{
315
14.8M
    if (IS_SMALL_INT(x)) {
316
14.3M
        return (PyLongObject*)get_small_int((sdigit)x);
317
14.3M
    }
318
14.8M
    assert(x != 0);
319
588k
    if (is_medium_int(x)) {
320
527k
        return (PyLongObject*)_PyLong_FromMedium((sdigit)x);
321
527k
    }
322
60.7k
    return (PyLongObject*)_PyLong_FromLarge(x);
323
588k
}
324
325
/* Create a new medium int object from a medium int.
326
 * Do not raise. Return NULL if not medium or can't allocate. */
327
static inline _PyStackRef
328
medium_from_stwodigits(stwodigits x)
329
91.8M
{
330
91.8M
    if (IS_SMALL_INT(x)) {
331
56.0M
        return PyStackRef_FromPyObjectBorrow(get_small_int((sdigit)x));
332
56.0M
    }
333
91.8M
    assert(x != 0);
334
35.7M
    if(!is_medium_int(x)) {
335
2.60k
        return PyStackRef_NULL;
336
2.60k
    }
337
35.7M
    PyLongObject *v = (PyLongObject *)_Py_FREELIST_POP(PyLongObject, ints);
338
35.7M
    if (v == NULL) {
339
1.53M
        v = PyObject_Malloc(sizeof(PyLongObject));
340
1.53M
        if (v == NULL) {
341
0
            return PyStackRef_NULL;
342
0
        }
343
1.53M
        _PyObject_Init((PyObject*)v, &PyLong_Type);
344
1.53M
        _PyLong_InitTag(v);
345
1.53M
    }
346
35.7M
    digit abs_x = x < 0 ? (digit)(-x) : (digit)x;
347
35.7M
    _PyLong_SetSignAndDigitCount(v, x<0?-1:1, 1);
348
35.7M
    v->long_value.ob_digit[0] = abs_x;
349
35.7M
    return PyStackRef_FromPyObjectStealMortal((PyObject *)v);
350
35.7M
}
351
352
353
/* If a freshly-allocated int is already shared, it must
354
   be a small integer, so negating it must go to PyLong_FromLong */
355
Py_LOCAL_INLINE(void)
356
_PyLong_Negate(PyLongObject **x_p)
357
233k
{
358
233k
    PyLongObject *x;
359
360
233k
    x = (PyLongObject *)*x_p;
361
233k
    if (_PyObject_IsUniquelyReferenced((PyObject *)x)) {
362
38.1k
         _PyLong_FlipSign(x);
363
38.1k
        return;
364
38.1k
    }
365
366
195k
    *x_p = _PyLong_FromSTwoDigits(-medium_value(x));
367
195k
    Py_DECREF(x);
368
195k
}
369
370
#define PYLONG_FROM_INT(UINT_TYPE, INT_TYPE, ival)                                  \
371
137M
    do {                                                                            \
372
137M
        /* Handle small and medium cases. */                                        \
373
137M
        if (IS_SMALL_INT(ival)) {                                                   \
374
106M
            return get_small_int((sdigit)(ival));                                   \
375
106M
        }                                                                           \
376
137M
        if (-(INT_TYPE)PyLong_MASK <= (ival) && (ival) <= (INT_TYPE)PyLong_MASK) {  \
377
31.1M
            return _PyLong_FromMedium((sdigit)(ival));                              \
378
31.1M
        }                                                                           \
379
31.2M
        UINT_TYPE abs_ival = (ival) < 0 ? 0U-(UINT_TYPE)(ival) : (UINT_TYPE)(ival); \
380
144k
        /* Do shift in two steps to avoid possible undefined behavior. */           \
381
144k
        UINT_TYPE t = abs_ival >> PyLong_SHIFT >> PyLong_SHIFT;                     \
382
144k
        /* Count digits (at least two - smaller cases were handled above). */       \
383
144k
        Py_ssize_t ndigits = 2;                                                     \
384
156k
        while (t) {                                                                 \
385
11.6k
            ++ndigits;                                                              \
386
11.6k
            t >>= PyLong_SHIFT;                                                     \
387
11.6k
        }                                                                           \
388
144k
        /* Construct output value. */                                               \
389
144k
        PyLongObject *v = long_alloc(ndigits);                                      \
390
144k
        if (v == NULL) {                                                            \
391
0
            return NULL;                                                            \
392
0
        }                                                                           \
393
144k
        digit *p = v->long_value.ob_digit;                                          \
394
144k
        _PyLong_SetSignAndDigitCount(v, (ival) < 0 ? -1 : 1, ndigits);              \
395
144k
        t = abs_ival;                                                               \
396
445k
        while (t) {                                                                 \
397
300k
            *p++ = (digit)(t & PyLong_MASK);                                        \
398
300k
            t >>= PyLong_SHIFT;                                                     \
399
300k
        }                                                                           \
400
144k
        return (PyObject *)v;                                                       \
401
144k
    } while(0)
402
403
404
/* Create a new int object from a C long int */
405
406
PyObject *
407
PyLong_FromLong(long ival)
408
70.6M
{
409
70.6M
    PYLONG_FROM_INT(unsigned long, long, ival);
410
70.6M
}
411
412
#define PYLONG_FROM_UINT(INT_TYPE, ival) \
413
173k
    do { \
414
173k
        /* Handle small and medium cases. */ \
415
173k
        if (IS_SMALL_UINT(ival)) { \
416
6.71k
            return get_small_int((sdigit)(ival)); \
417
6.71k
        } \
418
173k
        if ((ival) <= PyLong_MASK) { \
419
8.74k
            return _PyLong_FromMedium((sdigit)(ival)); \
420
8.74k
        } \
421
166k
        /* Do shift in two steps to avoid possible undefined behavior. */ \
422
166k
        INT_TYPE t = (ival) >> PyLong_SHIFT >> PyLong_SHIFT; \
423
157k
        /* Count digits (at least two - smaller cases were handled above). */ \
424
157k
        Py_ssize_t ndigits = 2; \
425
159k
        while (t) { \
426
2.03k
            ++ndigits; \
427
2.03k
            t >>= PyLong_SHIFT; \
428
2.03k
        } \
429
157k
        /* Construct output value. */ \
430
157k
        PyLongObject *v = long_alloc(ndigits); \
431
157k
        if (v == NULL) { \
432
0
            return NULL; \
433
0
        } \
434
157k
        digit *p = v->long_value.ob_digit; \
435
475k
        while ((ival)) { \
436
317k
            *p++ = (digit)((ival) & PyLong_MASK); \
437
317k
            (ival) >>= PyLong_SHIFT; \
438
317k
        } \
439
157k
        return (PyObject *)v; \
440
157k
    } while(0)
441
442
/* Create a new int object from a C unsigned long int */
443
444
PyObject *
445
PyLong_FromUnsignedLong(unsigned long ival)
446
162k
{
447
162k
    PYLONG_FROM_UINT(unsigned long, ival);
448
162k
}
449
450
/* Create a new int object from a C unsigned long long int. */
451
452
PyObject *
453
PyLong_FromUnsignedLongLong(unsigned long long ival)
454
8.39k
{
455
8.39k
    PYLONG_FROM_UINT(unsigned long long, ival);
456
8.39k
}
457
458
/* Create a new int object from a C size_t. */
459
460
PyObject *
461
PyLong_FromSize_t(size_t ival)
462
1.94k
{
463
1.94k
    PYLONG_FROM_UINT(size_t, ival);
464
1.94k
}
465
466
/* Create a new int object from a C double */
467
468
PyObject *
469
PyLong_FromDouble(double dval)
470
347
{
471
    /* Try to get out cheap if this fits in a long. When a finite value of real
472
     * floating type is converted to an integer type, the value is truncated
473
     * toward zero. If the value of the integral part cannot be represented by
474
     * the integer type, the behavior is undefined. Thus, we must check that
475
     * value is in range (LONG_MIN - 1, LONG_MAX + 1). If a long has more bits
476
     * of precision than a double, casting LONG_MIN - 1 to double may yield an
477
     * approximation, but LONG_MAX + 1 is a power of two and can be represented
478
     * as double exactly (assuming FLT_RADIX is 2 or 16), so for simplicity
479
     * check against [-(LONG_MAX + 1), LONG_MAX + 1).
480
     */
481
347
    const double int_max = (unsigned long)LONG_MAX + 1;
482
347
    if (-int_max < dval && dval < int_max) {
483
311
        return PyLong_FromLong((long)dval);
484
311
    }
485
486
36
    PyLongObject *v;
487
36
    double frac;
488
36
    int i, ndig, expo, neg;
489
36
    neg = 0;
490
36
    if (isinf(dval)) {
491
0
        PyErr_SetString(PyExc_OverflowError,
492
0
                        "cannot convert float infinity to integer");
493
0
        return NULL;
494
0
    }
495
36
    if (isnan(dval)) {
496
0
        PyErr_SetString(PyExc_ValueError,
497
0
                        "cannot convert float NaN to integer");
498
0
        return NULL;
499
0
    }
500
36
    if (dval < 0.0) {
501
23
        neg = 1;
502
23
        dval = -dval;
503
23
    }
504
36
    frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
505
36
    assert(expo > 0);
506
36
    ndig = (expo-1) / PyLong_SHIFT + 1; /* Number of 'digits' in result */
507
36
    v = long_alloc(ndig);
508
36
    if (v == NULL)
509
0
        return NULL;
510
36
    frac = ldexp(frac, (expo-1) % PyLong_SHIFT + 1);
511
144
    for (i = ndig; --i >= 0; ) {
512
108
        digit bits = (digit)frac;
513
108
        v->long_value.ob_digit[i] = bits;
514
108
        frac = frac - (double)bits;
515
108
        frac = ldexp(frac, PyLong_SHIFT);
516
108
    }
517
36
    if (neg) {
518
23
        _PyLong_FlipSign(v);
519
23
    }
520
36
    return (PyObject *)v;
521
36
}
522
523
/* Checking for overflow in PyLong_AsLong is a PITA since C doesn't define
524
 * anything about what happens when a signed integer operation overflows,
525
 * and some compilers think they're doing you a favor by being "clever"
526
 * then.  The bit pattern for the largest positive signed long is
527
 * (unsigned long)LONG_MAX, and for the smallest negative signed long
528
 * it is abs(LONG_MIN), which we could write -(unsigned long)LONG_MIN.
529
 * However, some other compilers warn about applying unary minus to an
530
 * unsigned operand.  Hence the weird "0-".
531
 */
532
4.69k
#define PY_ABS_LONG_MIN         (0-(unsigned long)LONG_MIN)
533
829
#define PY_ABS_SSIZE_T_MIN      (0-(size_t)PY_SSIZE_T_MIN)
534
535
static inline unsigned long
536
unroll_digits_ulong(PyLongObject *v, Py_ssize_t *iptr)
537
1.31M
{
538
1.31M
    assert(ULONG_MAX >= ((1UL << PyLong_SHIFT) - 1));
539
540
1.31M
    Py_ssize_t i = *iptr;
541
1.31M
    assert(i >= 2);
542
543
    /* unroll 1 digit */
544
1.31M
    --i;
545
1.31M
    digit *digits = v->long_value.ob_digit;
546
1.31M
    unsigned long x = digits[i];
547
548
1.31M
#if (ULONG_MAX >> PyLong_SHIFT) >= ((1UL << PyLong_SHIFT) - 1)
549
    /* unroll another digit */
550
1.31M
    x <<= PyLong_SHIFT;
551
1.31M
    --i;
552
1.31M
    x |= digits[i];
553
1.31M
#endif
554
555
1.31M
    *iptr = i;
556
1.31M
    return x;
557
1.31M
}
558
559
static inline size_t
560
unroll_digits_size_t(PyLongObject *v, Py_ssize_t *iptr)
561
6.65k
{
562
6.65k
    assert(SIZE_MAX >= ((1UL << PyLong_SHIFT) - 1));
563
564
6.65k
    Py_ssize_t i = *iptr;
565
6.65k
    assert(i >= 2);
566
567
    /* unroll 1 digit */
568
6.65k
    --i;
569
6.65k
    digit *digits = v->long_value.ob_digit;
570
6.65k
    size_t x = digits[i];
571
572
6.65k
#if (SIZE_MAX >> PyLong_SHIFT) >= ((1 << PyLong_SHIFT) - 1)
573
    /* unroll another digit */
574
6.65k
    x <<= PyLong_SHIFT;
575
6.65k
    --i;
576
6.65k
    x |= digits[i];
577
6.65k
#endif
578
579
6.65k
    *iptr = i;
580
6.65k
    return x;
581
6.65k
}
582
583
/* Get a C long int from an int object or any object that has an __index__
584
   method.
585
586
   On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
587
   the result.  Otherwise *overflow is 0.
588
589
   For other errors (e.g., TypeError), return -1 and set an error condition.
590
   In this case *overflow will be 0.
591
*/
592
long
593
PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
594
58.9M
{
595
    /* This version originally by Tim Peters */
596
58.9M
    PyLongObject *v;
597
58.9M
    long res;
598
58.9M
    Py_ssize_t i;
599
58.9M
    int sign;
600
58.9M
    int do_decref = 0; /* if PyNumber_Index was called */
601
602
58.9M
    *overflow = 0;
603
58.9M
    if (vv == NULL) {
604
0
        PyErr_BadInternalCall();
605
0
        return -1;
606
0
    }
607
608
58.9M
    if (PyLong_Check(vv)) {
609
58.9M
        v = (PyLongObject *)vv;
610
58.9M
    }
611
281
    else {
612
281
        v = (PyLongObject *)_PyNumber_Index(vv);
613
281
        if (v == NULL)
614
281
            return -1;
615
0
        do_decref = 1;
616
0
    }
617
58.9M
    if (_PyLong_IsCompact(v)) {
618
#if SIZEOF_LONG < SIZEOF_SIZE_T
619
        Py_ssize_t tmp = _PyLong_CompactValue(v);
620
        if (tmp < LONG_MIN) {
621
            *overflow = -1;
622
            res = -1;
623
        }
624
        else if (tmp > LONG_MAX) {
625
            *overflow = 1;
626
            res = -1;
627
        }
628
        else {
629
            res = (long)tmp;
630
        }
631
#else
632
58.4M
        res = _PyLong_CompactValue(v);
633
58.4M
#endif
634
58.4M
    }
635
460k
    else {
636
460k
        res = -1;
637
460k
        i = _PyLong_DigitCount(v);
638
460k
        sign = _PyLong_NonCompactSign(v);
639
640
460k
        unsigned long x = unroll_digits_ulong(v, &i);
641
529k
        while (--i >= 0) {
642
256k
            if (x > (ULONG_MAX >> PyLong_SHIFT)) {
643
188k
                *overflow = sign;
644
188k
                goto exit;
645
188k
            }
646
68.2k
            x = (x << PyLong_SHIFT) | v->long_value.ob_digit[i];
647
68.2k
        }
648
        /* Haven't lost any bits, but casting to long requires extra
649
        * care (see comment above).
650
        */
651
272k
        if (x <= (unsigned long)LONG_MAX) {
652
259k
            res = (long)x * sign;
653
259k
        }
654
12.7k
        else if (sign < 0 && x == PY_ABS_LONG_MIN) {
655
1.75k
            res = LONG_MIN;
656
1.75k
        }
657
10.9k
        else {
658
10.9k
            *overflow = sign;
659
            /* res is already set to -1 */
660
10.9k
        }
661
272k
    }
662
58.9M
  exit:
663
58.9M
    if (do_decref) {
664
0
        Py_DECREF(v);
665
0
    }
666
58.9M
    return res;
667
58.9M
}
668
669
/* Get a C long int from an int object or any object that has an __index__
670
   method.  Return -1 and set an error if overflow occurs. */
671
672
long
673
PyLong_AsLong(PyObject *obj)
674
14.4M
{
675
14.4M
    int overflow;
676
14.4M
    long result = PyLong_AsLongAndOverflow(obj, &overflow);
677
14.4M
    if (overflow) {
678
        /* XXX: could be cute and give a different
679
           message for overflow == -1 */
680
177
        PyErr_SetString(PyExc_OverflowError,
681
177
                        "Python int too large to convert to C long");
682
177
    }
683
14.4M
    return result;
684
14.4M
}
685
686
/* Get a C int from an int object or any object that has an __index__
687
   method.  Return -1 and set an error if overflow occurs. */
688
689
int
690
PyLong_AsInt(PyObject *obj)
691
13.6M
{
692
13.6M
    int overflow;
693
13.6M
    long result = PyLong_AsLongAndOverflow(obj, &overflow);
694
13.6M
    if (overflow || result > INT_MAX || result < INT_MIN) {
695
        /* XXX: could be cute and give a different
696
           message for overflow == -1 */
697
0
        PyErr_SetString(PyExc_OverflowError,
698
0
                        "Python int too large to convert to C int");
699
0
        return -1;
700
0
    }
701
13.6M
    return (int)result;
702
13.6M
}
703
704
/* Get a Py_ssize_t from an int object.
705
   Returns -1 and sets an error condition if overflow occurs. */
706
707
Py_ssize_t
708
44.1M
PyLong_AsSsize_t(PyObject *vv) {
709
44.1M
    PyLongObject *v;
710
44.1M
    Py_ssize_t i;
711
44.1M
    int sign;
712
713
44.1M
    if (vv == NULL) {
714
0
        PyErr_BadInternalCall();
715
0
        return -1;
716
0
    }
717
44.1M
    if (!PyLong_Check(vv)) {
718
0
        PyErr_SetString(PyExc_TypeError, "an integer is required");
719
0
        return -1;
720
0
    }
721
722
44.1M
    v = (PyLongObject *)vv;
723
44.1M
    if (_PyLong_IsCompact(v)) {
724
44.1M
        return _PyLong_CompactValue(v);
725
44.1M
    }
726
5.97k
    i = _PyLong_DigitCount(v);
727
5.97k
    sign = _PyLong_NonCompactSign(v);
728
729
5.97k
    size_t x = unroll_digits_size_t(v, &i);
730
7.77k
    while (--i >= 0) {
731
3.49k
        if (x > (SIZE_MAX >> PyLong_SHIFT)) {
732
1.69k
            goto overflow;
733
1.69k
        }
734
1.80k
        x = (x << PyLong_SHIFT) | v->long_value.ob_digit[i];
735
1.80k
    }
736
    /* Haven't lost any bits, but casting to a signed type requires
737
     * extra care (see comment above).
738
     */
739
4.28k
    if (x <= (size_t)PY_SSIZE_T_MAX) {
740
3.05k
        return (Py_ssize_t)x * sign;
741
3.05k
    }
742
1.22k
    else if (sign < 0 && x == PY_ABS_SSIZE_T_MIN) {
743
119
        return PY_SSIZE_T_MIN;
744
119
    }
745
    /* else overflow */
746
747
2.80k
  overflow:
748
2.80k
    PyErr_SetString(PyExc_OverflowError,
749
2.80k
                    "Python int too large to convert to C ssize_t");
750
2.80k
    return -1;
751
4.28k
}
752
753
/* Get a C unsigned long int from an int object.
754
   Returns -1 and sets an error condition if overflow occurs. */
755
756
unsigned long
757
PyLong_AsUnsignedLong(PyObject *vv)
758
21.2M
{
759
21.2M
    PyLongObject *v;
760
21.2M
    Py_ssize_t i;
761
762
21.2M
    if (vv == NULL) {
763
0
        PyErr_BadInternalCall();
764
0
        return (unsigned long)-1;
765
0
    }
766
21.2M
    if (!PyLong_Check(vv)) {
767
0
        PyErr_SetString(PyExc_TypeError, "an integer is required");
768
0
        return (unsigned long)-1;
769
0
    }
770
771
21.2M
    v = (PyLongObject *)vv;
772
21.2M
    if (_PyLong_IsNonNegativeCompact(v)) {
773
#if SIZEOF_LONG < SIZEOF_SIZE_T
774
        size_t tmp = (size_t)_PyLong_CompactValue(v);
775
        unsigned long res = (unsigned long)tmp;
776
        if (res != tmp) {
777
            goto overflow;
778
        }
779
        return res;
780
#else
781
20.4M
        return (unsigned long)(size_t)_PyLong_CompactValue(v);
782
20.4M
#endif
783
20.4M
    }
784
853k
    if (_PyLong_IsNegative(v)) {
785
0
        PyErr_SetString(PyExc_OverflowError,
786
0
                        "can't convert negative value to unsigned int");
787
0
        return (unsigned long) -1;
788
0
    }
789
853k
    i = _PyLong_DigitCount(v);
790
791
853k
    unsigned long x = unroll_digits_ulong(v, &i);
792
853k
    while (--i >= 0) {
793
0
        if (x > (ULONG_MAX >> PyLong_SHIFT)) {
794
0
            goto overflow;
795
0
        }
796
0
        x = (x << PyLong_SHIFT) | v->long_value.ob_digit[i];
797
0
    }
798
853k
    return x;
799
0
overflow:
800
0
    PyErr_SetString(PyExc_OverflowError,
801
0
                    "Python int too large to convert "
802
0
                    "to C unsigned long");
803
0
    return (unsigned long) -1;
804
853k
}
805
806
/* Get a C size_t from an int object. Returns (size_t)-1 and sets
807
   an error condition if overflow occurs. */
808
809
size_t
810
PyLong_AsSize_t(PyObject *vv)
811
52.4k
{
812
52.4k
    PyLongObject *v;
813
52.4k
    Py_ssize_t i;
814
815
52.4k
    if (vv == NULL) {
816
0
        PyErr_BadInternalCall();
817
0
        return (size_t) -1;
818
0
    }
819
52.4k
    if (!PyLong_Check(vv)) {
820
0
        PyErr_SetString(PyExc_TypeError, "an integer is required");
821
0
        return (size_t)-1;
822
0
    }
823
824
52.4k
    v = (PyLongObject *)vv;
825
52.4k
    if (_PyLong_IsNonNegativeCompact(v)) {
826
51.0k
        return (size_t)_PyLong_CompactValue(v);
827
51.0k
    }
828
1.42k
    if (_PyLong_IsNegative(v)) {
829
751
        PyErr_SetString(PyExc_OverflowError,
830
751
                   "can't convert negative value to size_t");
831
751
        return (size_t) -1;
832
751
    }
833
675
    i = _PyLong_DigitCount(v);
834
835
675
    size_t x = unroll_digits_size_t(v, &i);
836
856
    while (--i >= 0) {
837
537
            if (x > (SIZE_MAX >> PyLong_SHIFT)) {
838
356
                PyErr_SetString(PyExc_OverflowError,
839
356
                    "Python int too large to convert to C size_t");
840
356
                return (size_t) -1;
841
356
            }
842
181
            x = (x << PyLong_SHIFT) | v->long_value.ob_digit[i];
843
181
        }
844
319
    return x;
845
675
}
846
847
/* Get a C unsigned long int from an int object, ignoring the high bits.
848
   Returns -1 and sets an error condition if an error occurs. */
849
850
static unsigned long
851
_PyLong_AsUnsignedLongMask(PyObject *vv)
852
0
{
853
0
    PyLongObject *v;
854
0
    Py_ssize_t i;
855
856
0
    if (vv == NULL || !PyLong_Check(vv)) {
857
0
        PyErr_BadInternalCall();
858
0
        return (unsigned long) -1;
859
0
    }
860
0
    v = (PyLongObject *)vv;
861
0
    if (_PyLong_IsCompact(v)) {
862
#if SIZEOF_LONG < SIZEOF_SIZE_T
863
        return (unsigned long)(size_t)_PyLong_CompactValue(v);
864
#else
865
0
        return (unsigned long)(long)_PyLong_CompactValue(v);
866
0
#endif
867
0
    }
868
0
    i = _PyLong_DigitCount(v);
869
0
    int sign = _PyLong_NonCompactSign(v);
870
0
    unsigned long x = unroll_digits_ulong(v, &i);
871
0
    while (--i >= 0) {
872
0
        x = (x << PyLong_SHIFT) | v->long_value.ob_digit[i];
873
0
    }
874
0
    return x * sign;
875
0
}
876
877
unsigned long
878
PyLong_AsUnsignedLongMask(PyObject *op)
879
0
{
880
0
    PyLongObject *lo;
881
0
    unsigned long val;
882
883
0
    if (op == NULL) {
884
0
        PyErr_BadInternalCall();
885
0
        return (unsigned long)-1;
886
0
    }
887
888
0
    if (PyLong_Check(op)) {
889
0
        return _PyLong_AsUnsignedLongMask(op);
890
0
    }
891
892
0
    lo = (PyLongObject *)_PyNumber_Index(op);
893
0
    if (lo == NULL)
894
0
        return (unsigned long)-1;
895
896
0
    val = _PyLong_AsUnsignedLongMask((PyObject *)lo);
897
0
    Py_DECREF(lo);
898
0
    return val;
899
0
}
900
901
int
902
PyLong_IsPositive(PyObject *obj)
903
0
{
904
0
    assert(obj != NULL);
905
0
    if (!PyLong_Check(obj)) {
906
0
        PyErr_Format(PyExc_TypeError, "expected int, got %T", obj);
907
0
        return -1;
908
0
    }
909
0
    return _PyLong_IsPositive((PyLongObject *)obj);
910
0
}
911
912
int
913
PyLong_IsNegative(PyObject *obj)
914
0
{
915
0
    assert(obj != NULL);
916
0
    if (!PyLong_Check(obj)) {
917
0
        PyErr_Format(PyExc_TypeError, "expected int, got %T", obj);
918
0
        return -1;
919
0
    }
920
0
    return _PyLong_IsNegative((PyLongObject *)obj);
921
0
}
922
923
int
924
PyLong_IsZero(PyObject *obj)
925
0
{
926
0
    assert(obj != NULL);
927
0
    if (!PyLong_Check(obj)) {
928
0
        PyErr_Format(PyExc_TypeError, "expected int, got %T", obj);
929
0
        return -1;
930
0
    }
931
0
    return _PyLong_IsZero((PyLongObject *)obj);
932
0
}
933
934
static int
935
long_sign(PyObject *vv)
936
2.92M
{
937
2.92M
    assert(vv != NULL);
938
2.92M
    assert(PyLong_Check(vv));
939
2.92M
    PyLongObject *v = (PyLongObject *)vv;
940
941
2.92M
    if (_PyLong_IsCompact(v)) {
942
2.92M
        return _PyLong_CompactSign(v);
943
2.92M
    }
944
409
    return _PyLong_NonCompactSign(v);
945
2.92M
}
946
947
int
948
_PyLong_Sign(PyObject *vv)
949
0
{
950
0
    return long_sign(vv);
951
0
}
952
953
int
954
PyLong_GetSign(PyObject *vv, int *sign)
955
2.92M
{
956
2.92M
    if (!PyLong_Check(vv)) {
957
0
        PyErr_Format(PyExc_TypeError, "expect int, got %T", vv);
958
0
        return -1;
959
0
    }
960
961
2.92M
    *sign = long_sign(vv);
962
2.92M
    return 0;
963
2.92M
}
964
965
static int
966
bit_length_digit(digit x)
967
246k
{
968
    // digit can be larger than unsigned long, but only PyLong_SHIFT bits
969
    // of it will be ever used.
970
246k
    static_assert(PyLong_SHIFT <= sizeof(unsigned long) * 8,
971
246k
                  "digit is larger than unsigned long");
972
246k
    return _Py_bit_length((unsigned long)x);
973
246k
}
974
975
int64_t
976
_PyLong_NumBits(PyObject *vv)
977
135k
{
978
135k
    PyLongObject *v = (PyLongObject *)vv;
979
135k
    int64_t result = 0;
980
135k
    Py_ssize_t ndigits;
981
135k
    int msd_bits;
982
983
135k
    assert(v != NULL);
984
135k
    assert(PyLong_Check(v));
985
135k
    ndigits = _PyLong_DigitCount(v);
986
135k
    assert(ndigits == 0 || v->long_value.ob_digit[ndigits - 1] != 0);
987
135k
    if (ndigits > 0) {
988
135k
        digit msd = v->long_value.ob_digit[ndigits - 1];
989
135k
#if SIZEOF_SIZE_T == 8
990
135k
        assert(ndigits <= INT64_MAX / PyLong_SHIFT);
991
135k
#endif
992
135k
        result = (int64_t)(ndigits - 1) * PyLong_SHIFT;
993
135k
        msd_bits = bit_length_digit(msd);
994
135k
        result += msd_bits;
995
135k
    }
996
135k
    return result;
997
135k
}
998
999
PyObject *
1000
_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
1001
                      int little_endian, int is_signed)
1002
834
{
1003
834
    const unsigned char* pstartbyte;    /* LSB of bytes */
1004
834
    int incr;                           /* direction to move pstartbyte */
1005
834
    const unsigned char* pendbyte;      /* MSB of bytes */
1006
834
    size_t numsignificantbytes;         /* number of bytes that matter */
1007
834
    Py_ssize_t ndigits;                 /* number of Python int digits */
1008
834
    PyLongObject* v;                    /* result */
1009
834
    Py_ssize_t idigit = 0;              /* next free index in v->long_value.ob_digit */
1010
1011
834
    if (n == 0)
1012
0
        return PyLong_FromLong(0L);
1013
1014
834
    if (little_endian) {
1015
834
        pstartbyte = bytes;
1016
834
        pendbyte = bytes + n - 1;
1017
834
        incr = 1;
1018
834
    }
1019
0
    else {
1020
0
        pstartbyte = bytes + n - 1;
1021
0
        pendbyte = bytes;
1022
0
        incr = -1;
1023
0
    }
1024
1025
834
    if (is_signed)
1026
0
        is_signed = *pendbyte >= 0x80;
1027
1028
    /* Compute numsignificantbytes.  This consists of finding the most
1029
       significant byte.  Leading 0 bytes are insignificant if the number
1030
       is positive, and leading 0xff bytes if negative. */
1031
834
    {
1032
834
        size_t i;
1033
834
        const unsigned char* p = pendbyte;
1034
834
        const int pincr = -incr;  /* search MSB to LSB */
1035
834
        const unsigned char insignificant = is_signed ? 0xff : 0x00;
1036
1037
2.49k
        for (i = 0; i < n; ++i, p += pincr) {
1038
2.21k
            if (*p != insignificant)
1039
556
                break;
1040
2.21k
        }
1041
834
        numsignificantbytes = n - i;
1042
        /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
1043
           actually has 2 significant bytes.  OTOH, 0xff0001 ==
1044
           -0x00ffff, so we wouldn't *need* to bump it there; but we
1045
           do for 0xffff = -0x0001.  To be safe without bothering to
1046
           check every case, bump it regardless. */
1047
834
        if (is_signed && numsignificantbytes < n)
1048
0
            ++numsignificantbytes;
1049
834
    }
1050
1051
    /* avoid integer overflow */
1052
834
    ndigits = numsignificantbytes / PyLong_SHIFT * 8
1053
834
        + (numsignificantbytes % PyLong_SHIFT * 8 + PyLong_SHIFT - 1) / PyLong_SHIFT;
1054
834
    v = long_alloc(ndigits);
1055
834
    if (v == NULL)
1056
0
        return NULL;
1057
1058
    /* Copy the bits over.  The tricky parts are computing 2's-comp on
1059
       the fly for signed numbers, and dealing with the mismatch between
1060
       8-bit bytes and (probably) 15-bit Python digits.*/
1061
834
    {
1062
834
        size_t i;
1063
834
        twodigits carry = 1;                    /* for 2's-comp calculation */
1064
834
        twodigits accum = 0;                    /* sliding register */
1065
834
        unsigned int accumbits = 0;             /* number of bits in accum */
1066
834
        const unsigned char* p = pstartbyte;
1067
1068
2.51k
        for (i = 0; i < numsignificantbytes; ++i, p += incr) {
1069
1.67k
            twodigits thisbyte = *p;
1070
            /* Compute correction for 2's comp, if needed. */
1071
1.67k
            if (is_signed) {
1072
0
                thisbyte = (0xff ^ thisbyte) + carry;
1073
0
                carry = thisbyte >> 8;
1074
0
                thisbyte &= 0xff;
1075
0
            }
1076
            /* Because we're going LSB to MSB, thisbyte is
1077
               more significant than what's already in accum,
1078
               so needs to be prepended to accum. */
1079
1.67k
            accum |= thisbyte << accumbits;
1080
1.67k
            accumbits += 8;
1081
1.67k
            if (accumbits >= PyLong_SHIFT) {
1082
                /* There's enough to fill a Python digit. */
1083
278
                assert(idigit < ndigits);
1084
278
                v->long_value.ob_digit[idigit] = (digit)(accum & PyLong_MASK);
1085
278
                ++idigit;
1086
278
                accum >>= PyLong_SHIFT;
1087
278
                accumbits -= PyLong_SHIFT;
1088
278
                assert(accumbits < PyLong_SHIFT);
1089
278
            }
1090
1.67k
        }
1091
834
        assert(accumbits < PyLong_SHIFT);
1092
834
        if (accumbits) {
1093
556
            assert(idigit < ndigits);
1094
556
            v->long_value.ob_digit[idigit] = (digit)accum;
1095
556
            ++idigit;
1096
556
        }
1097
834
    }
1098
1099
834
    int sign = is_signed ? -1: 1;
1100
834
    if (idigit == 0) {
1101
278
        sign = 0;
1102
278
        v->long_value.ob_digit[0] = 0;
1103
278
    }
1104
834
    _PyLong_SetSignAndDigitCount(v, sign, idigit);
1105
834
    return (PyObject *)maybe_small_long(long_normalize(v));
1106
834
}
1107
1108
int
1109
_PyLong_AsByteArray(PyLongObject* v,
1110
                    unsigned char* bytes, size_t n,
1111
                    int little_endian, int is_signed,
1112
                    int with_exceptions)
1113
6.28k
{
1114
6.28k
    Py_ssize_t i;               /* index into v->long_value.ob_digit */
1115
6.28k
    Py_ssize_t ndigits;         /* number of digits */
1116
6.28k
    twodigits accum;            /* sliding register */
1117
6.28k
    unsigned int accumbits;     /* # bits in accum */
1118
6.28k
    int do_twos_comp;           /* store 2's-comp?  is_signed and v < 0 */
1119
6.28k
    digit carry;                /* for computing 2's-comp */
1120
6.28k
    size_t j;                   /* # bytes filled */
1121
6.28k
    unsigned char* p;           /* pointer to next byte in bytes */
1122
6.28k
    int pincr;                  /* direction to move p */
1123
1124
6.28k
    assert(v != NULL && PyLong_Check(v));
1125
1126
6.28k
    ndigits = _PyLong_DigitCount(v);
1127
6.28k
    if (_PyLong_IsNegative(v)) {
1128
0
        if (!is_signed) {
1129
0
            if (with_exceptions) {
1130
0
                PyErr_SetString(PyExc_OverflowError,
1131
0
                                "can't convert negative int to unsigned");
1132
0
            }
1133
0
            return -1;
1134
0
        }
1135
0
        do_twos_comp = 1;
1136
0
    }
1137
6.28k
    else {
1138
6.28k
        do_twos_comp = 0;
1139
6.28k
    }
1140
1141
6.28k
    if (little_endian) {
1142
6.28k
        p = bytes;
1143
6.28k
        pincr = 1;
1144
6.28k
    }
1145
0
    else {
1146
0
        p = bytes + n - 1;
1147
0
        pincr = -1;
1148
0
    }
1149
1150
    /* Copy over all the Python digits.
1151
       It's crucial that every Python digit except for the MSD contribute
1152
       exactly PyLong_SHIFT bits to the total, so first assert that the int is
1153
       normalized.
1154
       NOTE: PyLong_AsNativeBytes() assumes that this function will fill in 'n'
1155
       bytes even if it eventually fails to convert the whole number. Make sure
1156
       you account for that if you are changing this algorithm to return without
1157
       doing that.
1158
       */
1159
6.28k
    assert(ndigits == 0 || v->long_value.ob_digit[ndigits - 1] != 0);
1160
6.28k
    j = 0;
1161
6.28k
    accum = 0;
1162
6.28k
    accumbits = 0;
1163
6.28k
    carry = do_twos_comp ? 1 : 0;
1164
19.9k
    for (i = 0; i < ndigits; ++i) {
1165
17.4k
        digit thisdigit = v->long_value.ob_digit[i];
1166
17.4k
        if (do_twos_comp) {
1167
0
            thisdigit = (thisdigit ^ PyLong_MASK) + carry;
1168
0
            carry = thisdigit >> PyLong_SHIFT;
1169
0
            thisdigit &= PyLong_MASK;
1170
0
        }
1171
        /* Because we're going LSB to MSB, thisdigit is more
1172
           significant than what's already in accum, so needs to be
1173
           prepended to accum. */
1174
17.4k
        accum |= (twodigits)thisdigit << accumbits;
1175
1176
        /* The most-significant digit may be (probably is) at least
1177
           partly empty. */
1178
17.4k
        if (i == ndigits - 1) {
1179
            /* Count # of sign bits -- they needn't be stored,
1180
             * although for signed conversion we need later to
1181
             * make sure at least one sign bit gets stored. */
1182
3.44k
            digit s = do_twos_comp ? thisdigit ^ PyLong_MASK : thisdigit;
1183
45.2k
            while (s != 0) {
1184
41.8k
                s >>= 1;
1185
41.8k
                accumbits++;
1186
41.8k
            }
1187
3.44k
        }
1188
14.0k
        else
1189
14.0k
            accumbits += PyLong_SHIFT;
1190
1191
        /* Store as many bytes as possible. */
1192
63.0k
        while (accumbits >= 8) {
1193
49.4k
            if (j >= n)
1194
3.79k
                goto Overflow;
1195
45.6k
            ++j;
1196
45.6k
            *p = (unsigned char)(accum & 0xff);
1197
45.6k
            p += pincr;
1198
45.6k
            accumbits -= 8;
1199
45.6k
            accum >>= 8;
1200
45.6k
        }
1201
17.4k
    }
1202
1203
    /* Store the straggler (if any). */
1204
6.28k
    assert(accumbits < 8);
1205
2.48k
    assert(carry == 0);  /* else do_twos_comp and *every* digit was 0 */
1206
2.48k
    if (accumbits > 0) {
1207
2.30k
        if (j >= n)
1208
849
            goto Overflow;
1209
1.45k
        ++j;
1210
1.45k
        if (do_twos_comp) {
1211
            /* Fill leading bits of the byte with sign bits
1212
               (appropriately pretending that the int had an
1213
               infinite supply of sign bits). */
1214
0
            accum |= (~(twodigits)0) << accumbits;
1215
0
        }
1216
1.45k
        *p = (unsigned char)(accum & 0xff);
1217
1.45k
        p += pincr;
1218
1.45k
    }
1219
178
    else if (j == n && is_signed) {
1220
        /* The main loop filled the byte array exactly, so the code
1221
           just above didn't get to ensure there's a sign bit, and the
1222
           loop below wouldn't add one either.  Make sure a sign bit
1223
           exists. */
1224
57
        int sign_bit_set;
1225
57
        if (n > 0) {
1226
57
            unsigned char msb = *(p - pincr);
1227
57
            sign_bit_set = msb >= 0x80;
1228
57
        }
1229
0
        else {
1230
0
            sign_bit_set = 0;
1231
0
        }
1232
57
        assert(accumbits == 0);
1233
57
        if (sign_bit_set == do_twos_comp)
1234
0
            return 0;
1235
57
        else
1236
57
            goto Overflow;
1237
57
    }
1238
1239
    /* Fill remaining bytes with copies of the sign bit. */
1240
1.57k
    {
1241
1.57k
        unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
1242
4.66k
        for ( ; j < n; ++j, p += pincr)
1243
3.08k
            *p = signbyte;
1244
1.57k
    }
1245
1246
1.57k
    return 0;
1247
1248
4.70k
  Overflow:
1249
4.70k
    if (with_exceptions) {
1250
0
        PyErr_SetString(PyExc_OverflowError, "int too big to convert");
1251
0
    }
1252
4.70k
    return -1;
1253
1254
2.48k
}
1255
1256
// Refactored out for readability, not reuse
1257
static inline int
1258
_fits_in_n_bits(Py_ssize_t v, Py_ssize_t n)
1259
268k
{
1260
268k
    if (n >= (Py_ssize_t)sizeof(Py_ssize_t) * 8) {
1261
268k
        return 1;
1262
268k
    }
1263
    // If all bits above n are the same, we fit.
1264
    // (Use n-1 if we require the sign bit to be consistent.)
1265
0
    Py_ssize_t v_extended = v >> ((int)n - 1);
1266
0
    return v_extended == 0 || v_extended == -1;
1267
268k
}
1268
1269
static inline int
1270
_resolve_endianness(int *endianness)
1271
274k
{
1272
274k
    if (*endianness == -1 || (*endianness & 2)) {
1273
274k
        *endianness = PY_LITTLE_ENDIAN;
1274
274k
    } else {
1275
0
        *endianness &= 1;
1276
0
    }
1277
274k
    assert(*endianness == 0 || *endianness == 1);
1278
274k
    return 0;
1279
274k
}
1280
1281
Py_ssize_t
1282
PyLong_AsNativeBytes(PyObject* vv, void* buffer, Py_ssize_t n, int flags)
1283
274k
{
1284
274k
    PyLongObject *v;
1285
274k
    union {
1286
274k
        Py_ssize_t v;
1287
274k
        unsigned char b[sizeof(Py_ssize_t)];
1288
274k
    } cv;
1289
274k
    int do_decref = 0;
1290
274k
    Py_ssize_t res = 0;
1291
1292
274k
    if (vv == NULL || n < 0) {
1293
0
        PyErr_BadInternalCall();
1294
0
        return -1;
1295
0
    }
1296
1297
274k
    int little_endian = flags;
1298
274k
    if (_resolve_endianness(&little_endian) < 0) {
1299
0
        return -1;
1300
0
    }
1301
1302
274k
    if (PyLong_Check(vv)) {
1303
274k
        v = (PyLongObject *)vv;
1304
274k
    }
1305
0
    else if (flags != -1 && (flags & Py_ASNATIVEBYTES_ALLOW_INDEX)) {
1306
0
        v = (PyLongObject *)_PyNumber_Index(vv);
1307
0
        if (v == NULL) {
1308
0
            return -1;
1309
0
        }
1310
0
        do_decref = 1;
1311
0
    }
1312
0
    else {
1313
0
        PyErr_Format(PyExc_TypeError, "expect int, got %T", vv);
1314
0
        return -1;
1315
0
    }
1316
1317
274k
    if ((flags != -1 && (flags & Py_ASNATIVEBYTES_REJECT_NEGATIVE))
1318
0
        && _PyLong_IsNegative(v)) {
1319
0
        PyErr_SetString(PyExc_ValueError, "Cannot convert negative int");
1320
0
        if (do_decref) {
1321
0
            Py_DECREF(v);
1322
0
        }
1323
0
        return -1;
1324
0
    }
1325
1326
274k
    if (_PyLong_IsCompact(v)) {
1327
268k
        res = 0;
1328
268k
        cv.v = _PyLong_CompactValue(v);
1329
        /* Most paths result in res = sizeof(compact value). Only the case
1330
         * where 0 < n < sizeof(compact value) do we need to check and adjust
1331
         * our return value. */
1332
268k
        res = sizeof(cv.b);
1333
268k
        if (n <= 0) {
1334
            // nothing to do!
1335
0
        }
1336
268k
        else if (n <= (Py_ssize_t)sizeof(cv.b)) {
1337
268k
#if PY_LITTLE_ENDIAN
1338
268k
            if (little_endian) {
1339
268k
                memcpy(buffer, cv.b, n);
1340
268k
            }
1341
0
            else {
1342
0
                for (Py_ssize_t i = 0; i < n; ++i) {
1343
0
                    ((unsigned char*)buffer)[n - i - 1] = cv.b[i];
1344
0
                }
1345
0
            }
1346
#else
1347
            if (little_endian) {
1348
                for (Py_ssize_t i = 0; i < n; ++i) {
1349
                    ((unsigned char*)buffer)[i] = cv.b[sizeof(cv.b) - i - 1];
1350
                }
1351
            }
1352
            else {
1353
                memcpy(buffer, &cv.b[sizeof(cv.b) - n], n);
1354
            }
1355
#endif
1356
1357
            /* If we fit, return the requested number of bytes */
1358
268k
            if (_fits_in_n_bits(cv.v, n * 8)) {
1359
268k
                res = n;
1360
268k
            } else if (cv.v > 0 && _fits_in_n_bits(cv.v, n * 8 + 1)) {
1361
                /* Positive values with the MSB set do not require an
1362
                 * additional bit when the caller's intent is to treat them
1363
                 * as unsigned. */
1364
0
                if (flags == -1 || (flags & Py_ASNATIVEBYTES_UNSIGNED_BUFFER)) {
1365
0
                    res = n;
1366
0
                } else {
1367
0
                    res = n + 1;
1368
0
                }
1369
0
            }
1370
268k
        }
1371
0
        else {
1372
0
            unsigned char fill = cv.v < 0 ? 0xFF : 0x00;
1373
0
#if PY_LITTLE_ENDIAN
1374
0
            if (little_endian) {
1375
0
                memcpy(buffer, cv.b, sizeof(cv.b));
1376
0
                memset((char *)buffer + sizeof(cv.b), fill, n - sizeof(cv.b));
1377
0
            }
1378
0
            else {
1379
0
                unsigned char *b = (unsigned char *)buffer;
1380
0
                for (Py_ssize_t i = 0; i < n - (int)sizeof(cv.b); ++i) {
1381
0
                    *b++ = fill;
1382
0
                }
1383
0
                for (Py_ssize_t i = sizeof(cv.b); i > 0; --i) {
1384
0
                    *b++ = cv.b[i - 1];
1385
0
                }
1386
0
            }
1387
#else
1388
            if (little_endian) {
1389
                unsigned char *b = (unsigned char *)buffer;
1390
                for (Py_ssize_t i = sizeof(cv.b); i > 0; --i) {
1391
                    *b++ = cv.b[i - 1];
1392
                }
1393
                for (Py_ssize_t i = 0; i < n - (int)sizeof(cv.b); ++i) {
1394
                    *b++ = fill;
1395
                }
1396
            }
1397
            else {
1398
                memset(buffer, fill, n - sizeof(cv.b));
1399
                memcpy((char *)buffer + n - sizeof(cv.b), cv.b, sizeof(cv.b));
1400
            }
1401
#endif
1402
0
        }
1403
268k
    }
1404
6.26k
    else {
1405
6.26k
        if (n > 0) {
1406
6.26k
            _PyLong_AsByteArray(v, buffer, (size_t)n, little_endian, 1, 0);
1407
6.26k
        }
1408
1409
        /* Calculates the number of bits required for the *absolute* value
1410
         * of v. This does not take sign into account, only magnitude. */
1411
6.26k
        int64_t nb = _PyLong_NumBits((PyObject *)v);
1412
6.26k
        assert(nb >= 0);
1413
        /* Normally this would be ((nb - 1) / 8) + 1 to avoid rounding up
1414
         * multiples of 8 to the next byte, but we add an implied bit for
1415
         * the sign and it cancels out. */
1416
6.26k
        res = (Py_ssize_t)(nb / 8) + 1;
1417
1418
        /* Two edge cases exist that are best handled after extracting the
1419
         * bits. These may result in us reporting overflow when the value
1420
         * actually fits.
1421
         */
1422
6.26k
        if (n > 0 && res == n + 1 && nb % 8 == 0) {
1423
57
            if (_PyLong_IsNegative(v)) {
1424
                /* Values of 0x80...00 from negative values that use every
1425
                 * available bit in the buffer do not require an additional
1426
                 * bit to store the sign. */
1427
0
                int is_edge_case = 1;
1428
0
                unsigned char *b = (unsigned char *)buffer;
1429
0
                for (Py_ssize_t i = 0; i < n && is_edge_case; ++i, ++b) {
1430
0
                    if (i == 0) {
1431
0
                        is_edge_case = (*b == (little_endian ? 0 : 0x80));
1432
0
                    } else if (i < n - 1) {
1433
0
                        is_edge_case = (*b == 0);
1434
0
                    } else {
1435
0
                        is_edge_case = (*b == (little_endian ? 0x80 : 0));
1436
0
                    }
1437
0
                }
1438
0
                if (is_edge_case) {
1439
0
                    res = n;
1440
0
                }
1441
0
            }
1442
57
            else {
1443
                /* Positive values with the MSB set do not require an
1444
                 * additional bit when the caller's intent is to treat them
1445
                 * as unsigned. */
1446
57
                unsigned char *b = (unsigned char *)buffer;
1447
57
                if (b[little_endian ? n - 1 : 0] & 0x80) {
1448
57
                    if (flags == -1 || (flags & Py_ASNATIVEBYTES_UNSIGNED_BUFFER)) {
1449
0
                        res = n;
1450
57
                    } else {
1451
57
                        res = n + 1;
1452
57
                    }
1453
57
                }
1454
57
            }
1455
57
        }
1456
6.26k
    }
1457
1458
274k
    if (do_decref) {
1459
0
        Py_DECREF(v);
1460
0
    }
1461
1462
274k
    return res;
1463
274k
}
1464
1465
1466
PyObject *
1467
PyLong_FromNativeBytes(const void* buffer, size_t n, int flags)
1468
0
{
1469
0
    if (!buffer) {
1470
0
        PyErr_BadInternalCall();
1471
0
        return NULL;
1472
0
    }
1473
1474
0
    int little_endian = flags;
1475
0
    if (_resolve_endianness(&little_endian) < 0) {
1476
0
        return NULL;
1477
0
    }
1478
1479
0
    return _PyLong_FromByteArray(
1480
0
        (const unsigned char *)buffer,
1481
0
        n,
1482
0
        little_endian,
1483
0
        (flags == -1 || !(flags & Py_ASNATIVEBYTES_UNSIGNED_BUFFER)) ? 1 : 0
1484
0
    );
1485
0
}
1486
1487
1488
PyObject *
1489
PyLong_FromUnsignedNativeBytes(const void* buffer, size_t n, int flags)
1490
0
{
1491
0
    if (!buffer) {
1492
0
        PyErr_BadInternalCall();
1493
0
        return NULL;
1494
0
    }
1495
1496
0
    int little_endian = flags;
1497
0
    if (_resolve_endianness(&little_endian) < 0) {
1498
0
        return NULL;
1499
0
    }
1500
1501
0
    return _PyLong_FromByteArray((const unsigned char *)buffer, n, little_endian, 0);
1502
0
}
1503
1504
1505
/* Create a new int object from a C pointer */
1506
1507
PyObject *
1508
PyLong_FromVoidPtr(void *p)
1509
152k
{
1510
152k
#if SIZEOF_VOID_P <= SIZEOF_LONG
1511
152k
    return PyLong_FromUnsignedLong((unsigned long)(uintptr_t)p);
1512
#else
1513
1514
#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
1515
#   error "PyLong_FromVoidPtr: sizeof(long long) < sizeof(void*)"
1516
#endif
1517
    return PyLong_FromUnsignedLongLong((unsigned long long)(uintptr_t)p);
1518
#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
1519
1520
152k
}
1521
1522
/* Get a C pointer from an int object. */
1523
1524
void *
1525
PyLong_AsVoidPtr(PyObject *vv)
1526
16.4k
{
1527
16.4k
#if SIZEOF_VOID_P <= SIZEOF_LONG
1528
16.4k
    long x;
1529
1530
16.4k
    if (PyLong_Check(vv) && _PyLong_IsNegative((PyLongObject *)vv)) {
1531
0
        x = PyLong_AsLong(vv);
1532
0
    }
1533
16.4k
    else {
1534
16.4k
        x = PyLong_AsUnsignedLong(vv);
1535
16.4k
    }
1536
#else
1537
1538
#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
1539
#   error "PyLong_AsVoidPtr: sizeof(long long) < sizeof(void*)"
1540
#endif
1541
    long long x;
1542
1543
    if (PyLong_Check(vv) && _PyLong_IsNegative((PyLongObject *)vv)) {
1544
        x = PyLong_AsLongLong(vv);
1545
    }
1546
    else {
1547
        x = PyLong_AsUnsignedLongLong(vv);
1548
    }
1549
1550
#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
1551
1552
16.4k
    if (x == -1 && PyErr_Occurred())
1553
0
        return NULL;
1554
16.4k
    return (void *)x;
1555
16.4k
}
1556
1557
/* Initial long long support by Chris Herborth (chrish@qnx.com), later
1558
 * rewritten to use the newer PyLong_{As,From}ByteArray API.
1559
 */
1560
1561
0
#define PY_ABS_LLONG_MIN (0-(unsigned long long)LLONG_MIN)
1562
1563
/* Create a new int object from a C long long int. */
1564
1565
PyObject *
1566
PyLong_FromLongLong(long long ival)
1567
12.5k
{
1568
12.5k
    PYLONG_FROM_INT(unsigned long long, long long, ival);
1569
12.5k
}
1570
1571
/* Create a new int object from a C Py_ssize_t. */
1572
1573
PyObject *
1574
PyLong_FromSsize_t(Py_ssize_t ival)
1575
67.1M
{
1576
67.1M
    PYLONG_FROM_INT(size_t, Py_ssize_t, ival);
1577
67.1M
}
1578
1579
/* Get a C long long int from an int object or any object that has an
1580
   __index__ method.  Return -1 and set an error if overflow occurs. */
1581
1582
long long
1583
PyLong_AsLongLong(PyObject *vv)
1584
0
{
1585
0
    PyLongObject *v;
1586
0
    long long bytes;
1587
0
    int res;
1588
0
    int do_decref = 0; /* if PyNumber_Index was called */
1589
1590
0
    if (vv == NULL) {
1591
0
        PyErr_BadInternalCall();
1592
0
        return -1;
1593
0
    }
1594
1595
0
    if (PyLong_Check(vv)) {
1596
0
        v = (PyLongObject *)vv;
1597
0
    }
1598
0
    else {
1599
0
        v = (PyLongObject *)_PyNumber_Index(vv);
1600
0
        if (v == NULL)
1601
0
            return -1;
1602
0
        do_decref = 1;
1603
0
    }
1604
1605
0
    if (_PyLong_IsCompact(v)) {
1606
0
        res = 0;
1607
0
        bytes = _PyLong_CompactValue(v);
1608
0
    }
1609
0
    else {
1610
0
        res = _PyLong_AsByteArray((PyLongObject *)v, (unsigned char *)&bytes,
1611
0
                                  SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 1, 1);
1612
0
    }
1613
0
    if (do_decref) {
1614
0
        Py_DECREF(v);
1615
0
    }
1616
1617
    /* Plan 9 can't handle long long in ? : expressions */
1618
0
    if (res < 0)
1619
0
        return (long long)-1;
1620
0
    else
1621
0
        return bytes;
1622
0
}
1623
1624
/* Get a C unsigned long long int from an int object.
1625
   Return -1 and set an error if overflow occurs. */
1626
1627
unsigned long long
1628
PyLong_AsUnsignedLongLong(PyObject *vv)
1629
0
{
1630
0
    PyLongObject *v;
1631
0
    unsigned long long bytes;
1632
0
    int res;
1633
1634
0
    if (vv == NULL) {
1635
0
        PyErr_BadInternalCall();
1636
0
        return (unsigned long long)-1;
1637
0
    }
1638
0
    if (!PyLong_Check(vv)) {
1639
0
        PyErr_SetString(PyExc_TypeError, "an integer is required");
1640
0
        return (unsigned long long)-1;
1641
0
    }
1642
1643
0
    v = (PyLongObject*)vv;
1644
0
    if (_PyLong_IsNonNegativeCompact(v)) {
1645
0
        res = 0;
1646
#if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1647
        size_t tmp = (size_t)_PyLong_CompactValue(v);
1648
        bytes = (unsigned long long)tmp;
1649
        if (bytes != tmp) {
1650
            PyErr_SetString(PyExc_OverflowError,
1651
                            "Python int too large to convert "
1652
                            "to C unsigned long long");
1653
            res = -1;
1654
        }
1655
#else
1656
0
        bytes = (unsigned long long)(size_t)_PyLong_CompactValue(v);
1657
0
#endif
1658
0
    }
1659
0
    else {
1660
0
        res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes,
1661
0
                              SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 0, 1);
1662
0
    }
1663
1664
    /* Plan 9 can't handle long long in ? : expressions */
1665
0
    if (res < 0)
1666
0
        return (unsigned long long)res;
1667
0
    else
1668
0
        return bytes;
1669
0
}
1670
1671
/* Get a C unsigned long int from an int object, ignoring the high bits.
1672
   Returns -1 and sets an error condition if an error occurs. */
1673
1674
static unsigned long long
1675
_PyLong_AsUnsignedLongLongMask(PyObject *vv)
1676
0
{
1677
0
    PyLongObject *v;
1678
0
    Py_ssize_t i;
1679
0
    int sign;
1680
1681
0
    if (vv == NULL || !PyLong_Check(vv)) {
1682
0
        PyErr_BadInternalCall();
1683
0
        return (unsigned long long) -1;
1684
0
    }
1685
0
    v = (PyLongObject *)vv;
1686
0
    if (_PyLong_IsCompact(v)) {
1687
#if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1688
        return (unsigned long long)(size_t)_PyLong_CompactValue(v);
1689
#else
1690
0
        return (unsigned long long)(long long)_PyLong_CompactValue(v);
1691
0
#endif
1692
0
    }
1693
0
    i = _PyLong_DigitCount(v);
1694
0
    sign = _PyLong_NonCompactSign(v);
1695
0
    unsigned long long x = unroll_digits_ulong(v, &i);
1696
0
    while (--i >= 0) {
1697
0
        x = (x << PyLong_SHIFT) | v->long_value.ob_digit[i];
1698
0
    }
1699
0
    return x * sign;
1700
0
}
1701
1702
unsigned long long
1703
PyLong_AsUnsignedLongLongMask(PyObject *op)
1704
0
{
1705
0
    PyLongObject *lo;
1706
0
    unsigned long long val;
1707
1708
0
    if (op == NULL) {
1709
0
        PyErr_BadInternalCall();
1710
0
        return (unsigned long long)-1;
1711
0
    }
1712
1713
0
    if (PyLong_Check(op)) {
1714
0
        return _PyLong_AsUnsignedLongLongMask(op);
1715
0
    }
1716
1717
0
    lo = (PyLongObject *)_PyNumber_Index(op);
1718
0
    if (lo == NULL)
1719
0
        return (unsigned long long)-1;
1720
1721
0
    val = _PyLong_AsUnsignedLongLongMask((PyObject *)lo);
1722
0
    Py_DECREF(lo);
1723
0
    return val;
1724
0
}
1725
1726
/* Get a C long long int from an int object or any object that has an
1727
   __index__ method.
1728
1729
   On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
1730
   the result.  Otherwise *overflow is 0.
1731
1732
   For other errors (e.g., TypeError), return -1 and set an error condition.
1733
   In this case *overflow will be 0.
1734
*/
1735
1736
long long
1737
PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
1738
0
{
1739
    /* This version by Tim Peters */
1740
0
    PyLongObject *v;
1741
0
    long long res;
1742
0
    Py_ssize_t i;
1743
0
    int sign;
1744
0
    int do_decref = 0; /* if PyNumber_Index was called */
1745
1746
0
    *overflow = 0;
1747
0
    if (vv == NULL) {
1748
0
        PyErr_BadInternalCall();
1749
0
        return -1;
1750
0
    }
1751
1752
0
    if (PyLong_Check(vv)) {
1753
0
        v = (PyLongObject *)vv;
1754
0
    }
1755
0
    else {
1756
0
        v = (PyLongObject *)_PyNumber_Index(vv);
1757
0
        if (v == NULL)
1758
0
            return -1;
1759
0
        do_decref = 1;
1760
0
    }
1761
0
    if (_PyLong_IsCompact(v)) {
1762
#if SIZEOF_LONG_LONG < SIZEOF_SIZE_T
1763
        Py_ssize_t tmp = _PyLong_CompactValue(v);
1764
        if (tmp < LLONG_MIN) {
1765
            *overflow = -1;
1766
            res = -1;
1767
        }
1768
        else if (tmp > LLONG_MAX) {
1769
            *overflow = 1;
1770
            res = -1;
1771
        }
1772
        else {
1773
            res = (long long)tmp;
1774
        }
1775
#else
1776
0
        res = _PyLong_CompactValue(v);
1777
0
#endif
1778
0
    }
1779
0
    else {
1780
0
        i = _PyLong_DigitCount(v);
1781
0
        sign = _PyLong_NonCompactSign(v);
1782
0
        unsigned long long x = unroll_digits_ulong(v, &i);
1783
0
        while (--i >= 0) {
1784
0
            if (x > ULLONG_MAX >> PyLong_SHIFT) {
1785
0
                *overflow = sign;
1786
0
                res = -1;
1787
0
                goto exit;
1788
0
            }
1789
0
            x = (x << PyLong_SHIFT) + v->long_value.ob_digit[i];
1790
0
        }
1791
        /* Haven't lost any bits, but casting to long requires extra
1792
         * care (see comment above).
1793
         */
1794
0
        if (x <= (unsigned long long)LLONG_MAX) {
1795
0
            res = (long long)x * sign;
1796
0
        }
1797
0
        else if (sign < 0 && x == PY_ABS_LLONG_MIN) {
1798
0
            res = LLONG_MIN;
1799
0
        }
1800
0
        else {
1801
0
            *overflow = sign;
1802
0
            res = -1;
1803
0
        }
1804
0
    }
1805
0
  exit:
1806
0
    if (do_decref) {
1807
0
        Py_DECREF(v);
1808
0
    }
1809
0
    return res;
1810
0
}
1811
1812
#define UNSIGNED_INT_CONVERTER(NAME, TYPE)                          \
1813
int                                                                 \
1814
0
_PyLong_##NAME##_Converter(PyObject *obj, void *ptr)                \
1815
0
{                                                                   \
1816
0
    Py_ssize_t bytes = PyLong_AsNativeBytes(obj, ptr, sizeof(TYPE), \
1817
0
            Py_ASNATIVEBYTES_NATIVE_ENDIAN |                        \
1818
0
            Py_ASNATIVEBYTES_ALLOW_INDEX |                          \
1819
0
            Py_ASNATIVEBYTES_REJECT_NEGATIVE |                      \
1820
0
            Py_ASNATIVEBYTES_UNSIGNED_BUFFER);                      \
1821
0
    if (bytes < 0) {                                                \
1822
0
        return 0;                                                   \
1823
0
    }                                                               \
1824
0
    if ((size_t)bytes > sizeof(TYPE)) {                             \
1825
0
        PyErr_SetString(PyExc_OverflowError,                        \
1826
0
                        "Python int too large for C "#TYPE);        \
1827
0
        return 0;                                                   \
1828
0
    }                                                               \
1829
0
    return 1;                                                       \
1830
0
}
Unexecuted instantiation: _PyLong_UnsignedShort_Converter
Unexecuted instantiation: _PyLong_UnsignedInt_Converter
Unexecuted instantiation: _PyLong_UnsignedLong_Converter
Unexecuted instantiation: _PyLong_UnsignedLongLong_Converter
Unexecuted instantiation: _PyLong_Size_t_Converter
Unexecuted instantiation: _PyLong_UInt8_Converter
Unexecuted instantiation: _PyLong_UInt16_Converter
Unexecuted instantiation: _PyLong_UInt32_Converter
Unexecuted instantiation: _PyLong_UInt64_Converter
1831
1832
UNSIGNED_INT_CONVERTER(UnsignedShort, unsigned short)
1833
UNSIGNED_INT_CONVERTER(UnsignedInt, unsigned int)
1834
UNSIGNED_INT_CONVERTER(UnsignedLong, unsigned long)
1835
UNSIGNED_INT_CONVERTER(UnsignedLongLong, unsigned long long)
1836
UNSIGNED_INT_CONVERTER(Size_t, size_t)
1837
UNSIGNED_INT_CONVERTER(UInt8, uint8_t)
1838
UNSIGNED_INT_CONVERTER(UInt16, uint16_t)
1839
UNSIGNED_INT_CONVERTER(UInt32, uint32_t)
1840
UNSIGNED_INT_CONVERTER(UInt64, uint64_t)
1841
1842
1843
#define CHECK_BINOP(v,w)                                \
1844
58.1M
    do {                                                \
1845
58.1M
        if (!PyLong_Check(v) || !PyLong_Check(w))       \
1846
58.1M
            Py_RETURN_NOTIMPLEMENTED;                   \
1847
58.1M
    } while(0)
1848
1849
/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required.  x[0:n]
1850
 * is modified in place, by adding y to it.  Carries are propagated as far as
1851
 * x[m-1], and the remaining carry (0 or 1) is returned.
1852
 */
1853
static digit
1854
v_iadd(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
1855
258k
{
1856
258k
    Py_ssize_t i;
1857
258k
    digit carry = 0;
1858
1859
258k
    assert(m >= n);
1860
33.9M
    for (i = 0; i < n; ++i) {
1861
33.7M
        carry += x[i] + y[i];
1862
33.7M
        x[i] = carry & PyLong_MASK;
1863
33.7M
        carry >>= PyLong_SHIFT;
1864
33.7M
        assert((carry & 1) == carry);
1865
33.7M
    }
1866
315k
    for (; carry && i < m; ++i) {
1867
57.1k
        carry += x[i];
1868
57.1k
        x[i] = carry & PyLong_MASK;
1869
57.1k
        carry >>= PyLong_SHIFT;
1870
57.1k
        assert((carry & 1) == carry);
1871
57.1k
    }
1872
258k
    return carry;
1873
258k
}
1874
1875
/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required.  x[0:n]
1876
 * is modified in place, by subtracting y from it.  Borrows are propagated as
1877
 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
1878
 */
1879
static digit
1880
v_isub(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
1881
485k
{
1882
485k
    Py_ssize_t i;
1883
485k
    digit borrow = 0;
1884
1885
485k
    assert(m >= n);
1886
57.2M
    for (i = 0; i < n; ++i) {
1887
56.8M
        borrow = x[i] - y[i] - borrow;
1888
56.8M
        x[i] = borrow & PyLong_MASK;
1889
56.8M
        borrow >>= PyLong_SHIFT;
1890
56.8M
        borrow &= 1;            /* keep only 1 sign bit */
1891
56.8M
    }
1892
585k
    for (; borrow && i < m; ++i) {
1893
99.9k
        borrow = x[i] - borrow;
1894
99.9k
        x[i] = borrow & PyLong_MASK;
1895
99.9k
        borrow >>= PyLong_SHIFT;
1896
99.9k
        borrow &= 1;
1897
99.9k
    }
1898
485k
    return borrow;
1899
485k
}
1900
1901
/* Shift digit vector a[0:m] d bits left, with 0 <= d < PyLong_SHIFT.  Put
1902
 * result in z[0:m], and return the d bits shifted out of the top.
1903
 */
1904
static digit
1905
v_lshift(digit *z, digit *a, Py_ssize_t m, int d)
1906
89.2k
{
1907
89.2k
    Py_ssize_t i;
1908
89.2k
    digit carry = 0;
1909
1910
89.2k
    assert(0 <= d && d < PyLong_SHIFT);
1911
377k
    for (i=0; i < m; i++) {
1912
288k
        twodigits acc = (twodigits)a[i] << d | carry;
1913
288k
        z[i] = (digit)acc & PyLong_MASK;
1914
288k
        carry = (digit)(acc >> PyLong_SHIFT);
1915
288k
    }
1916
89.2k
    return carry;
1917
89.2k
}
1918
1919
/* Shift digit vector a[0:m] d bits right, with 0 <= d < PyLong_SHIFT.  Put
1920
 * result in z[0:m], and return the d bits shifted out of the bottom.
1921
 */
1922
static digit
1923
v_rshift(digit *z, digit *a, Py_ssize_t m, int d)
1924
41.8k
{
1925
41.8k
    Py_ssize_t i;
1926
41.8k
    digit carry = 0;
1927
41.8k
    digit mask = ((digit)1 << d) - 1U;
1928
1929
41.8k
    assert(0 <= d && d < PyLong_SHIFT);
1930
174k
    for (i=m; i-- > 0;) {
1931
132k
        twodigits acc = (twodigits)carry << PyLong_SHIFT | a[i];
1932
132k
        carry = (digit)acc & mask;
1933
132k
        z[i] = (digit)(acc >> d);
1934
132k
    }
1935
41.8k
    return carry;
1936
41.8k
}
1937
1938
/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
1939
   in pout, and returning the remainder.  pin and pout point at the LSD.
1940
   It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
1941
   _PyLong_Format, but that should be done with great care since ints are
1942
   immutable.
1943
1944
   This version of the code can be 20% faster than the pre-2022 version
1945
   on todays compilers on architectures like amd64.  It evolved from Mark
1946
   Dickinson observing that a 128:64 divide instruction was always being
1947
   generated by the compiler despite us working with 30-bit digit values.
1948
   See the thread for full context:
1949
1950
     https://mail.python.org/archives/list/python-dev@python.org/thread/ZICIMX5VFCX4IOFH5NUPVHCUJCQ4Q7QM/#NEUNFZU3TQU4CPTYZNF3WCN7DOJBBTK5
1951
1952
   If you ever want to change this code, pay attention to performance using
1953
   different compilers, optimization levels, and cpu architectures. Beware of
1954
   PGO/FDO builds doing value specialization such as a fast path for //10. :)
1955
1956
   Verify that 17 isn't specialized and this works as a quick test:
1957
     python -m timeit -s 'x = 10**1000; r=x//10; assert r == 10**999, r' 'x//17'
1958
*/
1959
static digit
1960
inplace_divrem1(digit *pout, digit *pin, Py_ssize_t size, digit n)
1961
16.4k
{
1962
16.4k
    digit remainder = 0;
1963
1964
16.4k
    assert(n > 0 && n <= PyLong_MASK);
1965
58.1k
    while (--size >= 0) {
1966
41.7k
        twodigits dividend;
1967
41.7k
        dividend = ((twodigits)remainder << PyLong_SHIFT) | pin[size];
1968
41.7k
        digit quotient;
1969
41.7k
        quotient = (digit)(dividend / n);
1970
41.7k
        remainder = dividend % n;
1971
41.7k
        pout[size] = quotient;
1972
41.7k
    }
1973
16.4k
    return remainder;
1974
16.4k
}
1975
1976
1977
/* Divide an integer by a digit, returning both the quotient
1978
   (as function result) and the remainder (through *prem).
1979
   The sign of a is ignored; n should not be zero. */
1980
1981
static PyLongObject *
1982
divrem1(PyLongObject *a, digit n, digit *prem)
1983
9.37k
{
1984
9.37k
    const Py_ssize_t size = _PyLong_DigitCount(a);
1985
9.37k
    PyLongObject *z;
1986
1987
9.37k
    assert(n > 0 && n <= PyLong_MASK);
1988
9.37k
    z = long_alloc(size);
1989
9.37k
    if (z == NULL)
1990
0
        return NULL;
1991
9.37k
    *prem = inplace_divrem1(z->long_value.ob_digit, a->long_value.ob_digit, size, n);
1992
9.37k
    return long_normalize(z);
1993
9.37k
}
1994
1995
/* Remainder of long pin, w/ size digits, by non-zero digit n,
1996
   returning the remainder. pin points at the LSD. */
1997
1998
static digit
1999
inplace_rem1(digit *pin, Py_ssize_t size, digit n)
2000
6.66k
{
2001
6.66k
    twodigits rem = 0;
2002
2003
6.66k
    assert(n > 0 && n <= PyLong_MASK);
2004
25.6k
    while (--size >= 0)
2005
18.9k
        rem = ((rem << PyLong_SHIFT) | pin[size]) % n;
2006
6.66k
    return (digit)rem;
2007
6.66k
}
2008
2009
/* Get the remainder of an integer divided by a digit, returning
2010
   the remainder as the result of the function. The sign of a is
2011
   ignored; n should not be zero. */
2012
2013
static PyLongObject *
2014
rem1(PyLongObject *a, digit n)
2015
6.66k
{
2016
6.66k
    const Py_ssize_t size = _PyLong_DigitCount(a);
2017
2018
6.66k
    assert(n > 0 && n <= PyLong_MASK);
2019
6.66k
    return (PyLongObject *)PyLong_FromLong(
2020
6.66k
        (long)inplace_rem1(a->long_value.ob_digit, size, n)
2021
6.66k
    );
2022
6.66k
}
2023
2024
#ifdef WITH_PYLONG_MODULE
2025
/* asymptotically faster long_to_decimal_string, using _pylong.py */
2026
static int
2027
pylong_int_to_decimal_string(PyObject *aa,
2028
                             PyObject **p_output,
2029
                             _PyUnicodeWriter *writer,
2030
                             PyBytesWriter *bytes_writer,
2031
                             char **bytes_str)
2032
0
{
2033
0
    PyObject *s = NULL;
2034
0
    PyObject *mod = PyImport_ImportModule("_pylong");
2035
0
    if (mod == NULL) {
2036
0
        return -1;
2037
0
    }
2038
0
    s = PyObject_CallMethod(mod, "int_to_decimal_string", "O", aa);
2039
0
    if (s == NULL) {
2040
0
        goto error;
2041
0
    }
2042
0
    if (!PyUnicode_Check(s)) {
2043
0
        PyErr_SetString(PyExc_TypeError,
2044
0
                        "_pylong.int_to_decimal_string did not return a str");
2045
0
        goto error;
2046
0
    }
2047
0
    if (writer) {
2048
0
        Py_ssize_t size = PyUnicode_GET_LENGTH(s);
2049
0
        if (_PyUnicodeWriter_Prepare(writer, size, '9') == -1) {
2050
0
            goto error;
2051
0
        }
2052
0
        if (_PyUnicodeWriter_WriteStr(writer, s) < 0) {
2053
0
            goto error;
2054
0
        }
2055
0
        goto success;
2056
0
    }
2057
0
    else if (bytes_writer) {
2058
0
        Py_ssize_t size = PyUnicode_GET_LENGTH(s);
2059
0
        const void *data = PyUnicode_DATA(s);
2060
0
        int kind = PyUnicode_KIND(s);
2061
0
        *bytes_str = PyBytesWriter_GrowAndUpdatePointer(bytes_writer, size,
2062
0
                                                        *bytes_str);
2063
0
        if (*bytes_str == NULL) {
2064
0
            goto error;
2065
0
        }
2066
0
        char *p = *bytes_str;
2067
0
        for (Py_ssize_t i=0; i < size; i++) {
2068
0
            Py_UCS4 ch = PyUnicode_READ(kind, data, i);
2069
0
            *p++ = (char) ch;
2070
0
        }
2071
0
        (*bytes_str) = p;
2072
0
        goto success;
2073
0
    }
2074
0
    else {
2075
0
        *p_output = Py_NewRef(s);
2076
0
        goto success;
2077
0
    }
2078
2079
0
error:
2080
0
        Py_DECREF(mod);
2081
0
        Py_XDECREF(s);
2082
0
        return -1;
2083
2084
0
success:
2085
0
        Py_DECREF(mod);
2086
0
        Py_DECREF(s);
2087
0
        return 0;
2088
0
}
2089
#endif /* WITH_PYLONG_MODULE */
2090
2091
/* Convert an integer to a base 10 string.  Returns a new non-shared
2092
   string.  (Return value is non-shared so that callers can modify the
2093
   returned value if necessary.) */
2094
2095
static int
2096
long_to_decimal_string_internal(PyObject *aa,
2097
                                PyObject **p_output,
2098
                                _PyUnicodeWriter *writer,
2099
                                PyBytesWriter *bytes_writer,
2100
                                char **bytes_str)
2101
1.66M
{
2102
1.66M
    PyLongObject *scratch, *a;
2103
1.66M
    PyObject *str = NULL;
2104
1.66M
    Py_ssize_t size, strlen, size_a, i, j;
2105
1.66M
    digit *pout, *pin, rem, tenpow;
2106
1.66M
    int negative;
2107
1.66M
    int d;
2108
2109
    // writer or bytes_writer can be used, but not both at the same time.
2110
1.66M
    assert(writer == NULL || bytes_writer == NULL);
2111
2112
1.66M
    a = (PyLongObject *)aa;
2113
1.66M
    if (a == NULL || !PyLong_Check(a)) {
2114
0
        PyErr_BadInternalCall();
2115
0
        return -1;
2116
0
    }
2117
1.66M
    size_a = _PyLong_DigitCount(a);
2118
1.66M
    negative = _PyLong_IsNegative(a);
2119
2120
    /* quick and dirty pre-check for overflowing the decimal digit limit,
2121
       based on the inequality 10/3 >= log2(10)
2122
2123
       explanation in https://github.com/python/cpython/pull/96537
2124
    */
2125
1.66M
    if (size_a >= 10 * _PY_LONG_MAX_STR_DIGITS_THRESHOLD
2126
1.66M
                  / (3 * PyLong_SHIFT) + 2) {
2127
125
        PyInterpreterState *interp = _PyInterpreterState_GET();
2128
125
        int max_str_digits = _Py_atomic_load_int(&interp->long_state.max_str_digits);
2129
125
        if ((max_str_digits > 0) &&
2130
125
            (max_str_digits / (3 * PyLong_SHIFT) <= (size_a - 11) / 10)) {
2131
0
            PyErr_Format(PyExc_ValueError, _MAX_STR_DIGITS_ERROR_FMT_TO_STR,
2132
0
                         max_str_digits);
2133
0
            return -1;
2134
0
        }
2135
125
    }
2136
2137
1.66M
#if WITH_PYLONG_MODULE
2138
1.66M
    if (size_a > 1000) {
2139
        /* Switch to _pylong.int_to_decimal_string(). */
2140
0
        return pylong_int_to_decimal_string(aa,
2141
0
                                         p_output,
2142
0
                                         writer,
2143
0
                                         bytes_writer,
2144
0
                                         bytes_str);
2145
0
    }
2146
1.66M
#endif
2147
2148
    /* quick and dirty upper bound for the number of digits
2149
       required to express a in base _PyLong_DECIMAL_BASE:
2150
2151
         #digits = 1 + floor(log2(a) / log2(_PyLong_DECIMAL_BASE))
2152
2153
       But log2(a) < size_a * PyLong_SHIFT, and
2154
       log2(_PyLong_DECIMAL_BASE) = log2(10) * _PyLong_DECIMAL_SHIFT
2155
                                  > 3.3 * _PyLong_DECIMAL_SHIFT
2156
2157
         size_a * PyLong_SHIFT / (3.3 * _PyLong_DECIMAL_SHIFT) =
2158
             size_a + size_a / d < size_a + size_a / floor(d),
2159
       where d = (3.3 * _PyLong_DECIMAL_SHIFT) /
2160
                 (PyLong_SHIFT - 3.3 * _PyLong_DECIMAL_SHIFT)
2161
    */
2162
1.66M
    d = (33 * _PyLong_DECIMAL_SHIFT) /
2163
1.66M
        (10 * PyLong_SHIFT - 33 * _PyLong_DECIMAL_SHIFT);
2164
1.66M
    assert(size_a < PY_SSIZE_T_MAX/2);
2165
1.66M
    size = 1 + size_a + size_a / d;
2166
1.66M
    scratch = long_alloc(size);
2167
1.66M
    if (scratch == NULL)
2168
0
        return -1;
2169
2170
    /* convert array of base _PyLong_BASE digits in pin to an array of
2171
       base _PyLong_DECIMAL_BASE digits in pout, following Knuth (TAOCP,
2172
       Volume 2 (3rd edn), section 4.4, Method 1b). */
2173
1.66M
    pin = a->long_value.ob_digit;
2174
1.66M
    pout = scratch->long_value.ob_digit;
2175
1.66M
    size = 0;
2176
3.31M
    for (i = size_a; --i >= 0; ) {
2177
1.64M
        digit hi = pin[i];
2178
19.7M
        for (j = 0; j < size; j++) {
2179
18.0M
            twodigits z = (twodigits)pout[j] << PyLong_SHIFT | hi;
2180
18.0M
            hi = (digit)(z / _PyLong_DECIMAL_BASE);
2181
18.0M
            pout[j] = (digit)(z - (twodigits)hi *
2182
18.0M
                              _PyLong_DECIMAL_BASE);
2183
18.0M
        }
2184
3.29M
        while (hi) {
2185
1.64M
            pout[size++] = hi % _PyLong_DECIMAL_BASE;
2186
1.64M
            hi /= _PyLong_DECIMAL_BASE;
2187
1.64M
        }
2188
        /* check for keyboard interrupt */
2189
1.64M
        SIGCHECK({
2190
1.64M
                Py_DECREF(scratch);
2191
1.64M
                return -1;
2192
1.64M
            });
2193
1.64M
    }
2194
    /* pout should have at least one digit, so that the case when a = 0
2195
       works correctly */
2196
1.66M
    if (size == 0)
2197
88.8k
        pout[size++] = 0;
2198
2199
    /* calculate exact length of output string, and allocate */
2200
1.66M
    strlen = negative + 1 + (size - 1) * _PyLong_DECIMAL_SHIFT;
2201
1.66M
    tenpow = 10;
2202
1.66M
    rem = pout[size-1];
2203
6.55M
    while (rem >= tenpow) {
2204
4.88M
        tenpow *= 10;
2205
4.88M
        strlen++;
2206
4.88M
    }
2207
1.66M
    if (strlen > _PY_LONG_MAX_STR_DIGITS_THRESHOLD) {
2208
127
        PyInterpreterState *interp = _PyInterpreterState_GET();
2209
127
        int max_str_digits = _Py_atomic_load_int(&interp->long_state.max_str_digits);
2210
127
        Py_ssize_t strlen_nosign = strlen - negative;
2211
127
        if ((max_str_digits > 0) && (strlen_nosign > max_str_digits)) {
2212
0
            Py_DECREF(scratch);
2213
0
            PyErr_Format(PyExc_ValueError, _MAX_STR_DIGITS_ERROR_FMT_TO_STR,
2214
0
                         max_str_digits);
2215
0
            return -1;
2216
0
        }
2217
127
    }
2218
1.66M
    if (writer) {
2219
1.26M
        if (_PyUnicodeWriter_Prepare(writer, strlen, '9') == -1) {
2220
0
            Py_DECREF(scratch);
2221
0
            return -1;
2222
0
        }
2223
1.26M
    }
2224
402k
    else if (bytes_writer) {
2225
0
        *bytes_str = PyBytesWriter_GrowAndUpdatePointer(bytes_writer, strlen,
2226
0
                                                        *bytes_str);
2227
0
        if (*bytes_str == NULL) {
2228
0
            Py_DECREF(scratch);
2229
0
            return -1;
2230
0
        }
2231
0
    }
2232
402k
    else {
2233
402k
        str = PyUnicode_New(strlen, '9');
2234
402k
        if (str == NULL) {
2235
0
            Py_DECREF(scratch);
2236
0
            return -1;
2237
0
        }
2238
402k
    }
2239
2240
1.66M
#define WRITE_DIGITS(p)                                               \
2241
1.66M
    do {                                                              \
2242
        /* pout[0] through pout[size-2] contribute exactly            \
2243
           _PyLong_DECIMAL_SHIFT digits each */                       \
2244
1.73M
        for (i=0; i < size - 1; i++) {                                \
2245
67.6k
            rem = pout[i];                                            \
2246
676k
            for (j = 0; j < _PyLong_DECIMAL_SHIFT; j++) {             \
2247
609k
                *--p = '0' + rem % 10;                                \
2248
609k
                rem /= 10;                                            \
2249
609k
            }                                                         \
2250
67.6k
        }                                                             \
2251
        /* pout[size-1]: always produce at least one decimal digit */ \
2252
1.66M
        rem = pout[i];                                                \
2253
6.55M
        do {                                                          \
2254
6.55M
            *--p = '0' + rem % 10;                                    \
2255
6.55M
            rem /= 10;                                                \
2256
6.55M
        } while (rem != 0);                                           \
2257
1.66M
                                                                      \
2258
        /* and sign */                                                \
2259
1.66M
        if (negative)                                                 \
2260
1.66M
            *--p = '-';                                               \
2261
1.66M
    } while (0)
2262
2263
1.66M
#define WRITE_UNICODE_DIGITS(TYPE)                                    \
2264
1.66M
    do {                                                              \
2265
1.66M
        if (writer)                                                   \
2266
1.66M
            p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + strlen; \
2267
1.66M
        else                                                          \
2268
1.66M
            p = (TYPE*)PyUnicode_DATA(str) + strlen;                  \
2269
1.66M
                                                                      \
2270
1.66M
        WRITE_DIGITS(p);                                              \
2271
1.66M
                                                                      \
2272
        /* check we've counted correctly */                           \
2273
1.66M
        if (writer)                                                   \
2274
1.66M
            assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \
2275
1.66M
        else                                                          \
2276
1.66M
            assert(p == (TYPE*)PyUnicode_DATA(str));                  \
2277
1.66M
    } while (0)
2278
2279
    /* fill the string right-to-left */
2280
1.66M
    if (bytes_writer) {
2281
0
        char *p = *bytes_str + strlen;
2282
0
        WRITE_DIGITS(p);
2283
0
        assert(p == *bytes_str);
2284
0
    }
2285
1.66M
    else {
2286
1.66M
        int kind = writer ? writer->kind : PyUnicode_KIND(str);
2287
1.66M
        if (kind == PyUnicode_1BYTE_KIND) {
2288
1.66M
            Py_UCS1 *p;
2289
1.66M
            WRITE_UNICODE_DIGITS(Py_UCS1);
2290
1.66M
        }
2291
0
        else if (kind == PyUnicode_2BYTE_KIND) {
2292
0
            Py_UCS2 *p;
2293
0
            WRITE_UNICODE_DIGITS(Py_UCS2);
2294
0
        }
2295
0
        else {
2296
0
            assert (kind == PyUnicode_4BYTE_KIND);
2297
0
            Py_UCS4 *p;
2298
0
            WRITE_UNICODE_DIGITS(Py_UCS4);
2299
0
        }
2300
1.66M
    }
2301
2302
1.66M
#undef WRITE_DIGITS
2303
1.66M
#undef WRITE_UNICODE_DIGITS
2304
2305
1.66M
    _Py_DECREF_INT(scratch);
2306
1.66M
    if (writer) {
2307
1.26M
        writer->pos += strlen;
2308
1.26M
    }
2309
402k
    else if (bytes_writer) {
2310
0
        (*bytes_str) += strlen;
2311
0
    }
2312
402k
    else {
2313
402k
        assert(_PyUnicode_CheckConsistency(str, 1));
2314
402k
        *p_output = (PyObject *)str;
2315
402k
    }
2316
1.66M
    return 0;
2317
1.66M
}
2318
2319
static PyObject *
2320
long_to_decimal_string(PyObject *aa)
2321
402k
{
2322
402k
    PyObject *v;
2323
402k
    if (long_to_decimal_string_internal(aa, &v, NULL, NULL, NULL) == -1)
2324
0
        return NULL;
2325
402k
    return v;
2326
402k
}
2327
2328
/* Convert an int object to a string, using a given conversion base,
2329
   which should be one of 2, 8 or 16.  Return a string object.
2330
   If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'
2331
   if alternate is nonzero. */
2332
2333
static int
2334
long_format_binary(PyObject *aa, int base, int alternate,
2335
                   PyObject **p_output, _PyUnicodeWriter *writer,
2336
                   PyBytesWriter *bytes_writer, char **bytes_str)
2337
164
{
2338
164
    PyLongObject *a = (PyLongObject *)aa;
2339
164
    PyObject *v = NULL;
2340
164
    Py_ssize_t sz;
2341
164
    Py_ssize_t size_a;
2342
164
    int negative;
2343
164
    int bits;
2344
2345
164
    assert(base == 2 || base == 8 || base == 16);
2346
    // writer or bytes_writer can be used, but not both at the same time.
2347
164
    assert(writer == NULL || bytes_writer == NULL);
2348
164
    if (a == NULL || !PyLong_Check(a)) {
2349
0
        PyErr_BadInternalCall();
2350
0
        return -1;
2351
0
    }
2352
164
    size_a = _PyLong_DigitCount(a);
2353
164
    negative = _PyLong_IsNegative(a);
2354
2355
    /* Compute a rough upper bound for the length of the string */
2356
164
    switch (base) {
2357
164
    case 16:
2358
164
        bits = 4;
2359
164
        break;
2360
0
    case 8:
2361
0
        bits = 3;
2362
0
        break;
2363
0
    case 2:
2364
0
        bits = 1;
2365
0
        break;
2366
0
    default:
2367
0
        Py_UNREACHABLE();
2368
164
    }
2369
2370
    /* Compute exact length 'sz' of output string. */
2371
164
    if (size_a == 0) {
2372
1
        sz = 1;
2373
1
    }
2374
163
    else {
2375
163
        Py_ssize_t size_a_in_bits;
2376
        /* Ensure overflow doesn't occur during computation of sz. */
2377
163
        if (size_a > (PY_SSIZE_T_MAX - 3) / PyLong_SHIFT) {
2378
0
            PyErr_SetString(PyExc_OverflowError,
2379
0
                            "int too large to format");
2380
0
            return -1;
2381
0
        }
2382
163
        size_a_in_bits = (size_a - 1) * PyLong_SHIFT +
2383
163
                         bit_length_digit(a->long_value.ob_digit[size_a - 1]);
2384
        /* Allow 1 character for a '-' sign. */
2385
163
        sz = negative + (size_a_in_bits + (bits - 1)) / bits;
2386
163
    }
2387
164
    if (alternate) {
2388
        /* 2 characters for prefix  */
2389
32
        sz += 2;
2390
32
    }
2391
2392
164
    if (writer) {
2393
132
        if (_PyUnicodeWriter_Prepare(writer, sz, 'x') == -1)
2394
0
            return -1;
2395
132
    }
2396
32
    else if (bytes_writer) {
2397
0
        *bytes_str = PyBytesWriter_GrowAndUpdatePointer(bytes_writer, sz,
2398
0
                                                        *bytes_str);
2399
0
        if (*bytes_str == NULL)
2400
0
            return -1;
2401
0
    }
2402
32
    else {
2403
32
        v = PyUnicode_New(sz, 'x');
2404
32
        if (v == NULL)
2405
0
            return -1;
2406
32
    }
2407
2408
164
#define WRITE_DIGITS(p)                                                 \
2409
164
    do {                                                                \
2410
164
        if (size_a == 0) {                                              \
2411
1
            *--p = '0';                                                 \
2412
1
        }                                                               \
2413
164
        else {                                                          \
2414
            /* JRH: special case for power-of-2 bases */                \
2415
163
            twodigits accum = 0;                                        \
2416
163
            int accumbits = 0;   /* # of bits in accum */               \
2417
163
            Py_ssize_t i;                                               \
2418
1.44k
            for (i = 0; i < size_a; ++i) {                              \
2419
1.27k
                accum |= (twodigits)a->long_value.ob_digit[i] << accumbits;        \
2420
1.27k
                accumbits += PyLong_SHIFT;                              \
2421
1.27k
                assert(accumbits >= bits);                              \
2422
9.03k
                do {                                                    \
2423
9.03k
                    char cdigit;                                        \
2424
9.03k
                    cdigit = (char)(accum & (base - 1));                \
2425
9.03k
                    cdigit += (cdigit < 10) ? '0' : 'a'-10;             \
2426
9.03k
                    *--p = cdigit;                                      \
2427
9.03k
                    accumbits -= bits;                                  \
2428
9.03k
                    accum >>= bits;                                     \
2429
9.03k
                } while (i < size_a-1 ? accumbits >= bits : accum > 0); \
2430
1.27k
            }                                                           \
2431
163
        }                                                               \
2432
164
                                                                        \
2433
164
        if (alternate) {                                                \
2434
32
            if (base == 16)                                             \
2435
32
                *--p = 'x';                                             \
2436
32
            else if (base == 8)                                         \
2437
0
                *--p = 'o';                                             \
2438
0
            else /* (base == 2) */                                      \
2439
0
                *--p = 'b';                                             \
2440
32
            *--p = '0';                                                 \
2441
32
        }                                                               \
2442
164
        if (negative)                                                   \
2443
164
            *--p = '-';                                                 \
2444
164
    } while (0)
2445
2446
164
#define WRITE_UNICODE_DIGITS(TYPE)                                      \
2447
164
    do {                                                                \
2448
164
        if (writer)                                                     \
2449
164
            p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + sz; \
2450
164
        else                                                            \
2451
164
            p = (TYPE*)PyUnicode_DATA(v) + sz;                          \
2452
164
                                                                        \
2453
164
        WRITE_DIGITS(p);                                                \
2454
164
                                                                        \
2455
164
        if (writer)                                                     \
2456
164
            assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \
2457
164
        else                                                            \
2458
164
            assert(p == (TYPE*)PyUnicode_DATA(v));                      \
2459
164
    } while (0)
2460
2461
164
    if (bytes_writer) {
2462
0
        char *p = *bytes_str + sz;
2463
0
        WRITE_DIGITS(p);
2464
0
        assert(p == *bytes_str);
2465
0
    }
2466
164
    else {
2467
164
        int kind = writer ? writer->kind : PyUnicode_KIND(v);
2468
164
        if (kind == PyUnicode_1BYTE_KIND) {
2469
164
            Py_UCS1 *p;
2470
164
            WRITE_UNICODE_DIGITS(Py_UCS1);
2471
164
        }
2472
0
        else if (kind == PyUnicode_2BYTE_KIND) {
2473
0
            Py_UCS2 *p;
2474
0
            WRITE_UNICODE_DIGITS(Py_UCS2);
2475
0
        }
2476
0
        else {
2477
0
            assert (kind == PyUnicode_4BYTE_KIND);
2478
0
            Py_UCS4 *p;
2479
0
            WRITE_UNICODE_DIGITS(Py_UCS4);
2480
0
        }
2481
164
    }
2482
2483
164
#undef WRITE_DIGITS
2484
164
#undef WRITE_UNICODE_DIGITS
2485
2486
164
    if (writer) {
2487
132
        writer->pos += sz;
2488
132
    }
2489
32
    else if (bytes_writer) {
2490
0
        (*bytes_str) += sz;
2491
0
    }
2492
32
    else {
2493
32
        assert(_PyUnicode_CheckConsistency(v, 1));
2494
32
        *p_output = v;
2495
32
    }
2496
164
    return 0;
2497
164
}
2498
2499
PyObject *
2500
_PyLong_Format(PyObject *obj, int base)
2501
32
{
2502
32
    PyObject *str;
2503
32
    int err;
2504
32
    if (base == 10)
2505
0
        err = long_to_decimal_string_internal(obj, &str, NULL, NULL, NULL);
2506
32
    else
2507
32
        err = long_format_binary(obj, base, 1, &str, NULL, NULL, NULL);
2508
32
    if (err == -1)
2509
0
        return NULL;
2510
32
    return str;
2511
32
}
2512
2513
int
2514
_PyLong_FormatWriter(_PyUnicodeWriter *writer,
2515
                     PyObject *obj,
2516
                     int base, int alternate)
2517
1.26M
{
2518
1.26M
    if (base == 10)
2519
1.26M
        return long_to_decimal_string_internal(obj, NULL, writer,
2520
1.26M
                                               NULL, NULL);
2521
132
    else
2522
132
        return long_format_binary(obj, base, alternate, NULL, writer,
2523
132
                                  NULL, NULL);
2524
1.26M
}
2525
2526
char*
2527
_PyLong_FormatBytesWriter(PyBytesWriter *writer, char *str,
2528
                          PyObject *obj,
2529
                          int base, int alternate)
2530
0
{
2531
0
    char *str2;
2532
0
    int res;
2533
0
    str2 = str;
2534
0
    if (base == 10)
2535
0
        res = long_to_decimal_string_internal(obj, NULL, NULL,
2536
0
                                              writer, &str2);
2537
0
    else
2538
0
        res = long_format_binary(obj, base, alternate, NULL, NULL,
2539
0
                                 writer, &str2);
2540
0
    if (res < 0)
2541
0
        return NULL;
2542
0
    assert(str2 != NULL);
2543
0
    return str2;
2544
0
}
2545
2546
/* Table of digit values for 8-bit string -> integer conversion.
2547
 * '0' maps to 0, ..., '9' maps to 9.
2548
 * 'a' and 'A' map to 10, ..., 'z' and 'Z' map to 35.
2549
 * All other indices map to 37.
2550
 * Note that when converting a base B string, a char c is a legitimate
2551
 * base B digit iff _PyLong_DigitValue[Py_CHARPyLong_MASK(c)] < B.
2552
 */
2553
unsigned char _PyLong_DigitValue[256] = {
2554
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2555
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2556
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2557
    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  37, 37, 37, 37, 37, 37,
2558
    37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2559
    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
2560
    37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2561
    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
2562
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2563
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2564
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2565
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2566
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2567
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2568
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2569
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2570
};
2571
2572
/* `start` and `end` point to the start and end of a string of base `base`
2573
 * digits.  base is a power of 2 (2, 4, 8, 16, or 32). An unnormalized int is
2574
 * returned in *res. The string should be already validated by the caller and
2575
 * consists only of valid digit characters and underscores. `digits` gives the
2576
 * number of digit characters.
2577
 *
2578
 * The point to this routine is that it takes time linear in the
2579
 * number of string characters.
2580
 *
2581
 * Return values:
2582
 *   -1 on syntax error (exception needs to be set, *res is untouched)
2583
 *   0 else (exception may be set, in that case *res is set to NULL)
2584
 */
2585
static int
2586
long_from_binary_base(const char *start, const char *end, Py_ssize_t digits, int base, PyLongObject **res)
2587
498k
{
2588
498k
    const char *p;
2589
498k
    int bits_per_char;
2590
498k
    Py_ssize_t n;
2591
498k
    PyLongObject *z;
2592
498k
    twodigits accum;
2593
498k
    int bits_in_accum;
2594
498k
    digit *pdigit;
2595
2596
498k
    assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
2597
498k
    n = base;
2598
1.51M
    for (bits_per_char = -1; n; ++bits_per_char) {
2599
1.01M
        n >>= 1;
2600
1.01M
    }
2601
2602
    /* n <- the number of Python digits needed,
2603
            = ceiling((digits * bits_per_char) / PyLong_SHIFT). */
2604
498k
    if (digits > (PY_SSIZE_T_MAX - (PyLong_SHIFT - 1)) / bits_per_char) {
2605
0
        PyErr_SetString(PyExc_ValueError,
2606
0
                        "int string too large to convert");
2607
0
        *res = NULL;
2608
0
        return 0;
2609
0
    }
2610
498k
    n = (digits * bits_per_char + PyLong_SHIFT - 1) / PyLong_SHIFT;
2611
498k
    z = long_alloc(n);
2612
498k
    if (z == NULL) {
2613
0
        *res = NULL;
2614
0
        return 0;
2615
0
    }
2616
    /* Read string from right, and fill in int from left; i.e.,
2617
     * from least to most significant in both.
2618
     */
2619
498k
    accum = 0;
2620
498k
    bits_in_accum = 0;
2621
498k
    pdigit = z->long_value.ob_digit;
2622
498k
    p = end;
2623
17.0M
    while (--p >= start) {
2624
16.5M
        int k;
2625
16.5M
        if (*p == '_') {
2626
251
            continue;
2627
251
        }
2628
16.5M
        k = (int)_PyLong_DigitValue[Py_CHARMASK(*p)];
2629
16.5M
        assert(k >= 0 && k < base);
2630
16.5M
        accum |= (twodigits)k << bits_in_accum;
2631
16.5M
        bits_in_accum += bits_per_char;
2632
16.5M
        if (bits_in_accum >= PyLong_SHIFT) {
2633
604k
            *pdigit++ = (digit)(accum & PyLong_MASK);
2634
604k
            assert(pdigit - z->long_value.ob_digit <= n);
2635
604k
            accum >>= PyLong_SHIFT;
2636
604k
            bits_in_accum -= PyLong_SHIFT;
2637
604k
            assert(bits_in_accum < PyLong_SHIFT);
2638
604k
        }
2639
16.5M
    }
2640
498k
    if (bits_in_accum) {
2641
497k
        assert(bits_in_accum <= PyLong_SHIFT);
2642
497k
        *pdigit++ = (digit)accum;
2643
497k
        assert(pdigit - z->long_value.ob_digit <= n);
2644
497k
    }
2645
498k
    while (pdigit - z->long_value.ob_digit < n)
2646
0
        *pdigit++ = 0;
2647
498k
    *res = z;
2648
498k
    return 0;
2649
498k
}
2650
2651
#ifdef WITH_PYLONG_MODULE
2652
/* asymptotically faster str-to-long conversion for base 10, using _pylong.py */
2653
static int
2654
pylong_int_from_string(const char *start, const char *end, PyLongObject **res)
2655
20.0k
{
2656
20.0k
    PyObject *mod = PyImport_ImportModule("_pylong");
2657
20.0k
    if (mod == NULL) {
2658
2
        goto error;
2659
2
    }
2660
20.0k
    PyObject *s = PyUnicode_FromStringAndSize(start, end-start);
2661
20.0k
    if (s == NULL) {
2662
0
        Py_DECREF(mod);
2663
0
        goto error;
2664
0
    }
2665
20.0k
    PyObject *result = PyObject_CallMethod(mod, "int_from_string", "O", s);
2666
20.0k
    Py_DECREF(s);
2667
20.0k
    Py_DECREF(mod);
2668
20.0k
    if (result == NULL) {
2669
2
        goto error;
2670
2
    }
2671
20.0k
    if (!PyLong_Check(result)) {
2672
0
        Py_DECREF(result);
2673
0
        PyErr_SetString(PyExc_TypeError,
2674
0
                        "_pylong.int_from_string did not return an int");
2675
0
        goto error;
2676
0
    }
2677
20.0k
    *res = (PyLongObject *)result;
2678
20.0k
    return 0;
2679
4
error:
2680
4
    *res = NULL;
2681
4
    return 0;  // See the long_from_string_base() API comment.
2682
20.0k
}
2683
#endif /* WITH_PYLONG_MODULE */
2684
2685
/***
2686
long_from_non_binary_base: parameters and return values are the same as
2687
long_from_binary_base.
2688
2689
Binary bases can be converted in time linear in the number of digits, because
2690
Python's representation base is binary.  Other bases (including decimal!) use
2691
the simple quadratic-time algorithm below, complicated by some speed tricks.
2692
2693
First some math:  the largest integer that can be expressed in N base-B digits
2694
is B**N-1.  Consequently, if we have an N-digit input in base B, the worst-
2695
case number of Python digits needed to hold it is the smallest integer n s.t.
2696
2697
    BASE**n-1 >= B**N-1  [or, adding 1 to both sides]
2698
    BASE**n >= B**N      [taking logs to base BASE]
2699
    n >= log(B**N)/log(BASE) = N * log(B)/log(BASE)
2700
2701
The static array log_base_BASE[base] == log(base)/log(BASE) so we can compute
2702
this quickly.  A Python int with that much space is reserved near the start,
2703
and the result is computed into it.
2704
2705
The input string is actually treated as being in base base**i (i.e., i digits
2706
are processed at a time), where two more static arrays hold:
2707
2708
    convwidth_base[base] = the largest integer i such that base**i <= BASE
2709
    convmultmax_base[base] = base ** convwidth_base[base]
2710
2711
The first of these is the largest i such that i consecutive input digits
2712
must fit in a single Python digit.  The second is effectively the input
2713
base we're really using.
2714
2715
Viewing the input as a sequence <c0, c1, ..., c_n-1> of digits in base
2716
convmultmax_base[base], the result is "simply"
2717
2718
   (((c0*B + c1)*B + c2)*B + c3)*B + ... ))) + c_n-1
2719
2720
where B = convmultmax_base[base].
2721
2722
Error analysis:  as above, the number of Python digits `n` needed is worst-
2723
case
2724
2725
    n >= N * log(B)/log(BASE)
2726
2727
where `N` is the number of input digits in base `B`.  This is computed via
2728
2729
    size_z = (Py_ssize_t)((scan - str) * log_base_BASE[base]) + 1;
2730
2731
below.  Two numeric concerns are how much space this can waste, and whether
2732
the computed result can be too small.  To be concrete, assume BASE = 2**15,
2733
which is the default (and it's unlikely anyone changes that).
2734
2735
Waste isn't a problem:  provided the first input digit isn't 0, the difference
2736
between the worst-case input with N digits and the smallest input with N
2737
digits is about a factor of B, but B is small compared to BASE so at most
2738
one allocated Python digit can remain unused on that count.  If
2739
N*log(B)/log(BASE) is mathematically an exact integer, then truncating that
2740
and adding 1 returns a result 1 larger than necessary.  However, that can't
2741
happen:  whenever B is a power of 2, long_from_binary_base() is called
2742
instead, and it's impossible for B**i to be an integer power of 2**15 when
2743
B is not a power of 2 (i.e., it's impossible for N*log(B)/log(BASE) to be
2744
an exact integer when B is not a power of 2, since B**i has a prime factor
2745
other than 2 in that case, but (2**15)**j's only prime factor is 2).
2746
2747
The computed result can be too small if the true value of N*log(B)/log(BASE)
2748
is a little bit larger than an exact integer, but due to roundoff errors (in
2749
computing log(B), log(BASE), their quotient, and/or multiplying that by N)
2750
yields a numeric result a little less than that integer.  Unfortunately, "how
2751
close can a transcendental function get to an integer over some range?"
2752
questions are generally theoretically intractable.  Computer analysis via
2753
continued fractions is practical:  expand log(B)/log(BASE) via continued
2754
fractions, giving a sequence i/j of "the best" rational approximations.  Then
2755
j*log(B)/log(BASE) is approximately equal to (the integer) i.  This shows that
2756
we can get very close to being in trouble, but very rarely.  For example,
2757
76573 is a denominator in one of the continued-fraction approximations to
2758
log(10)/log(2**15), and indeed:
2759
2760
    >>> log(10)/log(2**15)*76573
2761
    16958.000000654003
2762
2763
is very close to an integer.  If we were working with IEEE single-precision,
2764
rounding errors could kill us.  Finding worst cases in IEEE double-precision
2765
requires better-than-double-precision log() functions, and Tim didn't bother.
2766
Instead the code checks to see whether the allocated space is enough as each
2767
new Python digit is added, and copies the whole thing to a larger int if not.
2768
This should happen extremely rarely, and in fact I don't have a test case
2769
that triggers it(!).  Instead the code was tested by artificially allocating
2770
just 1 digit at the start, so that the copying code was exercised for every
2771
digit beyond the first.
2772
***/
2773
2774
// Tables are computed by Tools/scripts/long_conv_tables.py
2775
#if PYLONG_BITS_IN_DIGIT == 15
2776
    static const double log_base_BASE[37] = {0.0, 0.0, 0.0,
2777
        0.10566416671474375, 0.0, 0.15479520632582416,
2778
        0.17233083338141042, 0.18715699480384027, 0.0,
2779
        0.2113283334294875, 0.22146187299249084, 0.23062877457581984,
2780
        0.2389975000480771, 0.24669598120940617, 0.25382366147050694,
2781
        0.26045937304056793, 0.0, 0.27249752275002265,
2782
        0.27799500009615413, 0.2831951675629057, 0.28812853965915747,
2783
        0.29282116151858406, 0.2972954412424865, 0.3015707970704675,
2784
        0.3056641667147438, 0.30959041265164833, 0.3133626478760728,
2785
        0.31699250014423125, 0.3204903281371736, 0.3238653996751715,
2786
        0.3271260397072346, 0.3302797540257917, 0.0,
2787
        0.3362929412905636, 0.3391641894166893, 0.34195220112966446,
2788
        0.34466166676282084};
2789
    static const int convwidth_base[37] = {0, 0, 0, 9, 0, 6, 5, 5, 0,
2790
        4, 4, 4, 4, 4, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
2791
        3, 3, 0, 2, 2, 2, 2};
2792
    static const twodigits convmultmax_base[37] = {0, 0, 0, 19683, 0,
2793
        15625, 7776, 16807, 0, 6561, 10000, 14641, 20736, 28561, 2744,
2794
        3375, 0, 4913, 5832, 6859, 8000, 9261, 10648, 12167, 13824,
2795
        15625, 17576, 19683, 21952, 24389, 27000, 29791, 0, 1089,
2796
        1156, 1225, 1296};
2797
#elif PYLONG_BITS_IN_DIGIT == 30
2798
    static const double log_base_BASE[37] = {0.0, 0.0, 0.0,
2799
        0.05283208335737188, 0.0, 0.07739760316291208,
2800
        0.08616541669070521, 0.09357849740192013, 0.0,
2801
        0.10566416671474375, 0.11073093649624542, 0.11531438728790992,
2802
        0.11949875002403855, 0.12334799060470308, 0.12691183073525347,
2803
        0.13022968652028397, 0.0, 0.13624876137501132,
2804
        0.13899750004807707, 0.14159758378145285, 0.14406426982957873,
2805
        0.14641058075929203, 0.14864772062124326, 0.15078539853523376,
2806
        0.1528320833573719, 0.15479520632582416, 0.1566813239380364,
2807
        0.15849625007211562, 0.1602451640685868, 0.16193269983758574,
2808
        0.1635630198536173, 0.16513987701289584, 0.0,
2809
        0.1681464706452818, 0.16958209470834465, 0.17097610056483223,
2810
        0.17233083338141042};
2811
    static const int convwidth_base[37] = {0, 0, 0, 18, 0, 12, 11, 10,
2812
        0, 9, 9, 8, 8, 8, 7, 7, 0, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6,
2813
        6, 6, 6, 0, 5, 5, 5, 5};
2814
    static const twodigits convmultmax_base[37] = {0, 0, 0, 387420489,
2815
        0, 244140625, 362797056, 282475249, 0, 387420489, 1000000000,
2816
        214358881, 429981696, 815730721, 105413504, 170859375, 0,
2817
        410338673, 612220032, 893871739, 64000000, 85766121,
2818
        113379904, 148035889, 191102976, 244140625, 308915776,
2819
        387420489, 481890304, 594823321, 729000000, 887503681, 0,
2820
        39135393, 45435424, 52521875, 60466176};
2821
#else
2822
    #error "invalid PYLONG_BITS_IN_DIGIT value"
2823
#endif
2824
2825
static int
2826
long_from_non_binary_base(const char *start, const char *end, Py_ssize_t digits, int base, PyLongObject **res)
2827
1.99M
{
2828
1.99M
    twodigits c;           /* current input character */
2829
1.99M
    Py_ssize_t size_z;
2830
1.99M
    int i;
2831
1.99M
    int convwidth;
2832
1.99M
    twodigits convmultmax, convmult;
2833
1.99M
    digit *pz, *pzstop;
2834
1.99M
    PyLongObject *z;
2835
1.99M
    const char *p;
2836
2837
1.99M
    assert(log_base_BASE[base] != 0.0);
2838
2839
    /* Create an int object that can contain the largest possible
2840
     * integer with this base and length.  Note that there's no
2841
     * need to initialize z->long_value.ob_digit -- no slot is read up before
2842
     * being stored into.
2843
     */
2844
1.99M
    double fsize_z = (double)digits * log_base_BASE[base] + 1.0;
2845
1.99M
    if (fsize_z > (double)MAX_LONG_DIGITS) {
2846
        /* The same exception as in long_alloc(). */
2847
0
        PyErr_SetString(PyExc_OverflowError,
2848
0
                        "too many digits in integer");
2849
0
        *res = NULL;
2850
0
        return 0;
2851
0
    }
2852
1.99M
    size_z = (Py_ssize_t)fsize_z;
2853
    /* Uncomment next line to test exceedingly rare copy code */
2854
    /* size_z = 1; */
2855
1.99M
    assert(size_z > 0);
2856
1.99M
    z = long_alloc(size_z);
2857
1.99M
    if (z == NULL) {
2858
0
        *res = NULL;
2859
0
        return 0;
2860
0
    }
2861
1.99M
    z->long_value.ob_digit[0] = 0;
2862
1.99M
    _PyLong_SetSignAndDigitCount(z, 0, 0);
2863
2864
    /* `convwidth` consecutive input digits are treated as a single
2865
     * digit in base `convmultmax`.
2866
     */
2867
1.99M
    convwidth = convwidth_base[base];
2868
1.99M
    convmultmax = convmultmax_base[base];
2869
2870
    /* Work ;-) */
2871
1.99M
    p = start;
2872
19.3M
    while (p < end) {
2873
17.3M
        if (*p == '_') {
2874
224
            p++;
2875
224
            continue;
2876
224
        }
2877
        /* grab up to convwidth digits from the input string */
2878
17.3M
        c = (digit)_PyLong_DigitValue[Py_CHARMASK(*p++)];
2879
140M
        for (i = 1; i < convwidth && p != end; ++p) {
2880
123M
            if (*p == '_') {
2881
410
                continue;
2882
410
            }
2883
123M
            i++;
2884
123M
            c = (twodigits)(c *  base +
2885
123M
                            (int)_PyLong_DigitValue[Py_CHARMASK(*p)]);
2886
123M
            assert(c < PyLong_BASE);
2887
123M
        }
2888
2889
17.3M
        convmult = convmultmax;
2890
        /* Calculate the shift only if we couldn't get
2891
         * convwidth digits.
2892
         */
2893
17.3M
        if (i != convwidth) {
2894
1.97M
            convmult = base;
2895
2.67M
            for ( ; i > 1; --i) {
2896
698k
                convmult *= base;
2897
698k
            }
2898
1.97M
        }
2899
2900
        /* Multiply z by convmult, and add c. */
2901
17.3M
        pz = z->long_value.ob_digit;
2902
17.3M
        pzstop = pz + _PyLong_DigitCount(z);
2903
647M
        for (; pz < pzstop; ++pz) {
2904
629M
            c += (twodigits)*pz * convmult;
2905
629M
            *pz = (digit)(c & PyLong_MASK);
2906
629M
            c >>= PyLong_SHIFT;
2907
629M
        }
2908
        /* carry off the current end? */
2909
17.3M
        if (c) {
2910
8.71M
            assert(c < PyLong_BASE);
2911
8.71M
            if (_PyLong_DigitCount(z) < size_z) {
2912
8.71M
                *pz = (digit)c;
2913
8.71M
                assert(!_PyLong_IsNegative(z));
2914
8.71M
                _PyLong_SetSignAndDigitCount(z, 1, _PyLong_DigitCount(z) + 1);
2915
8.71M
            }
2916
0
            else {
2917
0
                PyLongObject *tmp;
2918
                /* Extremely rare.  Get more space. */
2919
0
                assert(_PyLong_DigitCount(z) == size_z);
2920
0
                tmp = long_alloc(size_z + 1);
2921
0
                if (tmp == NULL) {
2922
0
                    Py_DECREF(z);
2923
0
                    *res = NULL;
2924
0
                    return 0;
2925
0
                }
2926
0
                memcpy(tmp->long_value.ob_digit,
2927
0
                       z->long_value.ob_digit,
2928
0
                       sizeof(digit) * size_z);
2929
0
                Py_SETREF(z, tmp);
2930
0
                z->long_value.ob_digit[size_z] = (digit)c;
2931
0
                ++size_z;
2932
0
            }
2933
8.71M
        }
2934
17.3M
    }
2935
1.99M
    *res = z;
2936
1.99M
    return 0;
2937
1.99M
}
2938
2939
/* *str points to the first digit in a string of base `base` digits. base is an
2940
 * integer from 2 to 36 inclusive. Here we don't need to worry about prefixes
2941
 * like 0x or leading +- signs. The string should be null terminated consisting
2942
 * of ASCII digits and separating underscores possibly with trailing whitespace
2943
 * but we have to validate all of those points here.
2944
 *
2945
 * If base is a power of 2 then the complexity is linear in the number of
2946
 * characters in the string. Otherwise a quadratic algorithm is used for
2947
 * non-binary bases.
2948
 *
2949
 * Return values:
2950
 *
2951
 *   - Returns -1 on syntax error (exception needs to be set, *res is untouched)
2952
 *   - Returns 0 and sets *res to NULL for MemoryError, OverflowError, or
2953
 *     _pylong.int_from_string() errors.
2954
 *   - Returns 0 and sets *res to an unsigned, unnormalized PyLong (success!).
2955
 *
2956
 * Afterwards *str is set to point to the first non-digit (which may be *str!).
2957
 */
2958
static int
2959
long_from_string_base(const char **str, int base, PyLongObject **res)
2960
2.51M
{
2961
2.51M
    const char *start, *end, *p;
2962
2.51M
    char prev = 0;
2963
2.51M
    Py_ssize_t digits = 0;
2964
2.51M
    int is_binary_base = (base & (base - 1)) == 0;
2965
2966
    /* Here we do four things:
2967
     *
2968
     * - Find the `end` of the string.
2969
     * - Validate the string.
2970
     * - Count the number of `digits` (rather than underscores)
2971
     * - Point *str to the end-of-string or first invalid character.
2972
     */
2973
2.51M
    start = p = *str;
2974
    /* Leading underscore not allowed. */
2975
2.51M
    if (*start == '_') {
2976
6
        return -1;
2977
6
    }
2978
    /* Verify all characters are digits and underscores. */
2979
288M
    while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base || *p == '_') {
2980
285M
        if (*p == '_') {
2981
            /* Double underscore not allowed. */
2982
5.42k
            if (prev == '_') {
2983
3
                *str = p - 1;
2984
3
                return -1;
2985
3
            }
2986
285M
        } else {
2987
285M
            ++digits;
2988
285M
        }
2989
285M
        prev = *p;
2990
285M
        ++p;
2991
285M
    }
2992
    /* Trailing underscore not allowed. */
2993
2.51M
    if (prev == '_') {
2994
26
        *str = p - 1;
2995
26
        return -1;
2996
26
    }
2997
2.51M
    *str = end = p;
2998
    /* Reject empty strings */
2999
2.51M
    if (start == end) {
3000
1.46k
        return -1;
3001
1.46k
    }
3002
    /* Allow only trailing whitespace after `end` */
3003
2.51M
    while (*p && Py_ISSPACE(*p)) {
3004
426
        p++;
3005
426
    }
3006
2.51M
    *str = p;
3007
2.51M
    if (*p != '\0') {
3008
326
        return -1;
3009
326
    }
3010
3011
    /*
3012
     * Pass a validated string consisting of only valid digits and underscores
3013
     * to long_from_xxx_base.
3014
     */
3015
2.51M
    if (is_binary_base) {
3016
        /* Use the linear algorithm for binary bases. */
3017
498k
        return long_from_binary_base(start, end, digits, base, res);
3018
498k
    }
3019
2.01M
    else {
3020
        /* Limit the size to avoid excessive computation attacks exploiting the
3021
         * quadratic algorithm. */
3022
2.01M
        if (digits > _PY_LONG_MAX_STR_DIGITS_THRESHOLD) {
3023
104k
            PyInterpreterState *interp = _PyInterpreterState_GET();
3024
104k
            int max_str_digits = _Py_atomic_load_int(&interp->long_state.max_str_digits);
3025
104k
            if ((max_str_digits > 0) && (digits > max_str_digits)) {
3026
40
                PyErr_Format(PyExc_ValueError, _MAX_STR_DIGITS_ERROR_FMT_TO_INT,
3027
40
                             max_str_digits, digits);
3028
40
                *res = NULL;
3029
40
                return 0;
3030
40
            }
3031
104k
        }
3032
2.01M
#if WITH_PYLONG_MODULE
3033
2.01M
        if (digits > 6000 && base == 10) {
3034
            /* Switch to _pylong.int_from_string() */
3035
20.0k
            return pylong_int_from_string(start, end, res);
3036
20.0k
        }
3037
1.99M
#endif
3038
        /* Use the quadratic algorithm for non binary bases. */
3039
1.99M
        return long_from_non_binary_base(start, end, digits, base, res);
3040
2.01M
    }
3041
2.51M
}
3042
3043
/* Parses an int from a bytestring. Leading and trailing whitespace will be
3044
 * ignored.
3045
 *
3046
 * If successful, a PyLong object will be returned and 'pend' will be pointing
3047
 * to the first unused byte unless it's NULL.
3048
 *
3049
 * If unsuccessful, NULL will be returned.
3050
 */
3051
PyObject *
3052
PyLong_FromString(const char *str, char **pend, int base)
3053
2.51M
{
3054
2.51M
    int sign = 1, error_if_nonzero = 0;
3055
2.51M
    const char *orig_str = str;
3056
2.51M
    PyLongObject *z = NULL;
3057
2.51M
    PyObject *strobj;
3058
2.51M
    Py_ssize_t slen;
3059
3060
2.51M
    if ((base != 0 && base < 2) || base > 36) {
3061
0
        PyErr_SetString(PyExc_ValueError,
3062
0
                        "int() arg 2 must be >= 2 and <= 36");
3063
0
        return NULL;
3064
0
    }
3065
2.52M
    while (*str != '\0' && Py_ISSPACE(*str)) {
3066
5.60k
        ++str;
3067
5.60k
    }
3068
2.51M
    if (*str == '+') {
3069
2
        ++str;
3070
2
    }
3071
2.51M
    else if (*str == '-') {
3072
12.8k
        ++str;
3073
12.8k
        sign = -1;
3074
12.8k
    }
3075
2.51M
    if (base == 0) {
3076
78.6k
        if (str[0] != '0') {
3077
72.7k
            base = 10;
3078
72.7k
        }
3079
5.97k
        else if (str[1] == 'x' || str[1] == 'X') {
3080
3.56k
            base = 16;
3081
3.56k
        }
3082
2.41k
        else if (str[1] == 'o' || str[1] == 'O') {
3083
819
            base = 8;
3084
819
        }
3085
1.59k
        else if (str[1] == 'b' || str[1] == 'B') {
3086
999
            base = 2;
3087
999
        }
3088
592
        else {
3089
            /* "old" (C-style) octal literal, now invalid.
3090
               it might still be zero though */
3091
592
            error_if_nonzero = 1;
3092
592
            base = 10;
3093
592
        }
3094
78.6k
    }
3095
2.51M
    if (str[0] == '0' &&
3096
637k
        ((base == 16 && (str[1] == 'x' || str[1] == 'X')) ||
3097
634k
         (base == 8  && (str[1] == 'o' || str[1] == 'O')) ||
3098
633k
         (base == 2  && (str[1] == 'b' || str[1] == 'B')))) {
3099
5.38k
        str += 2;
3100
        /* One underscore allowed here. */
3101
5.38k
        if (*str == '_') {
3102
1
            ++str;
3103
1
        }
3104
5.38k
    }
3105
3106
    /* long_from_string_base is the main workhorse here. */
3107
2.51M
    int ret = long_from_string_base(&str, base, &z);
3108
2.51M
    if (ret == -1) {
3109
        /* Syntax error. */
3110
1.82k
        goto onError;
3111
1.82k
    }
3112
2.51M
    if (z == NULL) {
3113
        /* Error. exception already set. */
3114
44
        return NULL;
3115
44
    }
3116
3117
2.51M
    if (error_if_nonzero) {
3118
        /* reset the base to 0, else the exception message
3119
           doesn't make too much sense */
3120
432
        base = 0;
3121
432
        if (!_PyLong_IsZero(z)) {
3122
393
            goto onError;
3123
393
        }
3124
        /* there might still be other problems, therefore base
3125
           remains zero here for the same reason */
3126
432
    }
3127
3128
    /* Set sign and normalize */
3129
2.51M
    long_normalize(z);
3130
2.51M
    z = maybe_small_long(z);
3131
2.51M
    if (sign < 0) {
3132
12.8k
        _PyLong_Negate(&z);
3133
12.8k
    }
3134
3135
2.51M
    if (pend != NULL) {
3136
682k
        *pend = (char *)str;
3137
682k
    }
3138
2.51M
    return (PyObject *) z;
3139
3140
2.21k
  onError:
3141
2.21k
    if (pend != NULL) {
3142
2.21k
        *pend = (char *)str;
3143
2.21k
    }
3144
2.21k
    Py_XDECREF(z);
3145
2.21k
    slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200;
3146
2.21k
    strobj = PyUnicode_FromStringAndSize(orig_str, slen);
3147
2.21k
    if (strobj == NULL) {
3148
0
        return NULL;
3149
0
    }
3150
2.21k
    PyErr_Format(PyExc_ValueError,
3151
2.21k
                 "invalid literal for int() with base %d: %.200R",
3152
2.21k
                 base, strobj);
3153
2.21k
    Py_DECREF(strobj);
3154
2.21k
    return NULL;
3155
2.21k
}
3156
3157
/* Since PyLong_FromString doesn't have a length parameter,
3158
 * check here for possible NULs in the string.
3159
 *
3160
 * Reports an invalid literal as a bytes object.
3161
 */
3162
PyObject *
3163
_PyLong_FromBytes(const char *s, Py_ssize_t len, int base)
3164
488k
{
3165
488k
    PyObject *result, *strobj;
3166
488k
    char *end = NULL;
3167
3168
488k
    result = PyLong_FromString(s, &end, base);
3169
488k
    if (end == NULL || (result != NULL && end == s + len))
3170
488k
        return result;
3171
0
    Py_XDECREF(result);
3172
0
    strobj = PyBytes_FromStringAndSize(s, Py_MIN(len, 200));
3173
0
    if (strobj != NULL) {
3174
0
        PyErr_Format(PyExc_ValueError,
3175
0
                     "invalid literal for int() with base %d: %.200R",
3176
0
                     base, strobj);
3177
0
        Py_DECREF(strobj);
3178
0
    }
3179
0
    return NULL;
3180
488k
}
3181
3182
PyObject *
3183
PyLong_FromUnicodeObject(PyObject *u, int base)
3184
196k
{
3185
196k
    PyObject *result, *asciidig;
3186
196k
    const char *buffer;
3187
196k
    char *end = NULL;
3188
196k
    Py_ssize_t buflen;
3189
3190
196k
    asciidig = _PyUnicode_TransformDecimalAndSpaceToASCII(u);
3191
196k
    if (asciidig == NULL)
3192
0
        return NULL;
3193
196k
    assert(PyUnicode_IS_ASCII(asciidig));
3194
    /* Simply get a pointer to existing ASCII characters. */
3195
196k
    buffer = PyUnicode_AsUTF8AndSize(asciidig, &buflen);
3196
196k
    assert(buffer != NULL);
3197
3198
196k
    result = PyLong_FromString(buffer, &end, base);
3199
196k
    if (end == NULL || (result != NULL && end == buffer + buflen)) {
3200
193k
        Py_DECREF(asciidig);
3201
193k
        return result;
3202
193k
    }
3203
2.31k
    Py_DECREF(asciidig);
3204
2.31k
    Py_XDECREF(result);
3205
2.31k
    PyErr_Format(PyExc_ValueError,
3206
2.31k
                 "invalid literal for int() with base %d: %.200R",
3207
2.31k
                 base, u);
3208
2.31k
    return NULL;
3209
196k
}
3210
3211
/* Int division with remainder, top-level routine */
3212
3213
static int
3214
long_divrem(PyLongObject *a, PyLongObject *b,
3215
            PyLongObject **pdiv, PyLongObject **prem)
3216
92.3k
{
3217
92.3k
    Py_ssize_t size_a = _PyLong_DigitCount(a), size_b = _PyLong_DigitCount(b);
3218
92.3k
    PyLongObject *z;
3219
3220
92.3k
    if (size_b == 0) {
3221
108
        PyErr_SetString(PyExc_ZeroDivisionError, "division by zero");
3222
108
        return -1;
3223
108
    }
3224
92.2k
    if (size_a < size_b ||
3225
14.0k
        (size_a == size_b &&
3226
78.6k
         a->long_value.ob_digit[size_a-1] < b->long_value.ob_digit[size_b-1])) {
3227
        /* |a| < |b|. */
3228
78.6k
        *prem = (PyLongObject *)long_long((PyObject *)a);
3229
78.6k
        if (*prem == NULL) {
3230
0
            return -1;
3231
0
        }
3232
78.6k
        *pdiv = (PyLongObject*)_PyLong_GetZero();
3233
78.6k
        return 0;
3234
78.6k
    }
3235
13.5k
    if (size_b == 1) {
3236
9.37k
        digit rem = 0;
3237
9.37k
        z = divrem1(a, b->long_value.ob_digit[0], &rem);
3238
9.37k
        if (z == NULL)
3239
0
            return -1;
3240
9.37k
        *prem = (PyLongObject *) PyLong_FromLong((long)rem);
3241
9.37k
        if (*prem == NULL) {
3242
0
            Py_DECREF(z);
3243
0
            return -1;
3244
0
        }
3245
9.37k
    }
3246
4.20k
    else {
3247
4.20k
        z = x_divrem(a, b, prem);
3248
4.20k
        *prem = maybe_small_long(*prem);
3249
4.20k
        if (z == NULL)
3250
0
            return -1;
3251
4.20k
    }
3252
    /* Set the signs.
3253
       The quotient z has the sign of a*b;
3254
       the remainder r has the sign of a,
3255
       so a = b*z + r. */
3256
13.5k
    if ((_PyLong_IsNegative(a)) != (_PyLong_IsNegative(b))) {
3257
12.4k
        _PyLong_Negate(&z);
3258
12.4k
        if (z == NULL) {
3259
0
            Py_CLEAR(*prem);
3260
0
            return -1;
3261
0
        }
3262
12.4k
    }
3263
13.5k
    if (_PyLong_IsNegative(a) && !_PyLong_IsZero(*prem)) {
3264
8.21k
        _PyLong_Negate(prem);
3265
8.21k
        if (*prem == NULL) {
3266
0
            Py_DECREF(z);
3267
0
            Py_CLEAR(*prem);
3268
0
            return -1;
3269
0
        }
3270
8.21k
    }
3271
13.5k
    *pdiv = maybe_small_long(z);
3272
13.5k
    return 0;
3273
13.5k
}
3274
3275
/* Int remainder, top-level routine */
3276
3277
static int
3278
long_rem(PyLongObject *a, PyLongObject *b, PyLongObject **prem)
3279
23.3k
{
3280
23.3k
    Py_ssize_t size_a = _PyLong_DigitCount(a), size_b = _PyLong_DigitCount(b);
3281
3282
23.3k
    if (size_b == 0) {
3283
263
        PyErr_SetString(PyExc_ZeroDivisionError,
3284
263
                        "division by zero");
3285
263
        return -1;
3286
263
    }
3287
23.0k
    if (size_a < size_b ||
3288
13.8k
        (size_a == size_b &&
3289
10.5k
         a->long_value.ob_digit[size_a-1] < b->long_value.ob_digit[size_b-1])) {
3290
        /* |a| < |b|. */
3291
10.5k
        *prem = (PyLongObject *)long_long((PyObject *)a);
3292
10.5k
        return -(*prem == NULL);
3293
10.5k
    }
3294
12.5k
    if (size_b == 1) {
3295
6.66k
        *prem = rem1(a, b->long_value.ob_digit[0]);
3296
6.66k
        if (*prem == NULL)
3297
0
            return -1;
3298
6.66k
    }
3299
5.84k
    else {
3300
        /* Slow path using divrem. */
3301
5.84k
        Py_XDECREF(x_divrem(a, b, prem));
3302
5.84k
        *prem = maybe_small_long(*prem);
3303
5.84k
        if (*prem == NULL)
3304
0
            return -1;
3305
5.84k
    }
3306
    /* Set the sign. */
3307
12.5k
    if (_PyLong_IsNegative(a) && !_PyLong_IsZero(*prem)) {
3308
4.51k
        _PyLong_Negate(prem);
3309
4.51k
        if (*prem == NULL) {
3310
0
            Py_CLEAR(*prem);
3311
0
            return -1;
3312
0
        }
3313
4.51k
    }
3314
12.5k
    return 0;
3315
12.5k
}
3316
3317
/* Unsigned int division with remainder -- the algorithm.  The arguments v1
3318
   and w1 should satisfy 2 <= _PyLong_DigitCount(w1) <= _PyLong_DigitCount(v1). */
3319
3320
static PyLongObject *
3321
x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
3322
29.9k
{
3323
29.9k
    PyLongObject *v, *w, *a;
3324
29.9k
    Py_ssize_t i, k, size_v, size_w;
3325
29.9k
    int d;
3326
29.9k
    digit wm1, wm2, carry, q, r, vtop, *v0, *vk, *w0, *ak;
3327
29.9k
    twodigits vv;
3328
29.9k
    sdigit zhi;
3329
29.9k
    stwodigits z;
3330
3331
    /* We follow Knuth [The Art of Computer Programming, Vol. 2 (3rd
3332
       edn.), section 4.3.1, Algorithm D], except that we don't explicitly
3333
       handle the special case when the initial estimate q for a quotient
3334
       digit is >= PyLong_BASE: the max value for q is PyLong_BASE+1, and
3335
       that won't overflow a digit. */
3336
3337
    /* allocate space; w will also be used to hold the final remainder */
3338
29.9k
    size_v = _PyLong_DigitCount(v1);
3339
29.9k
    size_w = _PyLong_DigitCount(w1);
3340
29.9k
    assert(size_v >= size_w && size_w >= 2); /* Assert checks by div() */
3341
29.9k
    v = long_alloc(size_v+1);
3342
29.9k
    if (v == NULL) {
3343
0
        *prem = NULL;
3344
0
        return NULL;
3345
0
    }
3346
29.9k
    w = long_alloc(size_w);
3347
29.9k
    if (w == NULL) {
3348
0
        Py_DECREF(v);
3349
0
        *prem = NULL;
3350
0
        return NULL;
3351
0
    }
3352
3353
    /* normalize: shift w1 left so that its top digit is >= PyLong_BASE/2.
3354
       shift v1 left by the same amount.  Results go into w and v. */
3355
29.9k
    d = PyLong_SHIFT - bit_length_digit(w1->long_value.ob_digit[size_w-1]);
3356
29.9k
    carry = v_lshift(w->long_value.ob_digit, w1->long_value.ob_digit, size_w, d);
3357
29.9k
    assert(carry == 0);
3358
29.9k
    carry = v_lshift(v->long_value.ob_digit, v1->long_value.ob_digit, size_v, d);
3359
29.9k
    if (carry != 0 || v->long_value.ob_digit[size_v-1] >= w->long_value.ob_digit[size_w-1]) {
3360
14.6k
        v->long_value.ob_digit[size_v] = carry;
3361
14.6k
        size_v++;
3362
14.6k
    }
3363
3364
    /* Now v->long_value.ob_digit[size_v-1] < w->long_value.ob_digit[size_w-1], so quotient has
3365
       at most (and usually exactly) k = size_v - size_w digits. */
3366
29.9k
    k = size_v - size_w;
3367
29.9k
    assert(k >= 0);
3368
29.9k
    a = long_alloc(k);
3369
29.9k
    if (a == NULL) {
3370
0
        Py_DECREF(w);
3371
0
        Py_DECREF(v);
3372
0
        *prem = NULL;
3373
0
        return NULL;
3374
0
    }
3375
29.9k
    a->long_value.ob_digit[0] = 0;
3376
29.9k
    v0 = v->long_value.ob_digit;
3377
29.9k
    w0 = w->long_value.ob_digit;
3378
29.9k
    wm1 = w0[size_w-1];
3379
29.9k
    wm2 = w0[size_w-2];
3380
94.8k
    for (vk = v0+k, ak = a->long_value.ob_digit + k; vk-- > v0;) {
3381
        /* inner loop: divide vk[0:size_w+1] by w0[0:size_w], giving
3382
           single-digit quotient q, remainder in vk[0:size_w]. */
3383
3384
64.8k
        SIGCHECK({
3385
64.8k
                Py_DECREF(a);
3386
64.8k
                Py_DECREF(w);
3387
64.8k
                Py_DECREF(v);
3388
64.8k
                *prem = NULL;
3389
64.8k
                return NULL;
3390
64.8k
            });
3391
3392
        /* estimate quotient digit q; may overestimate by 1 (rare) */
3393
64.8k
        vtop = vk[size_w];
3394
64.8k
        assert(vtop <= wm1);
3395
64.8k
        vv = ((twodigits)vtop << PyLong_SHIFT) | vk[size_w-1];
3396
        /* The code used to compute the remainder via
3397
         *     r = (digit)(vv - (twodigits)wm1 * q);
3398
         * and compilers generally generated code to do the * and -.
3399
         * But modern processors generally compute q and r with a single
3400
         * instruction, and modern optimizing compilers exploit that if we
3401
         * _don't_ try to optimize it.
3402
         */
3403
64.8k
        q = (digit)(vv / wm1);
3404
64.8k
        r = (digit)(vv % wm1);
3405
80.8k
        while ((twodigits)wm2 * q > (((twodigits)r << PyLong_SHIFT)
3406
80.8k
                                     | vk[size_w-2])) {
3407
18.8k
            --q;
3408
18.8k
            r += wm1;
3409
18.8k
            if (r >= PyLong_BASE)
3410
2.88k
                break;
3411
18.8k
        }
3412
64.8k
        assert(q <= PyLong_BASE);
3413
3414
        /* subtract q*w0[0:size_w] from vk[0:size_w+1] */
3415
64.8k
        zhi = 0;
3416
1.13M
        for (i = 0; i < size_w; ++i) {
3417
            /* invariants: -PyLong_BASE <= -q <= zhi <= 0;
3418
               -PyLong_BASE * q <= z < PyLong_BASE */
3419
1.06M
            z = (sdigit)vk[i] + zhi -
3420
1.06M
                (stwodigits)q * (stwodigits)w0[i];
3421
1.06M
            vk[i] = (digit)z & PyLong_MASK;
3422
1.06M
            zhi = (sdigit)Py_ARITHMETIC_RIGHT_SHIFT(stwodigits,
3423
1.06M
                                                    z, PyLong_SHIFT);
3424
1.06M
        }
3425
3426
        /* add w back if q was too large (this branch taken rarely) */
3427
64.8k
        assert((sdigit)vtop + zhi == -1 || (sdigit)vtop + zhi == 0);
3428
64.8k
        if ((sdigit)vtop + zhi < 0) {
3429
584
            carry = 0;
3430
3.39k
            for (i = 0; i < size_w; ++i) {
3431
2.80k
                carry += vk[i] + w0[i];
3432
2.80k
                vk[i] = carry & PyLong_MASK;
3433
2.80k
                carry >>= PyLong_SHIFT;
3434
2.80k
            }
3435
584
            --q;
3436
584
        }
3437
3438
        /* store quotient digit */
3439
64.8k
        assert(q < PyLong_BASE);
3440
64.8k
        *--ak = q;
3441
64.8k
    }
3442
3443
    /* unshift remainder; we reuse w to store the result */
3444
29.9k
    carry = v_rshift(w0, v0, size_w, d);
3445
29.9k
    assert(carry==0);
3446
29.9k
    Py_DECREF(v);
3447
3448
29.9k
    *prem = long_normalize(w);
3449
29.9k
    return long_normalize(a);
3450
29.9k
}
3451
3452
/* For a nonzero PyLong a, express a in the form x * 2**e, with 0.5 <=
3453
   abs(x) < 1.0 and e >= 0; return x and put e in *e.  Here x is
3454
   rounded to DBL_MANT_DIG significant bits using round-half-to-even.
3455
   If a == 0, return 0.0 and set *e = 0.  */
3456
3457
/* attempt to define 2.0**DBL_MANT_DIG as a compile-time constant */
3458
#if DBL_MANT_DIG == 53
3459
14.3k
#define EXP2_DBL_MANT_DIG 9007199254740992.0
3460
#else
3461
#define EXP2_DBL_MANT_DIG (ldexp(1.0, DBL_MANT_DIG))
3462
#endif
3463
3464
double
3465
_PyLong_Frexp(PyLongObject *a, int64_t *e)
3466
14.3k
{
3467
14.3k
    Py_ssize_t a_size, shift_digits, x_size;
3468
14.3k
    int shift_bits;
3469
14.3k
    int64_t a_bits;
3470
    /* See below for why x_digits is always large enough. */
3471
14.3k
    digit rem;
3472
14.3k
    digit x_digits[2 + (DBL_MANT_DIG + 1) / PyLong_SHIFT] = {0,};
3473
14.3k
    double dx;
3474
    /* Correction term for round-half-to-even rounding.  For a digit x,
3475
       "x + half_even_correction[x & 7]" gives x rounded to the nearest
3476
       multiple of 4, rounding ties to a multiple of 8. */
3477
14.3k
    static const int half_even_correction[8] = {0, -1, -2, 1, 0, -1, 2, 1};
3478
3479
14.3k
    a_size = _PyLong_DigitCount(a);
3480
14.3k
    if (a_size == 0) {
3481
        /* Special case for 0: significand 0.0, exponent 0. */
3482
0
        *e = 0;
3483
0
        return 0.0;
3484
0
    }
3485
14.3k
    a_bits = _PyLong_NumBits((PyObject *)a);
3486
3487
    /* Shift the first DBL_MANT_DIG + 2 bits of a into x_digits[0:x_size]
3488
       (shifting left if a_bits <= DBL_MANT_DIG + 2).
3489
3490
       Number of digits needed for result: write // for floor division.
3491
       Then if shifting left, we end up using
3492
3493
         1 + a_size + (DBL_MANT_DIG + 2 - a_bits) // PyLong_SHIFT
3494
3495
       digits.  If shifting right, we use
3496
3497
         a_size - (a_bits - DBL_MANT_DIG - 2) // PyLong_SHIFT
3498
3499
       digits.  Using a_size = 1 + (a_bits - 1) // PyLong_SHIFT along with
3500
       the inequalities
3501
3502
         m // PyLong_SHIFT + n // PyLong_SHIFT <= (m + n) // PyLong_SHIFT
3503
         m // PyLong_SHIFT - n // PyLong_SHIFT <=
3504
                                          1 + (m - n - 1) // PyLong_SHIFT,
3505
3506
       valid for any integers m and n, we find that x_size satisfies
3507
3508
         x_size <= 2 + (DBL_MANT_DIG + 1) // PyLong_SHIFT
3509
3510
       in both cases.
3511
    */
3512
14.3k
    if (a_bits <= DBL_MANT_DIG + 2) {
3513
8.33k
        shift_digits = (DBL_MANT_DIG + 2 - (Py_ssize_t)a_bits) / PyLong_SHIFT;
3514
8.33k
        shift_bits = (DBL_MANT_DIG + 2 - (int)a_bits) % PyLong_SHIFT;
3515
8.33k
        x_size = shift_digits;
3516
8.33k
        rem = v_lshift(x_digits + x_size, a->long_value.ob_digit, a_size,
3517
8.33k
                       shift_bits);
3518
8.33k
        x_size += a_size;
3519
8.33k
        x_digits[x_size++] = rem;
3520
8.33k
    }
3521
6.04k
    else {
3522
6.04k
        shift_digits = (Py_ssize_t)((a_bits - DBL_MANT_DIG - 2) / PyLong_SHIFT);
3523
6.04k
        shift_bits = (int)((a_bits - DBL_MANT_DIG - 2) % PyLong_SHIFT);
3524
6.04k
        rem = v_rshift(x_digits, a->long_value.ob_digit + shift_digits,
3525
6.04k
                       a_size - shift_digits, shift_bits);
3526
6.04k
        x_size = a_size - shift_digits;
3527
        /* For correct rounding below, we need the least significant
3528
           bit of x to be 'sticky' for this shift: if any of the bits
3529
           shifted out was nonzero, we set the least significant bit
3530
           of x. */
3531
6.04k
        if (rem)
3532
4.35k
            x_digits[0] |= 1;
3533
1.69k
        else
3534
2.95k
            while (shift_digits > 0)
3535
1.84k
                if (a->long_value.ob_digit[--shift_digits]) {
3536
587
                    x_digits[0] |= 1;
3537
587
                    break;
3538
587
                }
3539
6.04k
    }
3540
14.3k
    assert(1 <= x_size && x_size <= (Py_ssize_t)Py_ARRAY_LENGTH(x_digits));
3541
3542
    /* Round, and convert to double. */
3543
14.3k
    x_digits[0] += half_even_correction[x_digits[0] & 7];
3544
14.3k
    dx = x_digits[--x_size];
3545
41.0k
    while (x_size > 0)
3546
26.6k
        dx = dx * PyLong_BASE + x_digits[--x_size];
3547
3548
    /* Rescale;  make correction if result is 1.0. */
3549
14.3k
    dx /= 4.0 * EXP2_DBL_MANT_DIG;
3550
14.3k
    if (dx == 1.0) {
3551
169
        assert(a_bits < INT64_MAX);
3552
169
        dx = 0.5;
3553
169
        a_bits += 1;
3554
169
    }
3555
3556
14.3k
    *e = a_bits;
3557
14.3k
    return _PyLong_IsNegative(a) ? -dx : dx;
3558
14.3k
}
3559
3560
/* Get a C double from an int object.  Rounds to the nearest double,
3561
   using the round-half-to-even rule in the case of a tie. */
3562
3563
double
3564
PyLong_AsDouble(PyObject *v)
3565
173k
{
3566
173k
    int64_t exponent;
3567
173k
    double x;
3568
3569
173k
    if (v == NULL) {
3570
0
        PyErr_BadInternalCall();
3571
0
        return -1.0;
3572
0
    }
3573
173k
    if (!PyLong_Check(v)) {
3574
0
        PyErr_SetString(PyExc_TypeError, "an integer is required");
3575
0
        return -1.0;
3576
0
    }
3577
173k
    if (_PyLong_IsCompact((PyLongObject *)v)) {
3578
        /* Fast path; single digit long (31 bits) will cast safely
3579
           to double.  This improves performance of FP/long operations
3580
           by 20%.
3581
        */
3582
159k
        return (double)medium_value((PyLongObject *)v);
3583
159k
    }
3584
14.3k
    x = _PyLong_Frexp((PyLongObject *)v, &exponent);
3585
14.3k
    assert(exponent >= 0);
3586
14.3k
    assert(!PyErr_Occurred());
3587
14.3k
    if (exponent > DBL_MAX_EXP) {
3588
263
        PyErr_SetString(PyExc_OverflowError,
3589
263
                        "int too large to convert to float");
3590
263
        return -1.0;
3591
263
    }
3592
14.1k
    return ldexp(x, (int)exponent);
3593
14.3k
}
3594
3595
/* Methods */
3596
3597
/* if a < b, return a negative number
3598
   if a == b, return 0
3599
   if a > b, return a positive number */
3600
3601
static Py_ssize_t
3602
long_compare(PyLongObject *a, PyLongObject *b)
3603
35.6M
{
3604
35.6M
    if (_PyLong_BothAreCompact(a, b)) {
3605
22.3M
        return _PyLong_CompactValue(a) - _PyLong_CompactValue(b);
3606
22.3M
    }
3607
13.2M
    Py_ssize_t sign = _PyLong_SignedDigitCount(a) - _PyLong_SignedDigitCount(b);
3608
13.2M
    if (sign == 0) {
3609
1.00M
        Py_ssize_t i = _PyLong_DigitCount(a);
3610
1.00M
        sdigit diff = 0;
3611
3.71M
        while (--i >= 0) {
3612
2.78M
            diff = (sdigit) a->long_value.ob_digit[i] - (sdigit) b->long_value.ob_digit[i];
3613
2.78M
            if (diff) {
3614
67.0k
                break;
3615
67.0k
            }
3616
2.78M
        }
3617
1.00M
        sign = _PyLong_IsNegative(a) ? -diff : diff;
3618
1.00M
    }
3619
13.2M
    return sign;
3620
35.6M
}
3621
3622
static PyObject *
3623
long_richcompare(PyObject *self, PyObject *other, int op)
3624
39.6M
{
3625
39.6M
    Py_ssize_t result;
3626
39.6M
    CHECK_BINOP(self, other);
3627
39.6M
    if (self == other)
3628
3.99M
        result = 0;
3629
35.6M
    else
3630
35.6M
        result = long_compare((PyLongObject*)self, (PyLongObject*)other);
3631
39.6M
    Py_RETURN_RICHCOMPARE(result, 0, op);
3632
39.6M
}
3633
3634
void
3635
_PyLong_ExactDealloc(PyObject *self)
3636
23.2M
{
3637
23.2M
    assert(PyLong_CheckExact(self));
3638
23.2M
    if (_PyLong_IsSmallInt((PyLongObject *)self)) {
3639
        // See PEP 683, section Accidental De-Immortalizing for details
3640
0
        _Py_SetImmortal(self);
3641
0
        return;
3642
0
    }
3643
23.2M
    if (_PyLong_IsCompact((PyLongObject *)self)) {
3644
19.4M
        _Py_FREELIST_FREE(ints, self, PyObject_Free);
3645
19.4M
        return;
3646
19.4M
    }
3647
3.73M
    PyObject_Free(self);
3648
3.73M
}
3649
3650
static void
3651
long_dealloc(PyObject *self)
3652
53.9M
{
3653
53.9M
    if (_PyLong_IsSmallInt((PyLongObject *)self)) {
3654
        /* This should never get called, but we also don't want to SEGV if
3655
         * we accidentally decref small Ints out of existence. Instead,
3656
         * since small Ints are immortal, re-set the reference count.
3657
         *
3658
         * See PEP 683, section Accidental De-Immortalizing for details
3659
         */
3660
0
        _Py_SetImmortal(self);
3661
0
        return;
3662
0
    }
3663
53.9M
    if (PyLong_CheckExact(self) && _PyLong_IsCompact((PyLongObject *)self)) {
3664
50.1M
        _Py_FREELIST_FREE(ints, self, PyObject_Free);
3665
50.1M
        return;
3666
50.1M
    }
3667
3.87M
    Py_TYPE(self)->tp_free(self);
3668
3.87M
}
3669
3670
static Py_hash_t
3671
long_hash(PyObject *obj)
3672
158M
{
3673
158M
    PyLongObject *v = (PyLongObject *)obj;
3674
158M
    Py_uhash_t x;
3675
158M
    Py_ssize_t i;
3676
158M
    int sign;
3677
3678
158M
    if (_PyLong_IsCompact(v)) {
3679
147M
        x = (Py_uhash_t)_PyLong_CompactValue(v);
3680
147M
        if (x == (Py_uhash_t)-1) {
3681
1.79k
            x = (Py_uhash_t)-2;
3682
1.79k
        }
3683
147M
        return x;
3684
147M
    }
3685
11.1M
    i = _PyLong_DigitCount(v);
3686
11.1M
    sign = _PyLong_NonCompactSign(v);
3687
3688
    // unroll first digit
3689
11.1M
    Py_BUILD_ASSERT(PyHASH_BITS > PyLong_SHIFT);
3690
11.1M
    assert(i >= 1);
3691
11.1M
    --i;
3692
11.1M
    x = v->long_value.ob_digit[i];
3693
11.1M
    assert(x < PyHASH_MODULUS);
3694
3695
11.1M
#if PyHASH_BITS >= 2 * PyLong_SHIFT
3696
    // unroll second digit
3697
11.1M
    assert(i >= 1);
3698
11.1M
    --i;
3699
11.1M
    x <<= PyLong_SHIFT;
3700
11.1M
    x += v->long_value.ob_digit[i];
3701
11.1M
    assert(x < PyHASH_MODULUS);
3702
11.1M
#endif
3703
3704
13.2M
    while (--i >= 0) {
3705
        /* Here x is a quantity in the range [0, PyHASH_MODULUS); we
3706
           want to compute x * 2**PyLong_SHIFT + v->long_value.ob_digit[i] modulo
3707
           PyHASH_MODULUS.
3708
3709
           The computation of x * 2**PyLong_SHIFT % PyHASH_MODULUS
3710
           amounts to a rotation of the bits of x.  To see this, write
3711
3712
             x * 2**PyLong_SHIFT = y * 2**PyHASH_BITS + z
3713
3714
           where y = x >> (PyHASH_BITS - PyLong_SHIFT) gives the top
3715
           PyLong_SHIFT bits of x (those that are shifted out of the
3716
           original PyHASH_BITS bits, and z = (x << PyLong_SHIFT) &
3717
           PyHASH_MODULUS gives the bottom PyHASH_BITS - PyLong_SHIFT
3718
           bits of x, shifted up.  Then since 2**PyHASH_BITS is
3719
           congruent to 1 modulo PyHASH_MODULUS, y*2**PyHASH_BITS is
3720
           congruent to y modulo PyHASH_MODULUS.  So
3721
3722
             x * 2**PyLong_SHIFT = y + z (mod PyHASH_MODULUS).
3723
3724
           The right-hand side is just the result of rotating the
3725
           PyHASH_BITS bits of x left by PyLong_SHIFT places; since
3726
           not all PyHASH_BITS bits of x are 1s, the same is true
3727
           after rotation, so 0 <= y+z < PyHASH_MODULUS and y + z is
3728
           the reduction of x*2**PyLong_SHIFT modulo
3729
           PyHASH_MODULUS. */
3730
2.11M
        x = ((x << PyLong_SHIFT) & PyHASH_MODULUS) |
3731
2.11M
            (x >> (PyHASH_BITS - PyLong_SHIFT));
3732
2.11M
        x += v->long_value.ob_digit[i];
3733
2.11M
        if (x >= PyHASH_MODULUS)
3734
2.98k
            x -= PyHASH_MODULUS;
3735
2.11M
    }
3736
11.1M
    x = x * sign;
3737
11.1M
    if (x == (Py_uhash_t)-1)
3738
5.52k
        x = (Py_uhash_t)-2;
3739
11.1M
    return (Py_hash_t)x;
3740
11.1M
}
3741
3742
3743
/* Add the absolute values of two integers. */
3744
3745
static PyLongObject *
3746
x_add(PyLongObject *a, PyLongObject *b)
3747
2.90M
{
3748
2.90M
    Py_ssize_t size_a = _PyLong_DigitCount(a), size_b = _PyLong_DigitCount(b);
3749
2.90M
    PyLongObject *z;
3750
2.90M
    Py_ssize_t i;
3751
2.90M
    digit carry = 0;
3752
3753
    /* Ensure a is the larger of the two: */
3754
2.90M
    if (size_a < size_b) {
3755
793k
        { PyLongObject *temp = a; a = b; b = temp; }
3756
793k
        { Py_ssize_t size_temp = size_a;
3757
793k
            size_a = size_b;
3758
793k
            size_b = size_temp; }
3759
793k
    }
3760
2.90M
    z = long_alloc(size_a+1);
3761
2.90M
    if (z == NULL)
3762
0
        return NULL;
3763
35.6M
    for (i = 0; i < size_b; ++i) {
3764
32.7M
        carry += a->long_value.ob_digit[i] + b->long_value.ob_digit[i];
3765
32.7M
        z->long_value.ob_digit[i] = carry & PyLong_MASK;
3766
32.7M
        carry >>= PyLong_SHIFT;
3767
32.7M
    }
3768
31.3M
    for (; i < size_a; ++i) {
3769
28.4M
        carry += a->long_value.ob_digit[i];
3770
28.4M
        z->long_value.ob_digit[i] = carry & PyLong_MASK;
3771
28.4M
        carry >>= PyLong_SHIFT;
3772
28.4M
    }
3773
2.90M
    z->long_value.ob_digit[i] = carry;
3774
2.90M
    return long_normalize(z);
3775
2.90M
}
3776
3777
/* Subtract the absolute values of two integers. */
3778
3779
static PyLongObject *
3780
x_sub(PyLongObject *a, PyLongObject *b)
3781
15.2k
{
3782
15.2k
    Py_ssize_t size_a = _PyLong_DigitCount(a), size_b = _PyLong_DigitCount(b);
3783
15.2k
    PyLongObject *z;
3784
15.2k
    Py_ssize_t i;
3785
15.2k
    int sign = 1;
3786
15.2k
    digit borrow = 0;
3787
3788
    /* Ensure a is the larger of the two: */
3789
15.2k
    if (size_a < size_b) {
3790
4.75k
        sign = -1;
3791
4.75k
        { PyLongObject *temp = a; a = b; b = temp; }
3792
4.75k
        { Py_ssize_t size_temp = size_a;
3793
4.75k
            size_a = size_b;
3794
4.75k
            size_b = size_temp; }
3795
4.75k
    }
3796
10.4k
    else if (size_a == size_b) {
3797
        /* Find highest digit where a and b differ: */
3798
5.10k
        i = size_a;
3799
6.43k
        while (--i >= 0 && a->long_value.ob_digit[i] == b->long_value.ob_digit[i])
3800
1.32k
            ;
3801
5.10k
        if (i < 0)
3802
322
            return (PyLongObject *)PyLong_FromLong(0);
3803
4.78k
        if (a->long_value.ob_digit[i] < b->long_value.ob_digit[i]) {
3804
652
            sign = -1;
3805
652
            { PyLongObject *temp = a; a = b; b = temp; }
3806
652
        }
3807
4.78k
        size_a = size_b = i+1;
3808
4.78k
    }
3809
14.8k
    z = long_alloc(size_a);
3810
14.8k
    if (z == NULL)
3811
0
        return NULL;
3812
65.5k
    for (i = 0; i < size_b; ++i) {
3813
        /* The following assumes unsigned arithmetic
3814
           works module 2**N for some N>PyLong_SHIFT. */
3815
50.6k
        borrow = a->long_value.ob_digit[i] - b->long_value.ob_digit[i] - borrow;
3816
50.6k
        z->long_value.ob_digit[i] = borrow & PyLong_MASK;
3817
50.6k
        borrow >>= PyLong_SHIFT;
3818
50.6k
        borrow &= 1; /* Keep only one sign bit */
3819
50.6k
    }
3820
50.9k
    for (; i < size_a; ++i) {
3821
36.0k
        borrow = a->long_value.ob_digit[i] - borrow;
3822
36.0k
        z->long_value.ob_digit[i] = borrow & PyLong_MASK;
3823
36.0k
        borrow >>= PyLong_SHIFT;
3824
36.0k
        borrow &= 1; /* Keep only one sign bit */
3825
36.0k
    }
3826
14.8k
    assert(borrow == 0);
3827
14.8k
    if (sign < 0) {
3828
5.40k
        _PyLong_FlipSign(z);
3829
5.40k
    }
3830
14.8k
    return maybe_small_long(long_normalize(z));
3831
14.8k
}
3832
3833
static PyLongObject *
3834
long_add(PyLongObject *a, PyLongObject *b)
3835
12.6M
{
3836
12.6M
    if (_PyLong_BothAreCompact(a, b)) {
3837
10.1M
        stwodigits z = medium_value(a) + medium_value(b);
3838
10.1M
        return _PyLong_FromSTwoDigits(z);
3839
10.1M
    }
3840
3841
2.41M
    PyLongObject *z;
3842
2.41M
    if (_PyLong_IsNegative(a)) {
3843
7.26k
        if (_PyLong_IsNegative(b)) {
3844
667
            z = x_add(a, b);
3845
667
            if (z != NULL) {
3846
                /* x_add received at least one multiple-digit int,
3847
                   and thus z must be a multiple-digit int.
3848
                   That also means z is not an element of
3849
                   small_ints, so negating it in-place is safe. */
3850
667
                assert(Py_REFCNT(z) == 1);
3851
667
                _PyLong_FlipSign(z);
3852
667
            }
3853
667
        }
3854
6.59k
        else
3855
6.59k
            z = x_sub(b, a);
3856
7.26k
    }
3857
2.40M
    else {
3858
2.40M
        if (_PyLong_IsNegative(b))
3859
3.64k
            z = x_sub(a, b);
3860
2.40M
        else
3861
2.40M
            z = x_add(a, b);
3862
2.40M
    }
3863
2.41M
    return z;
3864
2.41M
}
3865
3866
_PyStackRef
3867
_PyCompactLong_Add(PyLongObject *a, PyLongObject *b)
3868
70.9M
{
3869
70.9M
    assert(_PyLong_BothAreCompact(a, b));
3870
70.9M
    stwodigits v = medium_value(a) + medium_value(b);
3871
70.9M
    return medium_from_stwodigits(v);
3872
70.9M
}
3873
3874
static PyObject *
3875
long_add_method(PyObject *a, PyObject *b)
3876
12.5M
{
3877
12.5M
    CHECK_BINOP(a, b);
3878
12.5M
    return (PyObject*)long_add((PyLongObject*)a, (PyLongObject*)b);
3879
12.5M
}
3880
3881
3882
static PyLongObject *
3883
long_sub(PyLongObject *a, PyLongObject *b)
3884
32.3k
{
3885
32.3k
    if (_PyLong_BothAreCompact(a, b)) {
3886
17.8k
        return _PyLong_FromSTwoDigits(medium_value(a) - medium_value(b));
3887
17.8k
    }
3888
3889
14.4k
    PyLongObject *z;
3890
14.4k
    if (_PyLong_IsNegative(a)) {
3891
8.34k
        if (_PyLong_IsNegative(b)) {
3892
667
            z = x_sub(b, a);
3893
667
        }
3894
7.68k
        else {
3895
7.68k
            z = x_add(a, b);
3896
7.68k
            if (z != NULL) {
3897
7.68k
                assert(_PyLong_IsZero(z) || Py_REFCNT(z) == 1);
3898
7.68k
                _PyLong_FlipSign(z);
3899
7.68k
            }
3900
7.68k
        }
3901
8.34k
    }
3902
6.08k
    else {
3903
6.08k
        if (_PyLong_IsNegative(b))
3904
1.76k
            z = x_add(a, b);
3905
4.31k
        else
3906
4.31k
            z = x_sub(a, b);
3907
6.08k
    }
3908
14.4k
    return z;
3909
14.4k
}
3910
3911
_PyStackRef
3912
_PyCompactLong_Subtract(PyLongObject *a, PyLongObject *b)
3913
16.2M
{
3914
16.2M
    assert(_PyLong_BothAreCompact(a, b));
3915
16.2M
    stwodigits v = medium_value(a) - medium_value(b);
3916
16.2M
    return medium_from_stwodigits(v);
3917
16.2M
}
3918
3919
static PyObject *
3920
long_sub_method(PyObject *a, PyObject *b)
3921
28.4k
{
3922
28.4k
    CHECK_BINOP(a, b);
3923
22.9k
    return (PyObject*)long_sub((PyLongObject*)a, (PyLongObject*)b);
3924
28.4k
}
3925
3926
3927
/* Grade school multiplication, ignoring the signs.
3928
 * Returns the absolute value of the product, or NULL if error.
3929
 */
3930
static PyLongObject *
3931
x_mul(PyLongObject *a, PyLongObject *b)
3932
887k
{
3933
887k
    PyLongObject *z;
3934
887k
    Py_ssize_t size_a = _PyLong_DigitCount(a);
3935
887k
    Py_ssize_t size_b = _PyLong_DigitCount(b);
3936
887k
    Py_ssize_t i;
3937
3938
887k
    z = long_alloc(size_a + size_b);
3939
887k
    if (z == NULL)
3940
0
        return NULL;
3941
3942
887k
    memset(z->long_value.ob_digit, 0, _PyLong_DigitCount(z) * sizeof(digit));
3943
887k
    if (a == b) {
3944
        /* Efficient squaring per HAC, Algorithm 14.16:
3945
         * https://cacr.uwaterloo.ca/hac/about/chap14.pdf
3946
         * Gives slightly less than a 2x speedup when a == b,
3947
         * via exploiting that each entry in the multiplication
3948
         * pyramid appears twice (except for the size_a squares).
3949
         */
3950
174k
        digit *paend = a->long_value.ob_digit + size_a;
3951
5.26M
        for (i = 0; i < size_a; ++i) {
3952
5.08M
            twodigits carry;
3953
5.08M
            twodigits f = a->long_value.ob_digit[i];
3954
5.08M
            digit *pz = z->long_value.ob_digit + (i << 1);
3955
5.08M
            digit *pa = a->long_value.ob_digit + i + 1;
3956
3957
5.08M
            SIGCHECK({
3958
5.08M
                    Py_DECREF(z);
3959
5.08M
                    return NULL;
3960
5.08M
                });
3961
3962
5.08M
            carry = *pz + f * f;
3963
5.08M
            *pz++ = (digit)(carry & PyLong_MASK);
3964
5.08M
            carry >>= PyLong_SHIFT;
3965
5.08M
            assert(carry <= PyLong_MASK);
3966
3967
            /* Now f is added in twice in each column of the
3968
             * pyramid it appears.  Same as adding f<<1 once.
3969
             */
3970
5.08M
            f <<= 1;
3971
200M
            while (pa < paend) {
3972
195M
                carry += *pz + *pa++ * f;
3973
195M
                *pz++ = (digit)(carry & PyLong_MASK);
3974
195M
                carry >>= PyLong_SHIFT;
3975
195M
                assert(carry <= (PyLong_MASK << 1));
3976
195M
            }
3977
5.08M
            if (carry) {
3978
                /* See comment below. pz points at the highest possible
3979
                 * carry position from the last outer loop iteration, so
3980
                 * *pz is at most 1.
3981
                 */
3982
4.82M
                assert(*pz <= 1);
3983
4.82M
                carry += *pz;
3984
4.82M
                *pz = (digit)(carry & PyLong_MASK);
3985
4.82M
                carry >>= PyLong_SHIFT;
3986
4.82M
                if (carry) {
3987
                    /* If there's still a carry, it must be into a position
3988
                     * that still holds a 0. Where the base
3989
                     ^ B is 1 << PyLong_SHIFT, the last add was of a carry no
3990
                     * more than 2*B - 2 to a stored digit no more than 1.
3991
                     * So the sum was no more than 2*B - 1, so the current
3992
                     * carry no more than floor((2*B - 1)/B) = 1.
3993
                     */
3994
57.0k
                    assert(carry == 1);
3995
57.0k
                    assert(pz[1] == 0);
3996
57.0k
                    pz[1] = (digit)carry;
3997
57.0k
                }
3998
4.82M
            }
3999
5.08M
        }
4000
174k
    }
4001
712k
    else {      /* a is not the same as b -- gradeschool int mult */
4002
23.3M
        for (i = 0; i < size_a; ++i) {
4003
22.6M
            twodigits carry = 0;
4004
22.6M
            twodigits f = a->long_value.ob_digit[i];
4005
22.6M
            digit *pz = z->long_value.ob_digit + i;
4006
22.6M
            digit *pb = b->long_value.ob_digit;
4007
22.6M
            digit *pbend = b->long_value.ob_digit + size_b;
4008
4009
22.6M
            SIGCHECK({
4010
22.6M
                    Py_DECREF(z);
4011
22.6M
                    return NULL;
4012
22.6M
                });
4013
4014
1.18G
            while (pb < pbend) {
4015
1.16G
                carry += *pz + *pb++ * f;
4016
1.16G
                *pz++ = (digit)(carry & PyLong_MASK);
4017
1.16G
                carry >>= PyLong_SHIFT;
4018
1.16G
                assert(carry <= PyLong_MASK);
4019
1.16G
            }
4020
22.6M
            if (carry)
4021
20.3M
                *pz += (digit)(carry & PyLong_MASK);
4022
22.6M
            assert((carry >> PyLong_SHIFT) == 0);
4023
22.6M
        }
4024
712k
    }
4025
887k
    return long_normalize(z);
4026
887k
}
4027
4028
/* A helper for Karatsuba multiplication (k_mul).
4029
   Takes an int "n" and an integer "size" representing the place to
4030
   split, and sets low and high such that abs(n) == (high << size) + low,
4031
   viewing the shift as being by digits.  The sign bit is ignored, and
4032
   the return values are >= 0.
4033
   Returns 0 on success, -1 on failure.
4034
*/
4035
static int
4036
kmul_split(PyLongObject *n,
4037
           Py_ssize_t size,
4038
           PyLongObject **high,
4039
           PyLongObject **low)
4040
484k
{
4041
484k
    PyLongObject *hi, *lo;
4042
484k
    Py_ssize_t size_lo, size_hi;
4043
484k
    const Py_ssize_t size_n = _PyLong_DigitCount(n);
4044
4045
484k
    size_lo = Py_MIN(size_n, size);
4046
484k
    size_hi = size_n - size_lo;
4047
4048
484k
    if ((hi = long_alloc(size_hi)) == NULL)
4049
0
        return -1;
4050
484k
    if ((lo = long_alloc(size_lo)) == NULL) {
4051
0
        Py_DECREF(hi);
4052
0
        return -1;
4053
0
    }
4054
4055
484k
    memcpy(lo->long_value.ob_digit, n->long_value.ob_digit, size_lo * sizeof(digit));
4056
484k
    memcpy(hi->long_value.ob_digit, n->long_value.ob_digit + size_lo, size_hi * sizeof(digit));
4057
4058
484k
    *high = long_normalize(hi);
4059
484k
    *low = long_normalize(lo);
4060
484k
    return 0;
4061
484k
}
4062
4063
static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
4064
4065
/* Karatsuba multiplication.  Ignores the input signs, and returns the
4066
 * absolute value of the product (or NULL if error).
4067
 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
4068
 */
4069
static PyLongObject *
4070
k_mul(PyLongObject *a, PyLongObject *b)
4071
1.34M
{
4072
1.34M
    Py_ssize_t asize = _PyLong_DigitCount(a);
4073
1.34M
    Py_ssize_t bsize = _PyLong_DigitCount(b);
4074
1.34M
    PyLongObject *ah = NULL;
4075
1.34M
    PyLongObject *al = NULL;
4076
1.34M
    PyLongObject *bh = NULL;
4077
1.34M
    PyLongObject *bl = NULL;
4078
1.34M
    PyLongObject *ret = NULL;
4079
1.34M
    PyLongObject *t1, *t2, *t3;
4080
1.34M
    Py_ssize_t shift;           /* the number of digits we split off */
4081
1.34M
    Py_ssize_t i;
4082
4083
    /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
4084
     * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh  + ah*bh + al*bl
4085
     * Then the original product is
4086
     *     ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
4087
     * By picking X to be a power of 2, "*X" is just shifting, and it's
4088
     * been reduced to 3 multiplies on numbers half the size.
4089
     */
4090
4091
    /* We want to split based on the larger number; fiddle so that b
4092
     * is largest.
4093
     */
4094
1.34M
    if (asize > bsize) {
4095
243k
        t1 = a;
4096
243k
        a = b;
4097
243k
        b = t1;
4098
4099
243k
        i = asize;
4100
243k
        asize = bsize;
4101
243k
        bsize = i;
4102
243k
    }
4103
4104
    /* Use gradeschool math when either number is too small. */
4105
1.34M
    i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF;
4106
1.34M
    if (asize <= i) {
4107
1.09M
        if (asize == 0)
4108
207k
            return (PyLongObject *)PyLong_FromLong(0);
4109
887k
        else
4110
887k
            return x_mul(a, b);
4111
1.09M
    }
4112
4113
    /* If a is small compared to b, splitting on b gives a degenerate
4114
     * case with ah==0, and Karatsuba may be (even much) less efficient
4115
     * than "grade school" then.  However, we can still win, by viewing
4116
     * b as a string of "big digits", each of the same width as a. That
4117
     * leads to a sequence of balanced calls to k_mul.
4118
     */
4119
248k
    if (2 * asize <= bsize)
4120
5.25k
        return k_lopsided_mul(a, b);
4121
4122
    /* Split a & b into hi & lo pieces. */
4123
242k
    shift = bsize >> 1;
4124
242k
    if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
4125
242k
    assert(_PyLong_IsPositive(ah));        /* the split isn't degenerate */
4126
4127
242k
    if (a == b) {
4128
1.53k
        bh = (PyLongObject*)Py_NewRef(ah);
4129
1.53k
        bl = (PyLongObject*)Py_NewRef(al);
4130
1.53k
    }
4131
241k
    else if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
4132
4133
    /* The plan:
4134
     * 1. Allocate result space (asize + bsize digits:  that's always
4135
     *    enough).
4136
     * 2. Compute ah*bh, and copy into result at 2*shift.
4137
     * 3. Compute al*bl, and copy into result at 0.  Note that this
4138
     *    can't overlap with #2.
4139
     * 4. Subtract al*bl from the result, starting at shift.  This may
4140
     *    underflow (borrow out of the high digit), but we don't care:
4141
     *    we're effectively doing unsigned arithmetic mod
4142
     *    BASE**(sizea + sizeb), and so long as the *final* result fits,
4143
     *    borrows and carries out of the high digit can be ignored.
4144
     * 5. Subtract ah*bh from the result, starting at shift.
4145
     * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
4146
     *    at shift.
4147
     */
4148
4149
    /* 1. Allocate result space. */
4150
242k
    ret = long_alloc(asize + bsize);
4151
242k
    if (ret == NULL) goto fail;
4152
4153
    /* 2. t1 <- ah*bh, and copy into high digits of result. */
4154
242k
    if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
4155
242k
    assert(!_PyLong_IsNegative(t1));
4156
242k
    assert(2*shift + _PyLong_DigitCount(t1) <= _PyLong_DigitCount(ret));
4157
242k
    memcpy(ret->long_value.ob_digit + 2*shift, t1->long_value.ob_digit,
4158
242k
           _PyLong_DigitCount(t1) * sizeof(digit));
4159
4160
    /* Zero-out the digits higher than the ah*bh copy. */
4161
242k
    i = _PyLong_DigitCount(ret) - 2*shift - _PyLong_DigitCount(t1);
4162
242k
    if (i)
4163
40.6k
        memset(ret->long_value.ob_digit + 2*shift + _PyLong_DigitCount(t1), 0,
4164
40.6k
               i * sizeof(digit));
4165
4166
    /* 3. t2 <- al*bl, and copy into the low digits. */
4167
242k
    if ((t2 = k_mul(al, bl)) == NULL) {
4168
0
        Py_DECREF(t1);
4169
0
        goto fail;
4170
0
    }
4171
242k
    assert(!_PyLong_IsNegative(t2));
4172
242k
    assert(_PyLong_DigitCount(t2) <= 2*shift); /* no overlap with high digits */
4173
242k
    memcpy(ret->long_value.ob_digit, t2->long_value.ob_digit, _PyLong_DigitCount(t2) * sizeof(digit));
4174
4175
    /* Zero out remaining digits. */
4176
242k
    i = 2*shift - _PyLong_DigitCount(t2);          /* number of uninitialized digits */
4177
242k
    if (i)
4178
27.3k
        memset(ret->long_value.ob_digit + _PyLong_DigitCount(t2), 0, i * sizeof(digit));
4179
4180
    /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2).  We do al*bl first
4181
     * because it's fresher in cache.
4182
     */
4183
242k
    i = _PyLong_DigitCount(ret) - shift;  /* # digits after shift */
4184
242k
    (void)v_isub(ret->long_value.ob_digit + shift, i, t2->long_value.ob_digit, _PyLong_DigitCount(t2));
4185
242k
    _Py_DECREF_INT(t2);
4186
4187
242k
    (void)v_isub(ret->long_value.ob_digit + shift, i, t1->long_value.ob_digit, _PyLong_DigitCount(t1));
4188
242k
    _Py_DECREF_INT(t1);
4189
4190
    /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
4191
242k
    if ((t1 = x_add(ah, al)) == NULL) goto fail;
4192
242k
    _Py_DECREF_INT(ah);
4193
242k
    _Py_DECREF_INT(al);
4194
242k
    ah = al = NULL;
4195
4196
242k
    if (a == b) {
4197
1.53k
        t2 = (PyLongObject*)Py_NewRef(t1);
4198
1.53k
    }
4199
241k
    else if ((t2 = x_add(bh, bl)) == NULL) {
4200
0
        Py_DECREF(t1);
4201
0
        goto fail;
4202
0
    }
4203
242k
    _Py_DECREF_INT(bh);
4204
242k
    _Py_DECREF_INT(bl);
4205
242k
    bh = bl = NULL;
4206
4207
242k
    t3 = k_mul(t1, t2);
4208
242k
    _Py_DECREF_INT(t1);
4209
242k
    _Py_DECREF_INT(t2);
4210
242k
    if (t3 == NULL) goto fail;
4211
242k
    assert(!_PyLong_IsNegative(t3));
4212
4213
    /* Add t3.  It's not obvious why we can't run out of room here.
4214
     * See the (*) comment after this function.
4215
     */
4216
242k
    (void)v_iadd(ret->long_value.ob_digit + shift, i, t3->long_value.ob_digit, _PyLong_DigitCount(t3));
4217
242k
    _Py_DECREF_INT(t3);
4218
4219
242k
    return long_normalize(ret);
4220
4221
0
  fail:
4222
0
    Py_XDECREF(ret);
4223
0
    Py_XDECREF(ah);
4224
0
    Py_XDECREF(al);
4225
0
    Py_XDECREF(bh);
4226
0
    Py_XDECREF(bl);
4227
0
    return NULL;
4228
242k
}
4229
4230
/* (*) Why adding t3 can't "run out of room" above.
4231
4232
Let f(x) mean the floor of x and c(x) mean the ceiling of x.  Some facts
4233
to start with:
4234
4235
1. For any integer i, i = c(i/2) + f(i/2).  In particular,
4236
   bsize = c(bsize/2) + f(bsize/2).
4237
2. shift = f(bsize/2)
4238
3. asize <= bsize
4239
4. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
4240
   routine, so asize > bsize/2 >= f(bsize/2) in this routine.
4241
4242
We allocated asize + bsize result digits, and add t3 into them at an offset
4243
of shift.  This leaves asize+bsize-shift allocated digit positions for t3
4244
to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
4245
asize + c(bsize/2) available digit positions.
4246
4247
bh has c(bsize/2) digits, and bl at most f(size/2) digits.  So bh+hl has
4248
at most c(bsize/2) digits + 1 bit.
4249
4250
If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
4251
digits, and al has at most f(bsize/2) digits in any case.  So ah+al has at
4252
most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
4253
4254
The product (ah+al)*(bh+bl) therefore has at most
4255
4256
    c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
4257
4258
and we have asize + c(bsize/2) available digit positions.  We need to show
4259
this is always enough.  An instance of c(bsize/2) cancels out in both, so
4260
the question reduces to whether asize digits is enough to hold
4261
(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits.  If asize < bsize,
4262
then we're asking whether asize digits >= f(bsize/2) digits + 2 bits.  By #4,
4263
asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
4264
digit is enough to hold 2 bits.  This is so since PyLong_SHIFT=15 >= 2.  If
4265
asize == bsize, then we're asking whether bsize digits is enough to hold
4266
c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
4267
is enough to hold 2 bits.  This is so if bsize >= 2, which holds because
4268
bsize >= KARATSUBA_CUTOFF >= 2.
4269
4270
Note that since there's always enough room for (ah+al)*(bh+bl), and that's
4271
clearly >= each of ah*bh and al*bl, there's always enough room to subtract
4272
ah*bh and al*bl too.
4273
*/
4274
4275
/* b has at least twice the digits of a, and a is big enough that Karatsuba
4276
 * would pay off *if* the inputs had balanced sizes.  View b as a sequence
4277
 * of slices, each with the same number of digits as a, and multiply the
4278
 * slices by a, one at a time.  This gives k_mul balanced inputs to work with,
4279
 * and is also cache-friendly (we compute one double-width slice of the result
4280
 * at a time, then move on, never backtracking except for the helpful
4281
 * single-width slice overlap between successive partial sums).
4282
 */
4283
static PyLongObject *
4284
k_lopsided_mul(PyLongObject *a, PyLongObject *b)
4285
5.25k
{
4286
5.25k
    const Py_ssize_t asize = _PyLong_DigitCount(a);
4287
5.25k
    Py_ssize_t bsize = _PyLong_DigitCount(b);
4288
5.25k
    Py_ssize_t nbdone;          /* # of b digits already multiplied */
4289
5.25k
    PyLongObject *ret;
4290
5.25k
    PyLongObject *bslice = NULL;
4291
4292
5.25k
    assert(asize > KARATSUBA_CUTOFF);
4293
5.25k
    assert(2 * asize <= bsize);
4294
4295
    /* Allocate result space, and zero it out. */
4296
5.25k
    ret = long_alloc(asize + bsize);
4297
5.25k
    if (ret == NULL)
4298
0
        return NULL;
4299
5.25k
    memset(ret->long_value.ob_digit, 0, _PyLong_DigitCount(ret) * sizeof(digit));
4300
4301
    /* Successive slices of b are copied into bslice. */
4302
5.25k
    bslice = long_alloc(asize);
4303
5.25k
    if (bslice == NULL)
4304
0
        goto fail;
4305
4306
5.25k
    nbdone = 0;
4307
21.0k
    while (bsize > 0) {
4308
15.7k
        PyLongObject *product;
4309
15.7k
        const Py_ssize_t nbtouse = Py_MIN(bsize, asize);
4310
4311
        /* Multiply the next slice of b by a. */
4312
15.7k
        memcpy(bslice->long_value.ob_digit, b->long_value.ob_digit + nbdone,
4313
15.7k
               nbtouse * sizeof(digit));
4314
15.7k
        assert(nbtouse >= 0);
4315
15.7k
        _PyLong_SetSignAndDigitCount(bslice, 1, nbtouse);
4316
15.7k
        product = k_mul(a, bslice);
4317
15.7k
        if (product == NULL)
4318
0
            goto fail;
4319
4320
        /* Add into result. */
4321
15.7k
        (void)v_iadd(ret->long_value.ob_digit + nbdone, _PyLong_DigitCount(ret) - nbdone,
4322
15.7k
                     product->long_value.ob_digit, _PyLong_DigitCount(product));
4323
15.7k
        _Py_DECREF_INT(product);
4324
4325
15.7k
        bsize -= nbtouse;
4326
15.7k
        nbdone += nbtouse;
4327
15.7k
    }
4328
4329
5.25k
    _Py_DECREF_INT(bslice);
4330
5.25k
    return long_normalize(ret);
4331
4332
0
  fail:
4333
0
    Py_DECREF(ret);
4334
0
    Py_XDECREF(bslice);
4335
0
    return NULL;
4336
5.25k
}
4337
4338
4339
static PyLongObject*
4340
long_mul(PyLongObject *a, PyLongObject *b)
4341
4.28M
{
4342
    /* fast path for single-digit multiplication */
4343
4.28M
    if (_PyLong_BothAreCompact(a, b)) {
4344
3.68M
        stwodigits v = medium_value(a) * medium_value(b);
4345
3.68M
        return _PyLong_FromSTwoDigits(v);
4346
3.68M
    }
4347
4348
598k
    PyLongObject *z = k_mul(a, b);
4349
    /* Negate if exactly one of the inputs is negative. */
4350
598k
    if (!_PyLong_SameSign(a, b) && z) {
4351
189k
        _PyLong_Negate(&z);
4352
189k
    }
4353
598k
    return z;
4354
4.28M
}
4355
4356
/* This function returns NULL if the result is not compact,
4357
 * or if it fails to allocate, but never raises */
4358
_PyStackRef
4359
_PyCompactLong_Multiply(PyLongObject *a, PyLongObject *b)
4360
4.58M
{
4361
4.58M
    assert(_PyLong_BothAreCompact(a, b));
4362
4.58M
    stwodigits v = medium_value(a) * medium_value(b);
4363
4.58M
    return medium_from_stwodigits(v);
4364
4.58M
}
4365
4366
static PyObject *
4367
long_mul_method(PyObject *a, PyObject *b)
4368
3.48M
{
4369
3.48M
    CHECK_BINOP(a, b);
4370
3.42M
    return (PyObject*)long_mul((PyLongObject*)a, (PyLongObject*)b);
4371
3.48M
}
4372
4373
/* Fast modulo division for single-digit longs. */
4374
static PyObject *
4375
fast_mod(PyLongObject *a, PyLongObject *b)
4376
326k
{
4377
326k
    sdigit left = a->long_value.ob_digit[0];
4378
326k
    sdigit right = b->long_value.ob_digit[0];
4379
326k
    sdigit mod;
4380
4381
326k
    assert(_PyLong_DigitCount(a) == 1);
4382
326k
    assert(_PyLong_DigitCount(b) == 1);
4383
326k
    sdigit sign = _PyLong_CompactSign(b);
4384
326k
    if (_PyLong_SameSign(a, b)) {
4385
323k
        mod = left % right;
4386
323k
    }
4387
3.45k
    else {
4388
        /* Either 'a' or 'b' is negative. */
4389
3.45k
        mod = right - 1 - (left - 1) % right;
4390
3.45k
    }
4391
4392
326k
    return PyLong_FromLong(mod * sign);
4393
326k
}
4394
4395
/* Fast floor division for single-digit longs. */
4396
static PyObject *
4397
fast_floor_div(PyLongObject *a, PyLongObject *b)
4398
1.53M
{
4399
1.53M
    sdigit left = a->long_value.ob_digit[0];
4400
1.53M
    sdigit right = b->long_value.ob_digit[0];
4401
1.53M
    sdigit div;
4402
4403
1.53M
    assert(_PyLong_DigitCount(a) == 1);
4404
1.53M
    assert(_PyLong_DigitCount(b) == 1);
4405
4406
1.53M
    if (_PyLong_SameSign(a, b)) {
4407
1.53M
        div = left / right;
4408
1.53M
    }
4409
1.63k
    else {
4410
        /* Either 'a' or 'b' is negative. */
4411
1.63k
        div = -1 - (left - 1) / right;
4412
1.63k
    }
4413
4414
1.53M
    return PyLong_FromLong(div);
4415
1.53M
}
4416
4417
#ifdef WITH_PYLONG_MODULE
4418
/* asymptotically faster divmod, using _pylong.py */
4419
static int
4420
pylong_int_divmod(PyLongObject *v, PyLongObject *w,
4421
                  PyLongObject **pdiv, PyLongObject **pmod)
4422
23
{
4423
23
    PyObject *mod = PyImport_ImportModule("_pylong");
4424
23
    if (mod == NULL) {
4425
0
        return -1;
4426
0
    }
4427
23
    PyObject *result = PyObject_CallMethod(mod, "int_divmod", "OO", v, w);
4428
23
    Py_DECREF(mod);
4429
23
    if (result == NULL) {
4430
0
        return -1;
4431
0
    }
4432
23
    if (!PyTuple_Check(result) || PyTuple_GET_SIZE(result) != 2) {
4433
0
        Py_DECREF(result);
4434
0
        PyErr_SetString(PyExc_ValueError,
4435
0
                        "tuple of length 2 is required from int_divmod()");
4436
0
        return -1;
4437
0
    }
4438
23
    PyObject *q = PyTuple_GET_ITEM(result, 0);
4439
23
    PyObject *r = PyTuple_GET_ITEM(result, 1);
4440
23
    if (!PyLong_Check(q) || !PyLong_Check(r)) {
4441
0
        Py_DECREF(result);
4442
0
        PyErr_SetString(PyExc_ValueError,
4443
0
                        "tuple of int is required from int_divmod()");
4444
0
        return -1;
4445
0
    }
4446
23
    if (pdiv != NULL) {
4447
23
        *pdiv = (PyLongObject *)Py_NewRef(q);
4448
23
    }
4449
23
    if (pmod != NULL) {
4450
0
        *pmod = (PyLongObject *)Py_NewRef(r);
4451
0
    }
4452
23
    Py_DECREF(result);
4453
23
    return 0;
4454
23
}
4455
#endif /* WITH_PYLONG_MODULE */
4456
4457
/* The / and % operators are now defined in terms of divmod().
4458
   The expression a mod b has the value a - b*floor(a/b).
4459
   The long_divrem function gives the remainder after division of
4460
   |a| by |b|, with the sign of a.  This is also expressed
4461
   as a - b*trunc(a/b), if trunc truncates towards zero.
4462
   Some examples:
4463
     a           b      a rem b         a mod b
4464
     13          10      3               3
4465
    -13          10     -3               7
4466
     13         -10      3              -7
4467
    -13         -10     -3              -3
4468
   So, to get from rem to mod, we have to add b if a and b
4469
   have different signs.  We then subtract one from the 'div'
4470
   part of the outcome to keep the invariant intact. */
4471
4472
/* Compute
4473
 *     *pdiv, *pmod = divmod(v, w)
4474
 * NULL can be passed for pdiv or pmod, in which case that part of
4475
 * the result is simply thrown away.  The caller owns a reference to
4476
 * each of these it requests (does not pass NULL for).
4477
 */
4478
static int
4479
l_divmod(PyLongObject *v, PyLongObject *w,
4480
         PyLongObject **pdiv, PyLongObject **pmod)
4481
92.3k
{
4482
92.3k
    PyLongObject *div, *mod;
4483
4484
92.3k
    if (_PyLong_DigitCount(v) == 1 && _PyLong_DigitCount(w) == 1) {
4485
        /* Fast path for single-digit longs */
4486
0
        div = NULL;
4487
0
        if (pdiv != NULL) {
4488
0
            div = (PyLongObject *)fast_floor_div(v, w);
4489
0
            if (div == NULL) {
4490
0
                return -1;
4491
0
            }
4492
0
        }
4493
0
        if (pmod != NULL) {
4494
0
            mod = (PyLongObject *)fast_mod(v, w);
4495
0
            if (mod == NULL) {
4496
0
                Py_XDECREF(div);
4497
0
                return -1;
4498
0
            }
4499
0
            *pmod = mod;
4500
0
        }
4501
0
        if (pdiv != NULL) {
4502
            /* We only want to set `*pdiv` when `*pmod` is
4503
               set successfully. */
4504
0
            *pdiv = div;
4505
0
        }
4506
0
        return 0;
4507
0
    }
4508
92.3k
#if WITH_PYLONG_MODULE
4509
92.3k
    Py_ssize_t size_v = _PyLong_DigitCount(v); /* digits in numerator */
4510
92.3k
    Py_ssize_t size_w = _PyLong_DigitCount(w); /* digits in denominator */
4511
92.3k
    if (size_w > 300 && (size_v - size_w) > 150) {
4512
        /* Switch to _pylong.int_divmod().  If the quotient is small then
4513
          "schoolbook" division is linear-time so don't use in that case.
4514
          These limits are empirically determined and should be slightly
4515
          conservative so that _pylong is used in cases it is likely
4516
          to be faster. See Tools/scripts/divmod_threshold.py. */
4517
23
        return pylong_int_divmod(v, w, pdiv, pmod);
4518
23
    }
4519
92.3k
#endif
4520
92.3k
    if (long_divrem(v, w, &div, &mod) < 0)
4521
108
        return -1;
4522
92.2k
    if ((_PyLong_IsNegative(mod) && _PyLong_IsPositive(w)) ||
4523
83.1k
        (_PyLong_IsPositive(mod) && _PyLong_IsNegative(w))) {
4524
9.38k
        PyLongObject *temp;
4525
9.38k
        temp = long_add(mod, w);
4526
9.38k
        Py_SETREF(mod, temp);
4527
9.38k
        if (mod == NULL) {
4528
0
            Py_DECREF(div);
4529
0
            return -1;
4530
0
        }
4531
9.38k
        temp = long_sub(div, (PyLongObject *)_PyLong_GetOne());
4532
9.38k
        if (temp == NULL) {
4533
0
            Py_DECREF(mod);
4534
0
            Py_DECREF(div);
4535
0
            return -1;
4536
0
        }
4537
9.38k
        Py_SETREF(div, temp);
4538
9.38k
    }
4539
92.2k
    if (pdiv != NULL)
4540
92.2k
        *pdiv = div;
4541
0
    else
4542
0
        Py_DECREF(div);
4543
4544
92.2k
    if (pmod != NULL)
4545
106
        *pmod = mod;
4546
92.1k
    else
4547
92.1k
        Py_DECREF(mod);
4548
4549
92.2k
    return 0;
4550
92.2k
}
4551
4552
/* Compute
4553
 *     *pmod = v % w
4554
 * pmod cannot be NULL. The caller owns a reference to pmod.
4555
 */
4556
static int
4557
l_mod(PyLongObject *v, PyLongObject *w, PyLongObject **pmod)
4558
349k
{
4559
349k
    PyLongObject *mod;
4560
4561
349k
    assert(pmod);
4562
349k
    if (_PyLong_DigitCount(v) == 1 && _PyLong_DigitCount(w) == 1) {
4563
        /* Fast path for single-digit longs */
4564
326k
        *pmod = (PyLongObject *)fast_mod(v, w);
4565
326k
        return -(*pmod == NULL);
4566
326k
    }
4567
23.3k
    if (long_rem(v, w, &mod) < 0)
4568
263
        return -1;
4569
23.0k
    if ((_PyLong_IsNegative(mod) && _PyLong_IsPositive(w)) ||
4570
20.9k
        (_PyLong_IsPositive(mod) && _PyLong_IsNegative(w))) {
4571
5.42k
        PyLongObject *temp;
4572
5.42k
        temp = long_add(mod, w);
4573
5.42k
        Py_SETREF(mod, temp);
4574
5.42k
        if (mod == NULL)
4575
0
            return -1;
4576
5.42k
    }
4577
23.0k
    *pmod = mod;
4578
4579
23.0k
    return 0;
4580
23.0k
}
4581
4582
static PyObject *
4583
long_div(PyObject *a, PyObject *b)
4584
1.62M
{
4585
1.62M
    PyLongObject *div;
4586
4587
1.62M
    CHECK_BINOP(a, b);
4588
4589
1.62M
    if (_PyLong_DigitCount((PyLongObject*)a) == 1 && _PyLong_DigitCount((PyLongObject*)b) == 1) {
4590
1.53M
        return fast_floor_div((PyLongObject*)a, (PyLongObject*)b);
4591
1.53M
    }
4592
4593
92.2k
    if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, NULL) < 0)
4594
108
        div = NULL;
4595
92.2k
    return (PyObject *)div;
4596
1.62M
}
4597
4598
/* PyLong/PyLong -> float, with correctly rounded result. */
4599
4600
204k
#define MANT_DIG_DIGITS (DBL_MANT_DIG / PyLong_SHIFT)
4601
15.2k
#define MANT_DIG_BITS (DBL_MANT_DIG % PyLong_SHIFT)
4602
4603
static PyObject *
4604
long_true_divide(PyObject *v, PyObject *w)
4605
51.7k
{
4606
51.7k
    PyLongObject *a, *b, *x;
4607
51.7k
    Py_ssize_t a_size, b_size, shift, extra_bits, diff, x_size, x_bits;
4608
51.7k
    digit mask, low;
4609
51.7k
    int inexact, negate, a_is_small, b_is_small;
4610
51.7k
    double dx, result;
4611
4612
51.7k
    CHECK_BINOP(v, w);
4613
40.0k
    a = (PyLongObject *)v;
4614
40.0k
    b = (PyLongObject *)w;
4615
4616
    /*
4617
       Method in a nutshell:
4618
4619
         0. reduce to case a, b > 0; filter out obvious underflow/overflow
4620
         1. choose a suitable integer 'shift'
4621
         2. use integer arithmetic to compute x = floor(2**-shift*a/b)
4622
         3. adjust x for correct rounding
4623
         4. convert x to a double dx with the same value
4624
         5. return ldexp(dx, shift).
4625
4626
       In more detail:
4627
4628
       0. For any a, a/0 raises ZeroDivisionError; for nonzero b, 0/b
4629
       returns either 0.0 or -0.0, depending on the sign of b.  For a and
4630
       b both nonzero, ignore signs of a and b, and add the sign back in
4631
       at the end.  Now write a_bits and b_bits for the bit lengths of a
4632
       and b respectively (that is, a_bits = 1 + floor(log_2(a)); likewise
4633
       for b).  Then
4634
4635
          2**(a_bits - b_bits - 1) < a/b < 2**(a_bits - b_bits + 1).
4636
4637
       So if a_bits - b_bits > DBL_MAX_EXP then a/b > 2**DBL_MAX_EXP and
4638
       so overflows.  Similarly, if a_bits - b_bits < DBL_MIN_EXP -
4639
       DBL_MANT_DIG - 1 then a/b underflows to 0.  With these cases out of
4640
       the way, we can assume that
4641
4642
          DBL_MIN_EXP - DBL_MANT_DIG - 1 <= a_bits - b_bits <= DBL_MAX_EXP.
4643
4644
       1. The integer 'shift' is chosen so that x has the right number of
4645
       bits for a double, plus two or three extra bits that will be used
4646
       in the rounding decisions.  Writing a_bits and b_bits for the
4647
       number of significant bits in a and b respectively, a
4648
       straightforward formula for shift is:
4649
4650
          shift = a_bits - b_bits - DBL_MANT_DIG - 2
4651
4652
       This is fine in the usual case, but if a/b is smaller than the
4653
       smallest normal float then it can lead to double rounding on an
4654
       IEEE 754 platform, giving incorrectly rounded results.  So we
4655
       adjust the formula slightly.  The actual formula used is:
4656
4657
           shift = MAX(a_bits - b_bits, DBL_MIN_EXP) - DBL_MANT_DIG - 2
4658
4659
       2. The quantity x is computed by first shifting a (left -shift bits
4660
       if shift <= 0, right shift bits if shift > 0) and then dividing by
4661
       b.  For both the shift and the division, we keep track of whether
4662
       the result is inexact, in a flag 'inexact'; this information is
4663
       needed at the rounding stage.
4664
4665
       With the choice of shift above, together with our assumption that
4666
       a_bits - b_bits >= DBL_MIN_EXP - DBL_MANT_DIG - 1, it follows
4667
       that x >= 1.
4668
4669
       3. Now x * 2**shift <= a/b < (x+1) * 2**shift.  We want to replace
4670
       this with an exactly representable float of the form
4671
4672
          round(x/2**extra_bits) * 2**(extra_bits+shift).
4673
4674
       For float representability, we need x/2**extra_bits <
4675
       2**DBL_MANT_DIG and extra_bits + shift >= DBL_MIN_EXP -
4676
       DBL_MANT_DIG.  This translates to the condition:
4677
4678
          extra_bits >= MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG
4679
4680
       To round, we just modify the bottom digit of x in-place; this can
4681
       end up giving a digit with value > PyLONG_MASK, but that's not a
4682
       problem since digits can hold values up to 2*PyLONG_MASK+1.
4683
4684
       With the original choices for shift above, extra_bits will always
4685
       be 2 or 3.  Then rounding under the round-half-to-even rule, we
4686
       round up iff the most significant of the extra bits is 1, and
4687
       either: (a) the computation of x in step 2 had an inexact result,
4688
       or (b) at least one other of the extra bits is 1, or (c) the least
4689
       significant bit of x (above those to be rounded) is 1.
4690
4691
       4. Conversion to a double is straightforward; all floating-point
4692
       operations involved in the conversion are exact, so there's no
4693
       danger of rounding errors.
4694
4695
       5. Use ldexp(x, shift) to compute x*2**shift, the final result.
4696
       The result will always be exactly representable as a double, except
4697
       in the case that it overflows.  To avoid dependence on the exact
4698
       behaviour of ldexp on overflow, we check for overflow before
4699
       applying ldexp.  The result of ldexp is adjusted for sign before
4700
       returning.
4701
    */
4702
4703
    /* Reduce to case where a and b are both positive. */
4704
40.0k
    a_size = _PyLong_DigitCount(a);
4705
40.0k
    b_size = _PyLong_DigitCount(b);
4706
40.0k
    negate = (_PyLong_IsNegative(a)) != (_PyLong_IsNegative(b));
4707
40.0k
    if (b_size == 0) {
4708
293
        PyErr_SetString(PyExc_ZeroDivisionError,
4709
293
                        "division by zero");
4710
293
        goto error;
4711
293
    }
4712
39.7k
    if (a_size == 0)
4713
579
        goto underflow_or_zero;
4714
4715
    /* Fast path for a and b small (exactly representable in a double).
4716
       Relies on floating-point division being correctly rounded; results
4717
       may be subject to double rounding on x86 machines that operate with
4718
       the x87 FPU set to 64-bit precision. */
4719
39.1k
    a_is_small = a_size <= MANT_DIG_DIGITS ||
4720
9.05k
        (a_size == MANT_DIG_DIGITS+1 &&
4721
2.63k
         a->long_value.ob_digit[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0);
4722
39.1k
    b_is_small = b_size <= MANT_DIG_DIGITS ||
4723
23.2k
        (b_size == MANT_DIG_DIGITS+1 &&
4724
12.6k
         b->long_value.ob_digit[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0);
4725
39.1k
    if (a_is_small && b_is_small) {
4726
12.2k
        double da, db;
4727
12.2k
        da = a->long_value.ob_digit[--a_size];
4728
13.7k
        while (a_size > 0)
4729
1.47k
            da = da * PyLong_BASE + a->long_value.ob_digit[--a_size];
4730
12.2k
        db = b->long_value.ob_digit[--b_size];
4731
15.6k
        while (b_size > 0)
4732
3.37k
            db = db * PyLong_BASE + b->long_value.ob_digit[--b_size];
4733
12.2k
        result = da / db;
4734
12.2k
        goto success;
4735
12.2k
    }
4736
4737
    /* Catch obvious cases of underflow and overflow */
4738
26.9k
    diff = a_size - b_size;
4739
26.9k
    if (diff > PY_SSIZE_T_MAX/PyLong_SHIFT - 1)
4740
        /* Extreme overflow */
4741
0
        goto overflow;
4742
26.9k
    else if (diff < 1 - PY_SSIZE_T_MAX/PyLong_SHIFT)
4743
        /* Extreme underflow */
4744
0
        goto underflow_or_zero;
4745
    /* Next line is now safe from overflowing a Py_ssize_t */
4746
26.9k
    diff = diff * PyLong_SHIFT + bit_length_digit(a->long_value.ob_digit[a_size - 1]) -
4747
26.9k
        bit_length_digit(b->long_value.ob_digit[b_size - 1]);
4748
    /* Now diff = a_bits - b_bits. */
4749
26.9k
    if (diff > DBL_MAX_EXP)
4750
13
        goto overflow;
4751
26.9k
    else if (diff < DBL_MIN_EXP - DBL_MANT_DIG - 1)
4752
23
        goto underflow_or_zero;
4753
4754
    /* Choose value for shift; see comments for step 1 above. */
4755
26.9k
    shift = Py_MAX(diff, DBL_MIN_EXP) - DBL_MANT_DIG - 2;
4756
4757
26.9k
    inexact = 0;
4758
4759
    /* x = abs(a * 2**-shift) */
4760
26.9k
    if (shift <= 0) {
4761
21.0k
        Py_ssize_t i, shift_digits = -shift / PyLong_SHIFT;
4762
21.0k
        digit rem;
4763
        /* x = a << -shift */
4764
21.0k
        if (a_size >= PY_SSIZE_T_MAX - 1 - shift_digits) {
4765
            /* In practice, it's probably impossible to end up
4766
               here.  Both a and b would have to be enormous,
4767
               using close to SIZE_T_MAX bytes of memory each. */
4768
0
            PyErr_SetString(PyExc_OverflowError,
4769
0
                            "intermediate overflow during division");
4770
0
            goto error;
4771
0
        }
4772
21.0k
        x = long_alloc(a_size + shift_digits + 1);
4773
21.0k
        if (x == NULL)
4774
0
            goto error;
4775
92.9k
        for (i = 0; i < shift_digits; i++)
4776
71.9k
            x->long_value.ob_digit[i] = 0;
4777
21.0k
        rem = v_lshift(x->long_value.ob_digit + shift_digits, a->long_value.ob_digit,
4778
21.0k
                       a_size, -shift % PyLong_SHIFT);
4779
21.0k
        x->long_value.ob_digit[a_size + shift_digits] = rem;
4780
21.0k
    }
4781
5.88k
    else {
4782
5.88k
        Py_ssize_t shift_digits = shift / PyLong_SHIFT;
4783
5.88k
        digit rem;
4784
        /* x = a >> shift */
4785
5.88k
        assert(a_size >= shift_digits);
4786
5.88k
        x = long_alloc(a_size - shift_digits);
4787
5.88k
        if (x == NULL)
4788
0
            goto error;
4789
5.88k
        rem = v_rshift(x->long_value.ob_digit, a->long_value.ob_digit + shift_digits,
4790
5.88k
                       a_size - shift_digits, shift % PyLong_SHIFT);
4791
        /* set inexact if any of the bits shifted out is nonzero */
4792
5.88k
        if (rem)
4793
4.78k
            inexact = 1;
4794
7.10k
        while (!inexact && shift_digits > 0)
4795
1.22k
            if (a->long_value.ob_digit[--shift_digits])
4796
381
                inexact = 1;
4797
5.88k
    }
4798
26.9k
    long_normalize(x);
4799
26.9k
    x_size = _PyLong_SignedDigitCount(x);
4800
4801
    /* x //= b. If the remainder is nonzero, set inexact.  We own the only
4802
       reference to x, so it's safe to modify it in-place. */
4803
26.9k
    if (b_size == 1) {
4804
7.02k
        digit rem = inplace_divrem1(x->long_value.ob_digit, x->long_value.ob_digit, x_size,
4805
7.02k
                              b->long_value.ob_digit[0]);
4806
7.02k
        long_normalize(x);
4807
7.02k
        if (rem)
4808
2.72k
            inexact = 1;
4809
7.02k
    }
4810
19.8k
    else {
4811
19.8k
        PyLongObject *div, *rem;
4812
19.8k
        div = x_divrem(x, b, &rem);
4813
19.8k
        Py_SETREF(x, div);
4814
19.8k
        if (x == NULL)
4815
0
            goto error;
4816
19.8k
        if (!_PyLong_IsZero(rem))
4817
19.8k
            inexact = 1;
4818
19.8k
        Py_DECREF(rem);
4819
19.8k
    }
4820
26.9k
    x_size = _PyLong_DigitCount(x);
4821
26.9k
    assert(x_size > 0); /* result of division is never zero */
4822
26.9k
    x_bits = (x_size-1)*PyLong_SHIFT+bit_length_digit(x->long_value.ob_digit[x_size-1]);
4823
4824
    /* The number of extra bits that have to be rounded away. */
4825
26.9k
    extra_bits = Py_MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG;
4826
26.9k
    assert(extra_bits == 2 || extra_bits == 3);
4827
4828
    /* Round by directly modifying the low digit of x. */
4829
26.9k
    mask = (digit)1 << (extra_bits - 1);
4830
26.9k
    low = x->long_value.ob_digit[0] | inexact;
4831
26.9k
    if ((low & mask) && (low & (3U*mask-1U)))
4832
7.76k
        low += mask;
4833
26.9k
    x->long_value.ob_digit[0] = low & ~(2U*mask-1U);
4834
4835
    /* Convert x to a double dx; the conversion is exact. */
4836
26.9k
    dx = x->long_value.ob_digit[--x_size];
4837
53.7k
    while (x_size > 0)
4838
26.8k
        dx = dx * PyLong_BASE + x->long_value.ob_digit[--x_size];
4839
26.9k
    Py_DECREF(x);
4840
4841
    /* Check whether ldexp result will overflow a double. */
4842
26.9k
    if (shift + x_bits >= DBL_MAX_EXP &&
4843
8
        (shift + x_bits > DBL_MAX_EXP || dx == ldexp(1.0, (int)x_bits)))
4844
8
        goto overflow;
4845
26.8k
    result = ldexp(dx, (int)shift);
4846
4847
39.1k
  success:
4848
39.1k
    return PyFloat_FromDouble(negate ? -result : result);
4849
4850
602
  underflow_or_zero:
4851
602
    return PyFloat_FromDouble(negate ? -0.0 : 0.0);
4852
4853
21
  overflow:
4854
21
    PyErr_SetString(PyExc_OverflowError,
4855
21
                    "integer division result too large for a float");
4856
314
  error:
4857
314
    return NULL;
4858
21
}
4859
4860
static PyObject *
4861
long_mod(PyObject *a, PyObject *b)
4862
354k
{
4863
354k
    PyLongObject *mod;
4864
4865
354k
    CHECK_BINOP(a, b);
4866
4867
349k
    if (l_mod((PyLongObject*)a, (PyLongObject*)b, &mod) < 0)
4868
263
        mod = NULL;
4869
349k
    return (PyObject *)mod;
4870
354k
}
4871
4872
static PyObject *
4873
long_divmod(PyObject *a, PyObject *b)
4874
106
{
4875
106
    PyLongObject *div, *mod;
4876
106
    CHECK_BINOP(a, b);
4877
4878
106
    if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, &mod) < 0) {
4879
0
        return NULL;
4880
0
    }
4881
106
    return _PyTuple_FromPairSteal((PyObject *)div, (PyObject *)mod);
4882
106
}
4883
4884
4885
/* Compute an inverse to a modulo n, or raise ValueError if a is not
4886
   invertible modulo n. Assumes n is positive. The inverse returned
4887
   is whatever falls out of the extended Euclidean algorithm: it may
4888
   be either positive or negative, but will be smaller than n in
4889
   absolute value.
4890
4891
   Pure Python equivalent for long_invmod:
4892
4893
        def invmod(a, n):
4894
            b, c = 1, 0
4895
            while n:
4896
                q, r = divmod(a, n)
4897
                a, b, c, n = n, c, b - q*c, r
4898
4899
            # at this point a is the gcd of the original inputs
4900
            if a == 1:
4901
                return b
4902
            raise ValueError("Not invertible")
4903
*/
4904
4905
static PyLongObject *
4906
long_invmod(PyLongObject *a, PyLongObject *n)
4907
0
{
4908
    /* Should only ever be called for positive n */
4909
0
    assert(_PyLong_IsPositive(n));
4910
4911
0
    Py_INCREF(a);
4912
0
    PyLongObject *b = (PyLongObject *)Py_NewRef(_PyLong_GetOne());
4913
0
    PyLongObject *c = (PyLongObject *)Py_NewRef(_PyLong_GetZero());
4914
0
    Py_INCREF(n);
4915
4916
    /* references now owned: a, b, c, n */
4917
0
    while (!_PyLong_IsZero(n)) {
4918
0
        PyLongObject *q, *r, *s, *t;
4919
4920
0
        if (l_divmod(a, n, &q, &r) == -1) {
4921
0
            goto Error;
4922
0
        }
4923
0
        Py_SETREF(a, n);
4924
0
        n = r;
4925
0
        t = (PyLongObject *)long_mul(q, c);
4926
0
        Py_DECREF(q);
4927
0
        if (t == NULL) {
4928
0
            goto Error;
4929
0
        }
4930
0
        s = long_sub(b, t);
4931
0
        Py_DECREF(t);
4932
0
        if (s == NULL) {
4933
0
            goto Error;
4934
0
        }
4935
0
        Py_SETREF(b, c);
4936
0
        c = s;
4937
0
    }
4938
    /* references now owned: a, b, c, n */
4939
4940
0
    Py_DECREF(c);
4941
0
    Py_DECREF(n);
4942
0
    if (long_compare(a, (PyLongObject *)_PyLong_GetOne())) {
4943
        /* a != 1; we don't have an inverse. */
4944
0
        Py_DECREF(a);
4945
0
        Py_DECREF(b);
4946
0
        PyErr_SetString(PyExc_ValueError,
4947
0
                        "base is not invertible for the given modulus");
4948
0
        return NULL;
4949
0
    }
4950
0
    else {
4951
        /* a == 1; b gives an inverse modulo n */
4952
0
        Py_DECREF(a);
4953
0
        return b;
4954
0
    }
4955
4956
0
  Error:
4957
0
    Py_DECREF(a);
4958
0
    Py_DECREF(b);
4959
0
    Py_DECREF(c);
4960
0
    Py_DECREF(n);
4961
0
    return NULL;
4962
0
}
4963
4964
4965
/* pow(v, w, x) */
4966
static PyObject *
4967
long_pow(PyObject *v, PyObject *w, PyObject *x)
4968
81.3k
{
4969
81.3k
    PyLongObject *a, *b, *c; /* a,b,c = v,w,x */
4970
81.3k
    int negativeOutput = 0;  /* if x<0 return negative output */
4971
4972
81.3k
    PyLongObject *z = NULL;  /* accumulated result */
4973
81.3k
    Py_ssize_t i, j;             /* counters */
4974
81.3k
    PyLongObject *temp = NULL;
4975
81.3k
    PyLongObject *a2 = NULL; /* may temporarily hold a**2 % c */
4976
4977
    /* k-ary values.  If the exponent is large enough, table is
4978
     * precomputed so that table[i] == a**(2*i+1) % c for i in
4979
     * range(EXP_TABLE_LEN).
4980
     * Note: this is uninitialized stack trash: don't pay to set it to known
4981
     * values unless it's needed. Instead ensure that num_table_entries is
4982
     * set to the number of entries actually filled whenever a branch to the
4983
     * Error or Done labels is possible.
4984
     */
4985
81.3k
    PyLongObject *table[EXP_TABLE_LEN];
4986
81.3k
    Py_ssize_t num_table_entries = 0;
4987
4988
    /* a, b, c = v, w, x */
4989
81.3k
    CHECK_BINOP(v, w);
4990
67.4k
    a = (PyLongObject*)Py_NewRef(v);
4991
67.4k
    b = (PyLongObject*)Py_NewRef(w);
4992
67.4k
    if (PyLong_Check(x)) {
4993
4
        c = (PyLongObject *)Py_NewRef(x);
4994
4
    }
4995
67.4k
    else if (x == Py_None)
4996
67.4k
        c = NULL;
4997
0
    else {
4998
0
        Py_DECREF(a);
4999
0
        Py_DECREF(b);
5000
0
        Py_RETURN_NOTIMPLEMENTED;
5001
0
    }
5002
5003
67.4k
    if (_PyLong_IsNegative(b) && c == NULL) {
5004
        /* if exponent is negative and there's no modulus:
5005
               return a float.  This works because we know
5006
               that this calls float_pow() which converts its
5007
               arguments to double. */
5008
2.79k
        Py_DECREF(a);
5009
2.79k
        Py_DECREF(b);
5010
2.79k
        return PyFloat_Type.tp_as_number->nb_power(v, w, x);
5011
2.79k
    }
5012
5013
64.6k
    if (c) {
5014
        /* if modulus == 0:
5015
               raise ValueError() */
5016
4
        if (_PyLong_IsZero(c)) {
5017
0
            PyErr_SetString(PyExc_ValueError,
5018
0
                            "pow() 3rd argument cannot be 0");
5019
0
            goto Error;
5020
0
        }
5021
5022
        /* if modulus < 0:
5023
               negativeOutput = True
5024
               modulus = -modulus */
5025
4
        if (_PyLong_IsNegative(c)) {
5026
0
            negativeOutput = 1;
5027
0
            temp = (PyLongObject *)_PyLong_Copy(c);
5028
0
            if (temp == NULL)
5029
0
                goto Error;
5030
0
            Py_SETREF(c, temp);
5031
0
            temp = NULL;
5032
0
            _PyLong_Negate(&c);
5033
0
            if (c == NULL)
5034
0
                goto Error;
5035
0
        }
5036
5037
        /* if modulus == 1:
5038
               return 0 */
5039
4
        if (_PyLong_IsNonNegativeCompact(c) && (c->long_value.ob_digit[0] == 1)) {
5040
0
            z = (PyLongObject *)PyLong_FromLong(0L);
5041
0
            goto Done;
5042
0
        }
5043
5044
        /* if exponent is negative, negate the exponent and
5045
           replace the base with a modular inverse */
5046
4
        if (_PyLong_IsNegative(b)) {
5047
0
            temp = (PyLongObject *)_PyLong_Copy(b);
5048
0
            if (temp == NULL)
5049
0
                goto Error;
5050
0
            Py_SETREF(b, temp);
5051
0
            temp = NULL;
5052
0
            _PyLong_Negate(&b);
5053
0
            if (b == NULL)
5054
0
                goto Error;
5055
5056
0
            temp = long_invmod(a, c);
5057
0
            if (temp == NULL)
5058
0
                goto Error;
5059
0
            Py_SETREF(a, temp);
5060
0
            temp = NULL;
5061
0
        }
5062
5063
        /* Reduce base by modulus in some cases:
5064
           1. If base < 0.  Forcing the base non-negative makes things easier.
5065
           2. If base is obviously larger than the modulus.  The "small
5066
              exponent" case later can multiply directly by base repeatedly,
5067
              while the "large exponent" case multiplies directly by base 31
5068
              times.  It can be unboundedly faster to multiply by
5069
              base % modulus instead.
5070
           We could _always_ do this reduction, but l_mod() isn't cheap,
5071
           so we only do it when it buys something. */
5072
4
        if (_PyLong_IsNegative(a) || _PyLong_DigitCount(a) > _PyLong_DigitCount(c)) {
5073
0
            if (l_mod(a, c, &temp) < 0)
5074
0
                goto Error;
5075
0
            Py_SETREF(a, temp);
5076
0
            temp = NULL;
5077
0
        }
5078
4
    }
5079
5080
    /* At this point a, b, and c are guaranteed non-negative UNLESS
5081
       c is NULL, in which case a may be negative. */
5082
5083
64.6k
    z = (PyLongObject *)PyLong_FromLong(1L);
5084
64.6k
    if (z == NULL)
5085
0
        goto Error;
5086
5087
    /* Perform a modular reduction, X = X % c, but leave X alone if c
5088
     * is NULL.
5089
     */
5090
64.6k
#define REDUCE(X)                                       \
5091
860k
    do {                                                \
5092
860k
        if (c != NULL) {                                \
5093
476
            if (l_mod(X, c, &temp) < 0)                 \
5094
476
                goto Error;                             \
5095
476
            Py_XDECREF(X);                              \
5096
476
            X = temp;                                   \
5097
476
            temp = NULL;                                \
5098
476
        }                                               \
5099
860k
    } while(0)
5100
5101
    /* Multiply two values, then reduce the result:
5102
       result = X*Y % c.  If c is NULL, skip the mod. */
5103
64.6k
#define MULT(X, Y, result)                      \
5104
890k
    do {                                        \
5105
860k
        temp = (PyLongObject *)long_mul(X, Y);  \
5106
860k
        if (temp == NULL)                       \
5107
860k
            goto Error;                         \
5108
860k
        Py_XDECREF(result);                     \
5109
860k
        result = temp;                          \
5110
860k
        temp = NULL;                            \
5111
860k
        REDUCE(result);                         \
5112
860k
    } while(0)
5113
5114
64.6k
    i = _PyLong_SignedDigitCount(b);
5115
64.6k
    digit bi = i ? b->long_value.ob_digit[i-1] : 0;
5116
64.6k
    digit bit;
5117
64.6k
    if (i <= 1 && bi <= 3) {
5118
        /* aim for minimal overhead */
5119
4.51k
        if (bi >= 2) {
5120
2.07k
            MULT(a, a, z);
5121
2.07k
            if (bi == 3) {
5122
306
                MULT(z, a, z);
5123
306
            }
5124
2.07k
        }
5125
2.44k
        else if (bi == 1) {
5126
            /* Multiplying by 1 serves two purposes: if `a` is of an int
5127
             * subclass, makes the result an int (e.g., pow(False, 1) returns
5128
             * 0 instead of False), and potentially reduces `a` by the modulus.
5129
             */
5130
1.25k
            MULT(a, z, z);
5131
1.25k
        }
5132
        /* else bi is 0, and z==1 is correct */
5133
4.51k
    }
5134
60.1k
    else if (i <= HUGE_EXP_CUTOFF / PyLong_SHIFT ) {
5135
        /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
5136
        /* https://cacr.uwaterloo.ca/hac/about/chap14.pdf            */
5137
5138
        /* Find the first significant exponent bit. Search right to left
5139
         * because we're primarily trying to cut overhead for small powers.
5140
         */
5141
58.2k
        assert(bi);  /* else there is no significant bit */
5142
58.2k
        Py_SETREF(z, (PyLongObject*)Py_NewRef(a));
5143
408k
        for (bit = 2; ; bit <<= 1) {
5144
408k
            if (bit > bi) { /* found the first bit */
5145
58.2k
                assert((bi & bit) == 0);
5146
58.2k
                bit >>= 1;
5147
58.2k
                assert(bi & bit);
5148
58.2k
                break;
5149
58.2k
            }
5150
408k
        }
5151
59.2k
        for (--i, bit >>= 1;;) {
5152
441k
            for (; bit != 0; bit >>= 1) {
5153
382k
                MULT(z, z, z);
5154
382k
                if (bi & bit) {
5155
184k
                    MULT(z, a, z);
5156
184k
                }
5157
382k
            }
5158
59.2k
            if (--i < 0) {
5159
58.2k
                break;
5160
58.2k
            }
5161
1.05k
            bi = b->long_value.ob_digit[i];
5162
1.05k
            bit = (digit)1 << (PyLong_SHIFT-1);
5163
1.05k
        }
5164
58.2k
    }
5165
1.97k
    else {
5166
        /* Left-to-right k-ary sliding window exponentiation
5167
         * (Handbook of Applied Cryptography (HAC) Algorithm 14.85)
5168
         */
5169
1.97k
        table[0] = (PyLongObject*)Py_NewRef(a);
5170
1.97k
        num_table_entries = 1;
5171
1.97k
        MULT(a, a, a2);
5172
        /* table[i] == a**(2*i + 1) % c */
5173
31.5k
        for (i = 1; i < EXP_TABLE_LEN; ++i) {
5174
29.5k
            table[i] = NULL; /* must set to known value for MULT */
5175
29.5k
            MULT(table[i-1], a2, table[i]);
5176
29.5k
            ++num_table_entries; /* incremented iff MULT succeeded */
5177
29.5k
        }
5178
1.97k
        Py_CLEAR(a2);
5179
5180
        /* Repeatedly extract the next (no more than) EXP_WINDOW_SIZE bits
5181
         * into `pending`, starting with the next 1 bit.  The current bit
5182
         * length of `pending` is `blen`.
5183
         */
5184
1.97k
        int pending = 0, blen = 0;
5185
29.8k
#define ABSORB_PENDING  do { \
5186
29.8k
            int ntz = 0; /* number of trailing zeroes in `pending` */ \
5187
29.8k
            assert(pending && blen); \
5188
29.8k
            assert(pending >> (blen - 1)); \
5189
29.8k
            assert(pending >> blen == 0); \
5190
63.2k
            while ((pending & 1) == 0) { \
5191
33.4k
                ++ntz; \
5192
33.4k
                pending >>= 1; \
5193
33.4k
            } \
5194
29.8k
            assert(ntz < blen); \
5195
29.8k
            blen -= ntz; \
5196
113k
            do { \
5197
113k
                MULT(z, z, z); \
5198
113k
            } while (--blen); \
5199
29.8k
            MULT(z, table[pending >> 1], z); \
5200
63.2k
            while (ntz-- > 0) \
5201
33.4k
                MULT(z, z, z); \
5202
29.8k
            assert(blen == 0); \
5203
29.8k
            pending = 0; \
5204
29.8k
        } while(0)
5205
5206
9.61k
        for (i = _PyLong_SignedDigitCount(b) - 1; i >= 0; --i) {
5207
7.64k
            const digit bi = b->long_value.ob_digit[i];
5208
236k
            for (j = PyLong_SHIFT - 1; j >= 0; --j) {
5209
229k
                const int bit = (bi >> j) & 1;
5210
229k
                pending = (pending << 1) | bit;
5211
229k
                if (pending) {
5212
146k
                    ++blen;
5213
146k
                    if (blen == EXP_WINDOW_SIZE)
5214
28.5k
                        ABSORB_PENDING;
5215
146k
                }
5216
82.4k
                else /* absorb strings of 0 bits */
5217
82.4k
                    MULT(z, z, z);
5218
229k
            }
5219
7.64k
        }
5220
1.97k
        if (pending)
5221
1.39k
            ABSORB_PENDING;
5222
1.97k
    }
5223
5224
64.6k
    if (negativeOutput && !_PyLong_IsZero(z)) {
5225
0
        temp = long_sub(z, c);
5226
0
        if (temp == NULL)
5227
0
            goto Error;
5228
0
        Py_SETREF(z, temp);
5229
0
        temp = NULL;
5230
0
    }
5231
64.6k
    goto Done;
5232
5233
64.6k
  Error:
5234
0
    Py_CLEAR(z);
5235
    /* fall through */
5236
64.6k
  Done:
5237
96.2k
    for (i = 0; i < num_table_entries; ++i)
5238
31.5k
        Py_DECREF(table[i]);
5239
64.6k
    Py_DECREF(a);
5240
64.6k
    Py_DECREF(b);
5241
64.6k
    Py_XDECREF(c);
5242
64.6k
    Py_XDECREF(a2);
5243
64.6k
    Py_XDECREF(temp);
5244
64.6k
    return (PyObject *)z;
5245
0
}
5246
5247
static PyObject *
5248
long_invert(PyObject *self)
5249
435k
{
5250
435k
    PyLongObject *v = _PyLong_CAST(self);
5251
5252
    /* Implement ~x as -(x+1) */
5253
435k
    if (_PyLong_IsCompact(v))
5254
429k
        return (PyObject*)_PyLong_FromSTwoDigits(~medium_value(v));
5255
5256
6.18k
    PyLongObject *x = long_add(v, (PyLongObject *)_PyLong_GetOne());
5257
6.18k
    if (x == NULL)
5258
0
        return NULL;
5259
6.18k
    _PyLong_Negate(&x);
5260
    /* No need for maybe_small_long here, since any small longs
5261
       will have been caught in the _PyLong_IsCompact() fast path. */
5262
6.18k
    return (PyObject *)x;
5263
6.18k
}
5264
5265
static PyLongObject *
5266
long_neg(PyLongObject *v)
5267
180k
{
5268
180k
    if (_PyLong_IsCompact(v)) {
5269
144k
        return _PyLong_FromSTwoDigits(-medium_value(v));
5270
144k
    }
5271
5272
36.1k
    PyLongObject *z = (PyLongObject *)_PyLong_Copy(v);
5273
36.1k
    if (z != NULL) {
5274
36.1k
        _PyLong_FlipSign(z);
5275
36.1k
    }
5276
36.1k
    return z;
5277
180k
}
5278
5279
static PyObject *
5280
long_neg_method(PyObject *v)
5281
180k
{
5282
180k
    return (PyObject*)long_neg(_PyLong_CAST(v));
5283
180k
}
5284
5285
static PyLongObject*
5286
long_abs(PyLongObject *v)
5287
12
{
5288
12
    if (_PyLong_IsNegative(v))
5289
4
        return long_neg(v);
5290
8
    else
5291
8
        return (PyLongObject*)long_long((PyObject *)v);
5292
12
}
5293
5294
static PyObject *
5295
long_abs_method(PyObject *v)
5296
12
{
5297
12
    return (PyObject*)long_abs(_PyLong_CAST(v));
5298
12
}
5299
5300
static int
5301
long_bool(PyObject *v)
5302
52.4k
{
5303
52.4k
    return !_PyLong_IsZero(_PyLong_CAST(v));
5304
52.4k
}
5305
5306
/* Inner function for both long_rshift and _PyLong_Rshift, shifting an
5307
   integer right by PyLong_SHIFT*wordshift + remshift bits.
5308
   wordshift should be nonnegative. */
5309
5310
static PyObject *
5311
long_rshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift)
5312
217k
{
5313
217k
    PyLongObject *z = NULL;
5314
217k
    Py_ssize_t newsize, hishift, size_a;
5315
217k
    twodigits accum;
5316
217k
    int a_negative;
5317
5318
    /* Total number of bits shifted must be nonnegative. */
5319
217k
    assert(wordshift >= 0);
5320
217k
    assert(remshift < PyLong_SHIFT);
5321
5322
    /* Fast path for small a. */
5323
217k
    if (_PyLong_IsCompact(a)) {
5324
215k
        stwodigits m, x;
5325
215k
        digit shift;
5326
215k
        m = medium_value(a);
5327
215k
        shift = wordshift == 0 ? remshift : PyLong_SHIFT;
5328
215k
        x = m < 0 ? ~(~m >> shift) : m >> shift;
5329
215k
        return (PyObject*)_PyLong_FromSTwoDigits(x);
5330
215k
    }
5331
5332
2.44k
    a_negative = _PyLong_IsNegative(a);
5333
2.44k
    size_a = _PyLong_DigitCount(a);
5334
5335
2.44k
    if (a_negative) {
5336
        /* For negative 'a', adjust so that 0 < remshift <= PyLong_SHIFT,
5337
           while keeping PyLong_SHIFT*wordshift + remshift the same. This
5338
           ensures that 'newsize' is computed correctly below. */
5339
788
        if (remshift == 0) {
5340
304
            if (wordshift == 0) {
5341
                /* Can only happen if the original shift was 0. */
5342
165
                return long_long((PyObject *)a);
5343
165
            }
5344
139
            remshift = PyLong_SHIFT;
5345
139
            --wordshift;
5346
139
        }
5347
788
    }
5348
5349
2.44k
    assert(wordshift >= 0);
5350
2.27k
    newsize = size_a - wordshift;
5351
2.27k
    if (newsize <= 0) {
5352
        /* Shifting all the bits of 'a' out gives either -1 or 0. */
5353
1.09k
        return PyLong_FromLong(-a_negative);
5354
1.09k
    }
5355
1.18k
    z = long_alloc(newsize);
5356
1.18k
    if (z == NULL) {
5357
0
        return NULL;
5358
0
    }
5359
1.18k
    hishift = PyLong_SHIFT - remshift;
5360
5361
1.18k
    accum = a->long_value.ob_digit[wordshift];
5362
1.18k
    if (a_negative) {
5363
        /*
5364
            For a positive integer a and nonnegative shift, we have:
5365
5366
                (-a) >> shift == -((a + 2**shift - 1) >> shift).
5367
5368
            In the addition `a + (2**shift - 1)`, the low `wordshift` digits of
5369
            `2**shift - 1` all have value `PyLong_MASK`, so we get a carry out
5370
            from the bottom `wordshift` digits when at least one of the least
5371
            significant `wordshift` digits of `a` is nonzero. Digit `wordshift`
5372
            of `2**shift - 1` has value `PyLong_MASK >> hishift`.
5373
        */
5374
190
        _PyLong_SetSignAndDigitCount(z, -1, newsize);
5375
5376
190
        digit sticky = 0;
5377
429
        for (Py_ssize_t j = 0; j < wordshift; j++) {
5378
239
            sticky |= a->long_value.ob_digit[j];
5379
239
        }
5380
190
        accum += (PyLong_MASK >> hishift) + (digit)(sticky != 0);
5381
190
    }
5382
5383
1.18k
    accum >>= remshift;
5384
58.2k
    for (Py_ssize_t i = 0, j = wordshift + 1; j < size_a; i++, j++) {
5385
57.0k
        accum += (twodigits)a->long_value.ob_digit[j] << hishift;
5386
57.0k
        z->long_value.ob_digit[i] = (digit)(accum & PyLong_MASK);
5387
57.0k
        accum >>= PyLong_SHIFT;
5388
57.0k
    }
5389
1.18k
    assert(accum <= PyLong_MASK);
5390
1.18k
    z->long_value.ob_digit[newsize - 1] = (digit)accum;
5391
5392
1.18k
    z = maybe_small_long(long_normalize(z));
5393
1.18k
    return (PyObject *)z;
5394
1.18k
}
5395
5396
static PyObject *
5397
long_rshift(PyObject *a, PyObject *b)
5398
225k
{
5399
225k
    int64_t shiftby;
5400
5401
225k
    CHECK_BINOP(a, b);
5402
5403
223k
    if (_PyLong_IsNegative((PyLongObject *)b)) {
5404
212
        PyErr_SetString(PyExc_ValueError, "negative shift count");
5405
212
        return NULL;
5406
212
    }
5407
223k
    if (_PyLong_IsZero((PyLongObject *)a)) {
5408
969
        return PyLong_FromLong(0);
5409
969
    }
5410
222k
    if (PyLong_AsInt64(b, &shiftby) < 0) {
5411
4.70k
        if (!PyErr_ExceptionMatches(PyExc_OverflowError)) {
5412
0
            return NULL;
5413
0
        }
5414
4.70k
        PyErr_Clear();
5415
4.70k
        if (_PyLong_IsNegative((PyLongObject *)a)) {
5416
2.01k
            return PyLong_FromLong(-1);
5417
2.01k
        }
5418
2.69k
        else {
5419
2.69k
            return PyLong_FromLong(0);
5420
2.69k
        }
5421
4.70k
    }
5422
217k
    return _PyLong_Rshift(a, shiftby);
5423
222k
}
5424
5425
/* Return a >> shiftby. */
5426
PyObject *
5427
_PyLong_Rshift(PyObject *a, int64_t shiftby)
5428
217k
{
5429
217k
    Py_ssize_t wordshift;
5430
217k
    digit remshift;
5431
5432
217k
    assert(PyLong_Check(a));
5433
217k
    assert(shiftby >= 0);
5434
217k
    if (_PyLong_IsZero((PyLongObject *)a)) {
5435
0
        return PyLong_FromLong(0);
5436
0
    }
5437
#if PY_SSIZE_T_MAX <= INT64_MAX / PyLong_SHIFT
5438
    if (shiftby > (int64_t)PY_SSIZE_T_MAX * PyLong_SHIFT) {
5439
        if (_PyLong_IsNegative((PyLongObject *)a)) {
5440
            return PyLong_FromLong(-1);
5441
        }
5442
        else {
5443
            return PyLong_FromLong(0);
5444
        }
5445
    }
5446
#endif
5447
217k
    wordshift = (Py_ssize_t)(shiftby / PyLong_SHIFT);
5448
217k
    remshift = (digit)(shiftby % PyLong_SHIFT);
5449
217k
    return long_rshift1((PyLongObject *)a, wordshift, remshift);
5450
217k
}
5451
5452
static PyObject *
5453
long_lshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift)
5454
51.9k
{
5455
51.9k
    PyLongObject *z = NULL;
5456
51.9k
    Py_ssize_t oldsize, newsize, i, j;
5457
51.9k
    twodigits accum;
5458
5459
51.9k
    if (wordshift == 0 && _PyLong_IsCompact(a)) {
5460
480
        stwodigits m = medium_value(a);
5461
        // bypass undefined shift operator behavior
5462
480
        stwodigits x = m < 0 ? -(-m << remshift) : m << remshift;
5463
480
        return (PyObject*)_PyLong_FromSTwoDigits(x);
5464
480
    }
5465
5466
51.4k
    oldsize = _PyLong_DigitCount(a);
5467
51.4k
    newsize = oldsize + wordshift;
5468
51.4k
    if (remshift)
5469
44.8k
        ++newsize;
5470
51.4k
    z = long_alloc(newsize);
5471
51.4k
    if (z == NULL)
5472
0
        return NULL;
5473
51.4k
    if (_PyLong_IsNegative(a)) {
5474
168
        assert(Py_REFCNT(z) == 1);
5475
168
        _PyLong_FlipSign(z);
5476
168
    }
5477
3.46M
    for (i = 0; i < wordshift; i++)
5478
3.41M
        z->long_value.ob_digit[i] = 0;
5479
51.4k
    accum = 0;
5480
18.6M
    for (j = 0; j < oldsize; i++, j++) {
5481
18.6M
        accum |= (twodigits)a->long_value.ob_digit[j] << remshift;
5482
18.6M
        z->long_value.ob_digit[i] = (digit)(accum & PyLong_MASK);
5483
18.6M
        accum >>= PyLong_SHIFT;
5484
18.6M
    }
5485
51.4k
    if (remshift)
5486
44.8k
        z->long_value.ob_digit[newsize-1] = (digit)accum;
5487
6.61k
    else
5488
51.4k
        assert(!accum);
5489
51.4k
    z = long_normalize(z);
5490
51.4k
    return (PyObject *) maybe_small_long(z);
5491
51.4k
}
5492
5493
5494
static PyObject *
5495
long_lshift_method(PyObject *aa, PyObject *bb)
5496
68.5k
{
5497
68.5k
    CHECK_BINOP(aa, bb);
5498
68.2k
    PyLongObject *a = (PyLongObject*)aa;
5499
68.2k
    PyLongObject *b = (PyLongObject*)bb;
5500
5501
68.2k
    if (_PyLong_IsNegative(b)) {
5502
583
        PyErr_SetString(PyExc_ValueError, "negative shift count");
5503
583
        return NULL;
5504
583
    }
5505
67.7k
    if (_PyLong_IsZero(a)) {
5506
15.7k
        return PyLong_FromLong(0);
5507
15.7k
    }
5508
5509
51.9k
    int64_t shiftby;
5510
51.9k
    if (PyLong_AsInt64(bb, &shiftby) < 0) {
5511
0
        if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
5512
0
            PyErr_SetString(PyExc_OverflowError,
5513
0
                            "too many digits in integer");
5514
0
        }
5515
0
        return NULL;
5516
0
    }
5517
51.9k
    return long_lshift_int64(a, shiftby);
5518
51.9k
}
5519
5520
/* Return a << shiftby. */
5521
static PyObject *
5522
long_lshift_int64(PyLongObject *a, int64_t shiftby)
5523
51.9k
{
5524
51.9k
    assert(shiftby >= 0);
5525
5526
51.9k
    if (_PyLong_IsZero(a)) {
5527
0
        return PyLong_FromLong(0);
5528
0
    }
5529
#if PY_SSIZE_T_MAX <= INT64_MAX / PyLong_SHIFT
5530
    if (shiftby > (int64_t)PY_SSIZE_T_MAX * PyLong_SHIFT) {
5531
        PyErr_SetString(PyExc_OverflowError,
5532
                        "too many digits in integer");
5533
        return NULL;
5534
    }
5535
#endif
5536
51.9k
    Py_ssize_t wordshift = (Py_ssize_t)(shiftby / PyLong_SHIFT);
5537
51.9k
    digit remshift = (digit)(shiftby % PyLong_SHIFT);
5538
51.9k
    return long_lshift1(a, wordshift, remshift);
5539
51.9k
}
5540
5541
PyObject *
5542
_PyLong_Lshift(PyObject *a, int64_t shiftby)
5543
0
{
5544
0
    return long_lshift_int64(_PyLong_CAST(a), shiftby);
5545
0
}
5546
5547
5548
/* Compute two's complement of digit vector a[0:m], writing result to
5549
   z[0:m].  The digit vector a need not be normalized, but should not
5550
   be entirely zero.  a and z may point to the same digit vector. */
5551
5552
static void
5553
v_complement(digit *z, digit *a, Py_ssize_t m)
5554
7.69k
{
5555
7.69k
    Py_ssize_t i;
5556
7.69k
    digit carry = 1;
5557
44.5k
    for (i = 0; i < m; ++i) {
5558
36.9k
        carry += a[i] ^ PyLong_MASK;
5559
36.9k
        z[i] = carry & PyLong_MASK;
5560
36.9k
        carry >>= PyLong_SHIFT;
5561
36.9k
    }
5562
7.69k
    assert(carry == 0);
5563
7.69k
}
5564
5565
/* Bitwise and/xor/or operations */
5566
5567
static PyObject *
5568
long_bitwise(PyLongObject *a,
5569
             char op,  /* '&', '|', '^' */
5570
             PyLongObject *b)
5571
8.52k
{
5572
8.52k
    int nega, negb, negz;
5573
8.52k
    Py_ssize_t size_a, size_b, size_z, i;
5574
8.52k
    PyLongObject *z;
5575
5576
8.52k
    PyLongObject *new_a = NULL;
5577
8.52k
    PyLongObject *new_b = NULL;
5578
5579
    /* Bitwise operations for negative numbers operate as though
5580
       on a two's complement representation.  So convert arguments
5581
       from sign-magnitude to two's complement, and convert the
5582
       result back to sign-magnitude at the end. */
5583
5584
8.52k
    size_a = _PyLong_DigitCount(a);
5585
8.52k
    size_b = _PyLong_DigitCount(b);
5586
    /* Swap a and b if necessary to ensure size_a >= size_b. */
5587
8.52k
    if (size_a < size_b) {
5588
1.96k
        z = a; a = b; b = z;
5589
1.96k
        size_z = size_a; size_a = size_b; size_b = size_z;
5590
1.96k
    }
5591
5592
    /* If a is negative, replace it by its two's complement. */
5593
8.52k
    nega = _PyLong_IsNegative(a);
5594
8.52k
    if (nega) {
5595
2.60k
        z = long_alloc(size_a);
5596
2.60k
        if (z == NULL)
5597
0
            return NULL;
5598
2.60k
        v_complement(z->long_value.ob_digit, a->long_value.ob_digit, size_a);
5599
2.60k
        new_a = z; // reference to decrement instead of a itself
5600
2.60k
        a = z;
5601
2.60k
    }
5602
5603
    /* Same for b. */
5604
8.52k
    negb = _PyLong_IsNegative(b);
5605
8.52k
    if (negb) {
5606
2.25k
        z = long_alloc(size_b);
5607
2.25k
        if (z == NULL) {
5608
0
            Py_XDECREF(new_a);
5609
0
            return NULL;
5610
0
        }
5611
2.25k
        v_complement(z->long_value.ob_digit, b->long_value.ob_digit, size_b);
5612
2.25k
        new_b = z; // reference to decrement instead of b itself
5613
2.25k
        b = z;
5614
2.25k
    }
5615
5616
    /* JRH: The original logic here was to allocate the result value (z)
5617
       as the longer of the two operands.  However, there are some cases
5618
       where the result is guaranteed to be shorter than that: AND of two
5619
       positives, OR of two negatives: use the shorter number.  AND with
5620
       mixed signs: use the positive number.  OR with mixed signs: use the
5621
       negative number.
5622
    */
5623
8.52k
    switch (op) {
5624
3.67k
    case '^':
5625
3.67k
        negz = nega ^ negb;
5626
3.67k
        size_z = size_a;
5627
3.67k
        break;
5628
2.86k
    case '&':
5629
2.86k
        negz = nega & negb;
5630
2.86k
        size_z = negb ? size_a : size_b;
5631
2.86k
        break;
5632
1.97k
    case '|':
5633
1.97k
        negz = nega | negb;
5634
1.97k
        size_z = negb ? size_b : size_a;
5635
1.97k
        break;
5636
0
    default:
5637
0
        Py_UNREACHABLE();
5638
8.52k
    }
5639
5640
8.52k
    if ((size_z + negz) == 0) {
5641
462
        Py_XDECREF(new_a);
5642
462
        Py_XDECREF(new_b);
5643
462
        return get_small_int(0);
5644
462
    }
5645
5646
    /* We allow an extra digit if z is negative, to make sure that
5647
       the final two's complement of z doesn't overflow. */
5648
8.05k
    z = long_alloc(size_z + negz);
5649
8.05k
    if (z == NULL) {
5650
0
        Py_XDECREF(new_a);
5651
0
        Py_XDECREF(new_b);
5652
0
        return NULL;
5653
0
    }
5654
5655
    /* Compute digits for overlap of a and b. */
5656
8.05k
    switch(op) {
5657
2.40k
    case '&':
5658
25.9k
        for (i = 0; i < size_b; ++i)
5659
23.5k
            z->long_value.ob_digit[i] = a->long_value.ob_digit[i] & b->long_value.ob_digit[i];
5660
2.40k
        break;
5661
1.97k
    case '|':
5662
22.1k
        for (i = 0; i < size_b; ++i)
5663
20.1k
            z->long_value.ob_digit[i] = a->long_value.ob_digit[i] | b->long_value.ob_digit[i];
5664
1.97k
        break;
5665
3.67k
    case '^':
5666
23.8k
        for (i = 0; i < size_b; ++i)
5667
20.1k
            z->long_value.ob_digit[i] = a->long_value.ob_digit[i] ^ b->long_value.ob_digit[i];
5668
3.67k
        break;
5669
0
    default:
5670
0
        Py_UNREACHABLE();
5671
8.05k
    }
5672
5673
    /* Copy any remaining digits of a, inverting if necessary. */
5674
8.05k
    if (op == '^' && negb)
5675
3.05k
        for (; i < size_z; ++i)
5676
2.17k
            z->long_value.ob_digit[i] = a->long_value.ob_digit[i] ^ PyLong_MASK;
5677
7.17k
    else if (i < size_z)
5678
4.61k
        memcpy(&z->long_value.ob_digit[i], &a->long_value.ob_digit[i],
5679
4.61k
               (size_z-i)*sizeof(digit));
5680
5681
    /* Complement result if negative. */
5682
8.05k
    if (negz) {
5683
2.82k
        _PyLong_FlipSign(z);
5684
2.82k
        z->long_value.ob_digit[size_z] = PyLong_MASK;
5685
2.82k
        v_complement(z->long_value.ob_digit, z->long_value.ob_digit, size_z+1);
5686
2.82k
    }
5687
5688
8.05k
    Py_XDECREF(new_a);
5689
8.05k
    Py_XDECREF(new_b);
5690
8.05k
    return (PyObject *)maybe_small_long(long_normalize(z));
5691
8.05k
}
5692
5693
static PyObject *
5694
long_and(PyObject *a, PyObject *b)
5695
6.88k
{
5696
6.88k
    CHECK_BINOP(a, b);
5697
6.13k
    PyLongObject *x = (PyLongObject*)a;
5698
6.13k
    PyLongObject *y = (PyLongObject*)b;
5699
6.13k
    if (_PyLong_IsCompact(x) && _PyLong_IsCompact(y)) {
5700
3.26k
        return (PyObject*)_PyLong_FromSTwoDigits(medium_value(x) & medium_value(y));
5701
3.26k
    }
5702
2.86k
    return long_bitwise(x, '&', y);
5703
6.13k
}
5704
5705
static PyObject *
5706
long_xor(PyObject *a, PyObject *b)
5707
5.87k
{
5708
5.87k
    CHECK_BINOP(a, b);
5709
5.02k
    PyLongObject *x = (PyLongObject*)a;
5710
5.02k
    PyLongObject *y = (PyLongObject*)b;
5711
5.02k
    if (_PyLong_IsCompact(x) && _PyLong_IsCompact(y)) {
5712
1.34k
        return (PyObject*)_PyLong_FromSTwoDigits(medium_value(x) ^ medium_value(y));
5713
1.34k
    }
5714
3.67k
    return long_bitwise(x, '^', y);
5715
5.02k
}
5716
5717
static PyObject *
5718
long_or(PyObject *a, PyObject *b)
5719
6.94k
{
5720
6.94k
    CHECK_BINOP(a, b);
5721
6.66k
    PyLongObject *x = (PyLongObject*)a;
5722
6.66k
    PyLongObject *y = (PyLongObject*)b;
5723
6.66k
    if (_PyLong_IsCompact(x) && _PyLong_IsCompact(y)) {
5724
4.68k
        return (PyObject*)_PyLong_FromSTwoDigits(medium_value(x) | medium_value(y));
5725
4.68k
    }
5726
1.97k
    return long_bitwise(x, '|', y);
5727
6.66k
}
5728
5729
static PyObject *
5730
long_long(PyObject *v)
5731
115k
{
5732
115k
    if (PyLong_CheckExact(v)) {
5733
111k
        return Py_NewRef(v);
5734
111k
    }
5735
3.58k
    else {
5736
3.58k
        return _PyLong_Copy((PyLongObject *)v);
5737
3.58k
    }
5738
115k
}
5739
5740
PyObject *
5741
_PyLong_GCD(PyObject *aarg, PyObject *barg)
5742
0
{
5743
0
    PyLongObject *a, *b, *c = NULL, *d = NULL, *r;
5744
0
    stwodigits x, y, q, s, t, c_carry, d_carry;
5745
0
    stwodigits A, B, C, D, T;
5746
0
    int nbits, k;
5747
0
    digit *a_digit, *b_digit, *c_digit, *d_digit, *a_end, *b_end;
5748
5749
0
    a = (PyLongObject *)aarg;
5750
0
    b = (PyLongObject *)barg;
5751
0
    if (_PyLong_DigitCount(a) <= 2 && _PyLong_DigitCount(b) <= 2) {
5752
0
        Py_INCREF(a);
5753
0
        Py_INCREF(b);
5754
0
        goto simple;
5755
0
    }
5756
5757
    /* Initial reduction: make sure that 0 <= b <= a. */
5758
0
    a = long_abs(a);
5759
0
    if (a == NULL)
5760
0
        return NULL;
5761
0
    b = long_abs(b);
5762
0
    if (b == NULL) {
5763
0
        Py_DECREF(a);
5764
0
        return NULL;
5765
0
    }
5766
0
    if (long_compare(a, b) < 0) {
5767
0
        r = a;
5768
0
        a = b;
5769
0
        b = r;
5770
0
    }
5771
    /* We now own references to a and b */
5772
5773
0
    Py_ssize_t size_a, size_b, alloc_a, alloc_b;
5774
0
    alloc_a = _PyLong_DigitCount(a);
5775
0
    alloc_b = _PyLong_DigitCount(b);
5776
    /* reduce until a fits into 2 digits */
5777
0
    while ((size_a = _PyLong_DigitCount(a)) > 2) {
5778
0
        nbits = bit_length_digit(a->long_value.ob_digit[size_a-1]);
5779
        /* extract top 2*PyLong_SHIFT bits of a into x, along with
5780
           corresponding bits of b into y */
5781
0
        size_b = _PyLong_DigitCount(b);
5782
0
        assert(size_b <= size_a);
5783
0
        if (size_b == 0) {
5784
0
            if (size_a < alloc_a) {
5785
0
                r = (PyLongObject *)_PyLong_Copy(a);
5786
0
                Py_DECREF(a);
5787
0
            }
5788
0
            else
5789
0
                r = a;
5790
0
            Py_DECREF(b);
5791
0
            Py_XDECREF(c);
5792
0
            Py_XDECREF(d);
5793
0
            return (PyObject *)r;
5794
0
        }
5795
0
        x = (((twodigits)a->long_value.ob_digit[size_a-1] << (2*PyLong_SHIFT-nbits)) |
5796
0
             ((twodigits)a->long_value.ob_digit[size_a-2] << (PyLong_SHIFT-nbits)) |
5797
0
             (a->long_value.ob_digit[size_a-3] >> nbits));
5798
5799
0
        y = ((size_b >= size_a - 2 ? b->long_value.ob_digit[size_a-3] >> nbits : 0) |
5800
0
             (size_b >= size_a - 1 ? (twodigits)b->long_value.ob_digit[size_a-2] << (PyLong_SHIFT-nbits) : 0) |
5801
0
             (size_b >= size_a ? (twodigits)b->long_value.ob_digit[size_a-1] << (2*PyLong_SHIFT-nbits) : 0));
5802
5803
        /* inner loop of Lehmer's algorithm; A, B, C, D never grow
5804
           larger than PyLong_MASK during the algorithm. */
5805
0
        A = 1; B = 0; C = 0; D = 1;
5806
0
        for (k=0;; k++) {
5807
0
            if (y-C == 0)
5808
0
                break;
5809
0
            q = (x+(A-1))/(y-C);
5810
0
            s = B+q*D;
5811
0
            t = x-q*y;
5812
0
            if (s > t)
5813
0
                break;
5814
0
            x = y; y = t;
5815
0
            t = A+q*C; A = D; B = C; C = s; D = t;
5816
0
        }
5817
5818
0
        if (k == 0) {
5819
            /* no progress; do a Euclidean step */
5820
0
            if (l_mod(a, b, &r) < 0)
5821
0
                goto error;
5822
0
            Py_SETREF(a, b);
5823
0
            b = r;
5824
0
            alloc_a = alloc_b;
5825
0
            alloc_b = _PyLong_DigitCount(b);
5826
0
            continue;
5827
0
        }
5828
5829
        /*
5830
          a, b = A*b-B*a, D*a-C*b if k is odd
5831
          a, b = A*a-B*b, D*b-C*a if k is even
5832
        */
5833
0
        if (k&1) {
5834
0
            T = -A; A = -B; B = T;
5835
0
            T = -C; C = -D; D = T;
5836
0
        }
5837
0
        if (c != NULL) {
5838
0
            assert(size_a >= 0);
5839
0
            _PyLong_SetSignAndDigitCount(c, 1, size_a);
5840
0
        }
5841
0
        else if (_PyObject_IsUniquelyReferenced((PyObject *)a)) {
5842
0
            c = (PyLongObject*)Py_NewRef(a);
5843
0
        }
5844
0
        else {
5845
0
            alloc_a = size_a;
5846
0
            c = long_alloc(size_a);
5847
0
            if (c == NULL)
5848
0
                goto error;
5849
0
        }
5850
5851
0
        if (d != NULL) {
5852
0
            assert(size_a >= 0);
5853
0
            _PyLong_SetSignAndDigitCount(d, 1, size_a);
5854
0
        }
5855
0
        else if (_PyObject_IsUniquelyReferenced((PyObject *)b)
5856
0
                 && size_a <= alloc_b) {
5857
0
            d = (PyLongObject*)Py_NewRef(b);
5858
0
            assert(size_a >= 0);
5859
0
            _PyLong_SetSignAndDigitCount(d, 1, size_a);
5860
0
        }
5861
0
        else {
5862
0
            alloc_b = size_a;
5863
0
            d = long_alloc(size_a);
5864
0
            if (d == NULL)
5865
0
                goto error;
5866
0
        }
5867
0
        a_end = a->long_value.ob_digit + size_a;
5868
0
        b_end = b->long_value.ob_digit + size_b;
5869
5870
        /* compute new a and new b in parallel */
5871
0
        a_digit = a->long_value.ob_digit;
5872
0
        b_digit = b->long_value.ob_digit;
5873
0
        c_digit = c->long_value.ob_digit;
5874
0
        d_digit = d->long_value.ob_digit;
5875
0
        c_carry = 0;
5876
0
        d_carry = 0;
5877
0
        while (b_digit < b_end) {
5878
0
            c_carry += (A * *a_digit) - (B * *b_digit);
5879
0
            d_carry += (D * *b_digit++) - (C * *a_digit++);
5880
0
            *c_digit++ = (digit)(c_carry & PyLong_MASK);
5881
0
            *d_digit++ = (digit)(d_carry & PyLong_MASK);
5882
0
            c_carry >>= PyLong_SHIFT;
5883
0
            d_carry >>= PyLong_SHIFT;
5884
0
        }
5885
0
        while (a_digit < a_end) {
5886
0
            c_carry += A * *a_digit;
5887
0
            d_carry -= C * *a_digit++;
5888
0
            *c_digit++ = (digit)(c_carry & PyLong_MASK);
5889
0
            *d_digit++ = (digit)(d_carry & PyLong_MASK);
5890
0
            c_carry >>= PyLong_SHIFT;
5891
0
            d_carry >>= PyLong_SHIFT;
5892
0
        }
5893
0
        assert(c_carry == 0);
5894
0
        assert(d_carry == 0);
5895
5896
0
        Py_INCREF(c);
5897
0
        Py_INCREF(d);
5898
0
        Py_DECREF(a);
5899
0
        Py_DECREF(b);
5900
0
        a = long_normalize(c);
5901
0
        b = long_normalize(d);
5902
0
    }
5903
0
    Py_XDECREF(c);
5904
0
    Py_XDECREF(d);
5905
5906
0
simple:
5907
0
    assert(Py_REFCNT(a) > 0);
5908
0
    assert(Py_REFCNT(b) > 0);
5909
/* Issue #24999: use two shifts instead of ">> 2*PyLong_SHIFT" to avoid
5910
   undefined behaviour when LONG_MAX type is smaller than 60 bits */
5911
0
#if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
5912
    /* a fits into a long, so b must too */
5913
0
    x = PyLong_AsLong((PyObject *)a);
5914
0
    y = PyLong_AsLong((PyObject *)b);
5915
#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
5916
    x = PyLong_AsLongLong((PyObject *)a);
5917
    y = PyLong_AsLongLong((PyObject *)b);
5918
#else
5919
# error "_PyLong_GCD"
5920
#endif
5921
0
    x = Py_ABS(x);
5922
0
    y = Py_ABS(y);
5923
0
    Py_DECREF(a);
5924
0
    Py_DECREF(b);
5925
5926
    /* usual Euclidean algorithm for longs */
5927
0
    while (y != 0) {
5928
0
        t = y;
5929
0
        y = x % y;
5930
0
        x = t;
5931
0
    }
5932
0
#if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
5933
0
    return PyLong_FromLong(x);
5934
#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
5935
    return PyLong_FromLongLong(x);
5936
#else
5937
# error "_PyLong_GCD"
5938
#endif
5939
5940
0
error:
5941
0
    Py_DECREF(a);
5942
0
    Py_DECREF(b);
5943
0
    Py_XDECREF(c);
5944
0
    Py_XDECREF(d);
5945
0
    return NULL;
5946
0
}
5947
5948
static PyObject *
5949
long_float(PyObject *v)
5950
0
{
5951
0
    double result;
5952
0
    result = PyLong_AsDouble(v);
5953
0
    if (result == -1.0 && PyErr_Occurred())
5954
0
        return NULL;
5955
0
    return PyFloat_FromDouble(result);
5956
0
}
5957
5958
static PyObject *
5959
long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase);
5960
5961
/*[clinic input]
5962
@classmethod
5963
int.__new__ as long_new
5964
    x: object(c_default="NULL") = 0
5965
    /
5966
    base as obase: object(c_default="NULL") = 10
5967
[clinic start generated code]*/
5968
5969
static PyObject *
5970
long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase)
5971
/*[clinic end generated code: output=e47cfe777ab0f24c input=81c98f418af9eb6f]*/
5972
494k
{
5973
494k
    Py_ssize_t base;
5974
5975
494k
    if (type != &PyLong_Type)
5976
868
        return long_subtype_new(type, x, obase); /* Wimp out */
5977
493k
    if (x == NULL) {
5978
6
        if (obase != NULL) {
5979
0
            PyErr_SetString(PyExc_TypeError,
5980
0
                            "int() missing string argument");
5981
0
            return NULL;
5982
0
        }
5983
6
        return PyLong_FromLong(0L);
5984
6
    }
5985
    /* default base and limit, forward to standard implementation */
5986
493k
    if (obase == NULL)
5987
862
        return PyNumber_Long(x);
5988
5989
492k
    base = PyNumber_AsSsize_t(obase, NULL);
5990
492k
    if (base == -1 && PyErr_Occurred())
5991
0
        return NULL;
5992
492k
    if ((base != 0 && base < 2) || base > 36) {
5993
0
        PyErr_SetString(PyExc_ValueError,
5994
0
                        "int() base must be >= 2 and <= 36, or 0");
5995
0
        return NULL;
5996
0
    }
5997
5998
492k
    if (PyUnicode_Check(x))
5999
3.77k
        return PyLong_FromUnicodeObject(x, (int)base);
6000
488k
    else if (PyByteArray_Check(x) || PyBytes_Check(x)) {
6001
488k
        const char *string;
6002
488k
        if (PyByteArray_Check(x))
6003
488k
            string = PyByteArray_AS_STRING(x);
6004
0
        else
6005
0
            string = PyBytes_AS_STRING(x);
6006
488k
        return _PyLong_FromBytes(string, Py_SIZE(x), (int)base);
6007
488k
    }
6008
0
    else {
6009
0
        PyErr_SetString(PyExc_TypeError,
6010
0
                        "int() can't convert non-string with explicit base");
6011
0
        return NULL;
6012
0
    }
6013
492k
}
6014
6015
/* Wimpy, slow approach to tp_new calls for subtypes of int:
6016
   first create a regular int from whatever arguments we got,
6017
   then allocate a subtype instance and initialize it from
6018
   the regular int.  The regular int is then thrown away.
6019
*/
6020
static PyObject *
6021
long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase)
6022
868
{
6023
868
    PyLongObject *tmp, *newobj;
6024
868
    Py_ssize_t size, ndigits;
6025
868
    int sign;
6026
6027
868
    assert(PyType_IsSubtype(type, &PyLong_Type));
6028
868
    tmp = (PyLongObject *)long_new_impl(&PyLong_Type, x, obase);
6029
868
    if (tmp == NULL)
6030
0
        return NULL;
6031
868
    assert(PyLong_Check(tmp));
6032
868
    size = _PyLong_DigitCount(tmp);
6033
    /* Fast operations for single digit integers (including zero)
6034
     * assume that there is always at least one digit present. */
6035
868
    ndigits = size ? size : 1;
6036
868
    newobj = (PyLongObject *)type->tp_alloc(type, ndigits);
6037
868
    if (newobj == NULL) {
6038
0
        Py_DECREF(tmp);
6039
0
        return NULL;
6040
0
    }
6041
868
    assert(PyLong_Check(newobj));
6042
868
    if (_PyLong_IsCompact(tmp)) {
6043
862
        sign = _PyLong_CompactSign(tmp);
6044
862
    }
6045
6
    else {
6046
6
        sign = _PyLong_NonCompactSign(tmp);
6047
6
    }
6048
868
    _PyLong_InitTag(newobj);
6049
868
    _PyLong_SetSignAndDigitCount(newobj, sign, size);
6050
868
    memcpy(newobj->long_value.ob_digit, tmp->long_value.ob_digit,
6051
868
           ndigits * sizeof(digit));
6052
868
    Py_DECREF(tmp);
6053
868
    return (PyObject *)newobj;
6054
868
}
6055
6056
/*[clinic input]
6057
int.__getnewargs__
6058
[clinic start generated code]*/
6059
6060
static PyObject *
6061
int___getnewargs___impl(PyObject *self)
6062
/*[clinic end generated code: output=839a49de3f00b61b input=5904770ab1fb8c75]*/
6063
0
{
6064
0
    return Py_BuildValue("(N)", _PyLong_Copy((PyLongObject *)self));
6065
0
}
6066
6067
static PyObject *
6068
long_get0(PyObject *Py_UNUSED(self), void *Py_UNUSED(context))
6069
0
{
6070
0
    return PyLong_FromLong(0L);
6071
0
}
6072
6073
static PyObject *
6074
long_get1(PyObject *Py_UNUSED(self), void *Py_UNUSED(ignored))
6075
0
{
6076
0
    return PyLong_FromLong(1L);
6077
0
}
6078
6079
/*[clinic input]
6080
int.__format__
6081
6082
    format_spec: unicode
6083
    /
6084
6085
Convert to a string according to format_spec.
6086
[clinic start generated code]*/
6087
6088
static PyObject *
6089
int___format___impl(PyObject *self, PyObject *format_spec)
6090
/*[clinic end generated code: output=b4929dee9ae18689 input=d5e1254a47e8d1dc]*/
6091
132
{
6092
132
    _PyUnicodeWriter writer;
6093
132
    int ret;
6094
6095
132
    _PyUnicodeWriter_Init(&writer);
6096
132
    ret = _PyLong_FormatAdvancedWriter(
6097
132
        &writer,
6098
132
        self,
6099
132
        format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
6100
132
    if (ret == -1) {
6101
0
        _PyUnicodeWriter_Dealloc(&writer);
6102
0
        return NULL;
6103
0
    }
6104
132
    return _PyUnicodeWriter_Finish(&writer);
6105
132
}
6106
6107
/* Return a pair (q, r) such that a = b * q + r, and
6108
   abs(r) <= abs(b)/2, with equality possible only if q is even.
6109
   In other words, q == a / b, rounded to the nearest integer using
6110
   round-half-to-even. */
6111
6112
PyObject *
6113
_PyLong_DivmodNear(PyObject *a, PyObject *b)
6114
0
{
6115
0
    PyLongObject *quo = NULL, *rem = NULL;
6116
0
    PyObject *twice_rem, *temp;
6117
0
    int quo_is_odd, quo_is_neg;
6118
0
    Py_ssize_t cmp;
6119
6120
    /* Equivalent Python code:
6121
6122
       def divmod_near(a, b):
6123
           q, r = divmod(a, b)
6124
           # round up if either r / b > 0.5, or r / b == 0.5 and q is odd.
6125
           # The expression r / b > 0.5 is equivalent to 2 * r > b if b is
6126
           # positive, 2 * r < b if b negative.
6127
           greater_than_half = 2*r > b if b > 0 else 2*r < b
6128
           exactly_half = 2*r == b
6129
           if greater_than_half or exactly_half and q % 2 == 1:
6130
               q += 1
6131
               r -= b
6132
           return q, r
6133
6134
    */
6135
0
    if (!PyLong_Check(a) || !PyLong_Check(b)) {
6136
0
        PyErr_SetString(PyExc_TypeError,
6137
0
                        "non-integer arguments in division");
6138
0
        return NULL;
6139
0
    }
6140
6141
    /* Do a and b have different signs?  If so, quotient is negative. */
6142
0
    quo_is_neg = (_PyLong_IsNegative((PyLongObject *)a)) != (_PyLong_IsNegative((PyLongObject *)b));
6143
6144
0
    if (long_divrem((PyLongObject*)a, (PyLongObject*)b, &quo, &rem) < 0)
6145
0
        goto error;
6146
6147
    /* compare twice the remainder with the divisor, to see
6148
       if we need to adjust the quotient and remainder */
6149
0
    twice_rem = long_lshift_int64(rem, 1);
6150
0
    if (twice_rem == NULL)
6151
0
        goto error;
6152
0
    if (quo_is_neg) {
6153
0
        temp = (PyObject*)long_neg((PyLongObject*)twice_rem);
6154
0
        Py_SETREF(twice_rem, temp);
6155
0
        if (twice_rem == NULL)
6156
0
            goto error;
6157
0
    }
6158
0
    cmp = long_compare((PyLongObject *)twice_rem, (PyLongObject *)b);
6159
0
    Py_DECREF(twice_rem);
6160
6161
0
    quo_is_odd = (quo->long_value.ob_digit[0] & 1) != 0;
6162
0
    if ((_PyLong_IsNegative((PyLongObject *)b) ? cmp < 0 : cmp > 0) || (cmp == 0 && quo_is_odd)) {
6163
        /* fix up quotient */
6164
0
        PyObject *one = _PyLong_GetOne();  // borrowed reference
6165
0
        if (quo_is_neg)
6166
0
            temp = (PyObject*)long_sub(quo, (PyLongObject *)one);
6167
0
        else
6168
0
            temp = (PyObject*)long_add(quo, (PyLongObject *)one);
6169
0
        Py_SETREF(quo, (PyLongObject *)temp);
6170
0
        if (quo == NULL)
6171
0
            goto error;
6172
        /* and remainder */
6173
0
        if (quo_is_neg)
6174
0
            temp = (PyObject*)long_add(rem, (PyLongObject *)b);
6175
0
        else
6176
0
            temp = (PyObject*)long_sub(rem, (PyLongObject *)b);
6177
0
        Py_SETREF(rem, (PyLongObject *)temp);
6178
0
        if (rem == NULL)
6179
0
            goto error;
6180
0
    }
6181
6182
0
    return _PyTuple_FromPairSteal((PyObject *)quo, (PyObject *)rem);
6183
6184
0
  error:
6185
0
    Py_XDECREF(quo);
6186
0
    Py_XDECREF(rem);
6187
0
    return NULL;
6188
0
}
6189
6190
/*[clinic input]
6191
int.__round__
6192
6193
    ndigits as o_ndigits: object = None
6194
    /
6195
6196
Rounding an Integral returns itself.
6197
6198
Rounding with an ndigits argument also returns an integer.
6199
[clinic start generated code]*/
6200
6201
static PyObject *
6202
int___round___impl(PyObject *self, PyObject *o_ndigits)
6203
/*[clinic end generated code: output=954fda6b18875998 input=30c2aec788263144]*/
6204
0
{
6205
    /* To round an integer m to the nearest 10**n (n positive), we make use of
6206
     * the divmod_near operation, defined by:
6207
     *
6208
     *   divmod_near(a, b) = (q, r)
6209
     *
6210
     * where q is the nearest integer to the quotient a / b (the
6211
     * nearest even integer in the case of a tie) and r == a - q * b.
6212
     * Hence q * b = a - r is the nearest multiple of b to a,
6213
     * preferring even multiples in the case of a tie.
6214
     *
6215
     * So the nearest multiple of 10**n to m is:
6216
     *
6217
     *   m - divmod_near(m, 10**n)[1].
6218
     */
6219
0
    if (o_ndigits == Py_None)
6220
0
        return long_long(self);
6221
6222
0
    PyObject *ndigits = _PyNumber_Index(o_ndigits);
6223
0
    if (ndigits == NULL)
6224
0
        return NULL;
6225
6226
    /* if ndigits >= 0 then no rounding is necessary; return self unchanged */
6227
0
    if (!_PyLong_IsNegative((PyLongObject *)ndigits)) {
6228
0
        Py_DECREF(ndigits);
6229
0
        return long_long(self);
6230
0
    }
6231
6232
    /* result = self - divmod_near(self, 10 ** -ndigits)[1] */
6233
0
    PyObject *temp = (PyObject*)long_neg((PyLongObject*)ndigits);
6234
0
    Py_SETREF(ndigits, temp);
6235
0
    if (ndigits == NULL)
6236
0
        return NULL;
6237
6238
0
    PyObject *result = PyLong_FromLong(10);
6239
0
    if (result == NULL) {
6240
0
        Py_DECREF(ndigits);
6241
0
        return NULL;
6242
0
    }
6243
6244
0
    temp = long_pow(result, ndigits, Py_None);
6245
0
    Py_DECREF(ndigits);
6246
0
    Py_SETREF(result, temp);
6247
0
    if (result == NULL)
6248
0
        return NULL;
6249
6250
0
    temp = _PyLong_DivmodNear(self, result);
6251
0
    Py_SETREF(result, temp);
6252
0
    if (result == NULL)
6253
0
        return NULL;
6254
6255
0
    temp = (PyObject*)long_sub((PyLongObject*)self,
6256
0
                               (PyLongObject*)PyTuple_GET_ITEM(result, 1));
6257
0
    Py_SETREF(result, temp);
6258
6259
0
    return result;
6260
0
}
6261
6262
/*[clinic input]
6263
int.__sizeof__ -> Py_ssize_t
6264
6265
Returns size in memory, in bytes.
6266
[clinic start generated code]*/
6267
6268
static Py_ssize_t
6269
int___sizeof___impl(PyObject *self)
6270
/*[clinic end generated code: output=3303f008eaa6a0a5 input=9b51620c76fc4507]*/
6271
0
{
6272
    /* using Py_MAX(..., 1) because we always allocate space for at least
6273
       one digit, even though the integer zero has a digit count of 0 */
6274
0
    Py_ssize_t ndigits = Py_MAX(_PyLong_DigitCount((PyLongObject *)self), 1);
6275
0
    return Py_TYPE(self)->tp_basicsize + Py_TYPE(self)->tp_itemsize * ndigits;
6276
0
}
6277
6278
/*[clinic input]
6279
int.bit_length
6280
6281
Number of bits necessary to represent self in binary.
6282
6283
>>> bin(37)
6284
'0b100101'
6285
>>> (37).bit_length()
6286
6
6287
[clinic start generated code]*/
6288
6289
static PyObject *
6290
int_bit_length_impl(PyObject *self)
6291
/*[clinic end generated code: output=fc1977c9353d6a59 input=e4eb7a587e849a32]*/
6292
211
{
6293
211
    int64_t nbits = _PyLong_NumBits(self);
6294
211
    assert(nbits >= 0);
6295
211
    assert(!PyErr_Occurred());
6296
211
    return PyLong_FromInt64(nbits);
6297
211
}
6298
6299
static int
6300
popcount_digit(digit d)
6301
0
{
6302
    // digit can be larger than uint32_t, but only PyLong_SHIFT bits
6303
    // of it will be ever used.
6304
0
    static_assert(PyLong_SHIFT <= 32, "digit is larger than uint32_t");
6305
0
    return _Py_popcount32((uint32_t)d);
6306
0
}
6307
6308
/*[clinic input]
6309
@permit_long_summary
6310
int.bit_count
6311
6312
Number of ones in the binary representation of the absolute value of self.
6313
6314
Also known as the population count.
6315
6316
>>> bin(13)
6317
'0b1101'
6318
>>> (13).bit_count()
6319
3
6320
[clinic start generated code]*/
6321
6322
static PyObject *
6323
int_bit_count_impl(PyObject *self)
6324
/*[clinic end generated code: output=2e571970daf1e5c3 input=f2510a306761db15]*/
6325
0
{
6326
0
    assert(self != NULL);
6327
0
    assert(PyLong_Check(self));
6328
6329
0
    PyLongObject *z = (PyLongObject *)self;
6330
0
    Py_ssize_t ndigits = _PyLong_DigitCount(z);
6331
0
    int64_t bit_count = 0;
6332
6333
0
    for (Py_ssize_t i = 0; i < ndigits; i++) {
6334
0
        bit_count += popcount_digit(z->long_value.ob_digit[i]);
6335
0
    }
6336
6337
0
    return PyLong_FromInt64(bit_count);
6338
0
}
6339
6340
/*[clinic input]
6341
int.as_integer_ratio
6342
6343
Return a pair of integers, whose ratio is equal to the original int.
6344
6345
The ratio is in lowest terms and has a positive denominator.
6346
6347
>>> (10).as_integer_ratio()
6348
(10, 1)
6349
>>> (-10).as_integer_ratio()
6350
(-10, 1)
6351
>>> (0).as_integer_ratio()
6352
(0, 1)
6353
[clinic start generated code]*/
6354
6355
static PyObject *
6356
int_as_integer_ratio_impl(PyObject *self)
6357
/*[clinic end generated code: output=e60803ae1cc8621a input=384ff1766634bec2]*/
6358
0
{
6359
0
    PyObject *numerator = long_long(self);
6360
0
    if (numerator == NULL) {
6361
0
        return NULL;
6362
0
    }
6363
0
    return _PyTuple_FromPairSteal(numerator, _PyLong_GetOne());
6364
0
}
6365
6366
/*[clinic input]
6367
int.to_bytes
6368
6369
    length: Py_ssize_t(allow_negative=False) = 1
6370
        Length of bytes object to use.  An OverflowError is raised if
6371
        the integer is not representable with the given number of bytes.
6372
        Default is length 1.
6373
    byteorder: unicode(c_default="NULL") = "big"
6374
        The byte order used to represent the integer.  If byteorder is
6375
        'big', the most significant byte is at the beginning of the byte
6376
        array.  If byteorder is 'little', the most significant byte is at
6377
        the end of the byte array.  To request the native byte order of
6378
        the host system, use sys.byteorder as the byte order value.
6379
        Default is to use 'big'.
6380
    *
6381
    signed as is_signed: bool = False
6382
        Determines whether two's complement is used to represent the
6383
        integer.  If signed is False and a negative integer is given,
6384
        an OverflowError is raised.
6385
6386
Return an array of bytes representing an integer.
6387
[clinic start generated code]*/
6388
6389
static PyObject *
6390
int_to_bytes_impl(PyObject *self, Py_ssize_t length, PyObject *byteorder,
6391
                  int is_signed)
6392
/*[clinic end generated code: output=89c801df114050a3 input=c74a93c07b2f6526]*/
6393
21
{
6394
21
    int little_endian;
6395
21
    if (byteorder == NULL)
6396
0
        little_endian = 0;
6397
21
    else if (_PyUnicode_Equal(byteorder, &_Py_ID(little)))
6398
21
        little_endian = 1;
6399
0
    else if (_PyUnicode_Equal(byteorder, &_Py_ID(big)))
6400
0
        little_endian = 0;
6401
0
    else {
6402
0
        PyErr_SetString(PyExc_ValueError,
6403
0
            "byteorder must be either 'little' or 'big'");
6404
0
        return NULL;
6405
0
    }
6406
6407
21
    PyBytesWriter *writer = PyBytesWriter_Create(length);
6408
21
    if (writer == NULL) {
6409
0
        return NULL;
6410
0
    }
6411
6412
21
    if (_PyLong_AsByteArray((PyLongObject *)self,
6413
21
                            PyBytesWriter_GetData(writer),
6414
21
                            length, little_endian, is_signed, 1) < 0) {
6415
0
        PyBytesWriter_Discard(writer);
6416
0
        return NULL;
6417
0
    }
6418
6419
21
    return PyBytesWriter_Finish(writer);
6420
21
}
6421
6422
/*[clinic input]
6423
@classmethod
6424
int.from_bytes
6425
6426
    bytes as bytes_obj: object
6427
        Holds the array of bytes to convert.  The argument must either
6428
        support the buffer protocol or be an iterable object producing
6429
        bytes.  Bytes and bytearray are examples of built-in objects that
6430
        support the buffer protocol.
6431
    byteorder: unicode(c_default="NULL") = "big"
6432
        The byte order used to represent the integer.  If byteorder is
6433
        'big', the most significant byte is at the beginning of the byte
6434
        array.  If byteorder is 'little', the most significant byte is at
6435
        the end of the byte array.  To request the native byte order of
6436
        the host system, use sys.byteorder as the byte order value.
6437
        Default is to use 'big'.
6438
    *
6439
    signed as is_signed: bool = False
6440
        Indicates whether two's complement is used to represent the
6441
        integer.
6442
6443
Return the integer represented by the given array of bytes.
6444
[clinic start generated code]*/
6445
6446
static PyObject *
6447
int_from_bytes_impl(PyTypeObject *type, PyObject *bytes_obj,
6448
                    PyObject *byteorder, int is_signed)
6449
/*[clinic end generated code: output=efc5d68e31f9314f input=95801e50b942e164]*/
6450
834
{
6451
834
    int little_endian;
6452
834
    PyObject *long_obj, *bytes;
6453
6454
834
    if (byteorder == NULL)
6455
0
        little_endian = 0;
6456
834
    else if (_PyUnicode_Equal(byteorder, &_Py_ID(little)))
6457
834
        little_endian = 1;
6458
0
    else if (_PyUnicode_Equal(byteorder, &_Py_ID(big)))
6459
0
        little_endian = 0;
6460
0
    else {
6461
0
        PyErr_SetString(PyExc_ValueError,
6462
0
            "byteorder must be either 'little' or 'big'");
6463
0
        return NULL;
6464
0
    }
6465
6466
    /* Fast-path exact bytes. */
6467
834
    if (PyBytes_CheckExact(bytes_obj)) {
6468
834
        long_obj = _PyLong_FromByteArray(
6469
834
            (unsigned char *)PyBytes_AS_STRING(bytes_obj), Py_SIZE(bytes_obj),
6470
834
            little_endian, is_signed);
6471
834
    }
6472
    /* Use buffer protocol to avoid copies. */
6473
0
    else if (PyObject_CheckBuffer(bytes_obj)) {
6474
0
        Py_buffer view;
6475
0
        if (PyObject_GetBuffer(bytes_obj, &view, PyBUF_SIMPLE) != 0) {
6476
0
            return NULL;
6477
0
        }
6478
0
        long_obj = _PyLong_FromByteArray(view.buf, view.len, little_endian,
6479
0
            is_signed);
6480
0
        PyBuffer_Release(&view);
6481
0
    }
6482
0
    else {
6483
        /* fallback: Construct a bytes then convert. */
6484
0
        bytes = PyObject_Bytes(bytes_obj);
6485
0
        if (bytes == NULL) {
6486
0
            return NULL;
6487
0
        }
6488
0
        long_obj = _PyLong_FromByteArray(
6489
0
            (unsigned char *)PyBytes_AS_STRING(bytes), Py_SIZE(bytes),
6490
0
            little_endian, is_signed);
6491
0
        Py_DECREF(bytes);
6492
0
    }
6493
6494
834
    if (long_obj != NULL && type != &PyLong_Type) {
6495
0
        Py_SETREF(long_obj, PyObject_CallOneArg((PyObject *)type, long_obj));
6496
0
    }
6497
6498
834
    return long_obj;
6499
834
}
6500
6501
static PyObject *
6502
long_long_meth(PyObject *self, PyObject *Py_UNUSED(ignored))
6503
0
{
6504
0
    return long_long(self);
6505
0
}
6506
6507
static PyObject *
6508
long_long_getter(PyObject *self, void *Py_UNUSED(ignored))
6509
0
{
6510
0
    return long_long(self);
6511
0
}
6512
6513
/*[clinic input]
6514
@permit_long_summary
6515
int.is_integer
6516
6517
Returns True. Exists for duck type compatibility with float.is_integer.
6518
[clinic start generated code]*/
6519
6520
static PyObject *
6521
int_is_integer_impl(PyObject *self)
6522
/*[clinic end generated code: output=90f8e794ce5430ef input=aacf01a2c81c0244]*/
6523
0
{
6524
0
    Py_RETURN_TRUE;
6525
0
}
6526
6527
static PyObject *
6528
long_vectorcall(PyObject *type, PyObject * const*args,
6529
                 size_t nargsf, PyObject *kwnames)
6530
682k
{
6531
682k
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
6532
682k
    if (kwnames != NULL) {
6533
0
        PyThreadState *tstate = PyThreadState_GET();
6534
0
        return _PyObject_MakeTpCall(tstate, type, args, nargs, kwnames);
6535
0
    }
6536
682k
    switch (nargs) {
6537
0
        case 0:
6538
0
            return _PyLong_GetZero();
6539
190k
        case 1:
6540
190k
            return PyNumber_Long(args[0]);
6541
492k
        case 2:
6542
492k
            return long_new_impl(_PyType_CAST(type), args[0], args[1]);
6543
0
        default:
6544
0
            return PyErr_Format(PyExc_TypeError,
6545
0
                                "int expected at most 2 arguments, got %zd",
6546
0
                                nargs);
6547
682k
    }
6548
682k
}
6549
6550
static PyMethodDef long_methods[] = {
6551
    {"conjugate",       long_long_meth, METH_NOARGS,
6552
     "Returns self, the complex conjugate of any int."},
6553
    INT_BIT_LENGTH_METHODDEF
6554
    INT_BIT_COUNT_METHODDEF
6555
    INT_TO_BYTES_METHODDEF
6556
    INT_FROM_BYTES_METHODDEF
6557
    INT_AS_INTEGER_RATIO_METHODDEF
6558
    {"__trunc__",       long_long_meth, METH_NOARGS,
6559
     "Truncating an Integral returns itself."},
6560
    {"__floor__",       long_long_meth, METH_NOARGS,
6561
     "Flooring an Integral returns itself."},
6562
    {"__ceil__",        long_long_meth, METH_NOARGS,
6563
     "Ceiling of an Integral returns itself."},
6564
    INT___ROUND___METHODDEF
6565
    INT___GETNEWARGS___METHODDEF
6566
    INT___FORMAT___METHODDEF
6567
    INT___SIZEOF___METHODDEF
6568
    INT_IS_INTEGER_METHODDEF
6569
    {NULL,              NULL}           /* sentinel */
6570
};
6571
6572
static PyGetSetDef long_getset[] = {
6573
    {"real",
6574
     long_long_getter, NULL,
6575
     "the real part of a complex number",
6576
     NULL},
6577
    {"imag",
6578
     long_get0, NULL,
6579
     "the imaginary part of a complex number",
6580
     NULL},
6581
    {"numerator",
6582
     long_long_getter, NULL,
6583
     "the numerator of a rational number in lowest terms",
6584
     NULL},
6585
    {"denominator",
6586
     long_get1, NULL,
6587
     "the denominator of a rational number in lowest terms",
6588
     NULL},
6589
    {NULL}  /* Sentinel */
6590
};
6591
6592
PyDoc_STRVAR(long_doc,
6593
"int([x]) -> integer\n\
6594
int(x, base=10) -> integer\n\
6595
\n\
6596
Convert a number or string to an integer, or return 0 if no arguments\n\
6597
are given.  If x is a number, return x.__int__().  For floating-point\n\
6598
numbers, this truncates towards zero.\n\
6599
\n\
6600
If x is not a number or if base is given, then x must be a string,\n\
6601
bytes, or bytearray instance representing an integer literal in the\n\
6602
given base.  The literal can be preceded by '+' or '-' and be surrounded\n\
6603
by whitespace.  The base defaults to 10.  Valid bases are 0 and 2-36.\n\
6604
Base 0 means to interpret the base from the string as an integer\n\
6605
iteral.\n\
6606
>>> int('0b100', base=0)\n\
6607
4");
6608
6609
static PyNumberMethods long_as_number = {
6610
    long_add_method,            /*nb_add*/
6611
    long_sub_method,            /*nb_subtract*/
6612
    long_mul_method,            /*nb_multiply*/
6613
    long_mod,                   /*nb_remainder*/
6614
    long_divmod,                /*nb_divmod*/
6615
    long_pow,                   /*nb_power*/
6616
    long_neg_method,            /*nb_negative*/
6617
    long_long,                  /*tp_positive*/
6618
    long_abs_method,            /*tp_absolute*/
6619
    long_bool,                  /*tp_bool*/
6620
    long_invert,                /*nb_invert*/
6621
    long_lshift_method,         /*nb_lshift*/
6622
    long_rshift,                /*nb_rshift*/
6623
    long_and,                   /*nb_and*/
6624
    long_xor,                   /*nb_xor*/
6625
    long_or,                    /*nb_or*/
6626
    long_long,                  /*nb_int*/
6627
    0,                          /*nb_reserved*/
6628
    long_float,                 /*nb_float*/
6629
    0,                          /* nb_inplace_add */
6630
    0,                          /* nb_inplace_subtract */
6631
    0,                          /* nb_inplace_multiply */
6632
    0,                          /* nb_inplace_remainder */
6633
    0,                          /* nb_inplace_power */
6634
    0,                          /* nb_inplace_lshift */
6635
    0,                          /* nb_inplace_rshift */
6636
    0,                          /* nb_inplace_and */
6637
    0,                          /* nb_inplace_xor */
6638
    0,                          /* nb_inplace_or */
6639
    long_div,                   /* nb_floor_divide */
6640
    long_true_divide,           /* nb_true_divide */
6641
    0,                          /* nb_inplace_floor_divide */
6642
    0,                          /* nb_inplace_true_divide */
6643
    long_long,                  /* nb_index */
6644
};
6645
6646
PyTypeObject PyLong_Type = {
6647
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
6648
    "int",                                      /* tp_name */
6649
    offsetof(PyLongObject, long_value.ob_digit),  /* tp_basicsize */
6650
    sizeof(digit),                              /* tp_itemsize */
6651
    long_dealloc,                               /* tp_dealloc */
6652
    0,                                          /* tp_vectorcall_offset */
6653
    0,                                          /* tp_getattr */
6654
    0,                                          /* tp_setattr */
6655
    0,                                          /* tp_as_async */
6656
    long_to_decimal_string,                     /* tp_repr */
6657
    &long_as_number,                            /* tp_as_number */
6658
    0,                                          /* tp_as_sequence */
6659
    0,                                          /* tp_as_mapping */
6660
    long_hash,                                  /* tp_hash */
6661
    0,                                          /* tp_call */
6662
    0,                                          /* tp_str */
6663
    PyObject_GenericGetAttr,                    /* tp_getattro */
6664
    0,                                          /* tp_setattro */
6665
    0,                                          /* tp_as_buffer */
6666
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
6667
        Py_TPFLAGS_LONG_SUBCLASS |
6668
        _Py_TPFLAGS_MATCH_SELF,               /* tp_flags */
6669
    long_doc,                                   /* tp_doc */
6670
    0,                                          /* tp_traverse */
6671
    0,                                          /* tp_clear */
6672
    long_richcompare,                           /* tp_richcompare */
6673
    0,                                          /* tp_weaklistoffset */
6674
    0,                                          /* tp_iter */
6675
    0,                                          /* tp_iternext */
6676
    long_methods,                               /* tp_methods */
6677
    0,                                          /* tp_members */
6678
    long_getset,                                /* tp_getset */
6679
    0,                                          /* tp_base */
6680
    0,                                          /* tp_dict */
6681
    0,                                          /* tp_descr_get */
6682
    0,                                          /* tp_descr_set */
6683
    0,                                          /* tp_dictoffset */
6684
    0,                                          /* tp_init */
6685
    0,                                          /* tp_alloc */
6686
    long_new,                                   /* tp_new */
6687
    PyObject_Free,                              /* tp_free */
6688
    .tp_vectorcall = long_vectorcall,
6689
    .tp_version_tag = _Py_TYPE_VERSION_INT,
6690
};
6691
6692
static PyTypeObject Int_InfoType;
6693
6694
PyDoc_STRVAR(int_info__doc__,
6695
"sys.int_info\n\
6696
\n\
6697
A named tuple that holds information about Python's\n\
6698
internal representation of integers.  The attributes are read only.");
6699
6700
static PyStructSequence_Field int_info_fields[] = {
6701
    {"bits_per_digit", "size of a digit in bits"},
6702
    {"sizeof_digit", "size in bytes of the C type used to represent a digit"},
6703
    {"default_max_str_digits", "maximum string conversion digits limitation"},
6704
    {"str_digits_check_threshold", "minimum positive value for int_max_str_digits"},
6705
    {NULL, NULL}
6706
};
6707
6708
static PyStructSequence_Desc int_info_desc = {
6709
    "sys.int_info",   /* name */
6710
    int_info__doc__,  /* doc */
6711
    int_info_fields,  /* fields */
6712
    4                 /* number of fields */
6713
};
6714
6715
PyObject *
6716
PyLong_GetInfo(void)
6717
21
{
6718
21
    PyObject* int_info;
6719
21
    int field = 0;
6720
21
    int_info = PyStructSequence_New(&Int_InfoType);
6721
21
    if (int_info == NULL)
6722
0
        return NULL;
6723
21
    PyStructSequence_SET_ITEM(int_info, field++,
6724
21
                              PyLong_FromLong(PyLong_SHIFT));
6725
21
    PyStructSequence_SET_ITEM(int_info, field++,
6726
21
                              PyLong_FromLong(sizeof(digit)));
6727
    /*
6728
     * The following two fields were added after investigating uses of
6729
     * sys.int_info in the wild: Exceedingly rarely used. The ONLY use found was
6730
     * numba using sys.int_info.bits_per_digit as attribute access rather than
6731
     * sequence unpacking. Cython and sympy also refer to sys.int_info but only
6732
     * as info for debugging. No concern about adding these in a backport.
6733
     */
6734
21
    PyStructSequence_SET_ITEM(int_info, field++,
6735
21
                              PyLong_FromLong(_PY_LONG_DEFAULT_MAX_STR_DIGITS));
6736
21
    PyStructSequence_SET_ITEM(int_info, field++,
6737
21
                              PyLong_FromLong(_PY_LONG_MAX_STR_DIGITS_THRESHOLD));
6738
21
    if (PyErr_Occurred()) {
6739
0
        Py_CLEAR(int_info);
6740
0
        return NULL;
6741
0
    }
6742
21
    return int_info;
6743
21
}
6744
6745
6746
/* runtime lifecycle */
6747
6748
PyStatus
6749
_PyLong_InitTypes(PyInterpreterState *interp)
6750
21
{
6751
    /* initialize int_info */
6752
21
    if (_PyStructSequence_InitBuiltin(interp, &Int_InfoType,
6753
21
                                      &int_info_desc) < 0)
6754
0
    {
6755
0
        return _PyStatus_ERR("can't init int info type");
6756
0
    }
6757
6758
21
    return _PyStatus_OK();
6759
21
}
6760
6761
6762
void
6763
_PyLong_FiniTypes(PyInterpreterState *interp)
6764
0
{
6765
0
    _PyStructSequence_FiniBuiltin(interp, &Int_InfoType);
6766
0
}
6767
6768
#undef PyUnstable_Long_IsCompact
6769
6770
int
6771
0
PyUnstable_Long_IsCompact(const PyLongObject* op) {
6772
0
    return _PyLong_IsCompact((PyLongObject*)op);
6773
0
}
6774
6775
#undef PyUnstable_Long_CompactValue
6776
6777
Py_ssize_t
6778
0
PyUnstable_Long_CompactValue(const PyLongObject* op) {
6779
0
    return _PyLong_CompactValue((PyLongObject*)op);
6780
0
}
6781
6782
6783
PyObject* PyLong_FromInt32(int32_t value)
6784
0
{
6785
0
    PYLONG_FROM_INT(uint32_t, int32_t, value);
6786
0
}
6787
6788
PyObject* PyLong_FromUInt32(uint32_t value)
6789
0
{
6790
0
    PYLONG_FROM_UINT(uint32_t, value);
6791
0
}
6792
6793
PyObject* PyLong_FromInt64(int64_t value)
6794
211
{
6795
211
    PYLONG_FROM_INT(uint64_t, int64_t, value);
6796
211
}
6797
6798
PyObject* PyLong_FromUInt64(uint64_t value)
6799
0
{
6800
0
    PYLONG_FROM_UINT(uint64_t, value);
6801
0
}
6802
6803
#define LONG_TO_INT(type, obj, result) \
6804
274k
    do { \
6805
274k
        type value; \
6806
274k
        int flags = (Py_ASNATIVEBYTES_NATIVE_ENDIAN \
6807
274k
                     | Py_ASNATIVEBYTES_ALLOW_INDEX); \
6808
274k
        Py_ssize_t bytes = PyLong_AsNativeBytes(obj, &value, sizeof(value), flags); \
6809
274k
        if (bytes < 0) { \
6810
0
            return -1; \
6811
0
        } \
6812
274k
        if ((size_t)bytes > sizeof(value)) { \
6813
4.70k
            PyErr_SetString(PyExc_OverflowError, \
6814
4.70k
                            "Python int too large to convert to C " #type); \
6815
4.70k
            return -1; \
6816
4.70k
        } \
6817
274k
        *result = value; \
6818
269k
        return 0; \
6819
274k
    } while (0)
6820
6821
int PyLong_AsInt32(PyObject *obj, int32_t *result)
6822
0
{
6823
0
    LONG_TO_INT(int32_t, obj, result);
6824
0
}
6825
6826
int PyLong_AsInt64(PyObject *obj, int64_t *result)
6827
274k
{
6828
274k
    LONG_TO_INT(int64_t, obj, result);
6829
274k
}
6830
6831
#define LONG_TO_UINT(type, obj, result) \
6832
0
    do { \
6833
0
        type value; \
6834
0
        int flags = (Py_ASNATIVEBYTES_NATIVE_ENDIAN \
6835
0
                     | Py_ASNATIVEBYTES_UNSIGNED_BUFFER \
6836
0
                     | Py_ASNATIVEBYTES_REJECT_NEGATIVE \
6837
0
                     | Py_ASNATIVEBYTES_ALLOW_INDEX); \
6838
0
        Py_ssize_t bytes = PyLong_AsNativeBytes(obj, &value, sizeof(value), flags); \
6839
0
        if (bytes < 0) { \
6840
0
            return -1; \
6841
0
        } \
6842
0
        if ((size_t)bytes > sizeof(value)) { \
6843
0
            PyErr_SetString(PyExc_OverflowError, \
6844
0
                            "Python int too large to convert to C " #type); \
6845
0
            return -1; \
6846
0
        } \
6847
0
        *result = value; \
6848
0
        return 0; \
6849
0
    } while (0)
6850
6851
int PyLong_AsUInt32(PyObject *obj, uint32_t *result)
6852
0
{
6853
0
    LONG_TO_UINT(uint32_t, obj, result);
6854
0
}
6855
6856
int PyLong_AsUInt64(PyObject *obj, uint64_t *result)
6857
0
{
6858
0
    LONG_TO_UINT(uint64_t, obj, result);
6859
0
}
6860
6861
6862
static const PyLongLayout PyLong_LAYOUT = {
6863
    .bits_per_digit = PyLong_SHIFT,
6864
    .digits_order = -1,  // least significant first
6865
    .digit_endianness = PY_LITTLE_ENDIAN ? -1 : 1,
6866
    .digit_size = sizeof(digit),
6867
};
6868
6869
6870
const PyLongLayout*
6871
PyLong_GetNativeLayout(void)
6872
102
{
6873
102
    return &PyLong_LAYOUT;
6874
102
}
6875
6876
6877
int
6878
PyLong_Export(PyObject *obj, PyLongExport *export_long)
6879
0
{
6880
0
    if (!PyLong_Check(obj)) {
6881
0
        memset(export_long, 0, sizeof(*export_long));
6882
0
        PyErr_Format(PyExc_TypeError, "expect int, got %T", obj);
6883
0
        return -1;
6884
0
    }
6885
6886
    // Fast-path: try to convert to a int64_t
6887
0
    int overflow;
6888
0
#if SIZEOF_LONG == 8
6889
0
    long value = PyLong_AsLongAndOverflow(obj, &overflow);
6890
#else
6891
    // Windows has 32-bit long, so use 64-bit long long instead
6892
    long long value = PyLong_AsLongLongAndOverflow(obj, &overflow);
6893
#endif
6894
0
    Py_BUILD_ASSERT(sizeof(value) == sizeof(int64_t));
6895
    // the function cannot fail since obj is a PyLongObject
6896
0
    assert(!(value == -1 && PyErr_Occurred()));
6897
6898
0
    if (!overflow) {
6899
0
        export_long->value = value;
6900
0
        export_long->negative = 0;
6901
0
        export_long->ndigits = 0;
6902
0
        export_long->digits = NULL;
6903
0
        export_long->_reserved = 0;
6904
0
    }
6905
0
    else {
6906
0
        PyLongObject *self = (PyLongObject*)obj;
6907
0
        export_long->value = 0;
6908
0
        export_long->negative = _PyLong_IsNegative(self);
6909
0
        export_long->ndigits = _PyLong_DigitCount(self);
6910
0
        if (export_long->ndigits == 0) {
6911
0
            export_long->ndigits = 1;
6912
0
        }
6913
0
        export_long->digits = self->long_value.ob_digit;
6914
0
        export_long->_reserved = (Py_uintptr_t)Py_NewRef(obj);
6915
0
    }
6916
0
    return 0;
6917
0
}
6918
6919
6920
void
6921
PyLong_FreeExport(PyLongExport *export_long)
6922
0
{
6923
0
    PyObject *obj = (PyObject*)export_long->_reserved;
6924
0
    if (obj) {
6925
0
        export_long->_reserved = 0;
6926
0
        Py_DECREF(obj);
6927
0
    }
6928
0
}
6929
6930
6931
/* --- PyLongWriter API --------------------------------------------------- */
6932
6933
PyLongWriter*
6934
PyLongWriter_Create(int negative, Py_ssize_t ndigits, void **digits)
6935
102
{
6936
102
    if (ndigits <= 0) {
6937
0
        PyErr_SetString(PyExc_ValueError, "ndigits must be positive");
6938
0
        goto error;
6939
0
    }
6940
102
    assert(digits != NULL);
6941
6942
102
    PyLongObject *obj = long_alloc(ndigits);
6943
102
    if (obj == NULL) {
6944
0
        goto error;
6945
0
    }
6946
102
    if (negative) {
6947
4
        _PyLong_FlipSign(obj);
6948
4
    }
6949
6950
102
    *digits = obj->long_value.ob_digit;
6951
102
    return (PyLongWriter*)obj;
6952
6953
0
error:
6954
0
    *digits = NULL;
6955
0
    return NULL;
6956
102
}
6957
6958
6959
void
6960
PyLongWriter_Discard(PyLongWriter *writer)
6961
0
{
6962
0
    if (writer == NULL) {
6963
0
        return;
6964
0
    }
6965
6966
0
    PyLongObject *obj = (PyLongObject *)writer;
6967
0
    assert(Py_REFCNT(obj) == 1);
6968
0
    Py_DECREF(obj);
6969
0
}
6970
6971
6972
PyObject*
6973
PyLongWriter_Finish(PyLongWriter *writer)
6974
102
{
6975
102
    PyLongObject *obj = (PyLongObject *)writer;
6976
102
    assert(Py_REFCNT(obj) == 1);
6977
6978
#ifdef Py_DEBUG
6979
    // gh-147988: Detect uninitialized digits: long_alloc() fills digits with
6980
    // 0xFF byte pattern. It's posssible because PyLong_BASE is smaller than
6981
    // the maximum value of the C digit type (uint32_t or unsigned short):
6982
    // most significan bits are unused by the API.
6983
    Py_ssize_t ndigits = _PyLong_DigitCount(obj);
6984
    if (ndigits == 0) {
6985
        // Check ob_digit[0] digit for the number zero
6986
        ndigits = 1;
6987
    }
6988
    for (Py_ssize_t i = 0; i < ndigits; i++) {
6989
        digit d = obj->long_value.ob_digit[i];
6990
        if (d & ~(digit)PyLong_MASK) {
6991
            Py_DECREF(obj);
6992
            PyErr_Format(PyExc_SystemError,
6993
                         "PyLongWriter_Finish: digit %zd is uninitialized",
6994
                         i);
6995
            return NULL;
6996
        }
6997
    }
6998
#endif
6999
7000
    // Normalize and get singleton if possible
7001
102
    obj = maybe_small_long(long_normalize(obj));
7002
7003
102
    return (PyObject*)obj;
7004
102
}