Coverage Report

Created: 2025-10-10 06:57

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