17db96d56Sopenharmony_ci/* Long (arbitrary precision) integer object implementation */
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci/* XXX The functional organization of this file is terrible */
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci#include "Python.h"
67db96d56Sopenharmony_ci#include "pycore_bitutils.h"      // _Py_popcount32()
77db96d56Sopenharmony_ci#include "pycore_initconfig.h"    // _PyStatus_OK()
87db96d56Sopenharmony_ci#include "pycore_long.h"          // _Py_SmallInts
97db96d56Sopenharmony_ci#include "pycore_object.h"        // _PyObject_InitVar()
107db96d56Sopenharmony_ci#include "pycore_pystate.h"       // _Py_IsMainInterpreter()
117db96d56Sopenharmony_ci#include "pycore_runtime.h"       // _PY_NSMALLPOSINTS
127db96d56Sopenharmony_ci#include "pycore_structseq.h"     // _PyStructSequence_FiniType()
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci#include <ctype.h>
157db96d56Sopenharmony_ci#include <float.h>
167db96d56Sopenharmony_ci#include <stddef.h>
177db96d56Sopenharmony_ci#include <stdlib.h>               // abs()
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci#include "clinic/longobject.c.h"
207db96d56Sopenharmony_ci/*[clinic input]
217db96d56Sopenharmony_ciclass int "PyObject *" "&PyLong_Type"
227db96d56Sopenharmony_ci[clinic start generated code]*/
237db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ec0275e3422a36e3]*/
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci/* Is this PyLong of size 1, 0 or -1? */
267db96d56Sopenharmony_ci#define IS_MEDIUM_VALUE(x) (((size_t)Py_SIZE(x)) + 1U < 3U)
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci/* convert a PyLong of size 1, 0 or -1 to a C integer */
297db96d56Sopenharmony_cistatic inline stwodigits
307db96d56Sopenharmony_cimedium_value(PyLongObject *x)
317db96d56Sopenharmony_ci{
327db96d56Sopenharmony_ci    assert(IS_MEDIUM_VALUE(x));
337db96d56Sopenharmony_ci    return ((stwodigits)Py_SIZE(x)) * x->ob_digit[0];
347db96d56Sopenharmony_ci}
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci#define IS_SMALL_INT(ival) (-_PY_NSMALLNEGINTS <= (ival) && (ival) < _PY_NSMALLPOSINTS)
377db96d56Sopenharmony_ci#define IS_SMALL_UINT(ival) ((ival) < _PY_NSMALLPOSINTS)
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci#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"
407db96d56Sopenharmony_ci#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"
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_cistatic inline void
437db96d56Sopenharmony_ci_Py_DECREF_INT(PyLongObject *op)
447db96d56Sopenharmony_ci{
457db96d56Sopenharmony_ci    assert(PyLong_CheckExact(op));
467db96d56Sopenharmony_ci    _Py_DECREF_SPECIALIZED((PyObject *)op, (destructor)PyObject_Free);
477db96d56Sopenharmony_ci}
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_cistatic inline int
507db96d56Sopenharmony_ciis_medium_int(stwodigits x)
517db96d56Sopenharmony_ci{
527db96d56Sopenharmony_ci    /* Take care that we are comparing unsigned values. */
537db96d56Sopenharmony_ci    twodigits x_plus_mask = ((twodigits)x) + PyLong_MASK;
547db96d56Sopenharmony_ci    return x_plus_mask < ((twodigits)PyLong_MASK) + PyLong_BASE;
557db96d56Sopenharmony_ci}
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_cistatic PyObject *
587db96d56Sopenharmony_ciget_small_int(sdigit ival)
597db96d56Sopenharmony_ci{
607db96d56Sopenharmony_ci    assert(IS_SMALL_INT(ival));
617db96d56Sopenharmony_ci    PyObject *v = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + ival];
627db96d56Sopenharmony_ci    Py_INCREF(v);
637db96d56Sopenharmony_ci    return v;
647db96d56Sopenharmony_ci}
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_cistatic PyLongObject *
677db96d56Sopenharmony_cimaybe_small_long(PyLongObject *v)
687db96d56Sopenharmony_ci{
697db96d56Sopenharmony_ci    if (v && IS_MEDIUM_VALUE(v)) {
707db96d56Sopenharmony_ci        stwodigits ival = medium_value(v);
717db96d56Sopenharmony_ci        if (IS_SMALL_INT(ival)) {
727db96d56Sopenharmony_ci            _Py_DECREF_INT(v);
737db96d56Sopenharmony_ci            return (PyLongObject *)get_small_int((sdigit)ival);
747db96d56Sopenharmony_ci        }
757db96d56Sopenharmony_ci    }
767db96d56Sopenharmony_ci    return v;
777db96d56Sopenharmony_ci}
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci/* For int multiplication, use the O(N**2) school algorithm unless
807db96d56Sopenharmony_ci * both operands contain more than KARATSUBA_CUTOFF digits (this
817db96d56Sopenharmony_ci * being an internal Python int digit, in base BASE).
827db96d56Sopenharmony_ci */
837db96d56Sopenharmony_ci#define KARATSUBA_CUTOFF 70
847db96d56Sopenharmony_ci#define KARATSUBA_SQUARE_CUTOFF (2 * KARATSUBA_CUTOFF)
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci/* For exponentiation, use the binary left-to-right algorithm unless the
877db96d56Sopenharmony_ci ^ exponent contains more than HUGE_EXP_CUTOFF bits.  In that case, do
887db96d56Sopenharmony_ci * (no more than) EXP_WINDOW_SIZE bits at a time.  The potential drawback is
897db96d56Sopenharmony_ci * that a table of 2**(EXP_WINDOW_SIZE - 1) intermediate results is
907db96d56Sopenharmony_ci * precomputed.
917db96d56Sopenharmony_ci */
927db96d56Sopenharmony_ci#define EXP_WINDOW_SIZE 5
937db96d56Sopenharmony_ci#define EXP_TABLE_LEN (1 << (EXP_WINDOW_SIZE - 1))
947db96d56Sopenharmony_ci/* Suppose the exponent has bit length e. All ways of doing this
957db96d56Sopenharmony_ci * need e squarings. The binary method also needs a multiply for
967db96d56Sopenharmony_ci * each bit set. In a k-ary method with window width w, a multiply
977db96d56Sopenharmony_ci * for each non-zero window, so at worst (and likely!)
987db96d56Sopenharmony_ci * ceiling(e/w). The k-ary sliding window method has the same
997db96d56Sopenharmony_ci * worst case, but the window slides so it can sometimes skip
1007db96d56Sopenharmony_ci * over an all-zero window that the fixed-window method can't
1017db96d56Sopenharmony_ci * exploit. In addition, the windowing methods need multiplies
1027db96d56Sopenharmony_ci * to precompute a table of small powers.
1037db96d56Sopenharmony_ci *
1047db96d56Sopenharmony_ci * For the sliding window method with width 5, 16 precomputation
1057db96d56Sopenharmony_ci * multiplies are needed. Assuming about half the exponent bits
1067db96d56Sopenharmony_ci * are set, then, the binary method needs about e/2 extra mults
1077db96d56Sopenharmony_ci * and the window method about 16 + e/5.
1087db96d56Sopenharmony_ci *
1097db96d56Sopenharmony_ci * The latter is smaller for e > 53 1/3. We don't have direct
1107db96d56Sopenharmony_ci * access to the bit length, though, so call it 60, which is a
1117db96d56Sopenharmony_ci * multiple of a long digit's max bit length (15 or 30 so far).
1127db96d56Sopenharmony_ci */
1137db96d56Sopenharmony_ci#define HUGE_EXP_CUTOFF 60
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci#define SIGCHECK(PyTryBlock)                    \
1167db96d56Sopenharmony_ci    do {                                        \
1177db96d56Sopenharmony_ci        if (PyErr_CheckSignals()) PyTryBlock    \
1187db96d56Sopenharmony_ci    } while(0)
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci/* Normalize (remove leading zeros from) an int object.
1217db96d56Sopenharmony_ci   Doesn't attempt to free the storage--in most cases, due to the nature
1227db96d56Sopenharmony_ci   of the algorithms used, this could save at most be one word anyway. */
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_cistatic PyLongObject *
1257db96d56Sopenharmony_cilong_normalize(PyLongObject *v)
1267db96d56Sopenharmony_ci{
1277db96d56Sopenharmony_ci    Py_ssize_t j = Py_ABS(Py_SIZE(v));
1287db96d56Sopenharmony_ci    Py_ssize_t i = j;
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci    while (i > 0 && v->ob_digit[i-1] == 0)
1317db96d56Sopenharmony_ci        --i;
1327db96d56Sopenharmony_ci    if (i != j) {
1337db96d56Sopenharmony_ci        Py_SET_SIZE(v, (Py_SIZE(v) < 0) ? -(i) : i);
1347db96d56Sopenharmony_ci    }
1357db96d56Sopenharmony_ci    return v;
1367db96d56Sopenharmony_ci}
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci/* Allocate a new int object with size digits.
1397db96d56Sopenharmony_ci   Return NULL and set exception if we run out of memory. */
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci#define MAX_LONG_DIGITS \
1427db96d56Sopenharmony_ci    ((PY_SSIZE_T_MAX - offsetof(PyLongObject, ob_digit))/sizeof(digit))
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ciPyLongObject *
1457db96d56Sopenharmony_ci_PyLong_New(Py_ssize_t size)
1467db96d56Sopenharmony_ci{
1477db96d56Sopenharmony_ci    PyLongObject *result;
1487db96d56Sopenharmony_ci    if (size > (Py_ssize_t)MAX_LONG_DIGITS) {
1497db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
1507db96d56Sopenharmony_ci                        "too many digits in integer");
1517db96d56Sopenharmony_ci        return NULL;
1527db96d56Sopenharmony_ci    }
1537db96d56Sopenharmony_ci    /* Fast operations for single digit integers (including zero)
1547db96d56Sopenharmony_ci     * assume that there is always at least one digit present. */
1557db96d56Sopenharmony_ci    Py_ssize_t ndigits = size ? size : 1;
1567db96d56Sopenharmony_ci    /* Number of bytes needed is: offsetof(PyLongObject, ob_digit) +
1577db96d56Sopenharmony_ci       sizeof(digit)*size.  Previous incarnations of this code used
1587db96d56Sopenharmony_ci       sizeof(PyVarObject) instead of the offsetof, but this risks being
1597db96d56Sopenharmony_ci       incorrect in the presence of padding between the PyVarObject header
1607db96d56Sopenharmony_ci       and the digits. */
1617db96d56Sopenharmony_ci    result = PyObject_Malloc(offsetof(PyLongObject, ob_digit) +
1627db96d56Sopenharmony_ci                             ndigits*sizeof(digit));
1637db96d56Sopenharmony_ci    if (!result) {
1647db96d56Sopenharmony_ci        PyErr_NoMemory();
1657db96d56Sopenharmony_ci        return NULL;
1667db96d56Sopenharmony_ci    }
1677db96d56Sopenharmony_ci    _PyObject_InitVar((PyVarObject*)result, &PyLong_Type, size);
1687db96d56Sopenharmony_ci    return result;
1697db96d56Sopenharmony_ci}
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ciPyObject *
1727db96d56Sopenharmony_ci_PyLong_Copy(PyLongObject *src)
1737db96d56Sopenharmony_ci{
1747db96d56Sopenharmony_ci    PyLongObject *result;
1757db96d56Sopenharmony_ci    Py_ssize_t i;
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci    assert(src != NULL);
1787db96d56Sopenharmony_ci    i = Py_SIZE(src);
1797db96d56Sopenharmony_ci    if (i < 0)
1807db96d56Sopenharmony_ci        i = -(i);
1817db96d56Sopenharmony_ci    if (i < 2) {
1827db96d56Sopenharmony_ci        stwodigits ival = medium_value(src);
1837db96d56Sopenharmony_ci        if (IS_SMALL_INT(ival)) {
1847db96d56Sopenharmony_ci            return get_small_int((sdigit)ival);
1857db96d56Sopenharmony_ci        }
1867db96d56Sopenharmony_ci    }
1877db96d56Sopenharmony_ci    result = _PyLong_New(i);
1887db96d56Sopenharmony_ci    if (result != NULL) {
1897db96d56Sopenharmony_ci        Py_SET_SIZE(result, Py_SIZE(src));
1907db96d56Sopenharmony_ci        while (--i >= 0) {
1917db96d56Sopenharmony_ci            result->ob_digit[i] = src->ob_digit[i];
1927db96d56Sopenharmony_ci        }
1937db96d56Sopenharmony_ci    }
1947db96d56Sopenharmony_ci    return (PyObject *)result;
1957db96d56Sopenharmony_ci}
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_cistatic PyObject *
1987db96d56Sopenharmony_ci_PyLong_FromMedium(sdigit x)
1997db96d56Sopenharmony_ci{
2007db96d56Sopenharmony_ci    assert(!IS_SMALL_INT(x));
2017db96d56Sopenharmony_ci    assert(is_medium_int(x));
2027db96d56Sopenharmony_ci    /* We could use a freelist here */
2037db96d56Sopenharmony_ci    PyLongObject *v = PyObject_Malloc(sizeof(PyLongObject));
2047db96d56Sopenharmony_ci    if (v == NULL) {
2057db96d56Sopenharmony_ci        PyErr_NoMemory();
2067db96d56Sopenharmony_ci        return NULL;
2077db96d56Sopenharmony_ci    }
2087db96d56Sopenharmony_ci    Py_ssize_t sign = x < 0 ? -1: 1;
2097db96d56Sopenharmony_ci    digit abs_x = x < 0 ? -x : x;
2107db96d56Sopenharmony_ci    _PyObject_InitVar((PyVarObject*)v, &PyLong_Type, sign);
2117db96d56Sopenharmony_ci    v->ob_digit[0] = abs_x;
2127db96d56Sopenharmony_ci    return (PyObject*)v;
2137db96d56Sopenharmony_ci}
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_cistatic PyObject *
2167db96d56Sopenharmony_ci_PyLong_FromLarge(stwodigits ival)
2177db96d56Sopenharmony_ci{
2187db96d56Sopenharmony_ci    twodigits abs_ival;
2197db96d56Sopenharmony_ci    int sign;
2207db96d56Sopenharmony_ci    assert(!is_medium_int(ival));
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci    if (ival < 0) {
2237db96d56Sopenharmony_ci        /* negate: can't write this as abs_ival = -ival since that
2247db96d56Sopenharmony_ci           invokes undefined behaviour when ival is LONG_MIN */
2257db96d56Sopenharmony_ci        abs_ival = 0U-(twodigits)ival;
2267db96d56Sopenharmony_ci        sign = -1;
2277db96d56Sopenharmony_ci    }
2287db96d56Sopenharmony_ci    else {
2297db96d56Sopenharmony_ci        abs_ival = (twodigits)ival;
2307db96d56Sopenharmony_ci        sign = 1;
2317db96d56Sopenharmony_ci    }
2327db96d56Sopenharmony_ci    /* Must be at least two digits */
2337db96d56Sopenharmony_ci    assert(abs_ival >> PyLong_SHIFT != 0);
2347db96d56Sopenharmony_ci    twodigits t = abs_ival >> (PyLong_SHIFT * 2);
2357db96d56Sopenharmony_ci    Py_ssize_t ndigits = 2;
2367db96d56Sopenharmony_ci    while (t) {
2377db96d56Sopenharmony_ci        ++ndigits;
2387db96d56Sopenharmony_ci        t >>= PyLong_SHIFT;
2397db96d56Sopenharmony_ci    }
2407db96d56Sopenharmony_ci    PyLongObject *v = _PyLong_New(ndigits);
2417db96d56Sopenharmony_ci    if (v != NULL) {
2427db96d56Sopenharmony_ci        digit *p = v->ob_digit;
2437db96d56Sopenharmony_ci        Py_SET_SIZE(v, ndigits * sign);
2447db96d56Sopenharmony_ci        t = abs_ival;
2457db96d56Sopenharmony_ci        while (t) {
2467db96d56Sopenharmony_ci            *p++ = Py_SAFE_DOWNCAST(
2477db96d56Sopenharmony_ci                t & PyLong_MASK, twodigits, digit);
2487db96d56Sopenharmony_ci            t >>= PyLong_SHIFT;
2497db96d56Sopenharmony_ci        }
2507db96d56Sopenharmony_ci    }
2517db96d56Sopenharmony_ci    return (PyObject *)v;
2527db96d56Sopenharmony_ci}
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci/* Create a new int object from a C word-sized int */
2557db96d56Sopenharmony_cistatic inline PyObject *
2567db96d56Sopenharmony_ci_PyLong_FromSTwoDigits(stwodigits x)
2577db96d56Sopenharmony_ci{
2587db96d56Sopenharmony_ci    if (IS_SMALL_INT(x)) {
2597db96d56Sopenharmony_ci        return get_small_int((sdigit)x);
2607db96d56Sopenharmony_ci    }
2617db96d56Sopenharmony_ci    assert(x != 0);
2627db96d56Sopenharmony_ci    if (is_medium_int(x)) {
2637db96d56Sopenharmony_ci        return _PyLong_FromMedium((sdigit)x);
2647db96d56Sopenharmony_ci    }
2657db96d56Sopenharmony_ci    return _PyLong_FromLarge(x);
2667db96d56Sopenharmony_ci}
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci/* If a freshly-allocated int is already shared, it must
2697db96d56Sopenharmony_ci   be a small integer, so negating it must go to PyLong_FromLong */
2707db96d56Sopenharmony_ciPy_LOCAL_INLINE(void)
2717db96d56Sopenharmony_ci_PyLong_Negate(PyLongObject **x_p)
2727db96d56Sopenharmony_ci{
2737db96d56Sopenharmony_ci    PyLongObject *x;
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci    x = (PyLongObject *)*x_p;
2767db96d56Sopenharmony_ci    if (Py_REFCNT(x) == 1) {
2777db96d56Sopenharmony_ci        Py_SET_SIZE(x, -Py_SIZE(x));
2787db96d56Sopenharmony_ci        return;
2797db96d56Sopenharmony_ci    }
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci    *x_p = (PyLongObject *)_PyLong_FromSTwoDigits(-medium_value(x));
2827db96d56Sopenharmony_ci    Py_DECREF(x);
2837db96d56Sopenharmony_ci}
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci/* Create a new int object from a C long int */
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ciPyObject *
2887db96d56Sopenharmony_ciPyLong_FromLong(long ival)
2897db96d56Sopenharmony_ci{
2907db96d56Sopenharmony_ci    PyLongObject *v;
2917db96d56Sopenharmony_ci    unsigned long abs_ival, t;
2927db96d56Sopenharmony_ci    int ndigits;
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci    /* Handle small and medium cases. */
2957db96d56Sopenharmony_ci    if (IS_SMALL_INT(ival)) {
2967db96d56Sopenharmony_ci        return get_small_int((sdigit)ival);
2977db96d56Sopenharmony_ci    }
2987db96d56Sopenharmony_ci    if (-(long)PyLong_MASK <= ival && ival <= (long)PyLong_MASK) {
2997db96d56Sopenharmony_ci        return _PyLong_FromMedium((sdigit)ival);
3007db96d56Sopenharmony_ci    }
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci    /* Count digits (at least two - smaller cases were handled above). */
3037db96d56Sopenharmony_ci    abs_ival = ival < 0 ? 0U-(unsigned long)ival : (unsigned long)ival;
3047db96d56Sopenharmony_ci    /* Do shift in two steps to avoid possible undefined behavior. */
3057db96d56Sopenharmony_ci    t = abs_ival >> PyLong_SHIFT >> PyLong_SHIFT;
3067db96d56Sopenharmony_ci    ndigits = 2;
3077db96d56Sopenharmony_ci    while (t) {
3087db96d56Sopenharmony_ci        ++ndigits;
3097db96d56Sopenharmony_ci        t >>= PyLong_SHIFT;
3107db96d56Sopenharmony_ci    }
3117db96d56Sopenharmony_ci
3127db96d56Sopenharmony_ci    /* Construct output value. */
3137db96d56Sopenharmony_ci    v = _PyLong_New(ndigits);
3147db96d56Sopenharmony_ci    if (v != NULL) {
3157db96d56Sopenharmony_ci        digit *p = v->ob_digit;
3167db96d56Sopenharmony_ci        Py_SET_SIZE(v, ival < 0 ? -ndigits : ndigits);
3177db96d56Sopenharmony_ci        t = abs_ival;
3187db96d56Sopenharmony_ci        while (t) {
3197db96d56Sopenharmony_ci            *p++ = (digit)(t & PyLong_MASK);
3207db96d56Sopenharmony_ci            t >>= PyLong_SHIFT;
3217db96d56Sopenharmony_ci        }
3227db96d56Sopenharmony_ci    }
3237db96d56Sopenharmony_ci    return (PyObject *)v;
3247db96d56Sopenharmony_ci}
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci#define PYLONG_FROM_UINT(INT_TYPE, ival) \
3277db96d56Sopenharmony_ci    do { \
3287db96d56Sopenharmony_ci        if (IS_SMALL_UINT(ival)) { \
3297db96d56Sopenharmony_ci            return get_small_int((sdigit)(ival)); \
3307db96d56Sopenharmony_ci        } \
3317db96d56Sopenharmony_ci        /* Count the number of Python digits. */ \
3327db96d56Sopenharmony_ci        Py_ssize_t ndigits = 0; \
3337db96d56Sopenharmony_ci        INT_TYPE t = (ival); \
3347db96d56Sopenharmony_ci        while (t) { \
3357db96d56Sopenharmony_ci            ++ndigits; \
3367db96d56Sopenharmony_ci            t >>= PyLong_SHIFT; \
3377db96d56Sopenharmony_ci        } \
3387db96d56Sopenharmony_ci        PyLongObject *v = _PyLong_New(ndigits); \
3397db96d56Sopenharmony_ci        if (v == NULL) { \
3407db96d56Sopenharmony_ci            return NULL; \
3417db96d56Sopenharmony_ci        } \
3427db96d56Sopenharmony_ci        digit *p = v->ob_digit; \
3437db96d56Sopenharmony_ci        while ((ival)) { \
3447db96d56Sopenharmony_ci            *p++ = (digit)((ival) & PyLong_MASK); \
3457db96d56Sopenharmony_ci            (ival) >>= PyLong_SHIFT; \
3467db96d56Sopenharmony_ci        } \
3477db96d56Sopenharmony_ci        return (PyObject *)v; \
3487db96d56Sopenharmony_ci    } while(0)
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci/* Create a new int object from a C unsigned long int */
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ciPyObject *
3537db96d56Sopenharmony_ciPyLong_FromUnsignedLong(unsigned long ival)
3547db96d56Sopenharmony_ci{
3557db96d56Sopenharmony_ci    PYLONG_FROM_UINT(unsigned long, ival);
3567db96d56Sopenharmony_ci}
3577db96d56Sopenharmony_ci
3587db96d56Sopenharmony_ci/* Create a new int object from a C unsigned long long int. */
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ciPyObject *
3617db96d56Sopenharmony_ciPyLong_FromUnsignedLongLong(unsigned long long ival)
3627db96d56Sopenharmony_ci{
3637db96d56Sopenharmony_ci    PYLONG_FROM_UINT(unsigned long long, ival);
3647db96d56Sopenharmony_ci}
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci/* Create a new int object from a C size_t. */
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ciPyObject *
3697db96d56Sopenharmony_ciPyLong_FromSize_t(size_t ival)
3707db96d56Sopenharmony_ci{
3717db96d56Sopenharmony_ci    PYLONG_FROM_UINT(size_t, ival);
3727db96d56Sopenharmony_ci}
3737db96d56Sopenharmony_ci
3747db96d56Sopenharmony_ci/* Create a new int object from a C double */
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ciPyObject *
3777db96d56Sopenharmony_ciPyLong_FromDouble(double dval)
3787db96d56Sopenharmony_ci{
3797db96d56Sopenharmony_ci    /* Try to get out cheap if this fits in a long. When a finite value of real
3807db96d56Sopenharmony_ci     * floating type is converted to an integer type, the value is truncated
3817db96d56Sopenharmony_ci     * toward zero. If the value of the integral part cannot be represented by
3827db96d56Sopenharmony_ci     * the integer type, the behavior is undefined. Thus, we must check that
3837db96d56Sopenharmony_ci     * value is in range (LONG_MIN - 1, LONG_MAX + 1). If a long has more bits
3847db96d56Sopenharmony_ci     * of precision than a double, casting LONG_MIN - 1 to double may yield an
3857db96d56Sopenharmony_ci     * approximation, but LONG_MAX + 1 is a power of two and can be represented
3867db96d56Sopenharmony_ci     * as double exactly (assuming FLT_RADIX is 2 or 16), so for simplicity
3877db96d56Sopenharmony_ci     * check against [-(LONG_MAX + 1), LONG_MAX + 1).
3887db96d56Sopenharmony_ci     */
3897db96d56Sopenharmony_ci    const double int_max = (unsigned long)LONG_MAX + 1;
3907db96d56Sopenharmony_ci    if (-int_max < dval && dval < int_max) {
3917db96d56Sopenharmony_ci        return PyLong_FromLong((long)dval);
3927db96d56Sopenharmony_ci    }
3937db96d56Sopenharmony_ci
3947db96d56Sopenharmony_ci    PyLongObject *v;
3957db96d56Sopenharmony_ci    double frac;
3967db96d56Sopenharmony_ci    int i, ndig, expo, neg;
3977db96d56Sopenharmony_ci    neg = 0;
3987db96d56Sopenharmony_ci    if (Py_IS_INFINITY(dval)) {
3997db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
4007db96d56Sopenharmony_ci                        "cannot convert float infinity to integer");
4017db96d56Sopenharmony_ci        return NULL;
4027db96d56Sopenharmony_ci    }
4037db96d56Sopenharmony_ci    if (Py_IS_NAN(dval)) {
4047db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
4057db96d56Sopenharmony_ci                        "cannot convert float NaN to integer");
4067db96d56Sopenharmony_ci        return NULL;
4077db96d56Sopenharmony_ci    }
4087db96d56Sopenharmony_ci    if (dval < 0.0) {
4097db96d56Sopenharmony_ci        neg = 1;
4107db96d56Sopenharmony_ci        dval = -dval;
4117db96d56Sopenharmony_ci    }
4127db96d56Sopenharmony_ci    frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
4137db96d56Sopenharmony_ci    assert(expo > 0);
4147db96d56Sopenharmony_ci    ndig = (expo-1) / PyLong_SHIFT + 1; /* Number of 'digits' in result */
4157db96d56Sopenharmony_ci    v = _PyLong_New(ndig);
4167db96d56Sopenharmony_ci    if (v == NULL)
4177db96d56Sopenharmony_ci        return NULL;
4187db96d56Sopenharmony_ci    frac = ldexp(frac, (expo-1) % PyLong_SHIFT + 1);
4197db96d56Sopenharmony_ci    for (i = ndig; --i >= 0; ) {
4207db96d56Sopenharmony_ci        digit bits = (digit)frac;
4217db96d56Sopenharmony_ci        v->ob_digit[i] = bits;
4227db96d56Sopenharmony_ci        frac = frac - (double)bits;
4237db96d56Sopenharmony_ci        frac = ldexp(frac, PyLong_SHIFT);
4247db96d56Sopenharmony_ci    }
4257db96d56Sopenharmony_ci    if (neg) {
4267db96d56Sopenharmony_ci        Py_SET_SIZE(v, -(Py_SIZE(v)));
4277db96d56Sopenharmony_ci    }
4287db96d56Sopenharmony_ci    return (PyObject *)v;
4297db96d56Sopenharmony_ci}
4307db96d56Sopenharmony_ci
4317db96d56Sopenharmony_ci/* Checking for overflow in PyLong_AsLong is a PITA since C doesn't define
4327db96d56Sopenharmony_ci * anything about what happens when a signed integer operation overflows,
4337db96d56Sopenharmony_ci * and some compilers think they're doing you a favor by being "clever"
4347db96d56Sopenharmony_ci * then.  The bit pattern for the largest positive signed long is
4357db96d56Sopenharmony_ci * (unsigned long)LONG_MAX, and for the smallest negative signed long
4367db96d56Sopenharmony_ci * it is abs(LONG_MIN), which we could write -(unsigned long)LONG_MIN.
4377db96d56Sopenharmony_ci * However, some other compilers warn about applying unary minus to an
4387db96d56Sopenharmony_ci * unsigned operand.  Hence the weird "0-".
4397db96d56Sopenharmony_ci */
4407db96d56Sopenharmony_ci#define PY_ABS_LONG_MIN         (0-(unsigned long)LONG_MIN)
4417db96d56Sopenharmony_ci#define PY_ABS_SSIZE_T_MIN      (0-(size_t)PY_SSIZE_T_MIN)
4427db96d56Sopenharmony_ci
4437db96d56Sopenharmony_ci/* Get a C long int from an int object or any object that has an __index__
4447db96d56Sopenharmony_ci   method.
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci   On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
4477db96d56Sopenharmony_ci   the result.  Otherwise *overflow is 0.
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci   For other errors (e.g., TypeError), return -1 and set an error condition.
4507db96d56Sopenharmony_ci   In this case *overflow will be 0.
4517db96d56Sopenharmony_ci*/
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_cilong
4547db96d56Sopenharmony_ciPyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
4557db96d56Sopenharmony_ci{
4567db96d56Sopenharmony_ci    /* This version by Tim Peters */
4577db96d56Sopenharmony_ci    PyLongObject *v;
4587db96d56Sopenharmony_ci    unsigned long x, prev;
4597db96d56Sopenharmony_ci    long res;
4607db96d56Sopenharmony_ci    Py_ssize_t i;
4617db96d56Sopenharmony_ci    int sign;
4627db96d56Sopenharmony_ci    int do_decref = 0; /* if PyNumber_Index was called */
4637db96d56Sopenharmony_ci
4647db96d56Sopenharmony_ci    *overflow = 0;
4657db96d56Sopenharmony_ci    if (vv == NULL) {
4667db96d56Sopenharmony_ci        PyErr_BadInternalCall();
4677db96d56Sopenharmony_ci        return -1;
4687db96d56Sopenharmony_ci    }
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci    if (PyLong_Check(vv)) {
4717db96d56Sopenharmony_ci        v = (PyLongObject *)vv;
4727db96d56Sopenharmony_ci    }
4737db96d56Sopenharmony_ci    else {
4747db96d56Sopenharmony_ci        v = (PyLongObject *)_PyNumber_Index(vv);
4757db96d56Sopenharmony_ci        if (v == NULL)
4767db96d56Sopenharmony_ci            return -1;
4777db96d56Sopenharmony_ci        do_decref = 1;
4787db96d56Sopenharmony_ci    }
4797db96d56Sopenharmony_ci
4807db96d56Sopenharmony_ci    res = -1;
4817db96d56Sopenharmony_ci    i = Py_SIZE(v);
4827db96d56Sopenharmony_ci
4837db96d56Sopenharmony_ci    switch (i) {
4847db96d56Sopenharmony_ci    case -1:
4857db96d56Sopenharmony_ci        res = -(sdigit)v->ob_digit[0];
4867db96d56Sopenharmony_ci        break;
4877db96d56Sopenharmony_ci    case 0:
4887db96d56Sopenharmony_ci        res = 0;
4897db96d56Sopenharmony_ci        break;
4907db96d56Sopenharmony_ci    case 1:
4917db96d56Sopenharmony_ci        res = v->ob_digit[0];
4927db96d56Sopenharmony_ci        break;
4937db96d56Sopenharmony_ci    default:
4947db96d56Sopenharmony_ci        sign = 1;
4957db96d56Sopenharmony_ci        x = 0;
4967db96d56Sopenharmony_ci        if (i < 0) {
4977db96d56Sopenharmony_ci            sign = -1;
4987db96d56Sopenharmony_ci            i = -(i);
4997db96d56Sopenharmony_ci        }
5007db96d56Sopenharmony_ci        while (--i >= 0) {
5017db96d56Sopenharmony_ci            prev = x;
5027db96d56Sopenharmony_ci            x = (x << PyLong_SHIFT) | v->ob_digit[i];
5037db96d56Sopenharmony_ci            if ((x >> PyLong_SHIFT) != prev) {
5047db96d56Sopenharmony_ci                *overflow = sign;
5057db96d56Sopenharmony_ci                goto exit;
5067db96d56Sopenharmony_ci            }
5077db96d56Sopenharmony_ci        }
5087db96d56Sopenharmony_ci        /* Haven't lost any bits, but casting to long requires extra
5097db96d56Sopenharmony_ci         * care (see comment above).
5107db96d56Sopenharmony_ci         */
5117db96d56Sopenharmony_ci        if (x <= (unsigned long)LONG_MAX) {
5127db96d56Sopenharmony_ci            res = (long)x * sign;
5137db96d56Sopenharmony_ci        }
5147db96d56Sopenharmony_ci        else if (sign < 0 && x == PY_ABS_LONG_MIN) {
5157db96d56Sopenharmony_ci            res = LONG_MIN;
5167db96d56Sopenharmony_ci        }
5177db96d56Sopenharmony_ci        else {
5187db96d56Sopenharmony_ci            *overflow = sign;
5197db96d56Sopenharmony_ci            /* res is already set to -1 */
5207db96d56Sopenharmony_ci        }
5217db96d56Sopenharmony_ci    }
5227db96d56Sopenharmony_ci  exit:
5237db96d56Sopenharmony_ci    if (do_decref) {
5247db96d56Sopenharmony_ci        Py_DECREF(v);
5257db96d56Sopenharmony_ci    }
5267db96d56Sopenharmony_ci    return res;
5277db96d56Sopenharmony_ci}
5287db96d56Sopenharmony_ci
5297db96d56Sopenharmony_ci/* Get a C long int from an int object or any object that has an __index__
5307db96d56Sopenharmony_ci   method.  Return -1 and set an error if overflow occurs. */
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_cilong
5337db96d56Sopenharmony_ciPyLong_AsLong(PyObject *obj)
5347db96d56Sopenharmony_ci{
5357db96d56Sopenharmony_ci    int overflow;
5367db96d56Sopenharmony_ci    long result = PyLong_AsLongAndOverflow(obj, &overflow);
5377db96d56Sopenharmony_ci    if (overflow) {
5387db96d56Sopenharmony_ci        /* XXX: could be cute and give a different
5397db96d56Sopenharmony_ci           message for overflow == -1 */
5407db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
5417db96d56Sopenharmony_ci                        "Python int too large to convert to C long");
5427db96d56Sopenharmony_ci    }
5437db96d56Sopenharmony_ci    return result;
5447db96d56Sopenharmony_ci}
5457db96d56Sopenharmony_ci
5467db96d56Sopenharmony_ci/* Get a C int from an int object or any object that has an __index__
5477db96d56Sopenharmony_ci   method.  Return -1 and set an error if overflow occurs. */
5487db96d56Sopenharmony_ci
5497db96d56Sopenharmony_ciint
5507db96d56Sopenharmony_ci_PyLong_AsInt(PyObject *obj)
5517db96d56Sopenharmony_ci{
5527db96d56Sopenharmony_ci    int overflow;
5537db96d56Sopenharmony_ci    long result = PyLong_AsLongAndOverflow(obj, &overflow);
5547db96d56Sopenharmony_ci    if (overflow || result > INT_MAX || result < INT_MIN) {
5557db96d56Sopenharmony_ci        /* XXX: could be cute and give a different
5567db96d56Sopenharmony_ci           message for overflow == -1 */
5577db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
5587db96d56Sopenharmony_ci                        "Python int too large to convert to C int");
5597db96d56Sopenharmony_ci        return -1;
5607db96d56Sopenharmony_ci    }
5617db96d56Sopenharmony_ci    return (int)result;
5627db96d56Sopenharmony_ci}
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci/* Get a Py_ssize_t from an int object.
5657db96d56Sopenharmony_ci   Returns -1 and sets an error condition if overflow occurs. */
5667db96d56Sopenharmony_ci
5677db96d56Sopenharmony_ciPy_ssize_t
5687db96d56Sopenharmony_ciPyLong_AsSsize_t(PyObject *vv) {
5697db96d56Sopenharmony_ci    PyLongObject *v;
5707db96d56Sopenharmony_ci    size_t x, prev;
5717db96d56Sopenharmony_ci    Py_ssize_t i;
5727db96d56Sopenharmony_ci    int sign;
5737db96d56Sopenharmony_ci
5747db96d56Sopenharmony_ci    if (vv == NULL) {
5757db96d56Sopenharmony_ci        PyErr_BadInternalCall();
5767db96d56Sopenharmony_ci        return -1;
5777db96d56Sopenharmony_ci    }
5787db96d56Sopenharmony_ci    if (!PyLong_Check(vv)) {
5797db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "an integer is required");
5807db96d56Sopenharmony_ci        return -1;
5817db96d56Sopenharmony_ci    }
5827db96d56Sopenharmony_ci
5837db96d56Sopenharmony_ci    v = (PyLongObject *)vv;
5847db96d56Sopenharmony_ci    i = Py_SIZE(v);
5857db96d56Sopenharmony_ci    switch (i) {
5867db96d56Sopenharmony_ci    case -1: return -(sdigit)v->ob_digit[0];
5877db96d56Sopenharmony_ci    case 0: return 0;
5887db96d56Sopenharmony_ci    case 1: return v->ob_digit[0];
5897db96d56Sopenharmony_ci    }
5907db96d56Sopenharmony_ci    sign = 1;
5917db96d56Sopenharmony_ci    x = 0;
5927db96d56Sopenharmony_ci    if (i < 0) {
5937db96d56Sopenharmony_ci        sign = -1;
5947db96d56Sopenharmony_ci        i = -(i);
5957db96d56Sopenharmony_ci    }
5967db96d56Sopenharmony_ci    while (--i >= 0) {
5977db96d56Sopenharmony_ci        prev = x;
5987db96d56Sopenharmony_ci        x = (x << PyLong_SHIFT) | v->ob_digit[i];
5997db96d56Sopenharmony_ci        if ((x >> PyLong_SHIFT) != prev)
6007db96d56Sopenharmony_ci            goto overflow;
6017db96d56Sopenharmony_ci    }
6027db96d56Sopenharmony_ci    /* Haven't lost any bits, but casting to a signed type requires
6037db96d56Sopenharmony_ci     * extra care (see comment above).
6047db96d56Sopenharmony_ci     */
6057db96d56Sopenharmony_ci    if (x <= (size_t)PY_SSIZE_T_MAX) {
6067db96d56Sopenharmony_ci        return (Py_ssize_t)x * sign;
6077db96d56Sopenharmony_ci    }
6087db96d56Sopenharmony_ci    else if (sign < 0 && x == PY_ABS_SSIZE_T_MIN) {
6097db96d56Sopenharmony_ci        return PY_SSIZE_T_MIN;
6107db96d56Sopenharmony_ci    }
6117db96d56Sopenharmony_ci    /* else overflow */
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ci  overflow:
6147db96d56Sopenharmony_ci    PyErr_SetString(PyExc_OverflowError,
6157db96d56Sopenharmony_ci                    "Python int too large to convert to C ssize_t");
6167db96d56Sopenharmony_ci    return -1;
6177db96d56Sopenharmony_ci}
6187db96d56Sopenharmony_ci
6197db96d56Sopenharmony_ci/* Get a C unsigned long int from an int object.
6207db96d56Sopenharmony_ci   Returns -1 and sets an error condition if overflow occurs. */
6217db96d56Sopenharmony_ci
6227db96d56Sopenharmony_ciunsigned long
6237db96d56Sopenharmony_ciPyLong_AsUnsignedLong(PyObject *vv)
6247db96d56Sopenharmony_ci{
6257db96d56Sopenharmony_ci    PyLongObject *v;
6267db96d56Sopenharmony_ci    unsigned long x, prev;
6277db96d56Sopenharmony_ci    Py_ssize_t i;
6287db96d56Sopenharmony_ci
6297db96d56Sopenharmony_ci    if (vv == NULL) {
6307db96d56Sopenharmony_ci        PyErr_BadInternalCall();
6317db96d56Sopenharmony_ci        return (unsigned long)-1;
6327db96d56Sopenharmony_ci    }
6337db96d56Sopenharmony_ci    if (!PyLong_Check(vv)) {
6347db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "an integer is required");
6357db96d56Sopenharmony_ci        return (unsigned long)-1;
6367db96d56Sopenharmony_ci    }
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ci    v = (PyLongObject *)vv;
6397db96d56Sopenharmony_ci    i = Py_SIZE(v);
6407db96d56Sopenharmony_ci    x = 0;
6417db96d56Sopenharmony_ci    if (i < 0) {
6427db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
6437db96d56Sopenharmony_ci                        "can't convert negative value to unsigned int");
6447db96d56Sopenharmony_ci        return (unsigned long) -1;
6457db96d56Sopenharmony_ci    }
6467db96d56Sopenharmony_ci    switch (i) {
6477db96d56Sopenharmony_ci    case 0: return 0;
6487db96d56Sopenharmony_ci    case 1: return v->ob_digit[0];
6497db96d56Sopenharmony_ci    }
6507db96d56Sopenharmony_ci    while (--i >= 0) {
6517db96d56Sopenharmony_ci        prev = x;
6527db96d56Sopenharmony_ci        x = (x << PyLong_SHIFT) | v->ob_digit[i];
6537db96d56Sopenharmony_ci        if ((x >> PyLong_SHIFT) != prev) {
6547db96d56Sopenharmony_ci            PyErr_SetString(PyExc_OverflowError,
6557db96d56Sopenharmony_ci                            "Python int too large to convert "
6567db96d56Sopenharmony_ci                            "to C unsigned long");
6577db96d56Sopenharmony_ci            return (unsigned long) -1;
6587db96d56Sopenharmony_ci        }
6597db96d56Sopenharmony_ci    }
6607db96d56Sopenharmony_ci    return x;
6617db96d56Sopenharmony_ci}
6627db96d56Sopenharmony_ci
6637db96d56Sopenharmony_ci/* Get a C size_t from an int object. Returns (size_t)-1 and sets
6647db96d56Sopenharmony_ci   an error condition if overflow occurs. */
6657db96d56Sopenharmony_ci
6667db96d56Sopenharmony_cisize_t
6677db96d56Sopenharmony_ciPyLong_AsSize_t(PyObject *vv)
6687db96d56Sopenharmony_ci{
6697db96d56Sopenharmony_ci    PyLongObject *v;
6707db96d56Sopenharmony_ci    size_t x, prev;
6717db96d56Sopenharmony_ci    Py_ssize_t i;
6727db96d56Sopenharmony_ci
6737db96d56Sopenharmony_ci    if (vv == NULL) {
6747db96d56Sopenharmony_ci        PyErr_BadInternalCall();
6757db96d56Sopenharmony_ci        return (size_t) -1;
6767db96d56Sopenharmony_ci    }
6777db96d56Sopenharmony_ci    if (!PyLong_Check(vv)) {
6787db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "an integer is required");
6797db96d56Sopenharmony_ci        return (size_t)-1;
6807db96d56Sopenharmony_ci    }
6817db96d56Sopenharmony_ci
6827db96d56Sopenharmony_ci    v = (PyLongObject *)vv;
6837db96d56Sopenharmony_ci    i = Py_SIZE(v);
6847db96d56Sopenharmony_ci    x = 0;
6857db96d56Sopenharmony_ci    if (i < 0) {
6867db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
6877db96d56Sopenharmony_ci                   "can't convert negative value to size_t");
6887db96d56Sopenharmony_ci        return (size_t) -1;
6897db96d56Sopenharmony_ci    }
6907db96d56Sopenharmony_ci    switch (i) {
6917db96d56Sopenharmony_ci    case 0: return 0;
6927db96d56Sopenharmony_ci    case 1: return v->ob_digit[0];
6937db96d56Sopenharmony_ci    }
6947db96d56Sopenharmony_ci    while (--i >= 0) {
6957db96d56Sopenharmony_ci        prev = x;
6967db96d56Sopenharmony_ci        x = (x << PyLong_SHIFT) | v->ob_digit[i];
6977db96d56Sopenharmony_ci        if ((x >> PyLong_SHIFT) != prev) {
6987db96d56Sopenharmony_ci            PyErr_SetString(PyExc_OverflowError,
6997db96d56Sopenharmony_ci                "Python int too large to convert to C size_t");
7007db96d56Sopenharmony_ci            return (size_t) -1;
7017db96d56Sopenharmony_ci        }
7027db96d56Sopenharmony_ci    }
7037db96d56Sopenharmony_ci    return x;
7047db96d56Sopenharmony_ci}
7057db96d56Sopenharmony_ci
7067db96d56Sopenharmony_ci/* Get a C unsigned long int from an int object, ignoring the high bits.
7077db96d56Sopenharmony_ci   Returns -1 and sets an error condition if an error occurs. */
7087db96d56Sopenharmony_ci
7097db96d56Sopenharmony_cistatic unsigned long
7107db96d56Sopenharmony_ci_PyLong_AsUnsignedLongMask(PyObject *vv)
7117db96d56Sopenharmony_ci{
7127db96d56Sopenharmony_ci    PyLongObject *v;
7137db96d56Sopenharmony_ci    unsigned long x;
7147db96d56Sopenharmony_ci    Py_ssize_t i;
7157db96d56Sopenharmony_ci    int sign;
7167db96d56Sopenharmony_ci
7177db96d56Sopenharmony_ci    if (vv == NULL || !PyLong_Check(vv)) {
7187db96d56Sopenharmony_ci        PyErr_BadInternalCall();
7197db96d56Sopenharmony_ci        return (unsigned long) -1;
7207db96d56Sopenharmony_ci    }
7217db96d56Sopenharmony_ci    v = (PyLongObject *)vv;
7227db96d56Sopenharmony_ci    i = Py_SIZE(v);
7237db96d56Sopenharmony_ci    switch (i) {
7247db96d56Sopenharmony_ci    case 0: return 0;
7257db96d56Sopenharmony_ci    case 1: return v->ob_digit[0];
7267db96d56Sopenharmony_ci    }
7277db96d56Sopenharmony_ci    sign = 1;
7287db96d56Sopenharmony_ci    x = 0;
7297db96d56Sopenharmony_ci    if (i < 0) {
7307db96d56Sopenharmony_ci        sign = -1;
7317db96d56Sopenharmony_ci        i = -i;
7327db96d56Sopenharmony_ci    }
7337db96d56Sopenharmony_ci    while (--i >= 0) {
7347db96d56Sopenharmony_ci        x = (x << PyLong_SHIFT) | v->ob_digit[i];
7357db96d56Sopenharmony_ci    }
7367db96d56Sopenharmony_ci    return x * sign;
7377db96d56Sopenharmony_ci}
7387db96d56Sopenharmony_ci
7397db96d56Sopenharmony_ciunsigned long
7407db96d56Sopenharmony_ciPyLong_AsUnsignedLongMask(PyObject *op)
7417db96d56Sopenharmony_ci{
7427db96d56Sopenharmony_ci    PyLongObject *lo;
7437db96d56Sopenharmony_ci    unsigned long val;
7447db96d56Sopenharmony_ci
7457db96d56Sopenharmony_ci    if (op == NULL) {
7467db96d56Sopenharmony_ci        PyErr_BadInternalCall();
7477db96d56Sopenharmony_ci        return (unsigned long)-1;
7487db96d56Sopenharmony_ci    }
7497db96d56Sopenharmony_ci
7507db96d56Sopenharmony_ci    if (PyLong_Check(op)) {
7517db96d56Sopenharmony_ci        return _PyLong_AsUnsignedLongMask(op);
7527db96d56Sopenharmony_ci    }
7537db96d56Sopenharmony_ci
7547db96d56Sopenharmony_ci    lo = (PyLongObject *)_PyNumber_Index(op);
7557db96d56Sopenharmony_ci    if (lo == NULL)
7567db96d56Sopenharmony_ci        return (unsigned long)-1;
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ci    val = _PyLong_AsUnsignedLongMask((PyObject *)lo);
7597db96d56Sopenharmony_ci    Py_DECREF(lo);
7607db96d56Sopenharmony_ci    return val;
7617db96d56Sopenharmony_ci}
7627db96d56Sopenharmony_ci
7637db96d56Sopenharmony_ciint
7647db96d56Sopenharmony_ci_PyLong_Sign(PyObject *vv)
7657db96d56Sopenharmony_ci{
7667db96d56Sopenharmony_ci    PyLongObject *v = (PyLongObject *)vv;
7677db96d56Sopenharmony_ci
7687db96d56Sopenharmony_ci    assert(v != NULL);
7697db96d56Sopenharmony_ci    assert(PyLong_Check(v));
7707db96d56Sopenharmony_ci
7717db96d56Sopenharmony_ci    return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1);
7727db96d56Sopenharmony_ci}
7737db96d56Sopenharmony_ci
7747db96d56Sopenharmony_cistatic int
7757db96d56Sopenharmony_cibit_length_digit(digit x)
7767db96d56Sopenharmony_ci{
7777db96d56Sopenharmony_ci    // digit can be larger than unsigned long, but only PyLong_SHIFT bits
7787db96d56Sopenharmony_ci    // of it will be ever used.
7797db96d56Sopenharmony_ci    static_assert(PyLong_SHIFT <= sizeof(unsigned long) * 8,
7807db96d56Sopenharmony_ci                  "digit is larger than unsigned long");
7817db96d56Sopenharmony_ci    return _Py_bit_length((unsigned long)x);
7827db96d56Sopenharmony_ci}
7837db96d56Sopenharmony_ci
7847db96d56Sopenharmony_cisize_t
7857db96d56Sopenharmony_ci_PyLong_NumBits(PyObject *vv)
7867db96d56Sopenharmony_ci{
7877db96d56Sopenharmony_ci    PyLongObject *v = (PyLongObject *)vv;
7887db96d56Sopenharmony_ci    size_t result = 0;
7897db96d56Sopenharmony_ci    Py_ssize_t ndigits;
7907db96d56Sopenharmony_ci    int msd_bits;
7917db96d56Sopenharmony_ci
7927db96d56Sopenharmony_ci    assert(v != NULL);
7937db96d56Sopenharmony_ci    assert(PyLong_Check(v));
7947db96d56Sopenharmony_ci    ndigits = Py_ABS(Py_SIZE(v));
7957db96d56Sopenharmony_ci    assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
7967db96d56Sopenharmony_ci    if (ndigits > 0) {
7977db96d56Sopenharmony_ci        digit msd = v->ob_digit[ndigits - 1];
7987db96d56Sopenharmony_ci        if ((size_t)(ndigits - 1) > SIZE_MAX / (size_t)PyLong_SHIFT)
7997db96d56Sopenharmony_ci            goto Overflow;
8007db96d56Sopenharmony_ci        result = (size_t)(ndigits - 1) * (size_t)PyLong_SHIFT;
8017db96d56Sopenharmony_ci        msd_bits = bit_length_digit(msd);
8027db96d56Sopenharmony_ci        if (SIZE_MAX - msd_bits < result)
8037db96d56Sopenharmony_ci            goto Overflow;
8047db96d56Sopenharmony_ci        result += msd_bits;
8057db96d56Sopenharmony_ci    }
8067db96d56Sopenharmony_ci    return result;
8077db96d56Sopenharmony_ci
8087db96d56Sopenharmony_ci  Overflow:
8097db96d56Sopenharmony_ci    PyErr_SetString(PyExc_OverflowError, "int has too many bits "
8107db96d56Sopenharmony_ci                    "to express in a platform size_t");
8117db96d56Sopenharmony_ci    return (size_t)-1;
8127db96d56Sopenharmony_ci}
8137db96d56Sopenharmony_ci
8147db96d56Sopenharmony_ciPyObject *
8157db96d56Sopenharmony_ci_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
8167db96d56Sopenharmony_ci                      int little_endian, int is_signed)
8177db96d56Sopenharmony_ci{
8187db96d56Sopenharmony_ci    const unsigned char* pstartbyte;    /* LSB of bytes */
8197db96d56Sopenharmony_ci    int incr;                           /* direction to move pstartbyte */
8207db96d56Sopenharmony_ci    const unsigned char* pendbyte;      /* MSB of bytes */
8217db96d56Sopenharmony_ci    size_t numsignificantbytes;         /* number of bytes that matter */
8227db96d56Sopenharmony_ci    Py_ssize_t ndigits;                 /* number of Python int digits */
8237db96d56Sopenharmony_ci    PyLongObject* v;                    /* result */
8247db96d56Sopenharmony_ci    Py_ssize_t idigit = 0;              /* next free index in v->ob_digit */
8257db96d56Sopenharmony_ci
8267db96d56Sopenharmony_ci    if (n == 0)
8277db96d56Sopenharmony_ci        return PyLong_FromLong(0L);
8287db96d56Sopenharmony_ci
8297db96d56Sopenharmony_ci    if (little_endian) {
8307db96d56Sopenharmony_ci        pstartbyte = bytes;
8317db96d56Sopenharmony_ci        pendbyte = bytes + n - 1;
8327db96d56Sopenharmony_ci        incr = 1;
8337db96d56Sopenharmony_ci    }
8347db96d56Sopenharmony_ci    else {
8357db96d56Sopenharmony_ci        pstartbyte = bytes + n - 1;
8367db96d56Sopenharmony_ci        pendbyte = bytes;
8377db96d56Sopenharmony_ci        incr = -1;
8387db96d56Sopenharmony_ci    }
8397db96d56Sopenharmony_ci
8407db96d56Sopenharmony_ci    if (is_signed)
8417db96d56Sopenharmony_ci        is_signed = *pendbyte >= 0x80;
8427db96d56Sopenharmony_ci
8437db96d56Sopenharmony_ci    /* Compute numsignificantbytes.  This consists of finding the most
8447db96d56Sopenharmony_ci       significant byte.  Leading 0 bytes are insignificant if the number
8457db96d56Sopenharmony_ci       is positive, and leading 0xff bytes if negative. */
8467db96d56Sopenharmony_ci    {
8477db96d56Sopenharmony_ci        size_t i;
8487db96d56Sopenharmony_ci        const unsigned char* p = pendbyte;
8497db96d56Sopenharmony_ci        const int pincr = -incr;  /* search MSB to LSB */
8507db96d56Sopenharmony_ci        const unsigned char insignificant = is_signed ? 0xff : 0x00;
8517db96d56Sopenharmony_ci
8527db96d56Sopenharmony_ci        for (i = 0; i < n; ++i, p += pincr) {
8537db96d56Sopenharmony_ci            if (*p != insignificant)
8547db96d56Sopenharmony_ci                break;
8557db96d56Sopenharmony_ci        }
8567db96d56Sopenharmony_ci        numsignificantbytes = n - i;
8577db96d56Sopenharmony_ci        /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
8587db96d56Sopenharmony_ci           actually has 2 significant bytes.  OTOH, 0xff0001 ==
8597db96d56Sopenharmony_ci           -0x00ffff, so we wouldn't *need* to bump it there; but we
8607db96d56Sopenharmony_ci           do for 0xffff = -0x0001.  To be safe without bothering to
8617db96d56Sopenharmony_ci           check every case, bump it regardless. */
8627db96d56Sopenharmony_ci        if (is_signed && numsignificantbytes < n)
8637db96d56Sopenharmony_ci            ++numsignificantbytes;
8647db96d56Sopenharmony_ci    }
8657db96d56Sopenharmony_ci
8667db96d56Sopenharmony_ci    /* How many Python int digits do we need?  We have
8677db96d56Sopenharmony_ci       8*numsignificantbytes bits, and each Python int digit has
8687db96d56Sopenharmony_ci       PyLong_SHIFT bits, so it's the ceiling of the quotient. */
8697db96d56Sopenharmony_ci    /* catch overflow before it happens */
8707db96d56Sopenharmony_ci    if (numsignificantbytes > (PY_SSIZE_T_MAX - PyLong_SHIFT) / 8) {
8717db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
8727db96d56Sopenharmony_ci                        "byte array too long to convert to int");
8737db96d56Sopenharmony_ci        return NULL;
8747db96d56Sopenharmony_ci    }
8757db96d56Sopenharmony_ci    ndigits = (numsignificantbytes * 8 + PyLong_SHIFT - 1) / PyLong_SHIFT;
8767db96d56Sopenharmony_ci    v = _PyLong_New(ndigits);
8777db96d56Sopenharmony_ci    if (v == NULL)
8787db96d56Sopenharmony_ci        return NULL;
8797db96d56Sopenharmony_ci
8807db96d56Sopenharmony_ci    /* Copy the bits over.  The tricky parts are computing 2's-comp on
8817db96d56Sopenharmony_ci       the fly for signed numbers, and dealing with the mismatch between
8827db96d56Sopenharmony_ci       8-bit bytes and (probably) 15-bit Python digits.*/
8837db96d56Sopenharmony_ci    {
8847db96d56Sopenharmony_ci        size_t i;
8857db96d56Sopenharmony_ci        twodigits carry = 1;                    /* for 2's-comp calculation */
8867db96d56Sopenharmony_ci        twodigits accum = 0;                    /* sliding register */
8877db96d56Sopenharmony_ci        unsigned int accumbits = 0;             /* number of bits in accum */
8887db96d56Sopenharmony_ci        const unsigned char* p = pstartbyte;
8897db96d56Sopenharmony_ci
8907db96d56Sopenharmony_ci        for (i = 0; i < numsignificantbytes; ++i, p += incr) {
8917db96d56Sopenharmony_ci            twodigits thisbyte = *p;
8927db96d56Sopenharmony_ci            /* Compute correction for 2's comp, if needed. */
8937db96d56Sopenharmony_ci            if (is_signed) {
8947db96d56Sopenharmony_ci                thisbyte = (0xff ^ thisbyte) + carry;
8957db96d56Sopenharmony_ci                carry = thisbyte >> 8;
8967db96d56Sopenharmony_ci                thisbyte &= 0xff;
8977db96d56Sopenharmony_ci            }
8987db96d56Sopenharmony_ci            /* Because we're going LSB to MSB, thisbyte is
8997db96d56Sopenharmony_ci               more significant than what's already in accum,
9007db96d56Sopenharmony_ci               so needs to be prepended to accum. */
9017db96d56Sopenharmony_ci            accum |= thisbyte << accumbits;
9027db96d56Sopenharmony_ci            accumbits += 8;
9037db96d56Sopenharmony_ci            if (accumbits >= PyLong_SHIFT) {
9047db96d56Sopenharmony_ci                /* There's enough to fill a Python digit. */
9057db96d56Sopenharmony_ci                assert(idigit < ndigits);
9067db96d56Sopenharmony_ci                v->ob_digit[idigit] = (digit)(accum & PyLong_MASK);
9077db96d56Sopenharmony_ci                ++idigit;
9087db96d56Sopenharmony_ci                accum >>= PyLong_SHIFT;
9097db96d56Sopenharmony_ci                accumbits -= PyLong_SHIFT;
9107db96d56Sopenharmony_ci                assert(accumbits < PyLong_SHIFT);
9117db96d56Sopenharmony_ci            }
9127db96d56Sopenharmony_ci        }
9137db96d56Sopenharmony_ci        assert(accumbits < PyLong_SHIFT);
9147db96d56Sopenharmony_ci        if (accumbits) {
9157db96d56Sopenharmony_ci            assert(idigit < ndigits);
9167db96d56Sopenharmony_ci            v->ob_digit[idigit] = (digit)accum;
9177db96d56Sopenharmony_ci            ++idigit;
9187db96d56Sopenharmony_ci        }
9197db96d56Sopenharmony_ci    }
9207db96d56Sopenharmony_ci
9217db96d56Sopenharmony_ci    Py_SET_SIZE(v, is_signed ? -idigit : idigit);
9227db96d56Sopenharmony_ci    return (PyObject *)maybe_small_long(long_normalize(v));
9237db96d56Sopenharmony_ci}
9247db96d56Sopenharmony_ci
9257db96d56Sopenharmony_ciint
9267db96d56Sopenharmony_ci_PyLong_AsByteArray(PyLongObject* v,
9277db96d56Sopenharmony_ci                    unsigned char* bytes, size_t n,
9287db96d56Sopenharmony_ci                    int little_endian, int is_signed)
9297db96d56Sopenharmony_ci{
9307db96d56Sopenharmony_ci    Py_ssize_t i;               /* index into v->ob_digit */
9317db96d56Sopenharmony_ci    Py_ssize_t ndigits;         /* |v->ob_size| */
9327db96d56Sopenharmony_ci    twodigits accum;            /* sliding register */
9337db96d56Sopenharmony_ci    unsigned int accumbits;     /* # bits in accum */
9347db96d56Sopenharmony_ci    int do_twos_comp;           /* store 2's-comp?  is_signed and v < 0 */
9357db96d56Sopenharmony_ci    digit carry;                /* for computing 2's-comp */
9367db96d56Sopenharmony_ci    size_t j;                   /* # bytes filled */
9377db96d56Sopenharmony_ci    unsigned char* p;           /* pointer to next byte in bytes */
9387db96d56Sopenharmony_ci    int pincr;                  /* direction to move p */
9397db96d56Sopenharmony_ci
9407db96d56Sopenharmony_ci    assert(v != NULL && PyLong_Check(v));
9417db96d56Sopenharmony_ci
9427db96d56Sopenharmony_ci    if (Py_SIZE(v) < 0) {
9437db96d56Sopenharmony_ci        ndigits = -(Py_SIZE(v));
9447db96d56Sopenharmony_ci        if (!is_signed) {
9457db96d56Sopenharmony_ci            PyErr_SetString(PyExc_OverflowError,
9467db96d56Sopenharmony_ci                            "can't convert negative int to unsigned");
9477db96d56Sopenharmony_ci            return -1;
9487db96d56Sopenharmony_ci        }
9497db96d56Sopenharmony_ci        do_twos_comp = 1;
9507db96d56Sopenharmony_ci    }
9517db96d56Sopenharmony_ci    else {
9527db96d56Sopenharmony_ci        ndigits = Py_SIZE(v);
9537db96d56Sopenharmony_ci        do_twos_comp = 0;
9547db96d56Sopenharmony_ci    }
9557db96d56Sopenharmony_ci
9567db96d56Sopenharmony_ci    if (little_endian) {
9577db96d56Sopenharmony_ci        p = bytes;
9587db96d56Sopenharmony_ci        pincr = 1;
9597db96d56Sopenharmony_ci    }
9607db96d56Sopenharmony_ci    else {
9617db96d56Sopenharmony_ci        p = bytes + n - 1;
9627db96d56Sopenharmony_ci        pincr = -1;
9637db96d56Sopenharmony_ci    }
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_ci    /* Copy over all the Python digits.
9667db96d56Sopenharmony_ci       It's crucial that every Python digit except for the MSD contribute
9677db96d56Sopenharmony_ci       exactly PyLong_SHIFT bits to the total, so first assert that the int is
9687db96d56Sopenharmony_ci       normalized. */
9697db96d56Sopenharmony_ci    assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
9707db96d56Sopenharmony_ci    j = 0;
9717db96d56Sopenharmony_ci    accum = 0;
9727db96d56Sopenharmony_ci    accumbits = 0;
9737db96d56Sopenharmony_ci    carry = do_twos_comp ? 1 : 0;
9747db96d56Sopenharmony_ci    for (i = 0; i < ndigits; ++i) {
9757db96d56Sopenharmony_ci        digit thisdigit = v->ob_digit[i];
9767db96d56Sopenharmony_ci        if (do_twos_comp) {
9777db96d56Sopenharmony_ci            thisdigit = (thisdigit ^ PyLong_MASK) + carry;
9787db96d56Sopenharmony_ci            carry = thisdigit >> PyLong_SHIFT;
9797db96d56Sopenharmony_ci            thisdigit &= PyLong_MASK;
9807db96d56Sopenharmony_ci        }
9817db96d56Sopenharmony_ci        /* Because we're going LSB to MSB, thisdigit is more
9827db96d56Sopenharmony_ci           significant than what's already in accum, so needs to be
9837db96d56Sopenharmony_ci           prepended to accum. */
9847db96d56Sopenharmony_ci        accum |= (twodigits)thisdigit << accumbits;
9857db96d56Sopenharmony_ci
9867db96d56Sopenharmony_ci        /* The most-significant digit may be (probably is) at least
9877db96d56Sopenharmony_ci           partly empty. */
9887db96d56Sopenharmony_ci        if (i == ndigits - 1) {
9897db96d56Sopenharmony_ci            /* Count # of sign bits -- they needn't be stored,
9907db96d56Sopenharmony_ci             * although for signed conversion we need later to
9917db96d56Sopenharmony_ci             * make sure at least one sign bit gets stored. */
9927db96d56Sopenharmony_ci            digit s = do_twos_comp ? thisdigit ^ PyLong_MASK : thisdigit;
9937db96d56Sopenharmony_ci            while (s != 0) {
9947db96d56Sopenharmony_ci                s >>= 1;
9957db96d56Sopenharmony_ci                accumbits++;
9967db96d56Sopenharmony_ci            }
9977db96d56Sopenharmony_ci        }
9987db96d56Sopenharmony_ci        else
9997db96d56Sopenharmony_ci            accumbits += PyLong_SHIFT;
10007db96d56Sopenharmony_ci
10017db96d56Sopenharmony_ci        /* Store as many bytes as possible. */
10027db96d56Sopenharmony_ci        while (accumbits >= 8) {
10037db96d56Sopenharmony_ci            if (j >= n)
10047db96d56Sopenharmony_ci                goto Overflow;
10057db96d56Sopenharmony_ci            ++j;
10067db96d56Sopenharmony_ci            *p = (unsigned char)(accum & 0xff);
10077db96d56Sopenharmony_ci            p += pincr;
10087db96d56Sopenharmony_ci            accumbits -= 8;
10097db96d56Sopenharmony_ci            accum >>= 8;
10107db96d56Sopenharmony_ci        }
10117db96d56Sopenharmony_ci    }
10127db96d56Sopenharmony_ci
10137db96d56Sopenharmony_ci    /* Store the straggler (if any). */
10147db96d56Sopenharmony_ci    assert(accumbits < 8);
10157db96d56Sopenharmony_ci    assert(carry == 0);  /* else do_twos_comp and *every* digit was 0 */
10167db96d56Sopenharmony_ci    if (accumbits > 0) {
10177db96d56Sopenharmony_ci        if (j >= n)
10187db96d56Sopenharmony_ci            goto Overflow;
10197db96d56Sopenharmony_ci        ++j;
10207db96d56Sopenharmony_ci        if (do_twos_comp) {
10217db96d56Sopenharmony_ci            /* Fill leading bits of the byte with sign bits
10227db96d56Sopenharmony_ci               (appropriately pretending that the int had an
10237db96d56Sopenharmony_ci               infinite supply of sign bits). */
10247db96d56Sopenharmony_ci            accum |= (~(twodigits)0) << accumbits;
10257db96d56Sopenharmony_ci        }
10267db96d56Sopenharmony_ci        *p = (unsigned char)(accum & 0xff);
10277db96d56Sopenharmony_ci        p += pincr;
10287db96d56Sopenharmony_ci    }
10297db96d56Sopenharmony_ci    else if (j == n && n > 0 && is_signed) {
10307db96d56Sopenharmony_ci        /* The main loop filled the byte array exactly, so the code
10317db96d56Sopenharmony_ci           just above didn't get to ensure there's a sign bit, and the
10327db96d56Sopenharmony_ci           loop below wouldn't add one either.  Make sure a sign bit
10337db96d56Sopenharmony_ci           exists. */
10347db96d56Sopenharmony_ci        unsigned char msb = *(p - pincr);
10357db96d56Sopenharmony_ci        int sign_bit_set = msb >= 0x80;
10367db96d56Sopenharmony_ci        assert(accumbits == 0);
10377db96d56Sopenharmony_ci        if (sign_bit_set == do_twos_comp)
10387db96d56Sopenharmony_ci            return 0;
10397db96d56Sopenharmony_ci        else
10407db96d56Sopenharmony_ci            goto Overflow;
10417db96d56Sopenharmony_ci    }
10427db96d56Sopenharmony_ci
10437db96d56Sopenharmony_ci    /* Fill remaining bytes with copies of the sign bit. */
10447db96d56Sopenharmony_ci    {
10457db96d56Sopenharmony_ci        unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
10467db96d56Sopenharmony_ci        for ( ; j < n; ++j, p += pincr)
10477db96d56Sopenharmony_ci            *p = signbyte;
10487db96d56Sopenharmony_ci    }
10497db96d56Sopenharmony_ci
10507db96d56Sopenharmony_ci    return 0;
10517db96d56Sopenharmony_ci
10527db96d56Sopenharmony_ci  Overflow:
10537db96d56Sopenharmony_ci    PyErr_SetString(PyExc_OverflowError, "int too big to convert");
10547db96d56Sopenharmony_ci    return -1;
10557db96d56Sopenharmony_ci
10567db96d56Sopenharmony_ci}
10577db96d56Sopenharmony_ci
10587db96d56Sopenharmony_ci/* Create a new int object from a C pointer */
10597db96d56Sopenharmony_ci
10607db96d56Sopenharmony_ciPyObject *
10617db96d56Sopenharmony_ciPyLong_FromVoidPtr(void *p)
10627db96d56Sopenharmony_ci{
10637db96d56Sopenharmony_ci#if SIZEOF_VOID_P <= SIZEOF_LONG
10647db96d56Sopenharmony_ci    return PyLong_FromUnsignedLong((unsigned long)(uintptr_t)p);
10657db96d56Sopenharmony_ci#else
10667db96d56Sopenharmony_ci
10677db96d56Sopenharmony_ci#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
10687db96d56Sopenharmony_ci#   error "PyLong_FromVoidPtr: sizeof(long long) < sizeof(void*)"
10697db96d56Sopenharmony_ci#endif
10707db96d56Sopenharmony_ci    return PyLong_FromUnsignedLongLong((unsigned long long)(uintptr_t)p);
10717db96d56Sopenharmony_ci#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
10727db96d56Sopenharmony_ci
10737db96d56Sopenharmony_ci}
10747db96d56Sopenharmony_ci
10757db96d56Sopenharmony_ci/* Get a C pointer from an int object. */
10767db96d56Sopenharmony_ci
10777db96d56Sopenharmony_civoid *
10787db96d56Sopenharmony_ciPyLong_AsVoidPtr(PyObject *vv)
10797db96d56Sopenharmony_ci{
10807db96d56Sopenharmony_ci#if SIZEOF_VOID_P <= SIZEOF_LONG
10817db96d56Sopenharmony_ci    long x;
10827db96d56Sopenharmony_ci
10837db96d56Sopenharmony_ci    if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
10847db96d56Sopenharmony_ci        x = PyLong_AsLong(vv);
10857db96d56Sopenharmony_ci    else
10867db96d56Sopenharmony_ci        x = PyLong_AsUnsignedLong(vv);
10877db96d56Sopenharmony_ci#else
10887db96d56Sopenharmony_ci
10897db96d56Sopenharmony_ci#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
10907db96d56Sopenharmony_ci#   error "PyLong_AsVoidPtr: sizeof(long long) < sizeof(void*)"
10917db96d56Sopenharmony_ci#endif
10927db96d56Sopenharmony_ci    long long x;
10937db96d56Sopenharmony_ci
10947db96d56Sopenharmony_ci    if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
10957db96d56Sopenharmony_ci        x = PyLong_AsLongLong(vv);
10967db96d56Sopenharmony_ci    else
10977db96d56Sopenharmony_ci        x = PyLong_AsUnsignedLongLong(vv);
10987db96d56Sopenharmony_ci
10997db96d56Sopenharmony_ci#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
11007db96d56Sopenharmony_ci
11017db96d56Sopenharmony_ci    if (x == -1 && PyErr_Occurred())
11027db96d56Sopenharmony_ci        return NULL;
11037db96d56Sopenharmony_ci    return (void *)x;
11047db96d56Sopenharmony_ci}
11057db96d56Sopenharmony_ci
11067db96d56Sopenharmony_ci/* Initial long long support by Chris Herborth (chrish@qnx.com), later
11077db96d56Sopenharmony_ci * rewritten to use the newer PyLong_{As,From}ByteArray API.
11087db96d56Sopenharmony_ci */
11097db96d56Sopenharmony_ci
11107db96d56Sopenharmony_ci#define PY_ABS_LLONG_MIN (0-(unsigned long long)LLONG_MIN)
11117db96d56Sopenharmony_ci
11127db96d56Sopenharmony_ci/* Create a new int object from a C long long int. */
11137db96d56Sopenharmony_ci
11147db96d56Sopenharmony_ciPyObject *
11157db96d56Sopenharmony_ciPyLong_FromLongLong(long long ival)
11167db96d56Sopenharmony_ci{
11177db96d56Sopenharmony_ci    PyLongObject *v;
11187db96d56Sopenharmony_ci    unsigned long long abs_ival, t;
11197db96d56Sopenharmony_ci    int ndigits;
11207db96d56Sopenharmony_ci
11217db96d56Sopenharmony_ci    /* Handle small and medium cases. */
11227db96d56Sopenharmony_ci    if (IS_SMALL_INT(ival)) {
11237db96d56Sopenharmony_ci        return get_small_int((sdigit)ival);
11247db96d56Sopenharmony_ci    }
11257db96d56Sopenharmony_ci    if (-(long long)PyLong_MASK <= ival && ival <= (long long)PyLong_MASK) {
11267db96d56Sopenharmony_ci        return _PyLong_FromMedium((sdigit)ival);
11277db96d56Sopenharmony_ci    }
11287db96d56Sopenharmony_ci
11297db96d56Sopenharmony_ci    /* Count digits (at least two - smaller cases were handled above). */
11307db96d56Sopenharmony_ci    abs_ival = ival < 0 ? 0U-(unsigned long long)ival : (unsigned long long)ival;
11317db96d56Sopenharmony_ci    /* Do shift in two steps to avoid possible undefined behavior. */
11327db96d56Sopenharmony_ci    t = abs_ival >> PyLong_SHIFT >> PyLong_SHIFT;
11337db96d56Sopenharmony_ci    ndigits = 2;
11347db96d56Sopenharmony_ci    while (t) {
11357db96d56Sopenharmony_ci        ++ndigits;
11367db96d56Sopenharmony_ci        t >>= PyLong_SHIFT;
11377db96d56Sopenharmony_ci    }
11387db96d56Sopenharmony_ci
11397db96d56Sopenharmony_ci    /* Construct output value. */
11407db96d56Sopenharmony_ci    v = _PyLong_New(ndigits);
11417db96d56Sopenharmony_ci    if (v != NULL) {
11427db96d56Sopenharmony_ci        digit *p = v->ob_digit;
11437db96d56Sopenharmony_ci        Py_SET_SIZE(v, ival < 0 ? -ndigits : ndigits);
11447db96d56Sopenharmony_ci        t = abs_ival;
11457db96d56Sopenharmony_ci        while (t) {
11467db96d56Sopenharmony_ci            *p++ = (digit)(t & PyLong_MASK);
11477db96d56Sopenharmony_ci            t >>= PyLong_SHIFT;
11487db96d56Sopenharmony_ci        }
11497db96d56Sopenharmony_ci    }
11507db96d56Sopenharmony_ci    return (PyObject *)v;
11517db96d56Sopenharmony_ci}
11527db96d56Sopenharmony_ci
11537db96d56Sopenharmony_ci/* Create a new int object from a C Py_ssize_t. */
11547db96d56Sopenharmony_ci
11557db96d56Sopenharmony_ciPyObject *
11567db96d56Sopenharmony_ciPyLong_FromSsize_t(Py_ssize_t ival)
11577db96d56Sopenharmony_ci{
11587db96d56Sopenharmony_ci    PyLongObject *v;
11597db96d56Sopenharmony_ci    size_t abs_ival;
11607db96d56Sopenharmony_ci    size_t t;  /* unsigned so >> doesn't propagate sign bit */
11617db96d56Sopenharmony_ci    int ndigits = 0;
11627db96d56Sopenharmony_ci    int negative = 0;
11637db96d56Sopenharmony_ci
11647db96d56Sopenharmony_ci    if (IS_SMALL_INT(ival)) {
11657db96d56Sopenharmony_ci        return get_small_int((sdigit)ival);
11667db96d56Sopenharmony_ci    }
11677db96d56Sopenharmony_ci
11687db96d56Sopenharmony_ci    if (ival < 0) {
11697db96d56Sopenharmony_ci        /* avoid signed overflow when ival = SIZE_T_MIN */
11707db96d56Sopenharmony_ci        abs_ival = (size_t)(-1-ival)+1;
11717db96d56Sopenharmony_ci        negative = 1;
11727db96d56Sopenharmony_ci    }
11737db96d56Sopenharmony_ci    else {
11747db96d56Sopenharmony_ci        abs_ival = (size_t)ival;
11757db96d56Sopenharmony_ci    }
11767db96d56Sopenharmony_ci
11777db96d56Sopenharmony_ci    /* Count the number of Python digits. */
11787db96d56Sopenharmony_ci    t = abs_ival;
11797db96d56Sopenharmony_ci    while (t) {
11807db96d56Sopenharmony_ci        ++ndigits;
11817db96d56Sopenharmony_ci        t >>= PyLong_SHIFT;
11827db96d56Sopenharmony_ci    }
11837db96d56Sopenharmony_ci    v = _PyLong_New(ndigits);
11847db96d56Sopenharmony_ci    if (v != NULL) {
11857db96d56Sopenharmony_ci        digit *p = v->ob_digit;
11867db96d56Sopenharmony_ci        Py_SET_SIZE(v, negative ? -ndigits : ndigits);
11877db96d56Sopenharmony_ci        t = abs_ival;
11887db96d56Sopenharmony_ci        while (t) {
11897db96d56Sopenharmony_ci            *p++ = (digit)(t & PyLong_MASK);
11907db96d56Sopenharmony_ci            t >>= PyLong_SHIFT;
11917db96d56Sopenharmony_ci        }
11927db96d56Sopenharmony_ci    }
11937db96d56Sopenharmony_ci    return (PyObject *)v;
11947db96d56Sopenharmony_ci}
11957db96d56Sopenharmony_ci
11967db96d56Sopenharmony_ci/* Get a C long long int from an int object or any object that has an
11977db96d56Sopenharmony_ci   __index__ method.  Return -1 and set an error if overflow occurs. */
11987db96d56Sopenharmony_ci
11997db96d56Sopenharmony_cilong long
12007db96d56Sopenharmony_ciPyLong_AsLongLong(PyObject *vv)
12017db96d56Sopenharmony_ci{
12027db96d56Sopenharmony_ci    PyLongObject *v;
12037db96d56Sopenharmony_ci    long long bytes;
12047db96d56Sopenharmony_ci    int res;
12057db96d56Sopenharmony_ci    int do_decref = 0; /* if PyNumber_Index was called */
12067db96d56Sopenharmony_ci
12077db96d56Sopenharmony_ci    if (vv == NULL) {
12087db96d56Sopenharmony_ci        PyErr_BadInternalCall();
12097db96d56Sopenharmony_ci        return -1;
12107db96d56Sopenharmony_ci    }
12117db96d56Sopenharmony_ci
12127db96d56Sopenharmony_ci    if (PyLong_Check(vv)) {
12137db96d56Sopenharmony_ci        v = (PyLongObject *)vv;
12147db96d56Sopenharmony_ci    }
12157db96d56Sopenharmony_ci    else {
12167db96d56Sopenharmony_ci        v = (PyLongObject *)_PyNumber_Index(vv);
12177db96d56Sopenharmony_ci        if (v == NULL)
12187db96d56Sopenharmony_ci            return -1;
12197db96d56Sopenharmony_ci        do_decref = 1;
12207db96d56Sopenharmony_ci    }
12217db96d56Sopenharmony_ci
12227db96d56Sopenharmony_ci    res = 0;
12237db96d56Sopenharmony_ci    switch(Py_SIZE(v)) {
12247db96d56Sopenharmony_ci    case -1:
12257db96d56Sopenharmony_ci        bytes = -(sdigit)v->ob_digit[0];
12267db96d56Sopenharmony_ci        break;
12277db96d56Sopenharmony_ci    case 0:
12287db96d56Sopenharmony_ci        bytes = 0;
12297db96d56Sopenharmony_ci        break;
12307db96d56Sopenharmony_ci    case 1:
12317db96d56Sopenharmony_ci        bytes = v->ob_digit[0];
12327db96d56Sopenharmony_ci        break;
12337db96d56Sopenharmony_ci    default:
12347db96d56Sopenharmony_ci        res = _PyLong_AsByteArray((PyLongObject *)v, (unsigned char *)&bytes,
12357db96d56Sopenharmony_ci                                  SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 1);
12367db96d56Sopenharmony_ci    }
12377db96d56Sopenharmony_ci    if (do_decref) {
12387db96d56Sopenharmony_ci        Py_DECREF(v);
12397db96d56Sopenharmony_ci    }
12407db96d56Sopenharmony_ci
12417db96d56Sopenharmony_ci    /* Plan 9 can't handle long long in ? : expressions */
12427db96d56Sopenharmony_ci    if (res < 0)
12437db96d56Sopenharmony_ci        return (long long)-1;
12447db96d56Sopenharmony_ci    else
12457db96d56Sopenharmony_ci        return bytes;
12467db96d56Sopenharmony_ci}
12477db96d56Sopenharmony_ci
12487db96d56Sopenharmony_ci/* Get a C unsigned long long int from an int object.
12497db96d56Sopenharmony_ci   Return -1 and set an error if overflow occurs. */
12507db96d56Sopenharmony_ci
12517db96d56Sopenharmony_ciunsigned long long
12527db96d56Sopenharmony_ciPyLong_AsUnsignedLongLong(PyObject *vv)
12537db96d56Sopenharmony_ci{
12547db96d56Sopenharmony_ci    PyLongObject *v;
12557db96d56Sopenharmony_ci    unsigned long long bytes;
12567db96d56Sopenharmony_ci    int res;
12577db96d56Sopenharmony_ci
12587db96d56Sopenharmony_ci    if (vv == NULL) {
12597db96d56Sopenharmony_ci        PyErr_BadInternalCall();
12607db96d56Sopenharmony_ci        return (unsigned long long)-1;
12617db96d56Sopenharmony_ci    }
12627db96d56Sopenharmony_ci    if (!PyLong_Check(vv)) {
12637db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "an integer is required");
12647db96d56Sopenharmony_ci        return (unsigned long long)-1;
12657db96d56Sopenharmony_ci    }
12667db96d56Sopenharmony_ci
12677db96d56Sopenharmony_ci    v = (PyLongObject*)vv;
12687db96d56Sopenharmony_ci    switch(Py_SIZE(v)) {
12697db96d56Sopenharmony_ci    case 0: return 0;
12707db96d56Sopenharmony_ci    case 1: return v->ob_digit[0];
12717db96d56Sopenharmony_ci    }
12727db96d56Sopenharmony_ci
12737db96d56Sopenharmony_ci    res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes,
12747db96d56Sopenharmony_ci                              SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 0);
12757db96d56Sopenharmony_ci
12767db96d56Sopenharmony_ci    /* Plan 9 can't handle long long in ? : expressions */
12777db96d56Sopenharmony_ci    if (res < 0)
12787db96d56Sopenharmony_ci        return (unsigned long long)res;
12797db96d56Sopenharmony_ci    else
12807db96d56Sopenharmony_ci        return bytes;
12817db96d56Sopenharmony_ci}
12827db96d56Sopenharmony_ci
12837db96d56Sopenharmony_ci/* Get a C unsigned long int from an int object, ignoring the high bits.
12847db96d56Sopenharmony_ci   Returns -1 and sets an error condition if an error occurs. */
12857db96d56Sopenharmony_ci
12867db96d56Sopenharmony_cistatic unsigned long long
12877db96d56Sopenharmony_ci_PyLong_AsUnsignedLongLongMask(PyObject *vv)
12887db96d56Sopenharmony_ci{
12897db96d56Sopenharmony_ci    PyLongObject *v;
12907db96d56Sopenharmony_ci    unsigned long long x;
12917db96d56Sopenharmony_ci    Py_ssize_t i;
12927db96d56Sopenharmony_ci    int sign;
12937db96d56Sopenharmony_ci
12947db96d56Sopenharmony_ci    if (vv == NULL || !PyLong_Check(vv)) {
12957db96d56Sopenharmony_ci        PyErr_BadInternalCall();
12967db96d56Sopenharmony_ci        return (unsigned long long) -1;
12977db96d56Sopenharmony_ci    }
12987db96d56Sopenharmony_ci    v = (PyLongObject *)vv;
12997db96d56Sopenharmony_ci    switch(Py_SIZE(v)) {
13007db96d56Sopenharmony_ci    case 0: return 0;
13017db96d56Sopenharmony_ci    case 1: return v->ob_digit[0];
13027db96d56Sopenharmony_ci    }
13037db96d56Sopenharmony_ci    i = Py_SIZE(v);
13047db96d56Sopenharmony_ci    sign = 1;
13057db96d56Sopenharmony_ci    x = 0;
13067db96d56Sopenharmony_ci    if (i < 0) {
13077db96d56Sopenharmony_ci        sign = -1;
13087db96d56Sopenharmony_ci        i = -i;
13097db96d56Sopenharmony_ci    }
13107db96d56Sopenharmony_ci    while (--i >= 0) {
13117db96d56Sopenharmony_ci        x = (x << PyLong_SHIFT) | v->ob_digit[i];
13127db96d56Sopenharmony_ci    }
13137db96d56Sopenharmony_ci    return x * sign;
13147db96d56Sopenharmony_ci}
13157db96d56Sopenharmony_ci
13167db96d56Sopenharmony_ciunsigned long long
13177db96d56Sopenharmony_ciPyLong_AsUnsignedLongLongMask(PyObject *op)
13187db96d56Sopenharmony_ci{
13197db96d56Sopenharmony_ci    PyLongObject *lo;
13207db96d56Sopenharmony_ci    unsigned long long val;
13217db96d56Sopenharmony_ci
13227db96d56Sopenharmony_ci    if (op == NULL) {
13237db96d56Sopenharmony_ci        PyErr_BadInternalCall();
13247db96d56Sopenharmony_ci        return (unsigned long long)-1;
13257db96d56Sopenharmony_ci    }
13267db96d56Sopenharmony_ci
13277db96d56Sopenharmony_ci    if (PyLong_Check(op)) {
13287db96d56Sopenharmony_ci        return _PyLong_AsUnsignedLongLongMask(op);
13297db96d56Sopenharmony_ci    }
13307db96d56Sopenharmony_ci
13317db96d56Sopenharmony_ci    lo = (PyLongObject *)_PyNumber_Index(op);
13327db96d56Sopenharmony_ci    if (lo == NULL)
13337db96d56Sopenharmony_ci        return (unsigned long long)-1;
13347db96d56Sopenharmony_ci
13357db96d56Sopenharmony_ci    val = _PyLong_AsUnsignedLongLongMask((PyObject *)lo);
13367db96d56Sopenharmony_ci    Py_DECREF(lo);
13377db96d56Sopenharmony_ci    return val;
13387db96d56Sopenharmony_ci}
13397db96d56Sopenharmony_ci
13407db96d56Sopenharmony_ci/* Get a C long long int from an int object or any object that has an
13417db96d56Sopenharmony_ci   __index__ method.
13427db96d56Sopenharmony_ci
13437db96d56Sopenharmony_ci   On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
13447db96d56Sopenharmony_ci   the result.  Otherwise *overflow is 0.
13457db96d56Sopenharmony_ci
13467db96d56Sopenharmony_ci   For other errors (e.g., TypeError), return -1 and set an error condition.
13477db96d56Sopenharmony_ci   In this case *overflow will be 0.
13487db96d56Sopenharmony_ci*/
13497db96d56Sopenharmony_ci
13507db96d56Sopenharmony_cilong long
13517db96d56Sopenharmony_ciPyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
13527db96d56Sopenharmony_ci{
13537db96d56Sopenharmony_ci    /* This version by Tim Peters */
13547db96d56Sopenharmony_ci    PyLongObject *v;
13557db96d56Sopenharmony_ci    unsigned long long x, prev;
13567db96d56Sopenharmony_ci    long long res;
13577db96d56Sopenharmony_ci    Py_ssize_t i;
13587db96d56Sopenharmony_ci    int sign;
13597db96d56Sopenharmony_ci    int do_decref = 0; /* if PyNumber_Index was called */
13607db96d56Sopenharmony_ci
13617db96d56Sopenharmony_ci    *overflow = 0;
13627db96d56Sopenharmony_ci    if (vv == NULL) {
13637db96d56Sopenharmony_ci        PyErr_BadInternalCall();
13647db96d56Sopenharmony_ci        return -1;
13657db96d56Sopenharmony_ci    }
13667db96d56Sopenharmony_ci
13677db96d56Sopenharmony_ci    if (PyLong_Check(vv)) {
13687db96d56Sopenharmony_ci        v = (PyLongObject *)vv;
13697db96d56Sopenharmony_ci    }
13707db96d56Sopenharmony_ci    else {
13717db96d56Sopenharmony_ci        v = (PyLongObject *)_PyNumber_Index(vv);
13727db96d56Sopenharmony_ci        if (v == NULL)
13737db96d56Sopenharmony_ci            return -1;
13747db96d56Sopenharmony_ci        do_decref = 1;
13757db96d56Sopenharmony_ci    }
13767db96d56Sopenharmony_ci
13777db96d56Sopenharmony_ci    res = -1;
13787db96d56Sopenharmony_ci    i = Py_SIZE(v);
13797db96d56Sopenharmony_ci
13807db96d56Sopenharmony_ci    switch (i) {
13817db96d56Sopenharmony_ci    case -1:
13827db96d56Sopenharmony_ci        res = -(sdigit)v->ob_digit[0];
13837db96d56Sopenharmony_ci        break;
13847db96d56Sopenharmony_ci    case 0:
13857db96d56Sopenharmony_ci        res = 0;
13867db96d56Sopenharmony_ci        break;
13877db96d56Sopenharmony_ci    case 1:
13887db96d56Sopenharmony_ci        res = v->ob_digit[0];
13897db96d56Sopenharmony_ci        break;
13907db96d56Sopenharmony_ci    default:
13917db96d56Sopenharmony_ci        sign = 1;
13927db96d56Sopenharmony_ci        x = 0;
13937db96d56Sopenharmony_ci        if (i < 0) {
13947db96d56Sopenharmony_ci            sign = -1;
13957db96d56Sopenharmony_ci            i = -(i);
13967db96d56Sopenharmony_ci        }
13977db96d56Sopenharmony_ci        while (--i >= 0) {
13987db96d56Sopenharmony_ci            prev = x;
13997db96d56Sopenharmony_ci            x = (x << PyLong_SHIFT) + v->ob_digit[i];
14007db96d56Sopenharmony_ci            if ((x >> PyLong_SHIFT) != prev) {
14017db96d56Sopenharmony_ci                *overflow = sign;
14027db96d56Sopenharmony_ci                goto exit;
14037db96d56Sopenharmony_ci            }
14047db96d56Sopenharmony_ci        }
14057db96d56Sopenharmony_ci        /* Haven't lost any bits, but casting to long requires extra
14067db96d56Sopenharmony_ci         * care (see comment above).
14077db96d56Sopenharmony_ci         */
14087db96d56Sopenharmony_ci        if (x <= (unsigned long long)LLONG_MAX) {
14097db96d56Sopenharmony_ci            res = (long long)x * sign;
14107db96d56Sopenharmony_ci        }
14117db96d56Sopenharmony_ci        else if (sign < 0 && x == PY_ABS_LLONG_MIN) {
14127db96d56Sopenharmony_ci            res = LLONG_MIN;
14137db96d56Sopenharmony_ci        }
14147db96d56Sopenharmony_ci        else {
14157db96d56Sopenharmony_ci            *overflow = sign;
14167db96d56Sopenharmony_ci            /* res is already set to -1 */
14177db96d56Sopenharmony_ci        }
14187db96d56Sopenharmony_ci    }
14197db96d56Sopenharmony_ci  exit:
14207db96d56Sopenharmony_ci    if (do_decref) {
14217db96d56Sopenharmony_ci        Py_DECREF(v);
14227db96d56Sopenharmony_ci    }
14237db96d56Sopenharmony_ci    return res;
14247db96d56Sopenharmony_ci}
14257db96d56Sopenharmony_ci
14267db96d56Sopenharmony_ciint
14277db96d56Sopenharmony_ci_PyLong_UnsignedShort_Converter(PyObject *obj, void *ptr)
14287db96d56Sopenharmony_ci{
14297db96d56Sopenharmony_ci    unsigned long uval;
14307db96d56Sopenharmony_ci
14317db96d56Sopenharmony_ci    if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
14327db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "value must be positive");
14337db96d56Sopenharmony_ci        return 0;
14347db96d56Sopenharmony_ci    }
14357db96d56Sopenharmony_ci    uval = PyLong_AsUnsignedLong(obj);
14367db96d56Sopenharmony_ci    if (uval == (unsigned long)-1 && PyErr_Occurred())
14377db96d56Sopenharmony_ci        return 0;
14387db96d56Sopenharmony_ci    if (uval > USHRT_MAX) {
14397db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
14407db96d56Sopenharmony_ci                        "Python int too large for C unsigned short");
14417db96d56Sopenharmony_ci        return 0;
14427db96d56Sopenharmony_ci    }
14437db96d56Sopenharmony_ci
14447db96d56Sopenharmony_ci    *(unsigned short *)ptr = Py_SAFE_DOWNCAST(uval, unsigned long, unsigned short);
14457db96d56Sopenharmony_ci    return 1;
14467db96d56Sopenharmony_ci}
14477db96d56Sopenharmony_ci
14487db96d56Sopenharmony_ciint
14497db96d56Sopenharmony_ci_PyLong_UnsignedInt_Converter(PyObject *obj, void *ptr)
14507db96d56Sopenharmony_ci{
14517db96d56Sopenharmony_ci    unsigned long uval;
14527db96d56Sopenharmony_ci
14537db96d56Sopenharmony_ci    if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
14547db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "value must be positive");
14557db96d56Sopenharmony_ci        return 0;
14567db96d56Sopenharmony_ci    }
14577db96d56Sopenharmony_ci    uval = PyLong_AsUnsignedLong(obj);
14587db96d56Sopenharmony_ci    if (uval == (unsigned long)-1 && PyErr_Occurred())
14597db96d56Sopenharmony_ci        return 0;
14607db96d56Sopenharmony_ci    if (uval > UINT_MAX) {
14617db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
14627db96d56Sopenharmony_ci                        "Python int too large for C unsigned int");
14637db96d56Sopenharmony_ci        return 0;
14647db96d56Sopenharmony_ci    }
14657db96d56Sopenharmony_ci
14667db96d56Sopenharmony_ci    *(unsigned int *)ptr = Py_SAFE_DOWNCAST(uval, unsigned long, unsigned int);
14677db96d56Sopenharmony_ci    return 1;
14687db96d56Sopenharmony_ci}
14697db96d56Sopenharmony_ci
14707db96d56Sopenharmony_ciint
14717db96d56Sopenharmony_ci_PyLong_UnsignedLong_Converter(PyObject *obj, void *ptr)
14727db96d56Sopenharmony_ci{
14737db96d56Sopenharmony_ci    unsigned long uval;
14747db96d56Sopenharmony_ci
14757db96d56Sopenharmony_ci    if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
14767db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "value must be positive");
14777db96d56Sopenharmony_ci        return 0;
14787db96d56Sopenharmony_ci    }
14797db96d56Sopenharmony_ci    uval = PyLong_AsUnsignedLong(obj);
14807db96d56Sopenharmony_ci    if (uval == (unsigned long)-1 && PyErr_Occurred())
14817db96d56Sopenharmony_ci        return 0;
14827db96d56Sopenharmony_ci
14837db96d56Sopenharmony_ci    *(unsigned long *)ptr = uval;
14847db96d56Sopenharmony_ci    return 1;
14857db96d56Sopenharmony_ci}
14867db96d56Sopenharmony_ci
14877db96d56Sopenharmony_ciint
14887db96d56Sopenharmony_ci_PyLong_UnsignedLongLong_Converter(PyObject *obj, void *ptr)
14897db96d56Sopenharmony_ci{
14907db96d56Sopenharmony_ci    unsigned long long uval;
14917db96d56Sopenharmony_ci
14927db96d56Sopenharmony_ci    if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
14937db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "value must be positive");
14947db96d56Sopenharmony_ci        return 0;
14957db96d56Sopenharmony_ci    }
14967db96d56Sopenharmony_ci    uval = PyLong_AsUnsignedLongLong(obj);
14977db96d56Sopenharmony_ci    if (uval == (unsigned long long)-1 && PyErr_Occurred())
14987db96d56Sopenharmony_ci        return 0;
14997db96d56Sopenharmony_ci
15007db96d56Sopenharmony_ci    *(unsigned long long *)ptr = uval;
15017db96d56Sopenharmony_ci    return 1;
15027db96d56Sopenharmony_ci}
15037db96d56Sopenharmony_ci
15047db96d56Sopenharmony_ciint
15057db96d56Sopenharmony_ci_PyLong_Size_t_Converter(PyObject *obj, void *ptr)
15067db96d56Sopenharmony_ci{
15077db96d56Sopenharmony_ci    size_t uval;
15087db96d56Sopenharmony_ci
15097db96d56Sopenharmony_ci    if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
15107db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "value must be positive");
15117db96d56Sopenharmony_ci        return 0;
15127db96d56Sopenharmony_ci    }
15137db96d56Sopenharmony_ci    uval = PyLong_AsSize_t(obj);
15147db96d56Sopenharmony_ci    if (uval == (size_t)-1 && PyErr_Occurred())
15157db96d56Sopenharmony_ci        return 0;
15167db96d56Sopenharmony_ci
15177db96d56Sopenharmony_ci    *(size_t *)ptr = uval;
15187db96d56Sopenharmony_ci    return 1;
15197db96d56Sopenharmony_ci}
15207db96d56Sopenharmony_ci
15217db96d56Sopenharmony_ci
15227db96d56Sopenharmony_ci#define CHECK_BINOP(v,w)                                \
15237db96d56Sopenharmony_ci    do {                                                \
15247db96d56Sopenharmony_ci        if (!PyLong_Check(v) || !PyLong_Check(w))       \
15257db96d56Sopenharmony_ci            Py_RETURN_NOTIMPLEMENTED;                   \
15267db96d56Sopenharmony_ci    } while(0)
15277db96d56Sopenharmony_ci
15287db96d56Sopenharmony_ci/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required.  x[0:n]
15297db96d56Sopenharmony_ci * is modified in place, by adding y to it.  Carries are propagated as far as
15307db96d56Sopenharmony_ci * x[m-1], and the remaining carry (0 or 1) is returned.
15317db96d56Sopenharmony_ci */
15327db96d56Sopenharmony_cistatic digit
15337db96d56Sopenharmony_civ_iadd(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
15347db96d56Sopenharmony_ci{
15357db96d56Sopenharmony_ci    Py_ssize_t i;
15367db96d56Sopenharmony_ci    digit carry = 0;
15377db96d56Sopenharmony_ci
15387db96d56Sopenharmony_ci    assert(m >= n);
15397db96d56Sopenharmony_ci    for (i = 0; i < n; ++i) {
15407db96d56Sopenharmony_ci        carry += x[i] + y[i];
15417db96d56Sopenharmony_ci        x[i] = carry & PyLong_MASK;
15427db96d56Sopenharmony_ci        carry >>= PyLong_SHIFT;
15437db96d56Sopenharmony_ci        assert((carry & 1) == carry);
15447db96d56Sopenharmony_ci    }
15457db96d56Sopenharmony_ci    for (; carry && i < m; ++i) {
15467db96d56Sopenharmony_ci        carry += x[i];
15477db96d56Sopenharmony_ci        x[i] = carry & PyLong_MASK;
15487db96d56Sopenharmony_ci        carry >>= PyLong_SHIFT;
15497db96d56Sopenharmony_ci        assert((carry & 1) == carry);
15507db96d56Sopenharmony_ci    }
15517db96d56Sopenharmony_ci    return carry;
15527db96d56Sopenharmony_ci}
15537db96d56Sopenharmony_ci
15547db96d56Sopenharmony_ci/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required.  x[0:n]
15557db96d56Sopenharmony_ci * is modified in place, by subtracting y from it.  Borrows are propagated as
15567db96d56Sopenharmony_ci * far as x[m-1], and the remaining borrow (0 or 1) is returned.
15577db96d56Sopenharmony_ci */
15587db96d56Sopenharmony_cistatic digit
15597db96d56Sopenharmony_civ_isub(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
15607db96d56Sopenharmony_ci{
15617db96d56Sopenharmony_ci    Py_ssize_t i;
15627db96d56Sopenharmony_ci    digit borrow = 0;
15637db96d56Sopenharmony_ci
15647db96d56Sopenharmony_ci    assert(m >= n);
15657db96d56Sopenharmony_ci    for (i = 0; i < n; ++i) {
15667db96d56Sopenharmony_ci        borrow = x[i] - y[i] - borrow;
15677db96d56Sopenharmony_ci        x[i] = borrow & PyLong_MASK;
15687db96d56Sopenharmony_ci        borrow >>= PyLong_SHIFT;
15697db96d56Sopenharmony_ci        borrow &= 1;            /* keep only 1 sign bit */
15707db96d56Sopenharmony_ci    }
15717db96d56Sopenharmony_ci    for (; borrow && i < m; ++i) {
15727db96d56Sopenharmony_ci        borrow = x[i] - borrow;
15737db96d56Sopenharmony_ci        x[i] = borrow & PyLong_MASK;
15747db96d56Sopenharmony_ci        borrow >>= PyLong_SHIFT;
15757db96d56Sopenharmony_ci        borrow &= 1;
15767db96d56Sopenharmony_ci    }
15777db96d56Sopenharmony_ci    return borrow;
15787db96d56Sopenharmony_ci}
15797db96d56Sopenharmony_ci
15807db96d56Sopenharmony_ci/* Shift digit vector a[0:m] d bits left, with 0 <= d < PyLong_SHIFT.  Put
15817db96d56Sopenharmony_ci * result in z[0:m], and return the d bits shifted out of the top.
15827db96d56Sopenharmony_ci */
15837db96d56Sopenharmony_cistatic digit
15847db96d56Sopenharmony_civ_lshift(digit *z, digit *a, Py_ssize_t m, int d)
15857db96d56Sopenharmony_ci{
15867db96d56Sopenharmony_ci    Py_ssize_t i;
15877db96d56Sopenharmony_ci    digit carry = 0;
15887db96d56Sopenharmony_ci
15897db96d56Sopenharmony_ci    assert(0 <= d && d < PyLong_SHIFT);
15907db96d56Sopenharmony_ci    for (i=0; i < m; i++) {
15917db96d56Sopenharmony_ci        twodigits acc = (twodigits)a[i] << d | carry;
15927db96d56Sopenharmony_ci        z[i] = (digit)acc & PyLong_MASK;
15937db96d56Sopenharmony_ci        carry = (digit)(acc >> PyLong_SHIFT);
15947db96d56Sopenharmony_ci    }
15957db96d56Sopenharmony_ci    return carry;
15967db96d56Sopenharmony_ci}
15977db96d56Sopenharmony_ci
15987db96d56Sopenharmony_ci/* Shift digit vector a[0:m] d bits right, with 0 <= d < PyLong_SHIFT.  Put
15997db96d56Sopenharmony_ci * result in z[0:m], and return the d bits shifted out of the bottom.
16007db96d56Sopenharmony_ci */
16017db96d56Sopenharmony_cistatic digit
16027db96d56Sopenharmony_civ_rshift(digit *z, digit *a, Py_ssize_t m, int d)
16037db96d56Sopenharmony_ci{
16047db96d56Sopenharmony_ci    Py_ssize_t i;
16057db96d56Sopenharmony_ci    digit carry = 0;
16067db96d56Sopenharmony_ci    digit mask = ((digit)1 << d) - 1U;
16077db96d56Sopenharmony_ci
16087db96d56Sopenharmony_ci    assert(0 <= d && d < PyLong_SHIFT);
16097db96d56Sopenharmony_ci    for (i=m; i-- > 0;) {
16107db96d56Sopenharmony_ci        twodigits acc = (twodigits)carry << PyLong_SHIFT | a[i];
16117db96d56Sopenharmony_ci        carry = (digit)acc & mask;
16127db96d56Sopenharmony_ci        z[i] = (digit)(acc >> d);
16137db96d56Sopenharmony_ci    }
16147db96d56Sopenharmony_ci    return carry;
16157db96d56Sopenharmony_ci}
16167db96d56Sopenharmony_ci
16177db96d56Sopenharmony_ci/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
16187db96d56Sopenharmony_ci   in pout, and returning the remainder.  pin and pout point at the LSD.
16197db96d56Sopenharmony_ci   It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
16207db96d56Sopenharmony_ci   _PyLong_Format, but that should be done with great care since ints are
16217db96d56Sopenharmony_ci   immutable.
16227db96d56Sopenharmony_ci
16237db96d56Sopenharmony_ci   This version of the code can be 20% faster than the pre-2022 version
16247db96d56Sopenharmony_ci   on todays compilers on architectures like amd64.  It evolved from Mark
16257db96d56Sopenharmony_ci   Dickinson observing that a 128:64 divide instruction was always being
16267db96d56Sopenharmony_ci   generated by the compiler despite us working with 30-bit digit values.
16277db96d56Sopenharmony_ci   See the thread for full context:
16287db96d56Sopenharmony_ci
16297db96d56Sopenharmony_ci     https://mail.python.org/archives/list/python-dev@python.org/thread/ZICIMX5VFCX4IOFH5NUPVHCUJCQ4Q7QM/#NEUNFZU3TQU4CPTYZNF3WCN7DOJBBTK5
16307db96d56Sopenharmony_ci
16317db96d56Sopenharmony_ci   If you ever want to change this code, pay attention to performance using
16327db96d56Sopenharmony_ci   different compilers, optimization levels, and cpu architectures. Beware of
16337db96d56Sopenharmony_ci   PGO/FDO builds doing value specialization such as a fast path for //10. :)
16347db96d56Sopenharmony_ci
16357db96d56Sopenharmony_ci   Verify that 17 isn't specialized and this works as a quick test:
16367db96d56Sopenharmony_ci     python -m timeit -s 'x = 10**1000; r=x//10; assert r == 10**999, r' 'x//17'
16377db96d56Sopenharmony_ci*/
16387db96d56Sopenharmony_cistatic digit
16397db96d56Sopenharmony_ciinplace_divrem1(digit *pout, digit *pin, Py_ssize_t size, digit n)
16407db96d56Sopenharmony_ci{
16417db96d56Sopenharmony_ci    digit remainder = 0;
16427db96d56Sopenharmony_ci
16437db96d56Sopenharmony_ci    assert(n > 0 && n <= PyLong_MASK);
16447db96d56Sopenharmony_ci    while (--size >= 0) {
16457db96d56Sopenharmony_ci        twodigits dividend;
16467db96d56Sopenharmony_ci        dividend = ((twodigits)remainder << PyLong_SHIFT) | pin[size];
16477db96d56Sopenharmony_ci        digit quotient;
16487db96d56Sopenharmony_ci        quotient = (digit)(dividend / n);
16497db96d56Sopenharmony_ci        remainder = dividend % n;
16507db96d56Sopenharmony_ci        pout[size] = quotient;
16517db96d56Sopenharmony_ci    }
16527db96d56Sopenharmony_ci    return remainder;
16537db96d56Sopenharmony_ci}
16547db96d56Sopenharmony_ci
16557db96d56Sopenharmony_ci
16567db96d56Sopenharmony_ci/* Divide an integer by a digit, returning both the quotient
16577db96d56Sopenharmony_ci   (as function result) and the remainder (through *prem).
16587db96d56Sopenharmony_ci   The sign of a is ignored; n should not be zero. */
16597db96d56Sopenharmony_ci
16607db96d56Sopenharmony_cistatic PyLongObject *
16617db96d56Sopenharmony_cidivrem1(PyLongObject *a, digit n, digit *prem)
16627db96d56Sopenharmony_ci{
16637db96d56Sopenharmony_ci    const Py_ssize_t size = Py_ABS(Py_SIZE(a));
16647db96d56Sopenharmony_ci    PyLongObject *z;
16657db96d56Sopenharmony_ci
16667db96d56Sopenharmony_ci    assert(n > 0 && n <= PyLong_MASK);
16677db96d56Sopenharmony_ci    z = _PyLong_New(size);
16687db96d56Sopenharmony_ci    if (z == NULL)
16697db96d56Sopenharmony_ci        return NULL;
16707db96d56Sopenharmony_ci    *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
16717db96d56Sopenharmony_ci    return long_normalize(z);
16727db96d56Sopenharmony_ci}
16737db96d56Sopenharmony_ci
16747db96d56Sopenharmony_ci/* Remainder of long pin, w/ size digits, by non-zero digit n,
16757db96d56Sopenharmony_ci   returning the remainder. pin points at the LSD. */
16767db96d56Sopenharmony_ci
16777db96d56Sopenharmony_cistatic digit
16787db96d56Sopenharmony_ciinplace_rem1(digit *pin, Py_ssize_t size, digit n)
16797db96d56Sopenharmony_ci{
16807db96d56Sopenharmony_ci    twodigits rem = 0;
16817db96d56Sopenharmony_ci
16827db96d56Sopenharmony_ci    assert(n > 0 && n <= PyLong_MASK);
16837db96d56Sopenharmony_ci    while (--size >= 0)
16847db96d56Sopenharmony_ci        rem = ((rem << PyLong_SHIFT) | pin[size]) % n;
16857db96d56Sopenharmony_ci    return (digit)rem;
16867db96d56Sopenharmony_ci}
16877db96d56Sopenharmony_ci
16887db96d56Sopenharmony_ci/* Get the remainder of an integer divided by a digit, returning
16897db96d56Sopenharmony_ci   the remainder as the result of the function. The sign of a is
16907db96d56Sopenharmony_ci   ignored; n should not be zero. */
16917db96d56Sopenharmony_ci
16927db96d56Sopenharmony_cistatic PyLongObject *
16937db96d56Sopenharmony_cirem1(PyLongObject *a, digit n)
16947db96d56Sopenharmony_ci{
16957db96d56Sopenharmony_ci    const Py_ssize_t size = Py_ABS(Py_SIZE(a));
16967db96d56Sopenharmony_ci
16977db96d56Sopenharmony_ci    assert(n > 0 && n <= PyLong_MASK);
16987db96d56Sopenharmony_ci    return (PyLongObject *)PyLong_FromLong(
16997db96d56Sopenharmony_ci        (long)inplace_rem1(a->ob_digit, size, n)
17007db96d56Sopenharmony_ci    );
17017db96d56Sopenharmony_ci}
17027db96d56Sopenharmony_ci
17037db96d56Sopenharmony_ci/* Convert an integer to a base 10 string.  Returns a new non-shared
17047db96d56Sopenharmony_ci   string.  (Return value is non-shared so that callers can modify the
17057db96d56Sopenharmony_ci   returned value if necessary.) */
17067db96d56Sopenharmony_ci
17077db96d56Sopenharmony_cistatic int
17087db96d56Sopenharmony_cilong_to_decimal_string_internal(PyObject *aa,
17097db96d56Sopenharmony_ci                                PyObject **p_output,
17107db96d56Sopenharmony_ci                                _PyUnicodeWriter *writer,
17117db96d56Sopenharmony_ci                                _PyBytesWriter *bytes_writer,
17127db96d56Sopenharmony_ci                                char **bytes_str)
17137db96d56Sopenharmony_ci{
17147db96d56Sopenharmony_ci    PyLongObject *scratch, *a;
17157db96d56Sopenharmony_ci    PyObject *str = NULL;
17167db96d56Sopenharmony_ci    Py_ssize_t size, strlen, size_a, i, j;
17177db96d56Sopenharmony_ci    digit *pout, *pin, rem, tenpow;
17187db96d56Sopenharmony_ci    int negative;
17197db96d56Sopenharmony_ci    int d;
17207db96d56Sopenharmony_ci    enum PyUnicode_Kind kind;
17217db96d56Sopenharmony_ci
17227db96d56Sopenharmony_ci    a = (PyLongObject *)aa;
17237db96d56Sopenharmony_ci    if (a == NULL || !PyLong_Check(a)) {
17247db96d56Sopenharmony_ci        PyErr_BadInternalCall();
17257db96d56Sopenharmony_ci        return -1;
17267db96d56Sopenharmony_ci    }
17277db96d56Sopenharmony_ci    size_a = Py_ABS(Py_SIZE(a));
17287db96d56Sopenharmony_ci    negative = Py_SIZE(a) < 0;
17297db96d56Sopenharmony_ci
17307db96d56Sopenharmony_ci    /* quick and dirty pre-check for overflowing the decimal digit limit,
17317db96d56Sopenharmony_ci       based on the inequality 10/3 >= log2(10)
17327db96d56Sopenharmony_ci
17337db96d56Sopenharmony_ci       explanation in https://github.com/python/cpython/pull/96537
17347db96d56Sopenharmony_ci    */
17357db96d56Sopenharmony_ci    if (size_a >= 10 * _PY_LONG_MAX_STR_DIGITS_THRESHOLD
17367db96d56Sopenharmony_ci                  / (3 * PyLong_SHIFT) + 2) {
17377db96d56Sopenharmony_ci        PyInterpreterState *interp = _PyInterpreterState_GET();
17387db96d56Sopenharmony_ci        int max_str_digits = interp->int_max_str_digits;
17397db96d56Sopenharmony_ci        if ((max_str_digits > 0) &&
17407db96d56Sopenharmony_ci            (max_str_digits / (3 * PyLong_SHIFT) <= (size_a - 11) / 10)) {
17417db96d56Sopenharmony_ci            PyErr_Format(PyExc_ValueError, _MAX_STR_DIGITS_ERROR_FMT_TO_STR,
17427db96d56Sopenharmony_ci                         max_str_digits);
17437db96d56Sopenharmony_ci            return -1;
17447db96d56Sopenharmony_ci        }
17457db96d56Sopenharmony_ci    }
17467db96d56Sopenharmony_ci
17477db96d56Sopenharmony_ci    /* quick and dirty upper bound for the number of digits
17487db96d56Sopenharmony_ci       required to express a in base _PyLong_DECIMAL_BASE:
17497db96d56Sopenharmony_ci
17507db96d56Sopenharmony_ci         #digits = 1 + floor(log2(a) / log2(_PyLong_DECIMAL_BASE))
17517db96d56Sopenharmony_ci
17527db96d56Sopenharmony_ci       But log2(a) < size_a * PyLong_SHIFT, and
17537db96d56Sopenharmony_ci       log2(_PyLong_DECIMAL_BASE) = log2(10) * _PyLong_DECIMAL_SHIFT
17547db96d56Sopenharmony_ci                                  > 3.3 * _PyLong_DECIMAL_SHIFT
17557db96d56Sopenharmony_ci
17567db96d56Sopenharmony_ci         size_a * PyLong_SHIFT / (3.3 * _PyLong_DECIMAL_SHIFT) =
17577db96d56Sopenharmony_ci             size_a + size_a / d < size_a + size_a / floor(d),
17587db96d56Sopenharmony_ci       where d = (3.3 * _PyLong_DECIMAL_SHIFT) /
17597db96d56Sopenharmony_ci                 (PyLong_SHIFT - 3.3 * _PyLong_DECIMAL_SHIFT)
17607db96d56Sopenharmony_ci    */
17617db96d56Sopenharmony_ci    d = (33 * _PyLong_DECIMAL_SHIFT) /
17627db96d56Sopenharmony_ci        (10 * PyLong_SHIFT - 33 * _PyLong_DECIMAL_SHIFT);
17637db96d56Sopenharmony_ci    assert(size_a < PY_SSIZE_T_MAX/2);
17647db96d56Sopenharmony_ci    size = 1 + size_a + size_a / d;
17657db96d56Sopenharmony_ci    scratch = _PyLong_New(size);
17667db96d56Sopenharmony_ci    if (scratch == NULL)
17677db96d56Sopenharmony_ci        return -1;
17687db96d56Sopenharmony_ci
17697db96d56Sopenharmony_ci    /* convert array of base _PyLong_BASE digits in pin to an array of
17707db96d56Sopenharmony_ci       base _PyLong_DECIMAL_BASE digits in pout, following Knuth (TAOCP,
17717db96d56Sopenharmony_ci       Volume 2 (3rd edn), section 4.4, Method 1b). */
17727db96d56Sopenharmony_ci    pin = a->ob_digit;
17737db96d56Sopenharmony_ci    pout = scratch->ob_digit;
17747db96d56Sopenharmony_ci    size = 0;
17757db96d56Sopenharmony_ci    for (i = size_a; --i >= 0; ) {
17767db96d56Sopenharmony_ci        digit hi = pin[i];
17777db96d56Sopenharmony_ci        for (j = 0; j < size; j++) {
17787db96d56Sopenharmony_ci            twodigits z = (twodigits)pout[j] << PyLong_SHIFT | hi;
17797db96d56Sopenharmony_ci            hi = (digit)(z / _PyLong_DECIMAL_BASE);
17807db96d56Sopenharmony_ci            pout[j] = (digit)(z - (twodigits)hi *
17817db96d56Sopenharmony_ci                              _PyLong_DECIMAL_BASE);
17827db96d56Sopenharmony_ci        }
17837db96d56Sopenharmony_ci        while (hi) {
17847db96d56Sopenharmony_ci            pout[size++] = hi % _PyLong_DECIMAL_BASE;
17857db96d56Sopenharmony_ci            hi /= _PyLong_DECIMAL_BASE;
17867db96d56Sopenharmony_ci        }
17877db96d56Sopenharmony_ci        /* check for keyboard interrupt */
17887db96d56Sopenharmony_ci        SIGCHECK({
17897db96d56Sopenharmony_ci                Py_DECREF(scratch);
17907db96d56Sopenharmony_ci                return -1;
17917db96d56Sopenharmony_ci            });
17927db96d56Sopenharmony_ci    }
17937db96d56Sopenharmony_ci    /* pout should have at least one digit, so that the case when a = 0
17947db96d56Sopenharmony_ci       works correctly */
17957db96d56Sopenharmony_ci    if (size == 0)
17967db96d56Sopenharmony_ci        pout[size++] = 0;
17977db96d56Sopenharmony_ci
17987db96d56Sopenharmony_ci    /* calculate exact length of output string, and allocate */
17997db96d56Sopenharmony_ci    strlen = negative + 1 + (size - 1) * _PyLong_DECIMAL_SHIFT;
18007db96d56Sopenharmony_ci    tenpow = 10;
18017db96d56Sopenharmony_ci    rem = pout[size-1];
18027db96d56Sopenharmony_ci    while (rem >= tenpow) {
18037db96d56Sopenharmony_ci        tenpow *= 10;
18047db96d56Sopenharmony_ci        strlen++;
18057db96d56Sopenharmony_ci    }
18067db96d56Sopenharmony_ci    if (strlen > _PY_LONG_MAX_STR_DIGITS_THRESHOLD) {
18077db96d56Sopenharmony_ci        PyInterpreterState *interp = _PyInterpreterState_GET();
18087db96d56Sopenharmony_ci        int max_str_digits = interp->int_max_str_digits;
18097db96d56Sopenharmony_ci        Py_ssize_t strlen_nosign = strlen - negative;
18107db96d56Sopenharmony_ci        if ((max_str_digits > 0) && (strlen_nosign > max_str_digits)) {
18117db96d56Sopenharmony_ci            Py_DECREF(scratch);
18127db96d56Sopenharmony_ci            PyErr_Format(PyExc_ValueError, _MAX_STR_DIGITS_ERROR_FMT_TO_STR,
18137db96d56Sopenharmony_ci                         max_str_digits);
18147db96d56Sopenharmony_ci            return -1;
18157db96d56Sopenharmony_ci        }
18167db96d56Sopenharmony_ci    }
18177db96d56Sopenharmony_ci    if (writer) {
18187db96d56Sopenharmony_ci        if (_PyUnicodeWriter_Prepare(writer, strlen, '9') == -1) {
18197db96d56Sopenharmony_ci            Py_DECREF(scratch);
18207db96d56Sopenharmony_ci            return -1;
18217db96d56Sopenharmony_ci        }
18227db96d56Sopenharmony_ci        kind = writer->kind;
18237db96d56Sopenharmony_ci    }
18247db96d56Sopenharmony_ci    else if (bytes_writer) {
18257db96d56Sopenharmony_ci        *bytes_str = _PyBytesWriter_Prepare(bytes_writer, *bytes_str, strlen);
18267db96d56Sopenharmony_ci        if (*bytes_str == NULL) {
18277db96d56Sopenharmony_ci            Py_DECREF(scratch);
18287db96d56Sopenharmony_ci            return -1;
18297db96d56Sopenharmony_ci        }
18307db96d56Sopenharmony_ci    }
18317db96d56Sopenharmony_ci    else {
18327db96d56Sopenharmony_ci        str = PyUnicode_New(strlen, '9');
18337db96d56Sopenharmony_ci        if (str == NULL) {
18347db96d56Sopenharmony_ci            Py_DECREF(scratch);
18357db96d56Sopenharmony_ci            return -1;
18367db96d56Sopenharmony_ci        }
18377db96d56Sopenharmony_ci        kind = PyUnicode_KIND(str);
18387db96d56Sopenharmony_ci    }
18397db96d56Sopenharmony_ci
18407db96d56Sopenharmony_ci#define WRITE_DIGITS(p)                                               \
18417db96d56Sopenharmony_ci    do {                                                              \
18427db96d56Sopenharmony_ci        /* pout[0] through pout[size-2] contribute exactly            \
18437db96d56Sopenharmony_ci           _PyLong_DECIMAL_SHIFT digits each */                       \
18447db96d56Sopenharmony_ci        for (i=0; i < size - 1; i++) {                                \
18457db96d56Sopenharmony_ci            rem = pout[i];                                            \
18467db96d56Sopenharmony_ci            for (j = 0; j < _PyLong_DECIMAL_SHIFT; j++) {             \
18477db96d56Sopenharmony_ci                *--p = '0' + rem % 10;                                \
18487db96d56Sopenharmony_ci                rem /= 10;                                            \
18497db96d56Sopenharmony_ci            }                                                         \
18507db96d56Sopenharmony_ci        }                                                             \
18517db96d56Sopenharmony_ci        /* pout[size-1]: always produce at least one decimal digit */ \
18527db96d56Sopenharmony_ci        rem = pout[i];                                                \
18537db96d56Sopenharmony_ci        do {                                                          \
18547db96d56Sopenharmony_ci            *--p = '0' + rem % 10;                                    \
18557db96d56Sopenharmony_ci            rem /= 10;                                                \
18567db96d56Sopenharmony_ci        } while (rem != 0);                                           \
18577db96d56Sopenharmony_ci                                                                      \
18587db96d56Sopenharmony_ci        /* and sign */                                                \
18597db96d56Sopenharmony_ci        if (negative)                                                 \
18607db96d56Sopenharmony_ci            *--p = '-';                                               \
18617db96d56Sopenharmony_ci    } while (0)
18627db96d56Sopenharmony_ci
18637db96d56Sopenharmony_ci#define WRITE_UNICODE_DIGITS(TYPE)                                    \
18647db96d56Sopenharmony_ci    do {                                                              \
18657db96d56Sopenharmony_ci        if (writer)                                                   \
18667db96d56Sopenharmony_ci            p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + strlen; \
18677db96d56Sopenharmony_ci        else                                                          \
18687db96d56Sopenharmony_ci            p = (TYPE*)PyUnicode_DATA(str) + strlen;                  \
18697db96d56Sopenharmony_ci                                                                      \
18707db96d56Sopenharmony_ci        WRITE_DIGITS(p);                                              \
18717db96d56Sopenharmony_ci                                                                      \
18727db96d56Sopenharmony_ci        /* check we've counted correctly */                           \
18737db96d56Sopenharmony_ci        if (writer)                                                   \
18747db96d56Sopenharmony_ci            assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \
18757db96d56Sopenharmony_ci        else                                                          \
18767db96d56Sopenharmony_ci            assert(p == (TYPE*)PyUnicode_DATA(str));                  \
18777db96d56Sopenharmony_ci    } while (0)
18787db96d56Sopenharmony_ci
18797db96d56Sopenharmony_ci    /* fill the string right-to-left */
18807db96d56Sopenharmony_ci    if (bytes_writer) {
18817db96d56Sopenharmony_ci        char *p = *bytes_str + strlen;
18827db96d56Sopenharmony_ci        WRITE_DIGITS(p);
18837db96d56Sopenharmony_ci        assert(p == *bytes_str);
18847db96d56Sopenharmony_ci    }
18857db96d56Sopenharmony_ci    else if (kind == PyUnicode_1BYTE_KIND) {
18867db96d56Sopenharmony_ci        Py_UCS1 *p;
18877db96d56Sopenharmony_ci        WRITE_UNICODE_DIGITS(Py_UCS1);
18887db96d56Sopenharmony_ci    }
18897db96d56Sopenharmony_ci    else if (kind == PyUnicode_2BYTE_KIND) {
18907db96d56Sopenharmony_ci        Py_UCS2 *p;
18917db96d56Sopenharmony_ci        WRITE_UNICODE_DIGITS(Py_UCS2);
18927db96d56Sopenharmony_ci    }
18937db96d56Sopenharmony_ci    else {
18947db96d56Sopenharmony_ci        Py_UCS4 *p;
18957db96d56Sopenharmony_ci        assert (kind == PyUnicode_4BYTE_KIND);
18967db96d56Sopenharmony_ci        WRITE_UNICODE_DIGITS(Py_UCS4);
18977db96d56Sopenharmony_ci    }
18987db96d56Sopenharmony_ci#undef WRITE_DIGITS
18997db96d56Sopenharmony_ci#undef WRITE_UNICODE_DIGITS
19007db96d56Sopenharmony_ci
19017db96d56Sopenharmony_ci    _Py_DECREF_INT(scratch);
19027db96d56Sopenharmony_ci    if (writer) {
19037db96d56Sopenharmony_ci        writer->pos += strlen;
19047db96d56Sopenharmony_ci    }
19057db96d56Sopenharmony_ci    else if (bytes_writer) {
19067db96d56Sopenharmony_ci        (*bytes_str) += strlen;
19077db96d56Sopenharmony_ci    }
19087db96d56Sopenharmony_ci    else {
19097db96d56Sopenharmony_ci        assert(_PyUnicode_CheckConsistency(str, 1));
19107db96d56Sopenharmony_ci        *p_output = (PyObject *)str;
19117db96d56Sopenharmony_ci    }
19127db96d56Sopenharmony_ci    return 0;
19137db96d56Sopenharmony_ci}
19147db96d56Sopenharmony_ci
19157db96d56Sopenharmony_cistatic PyObject *
19167db96d56Sopenharmony_cilong_to_decimal_string(PyObject *aa)
19177db96d56Sopenharmony_ci{
19187db96d56Sopenharmony_ci    PyObject *v;
19197db96d56Sopenharmony_ci    if (long_to_decimal_string_internal(aa, &v, NULL, NULL, NULL) == -1)
19207db96d56Sopenharmony_ci        return NULL;
19217db96d56Sopenharmony_ci    return v;
19227db96d56Sopenharmony_ci}
19237db96d56Sopenharmony_ci
19247db96d56Sopenharmony_ci/* Convert an int object to a string, using a given conversion base,
19257db96d56Sopenharmony_ci   which should be one of 2, 8 or 16.  Return a string object.
19267db96d56Sopenharmony_ci   If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'
19277db96d56Sopenharmony_ci   if alternate is nonzero. */
19287db96d56Sopenharmony_ci
19297db96d56Sopenharmony_cistatic int
19307db96d56Sopenharmony_cilong_format_binary(PyObject *aa, int base, int alternate,
19317db96d56Sopenharmony_ci                   PyObject **p_output, _PyUnicodeWriter *writer,
19327db96d56Sopenharmony_ci                   _PyBytesWriter *bytes_writer, char **bytes_str)
19337db96d56Sopenharmony_ci{
19347db96d56Sopenharmony_ci    PyLongObject *a = (PyLongObject *)aa;
19357db96d56Sopenharmony_ci    PyObject *v = NULL;
19367db96d56Sopenharmony_ci    Py_ssize_t sz;
19377db96d56Sopenharmony_ci    Py_ssize_t size_a;
19387db96d56Sopenharmony_ci    enum PyUnicode_Kind kind;
19397db96d56Sopenharmony_ci    int negative;
19407db96d56Sopenharmony_ci    int bits;
19417db96d56Sopenharmony_ci
19427db96d56Sopenharmony_ci    assert(base == 2 || base == 8 || base == 16);
19437db96d56Sopenharmony_ci    if (a == NULL || !PyLong_Check(a)) {
19447db96d56Sopenharmony_ci        PyErr_BadInternalCall();
19457db96d56Sopenharmony_ci        return -1;
19467db96d56Sopenharmony_ci    }
19477db96d56Sopenharmony_ci    size_a = Py_ABS(Py_SIZE(a));
19487db96d56Sopenharmony_ci    negative = Py_SIZE(a) < 0;
19497db96d56Sopenharmony_ci
19507db96d56Sopenharmony_ci    /* Compute a rough upper bound for the length of the string */
19517db96d56Sopenharmony_ci    switch (base) {
19527db96d56Sopenharmony_ci    case 16:
19537db96d56Sopenharmony_ci        bits = 4;
19547db96d56Sopenharmony_ci        break;
19557db96d56Sopenharmony_ci    case 8:
19567db96d56Sopenharmony_ci        bits = 3;
19577db96d56Sopenharmony_ci        break;
19587db96d56Sopenharmony_ci    case 2:
19597db96d56Sopenharmony_ci        bits = 1;
19607db96d56Sopenharmony_ci        break;
19617db96d56Sopenharmony_ci    default:
19627db96d56Sopenharmony_ci        Py_UNREACHABLE();
19637db96d56Sopenharmony_ci    }
19647db96d56Sopenharmony_ci
19657db96d56Sopenharmony_ci    /* Compute exact length 'sz' of output string. */
19667db96d56Sopenharmony_ci    if (size_a == 0) {
19677db96d56Sopenharmony_ci        sz = 1;
19687db96d56Sopenharmony_ci    }
19697db96d56Sopenharmony_ci    else {
19707db96d56Sopenharmony_ci        Py_ssize_t size_a_in_bits;
19717db96d56Sopenharmony_ci        /* Ensure overflow doesn't occur during computation of sz. */
19727db96d56Sopenharmony_ci        if (size_a > (PY_SSIZE_T_MAX - 3) / PyLong_SHIFT) {
19737db96d56Sopenharmony_ci            PyErr_SetString(PyExc_OverflowError,
19747db96d56Sopenharmony_ci                            "int too large to format");
19757db96d56Sopenharmony_ci            return -1;
19767db96d56Sopenharmony_ci        }
19777db96d56Sopenharmony_ci        size_a_in_bits = (size_a - 1) * PyLong_SHIFT +
19787db96d56Sopenharmony_ci                         bit_length_digit(a->ob_digit[size_a - 1]);
19797db96d56Sopenharmony_ci        /* Allow 1 character for a '-' sign. */
19807db96d56Sopenharmony_ci        sz = negative + (size_a_in_bits + (bits - 1)) / bits;
19817db96d56Sopenharmony_ci    }
19827db96d56Sopenharmony_ci    if (alternate) {
19837db96d56Sopenharmony_ci        /* 2 characters for prefix  */
19847db96d56Sopenharmony_ci        sz += 2;
19857db96d56Sopenharmony_ci    }
19867db96d56Sopenharmony_ci
19877db96d56Sopenharmony_ci    if (writer) {
19887db96d56Sopenharmony_ci        if (_PyUnicodeWriter_Prepare(writer, sz, 'x') == -1)
19897db96d56Sopenharmony_ci            return -1;
19907db96d56Sopenharmony_ci        kind = writer->kind;
19917db96d56Sopenharmony_ci    }
19927db96d56Sopenharmony_ci    else if (bytes_writer) {
19937db96d56Sopenharmony_ci        *bytes_str = _PyBytesWriter_Prepare(bytes_writer, *bytes_str, sz);
19947db96d56Sopenharmony_ci        if (*bytes_str == NULL)
19957db96d56Sopenharmony_ci            return -1;
19967db96d56Sopenharmony_ci    }
19977db96d56Sopenharmony_ci    else {
19987db96d56Sopenharmony_ci        v = PyUnicode_New(sz, 'x');
19997db96d56Sopenharmony_ci        if (v == NULL)
20007db96d56Sopenharmony_ci            return -1;
20017db96d56Sopenharmony_ci        kind = PyUnicode_KIND(v);
20027db96d56Sopenharmony_ci    }
20037db96d56Sopenharmony_ci
20047db96d56Sopenharmony_ci#define WRITE_DIGITS(p)                                                 \
20057db96d56Sopenharmony_ci    do {                                                                \
20067db96d56Sopenharmony_ci        if (size_a == 0) {                                              \
20077db96d56Sopenharmony_ci            *--p = '0';                                                 \
20087db96d56Sopenharmony_ci        }                                                               \
20097db96d56Sopenharmony_ci        else {                                                          \
20107db96d56Sopenharmony_ci            /* JRH: special case for power-of-2 bases */                \
20117db96d56Sopenharmony_ci            twodigits accum = 0;                                        \
20127db96d56Sopenharmony_ci            int accumbits = 0;   /* # of bits in accum */               \
20137db96d56Sopenharmony_ci            Py_ssize_t i;                                               \
20147db96d56Sopenharmony_ci            for (i = 0; i < size_a; ++i) {                              \
20157db96d56Sopenharmony_ci                accum |= (twodigits)a->ob_digit[i] << accumbits;        \
20167db96d56Sopenharmony_ci                accumbits += PyLong_SHIFT;                              \
20177db96d56Sopenharmony_ci                assert(accumbits >= bits);                              \
20187db96d56Sopenharmony_ci                do {                                                    \
20197db96d56Sopenharmony_ci                    char cdigit;                                        \
20207db96d56Sopenharmony_ci                    cdigit = (char)(accum & (base - 1));                \
20217db96d56Sopenharmony_ci                    cdigit += (cdigit < 10) ? '0' : 'a'-10;             \
20227db96d56Sopenharmony_ci                    *--p = cdigit;                                      \
20237db96d56Sopenharmony_ci                    accumbits -= bits;                                  \
20247db96d56Sopenharmony_ci                    accum >>= bits;                                     \
20257db96d56Sopenharmony_ci                } while (i < size_a-1 ? accumbits >= bits : accum > 0); \
20267db96d56Sopenharmony_ci            }                                                           \
20277db96d56Sopenharmony_ci        }                                                               \
20287db96d56Sopenharmony_ci                                                                        \
20297db96d56Sopenharmony_ci        if (alternate) {                                                \
20307db96d56Sopenharmony_ci            if (base == 16)                                             \
20317db96d56Sopenharmony_ci                *--p = 'x';                                             \
20327db96d56Sopenharmony_ci            else if (base == 8)                                         \
20337db96d56Sopenharmony_ci                *--p = 'o';                                             \
20347db96d56Sopenharmony_ci            else /* (base == 2) */                                      \
20357db96d56Sopenharmony_ci                *--p = 'b';                                             \
20367db96d56Sopenharmony_ci            *--p = '0';                                                 \
20377db96d56Sopenharmony_ci        }                                                               \
20387db96d56Sopenharmony_ci        if (negative)                                                   \
20397db96d56Sopenharmony_ci            *--p = '-';                                                 \
20407db96d56Sopenharmony_ci    } while (0)
20417db96d56Sopenharmony_ci
20427db96d56Sopenharmony_ci#define WRITE_UNICODE_DIGITS(TYPE)                                      \
20437db96d56Sopenharmony_ci    do {                                                                \
20447db96d56Sopenharmony_ci        if (writer)                                                     \
20457db96d56Sopenharmony_ci            p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + sz; \
20467db96d56Sopenharmony_ci        else                                                            \
20477db96d56Sopenharmony_ci            p = (TYPE*)PyUnicode_DATA(v) + sz;                          \
20487db96d56Sopenharmony_ci                                                                        \
20497db96d56Sopenharmony_ci        WRITE_DIGITS(p);                                                \
20507db96d56Sopenharmony_ci                                                                        \
20517db96d56Sopenharmony_ci        if (writer)                                                     \
20527db96d56Sopenharmony_ci            assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \
20537db96d56Sopenharmony_ci        else                                                            \
20547db96d56Sopenharmony_ci            assert(p == (TYPE*)PyUnicode_DATA(v));                      \
20557db96d56Sopenharmony_ci    } while (0)
20567db96d56Sopenharmony_ci
20577db96d56Sopenharmony_ci    if (bytes_writer) {
20587db96d56Sopenharmony_ci        char *p = *bytes_str + sz;
20597db96d56Sopenharmony_ci        WRITE_DIGITS(p);
20607db96d56Sopenharmony_ci        assert(p == *bytes_str);
20617db96d56Sopenharmony_ci    }
20627db96d56Sopenharmony_ci    else if (kind == PyUnicode_1BYTE_KIND) {
20637db96d56Sopenharmony_ci        Py_UCS1 *p;
20647db96d56Sopenharmony_ci        WRITE_UNICODE_DIGITS(Py_UCS1);
20657db96d56Sopenharmony_ci    }
20667db96d56Sopenharmony_ci    else if (kind == PyUnicode_2BYTE_KIND) {
20677db96d56Sopenharmony_ci        Py_UCS2 *p;
20687db96d56Sopenharmony_ci        WRITE_UNICODE_DIGITS(Py_UCS2);
20697db96d56Sopenharmony_ci    }
20707db96d56Sopenharmony_ci    else {
20717db96d56Sopenharmony_ci        Py_UCS4 *p;
20727db96d56Sopenharmony_ci        assert (kind == PyUnicode_4BYTE_KIND);
20737db96d56Sopenharmony_ci        WRITE_UNICODE_DIGITS(Py_UCS4);
20747db96d56Sopenharmony_ci    }
20757db96d56Sopenharmony_ci#undef WRITE_DIGITS
20767db96d56Sopenharmony_ci#undef WRITE_UNICODE_DIGITS
20777db96d56Sopenharmony_ci
20787db96d56Sopenharmony_ci    if (writer) {
20797db96d56Sopenharmony_ci        writer->pos += sz;
20807db96d56Sopenharmony_ci    }
20817db96d56Sopenharmony_ci    else if (bytes_writer) {
20827db96d56Sopenharmony_ci        (*bytes_str) += sz;
20837db96d56Sopenharmony_ci    }
20847db96d56Sopenharmony_ci    else {
20857db96d56Sopenharmony_ci        assert(_PyUnicode_CheckConsistency(v, 1));
20867db96d56Sopenharmony_ci        *p_output = v;
20877db96d56Sopenharmony_ci    }
20887db96d56Sopenharmony_ci    return 0;
20897db96d56Sopenharmony_ci}
20907db96d56Sopenharmony_ci
20917db96d56Sopenharmony_ciPyObject *
20927db96d56Sopenharmony_ci_PyLong_Format(PyObject *obj, int base)
20937db96d56Sopenharmony_ci{
20947db96d56Sopenharmony_ci    PyObject *str;
20957db96d56Sopenharmony_ci    int err;
20967db96d56Sopenharmony_ci    if (base == 10)
20977db96d56Sopenharmony_ci        err = long_to_decimal_string_internal(obj, &str, NULL, NULL, NULL);
20987db96d56Sopenharmony_ci    else
20997db96d56Sopenharmony_ci        err = long_format_binary(obj, base, 1, &str, NULL, NULL, NULL);
21007db96d56Sopenharmony_ci    if (err == -1)
21017db96d56Sopenharmony_ci        return NULL;
21027db96d56Sopenharmony_ci    return str;
21037db96d56Sopenharmony_ci}
21047db96d56Sopenharmony_ci
21057db96d56Sopenharmony_ciint
21067db96d56Sopenharmony_ci_PyLong_FormatWriter(_PyUnicodeWriter *writer,
21077db96d56Sopenharmony_ci                     PyObject *obj,
21087db96d56Sopenharmony_ci                     int base, int alternate)
21097db96d56Sopenharmony_ci{
21107db96d56Sopenharmony_ci    if (base == 10)
21117db96d56Sopenharmony_ci        return long_to_decimal_string_internal(obj, NULL, writer,
21127db96d56Sopenharmony_ci                                               NULL, NULL);
21137db96d56Sopenharmony_ci    else
21147db96d56Sopenharmony_ci        return long_format_binary(obj, base, alternate, NULL, writer,
21157db96d56Sopenharmony_ci                                  NULL, NULL);
21167db96d56Sopenharmony_ci}
21177db96d56Sopenharmony_ci
21187db96d56Sopenharmony_cichar*
21197db96d56Sopenharmony_ci_PyLong_FormatBytesWriter(_PyBytesWriter *writer, char *str,
21207db96d56Sopenharmony_ci                          PyObject *obj,
21217db96d56Sopenharmony_ci                          int base, int alternate)
21227db96d56Sopenharmony_ci{
21237db96d56Sopenharmony_ci    char *str2;
21247db96d56Sopenharmony_ci    int res;
21257db96d56Sopenharmony_ci    str2 = str;
21267db96d56Sopenharmony_ci    if (base == 10)
21277db96d56Sopenharmony_ci        res = long_to_decimal_string_internal(obj, NULL, NULL,
21287db96d56Sopenharmony_ci                                              writer, &str2);
21297db96d56Sopenharmony_ci    else
21307db96d56Sopenharmony_ci        res = long_format_binary(obj, base, alternate, NULL, NULL,
21317db96d56Sopenharmony_ci                                 writer, &str2);
21327db96d56Sopenharmony_ci    if (res < 0)
21337db96d56Sopenharmony_ci        return NULL;
21347db96d56Sopenharmony_ci    assert(str2 != NULL);
21357db96d56Sopenharmony_ci    return str2;
21367db96d56Sopenharmony_ci}
21377db96d56Sopenharmony_ci
21387db96d56Sopenharmony_ci/* Table of digit values for 8-bit string -> integer conversion.
21397db96d56Sopenharmony_ci * '0' maps to 0, ..., '9' maps to 9.
21407db96d56Sopenharmony_ci * 'a' and 'A' map to 10, ..., 'z' and 'Z' map to 35.
21417db96d56Sopenharmony_ci * All other indices map to 37.
21427db96d56Sopenharmony_ci * Note that when converting a base B string, a char c is a legitimate
21437db96d56Sopenharmony_ci * base B digit iff _PyLong_DigitValue[Py_CHARPyLong_MASK(c)] < B.
21447db96d56Sopenharmony_ci */
21457db96d56Sopenharmony_ciunsigned char _PyLong_DigitValue[256] = {
21467db96d56Sopenharmony_ci    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
21477db96d56Sopenharmony_ci    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
21487db96d56Sopenharmony_ci    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
21497db96d56Sopenharmony_ci    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  37, 37, 37, 37, 37, 37,
21507db96d56Sopenharmony_ci    37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
21517db96d56Sopenharmony_ci    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
21527db96d56Sopenharmony_ci    37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
21537db96d56Sopenharmony_ci    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
21547db96d56Sopenharmony_ci    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
21557db96d56Sopenharmony_ci    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
21567db96d56Sopenharmony_ci    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
21577db96d56Sopenharmony_ci    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
21587db96d56Sopenharmony_ci    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
21597db96d56Sopenharmony_ci    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
21607db96d56Sopenharmony_ci    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
21617db96d56Sopenharmony_ci    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
21627db96d56Sopenharmony_ci};
21637db96d56Sopenharmony_ci
21647db96d56Sopenharmony_ci/* *str points to the first digit in a string of base `base` digits.  base
21657db96d56Sopenharmony_ci * is a power of 2 (2, 4, 8, 16, or 32).  *str is set to point to the first
21667db96d56Sopenharmony_ci * non-digit (which may be *str!).  A normalized int is returned.
21677db96d56Sopenharmony_ci * The point to this routine is that it takes time linear in the number of
21687db96d56Sopenharmony_ci * string characters.
21697db96d56Sopenharmony_ci *
21707db96d56Sopenharmony_ci * Return values:
21717db96d56Sopenharmony_ci *   -1 on syntax error (exception needs to be set, *res is untouched)
21727db96d56Sopenharmony_ci *   0 else (exception may be set, in that case *res is set to NULL)
21737db96d56Sopenharmony_ci */
21747db96d56Sopenharmony_cistatic int
21757db96d56Sopenharmony_cilong_from_binary_base(const char **str, int base, PyLongObject **res)
21767db96d56Sopenharmony_ci{
21777db96d56Sopenharmony_ci    const char *p = *str;
21787db96d56Sopenharmony_ci    const char *start = p;
21797db96d56Sopenharmony_ci    char prev = 0;
21807db96d56Sopenharmony_ci    Py_ssize_t digits = 0;
21817db96d56Sopenharmony_ci    int bits_per_char;
21827db96d56Sopenharmony_ci    Py_ssize_t n;
21837db96d56Sopenharmony_ci    PyLongObject *z;
21847db96d56Sopenharmony_ci    twodigits accum;
21857db96d56Sopenharmony_ci    int bits_in_accum;
21867db96d56Sopenharmony_ci    digit *pdigit;
21877db96d56Sopenharmony_ci
21887db96d56Sopenharmony_ci    assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
21897db96d56Sopenharmony_ci    n = base;
21907db96d56Sopenharmony_ci    for (bits_per_char = -1; n; ++bits_per_char) {
21917db96d56Sopenharmony_ci        n >>= 1;
21927db96d56Sopenharmony_ci    }
21937db96d56Sopenharmony_ci    /* count digits and set p to end-of-string */
21947db96d56Sopenharmony_ci    while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base || *p == '_') {
21957db96d56Sopenharmony_ci        if (*p == '_') {
21967db96d56Sopenharmony_ci            if (prev == '_') {
21977db96d56Sopenharmony_ci                *str = p - 1;
21987db96d56Sopenharmony_ci                return -1;
21997db96d56Sopenharmony_ci            }
22007db96d56Sopenharmony_ci        } else {
22017db96d56Sopenharmony_ci            ++digits;
22027db96d56Sopenharmony_ci        }
22037db96d56Sopenharmony_ci        prev = *p;
22047db96d56Sopenharmony_ci        ++p;
22057db96d56Sopenharmony_ci    }
22067db96d56Sopenharmony_ci    if (prev == '_') {
22077db96d56Sopenharmony_ci        /* Trailing underscore not allowed. */
22087db96d56Sopenharmony_ci        *str = p - 1;
22097db96d56Sopenharmony_ci        return -1;
22107db96d56Sopenharmony_ci    }
22117db96d56Sopenharmony_ci
22127db96d56Sopenharmony_ci    *str = p;
22137db96d56Sopenharmony_ci    /* n <- the number of Python digits needed,
22147db96d56Sopenharmony_ci            = ceiling((digits * bits_per_char) / PyLong_SHIFT). */
22157db96d56Sopenharmony_ci    if (digits > (PY_SSIZE_T_MAX - (PyLong_SHIFT - 1)) / bits_per_char) {
22167db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
22177db96d56Sopenharmony_ci                        "int string too large to convert");
22187db96d56Sopenharmony_ci        *res = NULL;
22197db96d56Sopenharmony_ci        return 0;
22207db96d56Sopenharmony_ci    }
22217db96d56Sopenharmony_ci    n = (digits * bits_per_char + PyLong_SHIFT - 1) / PyLong_SHIFT;
22227db96d56Sopenharmony_ci    z = _PyLong_New(n);
22237db96d56Sopenharmony_ci    if (z == NULL) {
22247db96d56Sopenharmony_ci        *res = NULL;
22257db96d56Sopenharmony_ci        return 0;
22267db96d56Sopenharmony_ci    }
22277db96d56Sopenharmony_ci    /* Read string from right, and fill in int from left; i.e.,
22287db96d56Sopenharmony_ci     * from least to most significant in both.
22297db96d56Sopenharmony_ci     */
22307db96d56Sopenharmony_ci    accum = 0;
22317db96d56Sopenharmony_ci    bits_in_accum = 0;
22327db96d56Sopenharmony_ci    pdigit = z->ob_digit;
22337db96d56Sopenharmony_ci    while (--p >= start) {
22347db96d56Sopenharmony_ci        int k;
22357db96d56Sopenharmony_ci        if (*p == '_') {
22367db96d56Sopenharmony_ci            continue;
22377db96d56Sopenharmony_ci        }
22387db96d56Sopenharmony_ci        k = (int)_PyLong_DigitValue[Py_CHARMASK(*p)];
22397db96d56Sopenharmony_ci        assert(k >= 0 && k < base);
22407db96d56Sopenharmony_ci        accum |= (twodigits)k << bits_in_accum;
22417db96d56Sopenharmony_ci        bits_in_accum += bits_per_char;
22427db96d56Sopenharmony_ci        if (bits_in_accum >= PyLong_SHIFT) {
22437db96d56Sopenharmony_ci            *pdigit++ = (digit)(accum & PyLong_MASK);
22447db96d56Sopenharmony_ci            assert(pdigit - z->ob_digit <= n);
22457db96d56Sopenharmony_ci            accum >>= PyLong_SHIFT;
22467db96d56Sopenharmony_ci            bits_in_accum -= PyLong_SHIFT;
22477db96d56Sopenharmony_ci            assert(bits_in_accum < PyLong_SHIFT);
22487db96d56Sopenharmony_ci        }
22497db96d56Sopenharmony_ci    }
22507db96d56Sopenharmony_ci    if (bits_in_accum) {
22517db96d56Sopenharmony_ci        assert(bits_in_accum <= PyLong_SHIFT);
22527db96d56Sopenharmony_ci        *pdigit++ = (digit)accum;
22537db96d56Sopenharmony_ci        assert(pdigit - z->ob_digit <= n);
22547db96d56Sopenharmony_ci    }
22557db96d56Sopenharmony_ci    while (pdigit - z->ob_digit < n)
22567db96d56Sopenharmony_ci        *pdigit++ = 0;
22577db96d56Sopenharmony_ci    *res = long_normalize(z);
22587db96d56Sopenharmony_ci    return 0;
22597db96d56Sopenharmony_ci}
22607db96d56Sopenharmony_ci
22617db96d56Sopenharmony_ci/* Parses an int from a bytestring. Leading and trailing whitespace will be
22627db96d56Sopenharmony_ci * ignored.
22637db96d56Sopenharmony_ci *
22647db96d56Sopenharmony_ci * If successful, a PyLong object will be returned and 'pend' will be pointing
22657db96d56Sopenharmony_ci * to the first unused byte unless it's NULL.
22667db96d56Sopenharmony_ci *
22677db96d56Sopenharmony_ci * If unsuccessful, NULL will be returned.
22687db96d56Sopenharmony_ci */
22697db96d56Sopenharmony_ciPyObject *
22707db96d56Sopenharmony_ciPyLong_FromString(const char *str, char **pend, int base)
22717db96d56Sopenharmony_ci{
22727db96d56Sopenharmony_ci    int sign = 1, error_if_nonzero = 0;
22737db96d56Sopenharmony_ci    const char *start, *orig_str = str;
22747db96d56Sopenharmony_ci    PyLongObject *z = NULL;
22757db96d56Sopenharmony_ci    PyObject *strobj;
22767db96d56Sopenharmony_ci    Py_ssize_t slen;
22777db96d56Sopenharmony_ci
22787db96d56Sopenharmony_ci    if ((base != 0 && base < 2) || base > 36) {
22797db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
22807db96d56Sopenharmony_ci                        "int() arg 2 must be >= 2 and <= 36");
22817db96d56Sopenharmony_ci        return NULL;
22827db96d56Sopenharmony_ci    }
22837db96d56Sopenharmony_ci    while (*str != '\0' && Py_ISSPACE(*str)) {
22847db96d56Sopenharmony_ci        str++;
22857db96d56Sopenharmony_ci    }
22867db96d56Sopenharmony_ci    if (*str == '+') {
22877db96d56Sopenharmony_ci        ++str;
22887db96d56Sopenharmony_ci    }
22897db96d56Sopenharmony_ci    else if (*str == '-') {
22907db96d56Sopenharmony_ci        ++str;
22917db96d56Sopenharmony_ci        sign = -1;
22927db96d56Sopenharmony_ci    }
22937db96d56Sopenharmony_ci    if (base == 0) {
22947db96d56Sopenharmony_ci        if (str[0] != '0') {
22957db96d56Sopenharmony_ci            base = 10;
22967db96d56Sopenharmony_ci        }
22977db96d56Sopenharmony_ci        else if (str[1] == 'x' || str[1] == 'X') {
22987db96d56Sopenharmony_ci            base = 16;
22997db96d56Sopenharmony_ci        }
23007db96d56Sopenharmony_ci        else if (str[1] == 'o' || str[1] == 'O') {
23017db96d56Sopenharmony_ci            base = 8;
23027db96d56Sopenharmony_ci        }
23037db96d56Sopenharmony_ci        else if (str[1] == 'b' || str[1] == 'B') {
23047db96d56Sopenharmony_ci            base = 2;
23057db96d56Sopenharmony_ci        }
23067db96d56Sopenharmony_ci        else {
23077db96d56Sopenharmony_ci            /* "old" (C-style) octal literal, now invalid.
23087db96d56Sopenharmony_ci               it might still be zero though */
23097db96d56Sopenharmony_ci            error_if_nonzero = 1;
23107db96d56Sopenharmony_ci            base = 10;
23117db96d56Sopenharmony_ci        }
23127db96d56Sopenharmony_ci    }
23137db96d56Sopenharmony_ci    if (str[0] == '0' &&
23147db96d56Sopenharmony_ci        ((base == 16 && (str[1] == 'x' || str[1] == 'X')) ||
23157db96d56Sopenharmony_ci         (base == 8  && (str[1] == 'o' || str[1] == 'O')) ||
23167db96d56Sopenharmony_ci         (base == 2  && (str[1] == 'b' || str[1] == 'B')))) {
23177db96d56Sopenharmony_ci        str += 2;
23187db96d56Sopenharmony_ci        /* One underscore allowed here. */
23197db96d56Sopenharmony_ci        if (*str == '_') {
23207db96d56Sopenharmony_ci            ++str;
23217db96d56Sopenharmony_ci        }
23227db96d56Sopenharmony_ci    }
23237db96d56Sopenharmony_ci    if (str[0] == '_') {
23247db96d56Sopenharmony_ci        /* May not start with underscores. */
23257db96d56Sopenharmony_ci        goto onError;
23267db96d56Sopenharmony_ci    }
23277db96d56Sopenharmony_ci
23287db96d56Sopenharmony_ci    start = str;
23297db96d56Sopenharmony_ci    if ((base & (base - 1)) == 0) {
23307db96d56Sopenharmony_ci        /* binary bases are not limited by int_max_str_digits */
23317db96d56Sopenharmony_ci        int res = long_from_binary_base(&str, base, &z);
23327db96d56Sopenharmony_ci        if (res < 0) {
23337db96d56Sopenharmony_ci            /* Syntax error. */
23347db96d56Sopenharmony_ci            goto onError;
23357db96d56Sopenharmony_ci        }
23367db96d56Sopenharmony_ci    }
23377db96d56Sopenharmony_ci    else {
23387db96d56Sopenharmony_ci/***
23397db96d56Sopenharmony_ciBinary bases can be converted in time linear in the number of digits, because
23407db96d56Sopenharmony_ciPython's representation base is binary.  Other bases (including decimal!) use
23417db96d56Sopenharmony_cithe simple quadratic-time algorithm below, complicated by some speed tricks.
23427db96d56Sopenharmony_ci
23437db96d56Sopenharmony_ciFirst some math:  the largest integer that can be expressed in N base-B digits
23447db96d56Sopenharmony_ciis B**N-1.  Consequently, if we have an N-digit input in base B, the worst-
23457db96d56Sopenharmony_cicase number of Python digits needed to hold it is the smallest integer n s.t.
23467db96d56Sopenharmony_ci
23477db96d56Sopenharmony_ci    BASE**n-1 >= B**N-1  [or, adding 1 to both sides]
23487db96d56Sopenharmony_ci    BASE**n >= B**N      [taking logs to base BASE]
23497db96d56Sopenharmony_ci    n >= log(B**N)/log(BASE) = N * log(B)/log(BASE)
23507db96d56Sopenharmony_ci
23517db96d56Sopenharmony_ciThe static array log_base_BASE[base] == log(base)/log(BASE) so we can compute
23527db96d56Sopenharmony_cithis quickly.  A Python int with that much space is reserved near the start,
23537db96d56Sopenharmony_ciand the result is computed into it.
23547db96d56Sopenharmony_ci
23557db96d56Sopenharmony_ciThe input string is actually treated as being in base base**i (i.e., i digits
23567db96d56Sopenharmony_ciare processed at a time), where two more static arrays hold:
23577db96d56Sopenharmony_ci
23587db96d56Sopenharmony_ci    convwidth_base[base] = the largest integer i such that base**i <= BASE
23597db96d56Sopenharmony_ci    convmultmax_base[base] = base ** convwidth_base[base]
23607db96d56Sopenharmony_ci
23617db96d56Sopenharmony_ciThe first of these is the largest i such that i consecutive input digits
23627db96d56Sopenharmony_cimust fit in a single Python digit.  The second is effectively the input
23637db96d56Sopenharmony_cibase we're really using.
23647db96d56Sopenharmony_ci
23657db96d56Sopenharmony_ciViewing the input as a sequence <c0, c1, ..., c_n-1> of digits in base
23667db96d56Sopenharmony_ciconvmultmax_base[base], the result is "simply"
23677db96d56Sopenharmony_ci
23687db96d56Sopenharmony_ci   (((c0*B + c1)*B + c2)*B + c3)*B + ... ))) + c_n-1
23697db96d56Sopenharmony_ci
23707db96d56Sopenharmony_ciwhere B = convmultmax_base[base].
23717db96d56Sopenharmony_ci
23727db96d56Sopenharmony_ciError analysis:  as above, the number of Python digits `n` needed is worst-
23737db96d56Sopenharmony_cicase
23747db96d56Sopenharmony_ci
23757db96d56Sopenharmony_ci    n >= N * log(B)/log(BASE)
23767db96d56Sopenharmony_ci
23777db96d56Sopenharmony_ciwhere `N` is the number of input digits in base `B`.  This is computed via
23787db96d56Sopenharmony_ci
23797db96d56Sopenharmony_ci    size_z = (Py_ssize_t)((scan - str) * log_base_BASE[base]) + 1;
23807db96d56Sopenharmony_ci
23817db96d56Sopenharmony_cibelow.  Two numeric concerns are how much space this can waste, and whether
23827db96d56Sopenharmony_cithe computed result can be too small.  To be concrete, assume BASE = 2**15,
23837db96d56Sopenharmony_ciwhich is the default (and it's unlikely anyone changes that).
23847db96d56Sopenharmony_ci
23857db96d56Sopenharmony_ciWaste isn't a problem:  provided the first input digit isn't 0, the difference
23867db96d56Sopenharmony_cibetween the worst-case input with N digits and the smallest input with N
23877db96d56Sopenharmony_cidigits is about a factor of B, but B is small compared to BASE so at most
23887db96d56Sopenharmony_cione allocated Python digit can remain unused on that count.  If
23897db96d56Sopenharmony_ciN*log(B)/log(BASE) is mathematically an exact integer, then truncating that
23907db96d56Sopenharmony_ciand adding 1 returns a result 1 larger than necessary.  However, that can't
23917db96d56Sopenharmony_cihappen:  whenever B is a power of 2, long_from_binary_base() is called
23927db96d56Sopenharmony_ciinstead, and it's impossible for B**i to be an integer power of 2**15 when
23937db96d56Sopenharmony_ciB is not a power of 2 (i.e., it's impossible for N*log(B)/log(BASE) to be
23947db96d56Sopenharmony_cian exact integer when B is not a power of 2, since B**i has a prime factor
23957db96d56Sopenharmony_ciother than 2 in that case, but (2**15)**j's only prime factor is 2).
23967db96d56Sopenharmony_ci
23977db96d56Sopenharmony_ciThe computed result can be too small if the true value of N*log(B)/log(BASE)
23987db96d56Sopenharmony_ciis a little bit larger than an exact integer, but due to roundoff errors (in
23997db96d56Sopenharmony_cicomputing log(B), log(BASE), their quotient, and/or multiplying that by N)
24007db96d56Sopenharmony_ciyields a numeric result a little less than that integer.  Unfortunately, "how
24017db96d56Sopenharmony_ciclose can a transcendental function get to an integer over some range?"
24027db96d56Sopenharmony_ciquestions are generally theoretically intractable.  Computer analysis via
24037db96d56Sopenharmony_cicontinued fractions is practical:  expand log(B)/log(BASE) via continued
24047db96d56Sopenharmony_cifractions, giving a sequence i/j of "the best" rational approximations.  Then
24057db96d56Sopenharmony_cij*log(B)/log(BASE) is approximately equal to (the integer) i.  This shows that
24067db96d56Sopenharmony_ciwe can get very close to being in trouble, but very rarely.  For example,
24077db96d56Sopenharmony_ci76573 is a denominator in one of the continued-fraction approximations to
24087db96d56Sopenharmony_cilog(10)/log(2**15), and indeed:
24097db96d56Sopenharmony_ci
24107db96d56Sopenharmony_ci    >>> log(10)/log(2**15)*76573
24117db96d56Sopenharmony_ci    16958.000000654003
24127db96d56Sopenharmony_ci
24137db96d56Sopenharmony_ciis very close to an integer.  If we were working with IEEE single-precision,
24147db96d56Sopenharmony_cirounding errors could kill us.  Finding worst cases in IEEE double-precision
24157db96d56Sopenharmony_cirequires better-than-double-precision log() functions, and Tim didn't bother.
24167db96d56Sopenharmony_ciInstead the code checks to see whether the allocated space is enough as each
24177db96d56Sopenharmony_cinew Python digit is added, and copies the whole thing to a larger int if not.
24187db96d56Sopenharmony_ciThis should happen extremely rarely, and in fact I don't have a test case
24197db96d56Sopenharmony_cithat triggers it(!).  Instead the code was tested by artificially allocating
24207db96d56Sopenharmony_cijust 1 digit at the start, so that the copying code was exercised for every
24217db96d56Sopenharmony_cidigit beyond the first.
24227db96d56Sopenharmony_ci***/
24237db96d56Sopenharmony_ci        twodigits c;           /* current input character */
24247db96d56Sopenharmony_ci        Py_ssize_t size_z;
24257db96d56Sopenharmony_ci        Py_ssize_t digits = 0;
24267db96d56Sopenharmony_ci        int i;
24277db96d56Sopenharmony_ci        int convwidth;
24287db96d56Sopenharmony_ci        twodigits convmultmax, convmult;
24297db96d56Sopenharmony_ci        digit *pz, *pzstop;
24307db96d56Sopenharmony_ci        const char *scan, *lastdigit;
24317db96d56Sopenharmony_ci        char prev = 0;
24327db96d56Sopenharmony_ci
24337db96d56Sopenharmony_ci        static double log_base_BASE[37] = {0.0e0,};
24347db96d56Sopenharmony_ci        static int convwidth_base[37] = {0,};
24357db96d56Sopenharmony_ci        static twodigits convmultmax_base[37] = {0,};
24367db96d56Sopenharmony_ci
24377db96d56Sopenharmony_ci        if (log_base_BASE[base] == 0.0) {
24387db96d56Sopenharmony_ci            twodigits convmax = base;
24397db96d56Sopenharmony_ci            int i = 1;
24407db96d56Sopenharmony_ci
24417db96d56Sopenharmony_ci            log_base_BASE[base] = (log((double)base) /
24427db96d56Sopenharmony_ci                                   log((double)PyLong_BASE));
24437db96d56Sopenharmony_ci            for (;;) {
24447db96d56Sopenharmony_ci                twodigits next = convmax * base;
24457db96d56Sopenharmony_ci                if (next > PyLong_BASE) {
24467db96d56Sopenharmony_ci                    break;
24477db96d56Sopenharmony_ci                }
24487db96d56Sopenharmony_ci                convmax = next;
24497db96d56Sopenharmony_ci                ++i;
24507db96d56Sopenharmony_ci            }
24517db96d56Sopenharmony_ci            convmultmax_base[base] = convmax;
24527db96d56Sopenharmony_ci            assert(i > 0);
24537db96d56Sopenharmony_ci            convwidth_base[base] = i;
24547db96d56Sopenharmony_ci        }
24557db96d56Sopenharmony_ci
24567db96d56Sopenharmony_ci        /* Find length of the string of numeric characters. */
24577db96d56Sopenharmony_ci        scan = str;
24587db96d56Sopenharmony_ci        lastdigit = str;
24597db96d56Sopenharmony_ci
24607db96d56Sopenharmony_ci        while (_PyLong_DigitValue[Py_CHARMASK(*scan)] < base || *scan == '_') {
24617db96d56Sopenharmony_ci            if (*scan == '_') {
24627db96d56Sopenharmony_ci                if (prev == '_') {
24637db96d56Sopenharmony_ci                    /* Only one underscore allowed. */
24647db96d56Sopenharmony_ci                    str = lastdigit + 1;
24657db96d56Sopenharmony_ci                    goto onError;
24667db96d56Sopenharmony_ci                }
24677db96d56Sopenharmony_ci            }
24687db96d56Sopenharmony_ci            else {
24697db96d56Sopenharmony_ci                ++digits;
24707db96d56Sopenharmony_ci                lastdigit = scan;
24717db96d56Sopenharmony_ci            }
24727db96d56Sopenharmony_ci            prev = *scan;
24737db96d56Sopenharmony_ci            ++scan;
24747db96d56Sopenharmony_ci        }
24757db96d56Sopenharmony_ci        if (prev == '_') {
24767db96d56Sopenharmony_ci            /* Trailing underscore not allowed. */
24777db96d56Sopenharmony_ci            /* Set error pointer to first underscore. */
24787db96d56Sopenharmony_ci            str = lastdigit + 1;
24797db96d56Sopenharmony_ci            goto onError;
24807db96d56Sopenharmony_ci        }
24817db96d56Sopenharmony_ci
24827db96d56Sopenharmony_ci        /* Limit the size to avoid excessive computation attacks. */
24837db96d56Sopenharmony_ci        if (digits > _PY_LONG_MAX_STR_DIGITS_THRESHOLD) {
24847db96d56Sopenharmony_ci            PyInterpreterState *interp = _PyInterpreterState_GET();
24857db96d56Sopenharmony_ci            int max_str_digits = interp->int_max_str_digits;
24867db96d56Sopenharmony_ci            if ((max_str_digits > 0) && (digits > max_str_digits)) {
24877db96d56Sopenharmony_ci                PyErr_Format(PyExc_ValueError, _MAX_STR_DIGITS_ERROR_FMT_TO_INT,
24887db96d56Sopenharmony_ci                             max_str_digits, digits);
24897db96d56Sopenharmony_ci                return NULL;
24907db96d56Sopenharmony_ci            }
24917db96d56Sopenharmony_ci        }
24927db96d56Sopenharmony_ci
24937db96d56Sopenharmony_ci        /* Create an int object that can contain the largest possible
24947db96d56Sopenharmony_ci         * integer with this base and length.  Note that there's no
24957db96d56Sopenharmony_ci         * need to initialize z->ob_digit -- no slot is read up before
24967db96d56Sopenharmony_ci         * being stored into.
24977db96d56Sopenharmony_ci         */
24987db96d56Sopenharmony_ci        double fsize_z = (double)digits * log_base_BASE[base] + 1.0;
24997db96d56Sopenharmony_ci        if (fsize_z > (double)MAX_LONG_DIGITS) {
25007db96d56Sopenharmony_ci            /* The same exception as in _PyLong_New(). */
25017db96d56Sopenharmony_ci            PyErr_SetString(PyExc_OverflowError,
25027db96d56Sopenharmony_ci                            "too many digits in integer");
25037db96d56Sopenharmony_ci            return NULL;
25047db96d56Sopenharmony_ci        }
25057db96d56Sopenharmony_ci        size_z = (Py_ssize_t)fsize_z;
25067db96d56Sopenharmony_ci        /* Uncomment next line to test exceedingly rare copy code */
25077db96d56Sopenharmony_ci        /* size_z = 1; */
25087db96d56Sopenharmony_ci        assert(size_z > 0);
25097db96d56Sopenharmony_ci        z = _PyLong_New(size_z);
25107db96d56Sopenharmony_ci        if (z == NULL) {
25117db96d56Sopenharmony_ci            return NULL;
25127db96d56Sopenharmony_ci        }
25137db96d56Sopenharmony_ci        Py_SET_SIZE(z, 0);
25147db96d56Sopenharmony_ci
25157db96d56Sopenharmony_ci        /* `convwidth` consecutive input digits are treated as a single
25167db96d56Sopenharmony_ci         * digit in base `convmultmax`.
25177db96d56Sopenharmony_ci         */
25187db96d56Sopenharmony_ci        convwidth = convwidth_base[base];
25197db96d56Sopenharmony_ci        convmultmax = convmultmax_base[base];
25207db96d56Sopenharmony_ci
25217db96d56Sopenharmony_ci        /* Work ;-) */
25227db96d56Sopenharmony_ci        while (str < scan) {
25237db96d56Sopenharmony_ci            if (*str == '_') {
25247db96d56Sopenharmony_ci                str++;
25257db96d56Sopenharmony_ci                continue;
25267db96d56Sopenharmony_ci            }
25277db96d56Sopenharmony_ci            /* grab up to convwidth digits from the input string */
25287db96d56Sopenharmony_ci            c = (digit)_PyLong_DigitValue[Py_CHARMASK(*str++)];
25297db96d56Sopenharmony_ci            for (i = 1; i < convwidth && str != scan; ++str) {
25307db96d56Sopenharmony_ci                if (*str == '_') {
25317db96d56Sopenharmony_ci                    continue;
25327db96d56Sopenharmony_ci                }
25337db96d56Sopenharmony_ci                i++;
25347db96d56Sopenharmony_ci                c = (twodigits)(c *  base +
25357db96d56Sopenharmony_ci                                (int)_PyLong_DigitValue[Py_CHARMASK(*str)]);
25367db96d56Sopenharmony_ci                assert(c < PyLong_BASE);
25377db96d56Sopenharmony_ci            }
25387db96d56Sopenharmony_ci
25397db96d56Sopenharmony_ci            convmult = convmultmax;
25407db96d56Sopenharmony_ci            /* Calculate the shift only if we couldn't get
25417db96d56Sopenharmony_ci             * convwidth digits.
25427db96d56Sopenharmony_ci             */
25437db96d56Sopenharmony_ci            if (i != convwidth) {
25447db96d56Sopenharmony_ci                convmult = base;
25457db96d56Sopenharmony_ci                for ( ; i > 1; --i) {
25467db96d56Sopenharmony_ci                    convmult *= base;
25477db96d56Sopenharmony_ci                }
25487db96d56Sopenharmony_ci            }
25497db96d56Sopenharmony_ci
25507db96d56Sopenharmony_ci            /* Multiply z by convmult, and add c. */
25517db96d56Sopenharmony_ci            pz = z->ob_digit;
25527db96d56Sopenharmony_ci            pzstop = pz + Py_SIZE(z);
25537db96d56Sopenharmony_ci            for (; pz < pzstop; ++pz) {
25547db96d56Sopenharmony_ci                c += (twodigits)*pz * convmult;
25557db96d56Sopenharmony_ci                *pz = (digit)(c & PyLong_MASK);
25567db96d56Sopenharmony_ci                c >>= PyLong_SHIFT;
25577db96d56Sopenharmony_ci            }
25587db96d56Sopenharmony_ci            /* carry off the current end? */
25597db96d56Sopenharmony_ci            if (c) {
25607db96d56Sopenharmony_ci                assert(c < PyLong_BASE);
25617db96d56Sopenharmony_ci                if (Py_SIZE(z) < size_z) {
25627db96d56Sopenharmony_ci                    *pz = (digit)c;
25637db96d56Sopenharmony_ci                    Py_SET_SIZE(z, Py_SIZE(z) + 1);
25647db96d56Sopenharmony_ci                }
25657db96d56Sopenharmony_ci                else {
25667db96d56Sopenharmony_ci                    PyLongObject *tmp;
25677db96d56Sopenharmony_ci                    /* Extremely rare.  Get more space. */
25687db96d56Sopenharmony_ci                    assert(Py_SIZE(z) == size_z);
25697db96d56Sopenharmony_ci                    tmp = _PyLong_New(size_z + 1);
25707db96d56Sopenharmony_ci                    if (tmp == NULL) {
25717db96d56Sopenharmony_ci                        Py_DECREF(z);
25727db96d56Sopenharmony_ci                        return NULL;
25737db96d56Sopenharmony_ci                    }
25747db96d56Sopenharmony_ci                    memcpy(tmp->ob_digit,
25757db96d56Sopenharmony_ci                           z->ob_digit,
25767db96d56Sopenharmony_ci                           sizeof(digit) * size_z);
25777db96d56Sopenharmony_ci                    Py_DECREF(z);
25787db96d56Sopenharmony_ci                    z = tmp;
25797db96d56Sopenharmony_ci                    z->ob_digit[size_z] = (digit)c;
25807db96d56Sopenharmony_ci                    ++size_z;
25817db96d56Sopenharmony_ci                }
25827db96d56Sopenharmony_ci            }
25837db96d56Sopenharmony_ci        }
25847db96d56Sopenharmony_ci    }
25857db96d56Sopenharmony_ci    if (z == NULL) {
25867db96d56Sopenharmony_ci        return NULL;
25877db96d56Sopenharmony_ci    }
25887db96d56Sopenharmony_ci    if (error_if_nonzero) {
25897db96d56Sopenharmony_ci        /* reset the base to 0, else the exception message
25907db96d56Sopenharmony_ci           doesn't make too much sense */
25917db96d56Sopenharmony_ci        base = 0;
25927db96d56Sopenharmony_ci        if (Py_SIZE(z) != 0) {
25937db96d56Sopenharmony_ci            goto onError;
25947db96d56Sopenharmony_ci        }
25957db96d56Sopenharmony_ci        /* there might still be other problems, therefore base
25967db96d56Sopenharmony_ci           remains zero here for the same reason */
25977db96d56Sopenharmony_ci    }
25987db96d56Sopenharmony_ci    if (str == start) {
25997db96d56Sopenharmony_ci        goto onError;
26007db96d56Sopenharmony_ci    }
26017db96d56Sopenharmony_ci    if (sign < 0) {
26027db96d56Sopenharmony_ci        Py_SET_SIZE(z, -(Py_SIZE(z)));
26037db96d56Sopenharmony_ci    }
26047db96d56Sopenharmony_ci    while (*str && Py_ISSPACE(*str)) {
26057db96d56Sopenharmony_ci        str++;
26067db96d56Sopenharmony_ci    }
26077db96d56Sopenharmony_ci    if (*str != '\0') {
26087db96d56Sopenharmony_ci        goto onError;
26097db96d56Sopenharmony_ci    }
26107db96d56Sopenharmony_ci    long_normalize(z);
26117db96d56Sopenharmony_ci    z = maybe_small_long(z);
26127db96d56Sopenharmony_ci    if (z == NULL) {
26137db96d56Sopenharmony_ci        return NULL;
26147db96d56Sopenharmony_ci    }
26157db96d56Sopenharmony_ci    if (pend != NULL) {
26167db96d56Sopenharmony_ci        *pend = (char *)str;
26177db96d56Sopenharmony_ci    }
26187db96d56Sopenharmony_ci    return (PyObject *) z;
26197db96d56Sopenharmony_ci
26207db96d56Sopenharmony_ci  onError:
26217db96d56Sopenharmony_ci    if (pend != NULL) {
26227db96d56Sopenharmony_ci        *pend = (char *)str;
26237db96d56Sopenharmony_ci    }
26247db96d56Sopenharmony_ci    Py_XDECREF(z);
26257db96d56Sopenharmony_ci    slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200;
26267db96d56Sopenharmony_ci    strobj = PyUnicode_FromStringAndSize(orig_str, slen);
26277db96d56Sopenharmony_ci    if (strobj == NULL) {
26287db96d56Sopenharmony_ci        return NULL;
26297db96d56Sopenharmony_ci    }
26307db96d56Sopenharmony_ci    PyErr_Format(PyExc_ValueError,
26317db96d56Sopenharmony_ci                 "invalid literal for int() with base %d: %.200R",
26327db96d56Sopenharmony_ci                 base, strobj);
26337db96d56Sopenharmony_ci    Py_DECREF(strobj);
26347db96d56Sopenharmony_ci    return NULL;
26357db96d56Sopenharmony_ci}
26367db96d56Sopenharmony_ci
26377db96d56Sopenharmony_ci/* Since PyLong_FromString doesn't have a length parameter,
26387db96d56Sopenharmony_ci * check here for possible NULs in the string.
26397db96d56Sopenharmony_ci *
26407db96d56Sopenharmony_ci * Reports an invalid literal as a bytes object.
26417db96d56Sopenharmony_ci */
26427db96d56Sopenharmony_ciPyObject *
26437db96d56Sopenharmony_ci_PyLong_FromBytes(const char *s, Py_ssize_t len, int base)
26447db96d56Sopenharmony_ci{
26457db96d56Sopenharmony_ci    PyObject *result, *strobj;
26467db96d56Sopenharmony_ci    char *end = NULL;
26477db96d56Sopenharmony_ci
26487db96d56Sopenharmony_ci    result = PyLong_FromString(s, &end, base);
26497db96d56Sopenharmony_ci    if (end == NULL || (result != NULL && end == s + len))
26507db96d56Sopenharmony_ci        return result;
26517db96d56Sopenharmony_ci    Py_XDECREF(result);
26527db96d56Sopenharmony_ci    strobj = PyBytes_FromStringAndSize(s, Py_MIN(len, 200));
26537db96d56Sopenharmony_ci    if (strobj != NULL) {
26547db96d56Sopenharmony_ci        PyErr_Format(PyExc_ValueError,
26557db96d56Sopenharmony_ci                     "invalid literal for int() with base %d: %.200R",
26567db96d56Sopenharmony_ci                     base, strobj);
26577db96d56Sopenharmony_ci        Py_DECREF(strobj);
26587db96d56Sopenharmony_ci    }
26597db96d56Sopenharmony_ci    return NULL;
26607db96d56Sopenharmony_ci}
26617db96d56Sopenharmony_ci
26627db96d56Sopenharmony_ciPyObject *
26637db96d56Sopenharmony_ciPyLong_FromUnicodeObject(PyObject *u, int base)
26647db96d56Sopenharmony_ci{
26657db96d56Sopenharmony_ci    PyObject *result, *asciidig;
26667db96d56Sopenharmony_ci    const char *buffer;
26677db96d56Sopenharmony_ci    char *end = NULL;
26687db96d56Sopenharmony_ci    Py_ssize_t buflen;
26697db96d56Sopenharmony_ci
26707db96d56Sopenharmony_ci    asciidig = _PyUnicode_TransformDecimalAndSpaceToASCII(u);
26717db96d56Sopenharmony_ci    if (asciidig == NULL)
26727db96d56Sopenharmony_ci        return NULL;
26737db96d56Sopenharmony_ci    assert(PyUnicode_IS_ASCII(asciidig));
26747db96d56Sopenharmony_ci    /* Simply get a pointer to existing ASCII characters. */
26757db96d56Sopenharmony_ci    buffer = PyUnicode_AsUTF8AndSize(asciidig, &buflen);
26767db96d56Sopenharmony_ci    assert(buffer != NULL);
26777db96d56Sopenharmony_ci
26787db96d56Sopenharmony_ci    result = PyLong_FromString(buffer, &end, base);
26797db96d56Sopenharmony_ci    if (end == NULL || (result != NULL && end == buffer + buflen)) {
26807db96d56Sopenharmony_ci        Py_DECREF(asciidig);
26817db96d56Sopenharmony_ci        return result;
26827db96d56Sopenharmony_ci    }
26837db96d56Sopenharmony_ci    Py_DECREF(asciidig);
26847db96d56Sopenharmony_ci    Py_XDECREF(result);
26857db96d56Sopenharmony_ci    PyErr_Format(PyExc_ValueError,
26867db96d56Sopenharmony_ci                 "invalid literal for int() with base %d: %.200R",
26877db96d56Sopenharmony_ci                 base, u);
26887db96d56Sopenharmony_ci    return NULL;
26897db96d56Sopenharmony_ci}
26907db96d56Sopenharmony_ci
26917db96d56Sopenharmony_ci/* forward */
26927db96d56Sopenharmony_cistatic PyLongObject *x_divrem
26937db96d56Sopenharmony_ci    (PyLongObject *, PyLongObject *, PyLongObject **);
26947db96d56Sopenharmony_cistatic PyObject *long_long(PyObject *v);
26957db96d56Sopenharmony_ci
26967db96d56Sopenharmony_ci/* Int division with remainder, top-level routine */
26977db96d56Sopenharmony_ci
26987db96d56Sopenharmony_cistatic int
26997db96d56Sopenharmony_cilong_divrem(PyLongObject *a, PyLongObject *b,
27007db96d56Sopenharmony_ci            PyLongObject **pdiv, PyLongObject **prem)
27017db96d56Sopenharmony_ci{
27027db96d56Sopenharmony_ci    Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
27037db96d56Sopenharmony_ci    PyLongObject *z;
27047db96d56Sopenharmony_ci
27057db96d56Sopenharmony_ci    if (size_b == 0) {
27067db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ZeroDivisionError,
27077db96d56Sopenharmony_ci                        "integer division or modulo by zero");
27087db96d56Sopenharmony_ci        return -1;
27097db96d56Sopenharmony_ci    }
27107db96d56Sopenharmony_ci    if (size_a < size_b ||
27117db96d56Sopenharmony_ci        (size_a == size_b &&
27127db96d56Sopenharmony_ci         a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
27137db96d56Sopenharmony_ci        /* |a| < |b|. */
27147db96d56Sopenharmony_ci        *prem = (PyLongObject *)long_long((PyObject *)a);
27157db96d56Sopenharmony_ci        if (*prem == NULL) {
27167db96d56Sopenharmony_ci            return -1;
27177db96d56Sopenharmony_ci        }
27187db96d56Sopenharmony_ci        PyObject *zero = _PyLong_GetZero();
27197db96d56Sopenharmony_ci        Py_INCREF(zero);
27207db96d56Sopenharmony_ci        *pdiv = (PyLongObject*)zero;
27217db96d56Sopenharmony_ci        return 0;
27227db96d56Sopenharmony_ci    }
27237db96d56Sopenharmony_ci    if (size_b == 1) {
27247db96d56Sopenharmony_ci        digit rem = 0;
27257db96d56Sopenharmony_ci        z = divrem1(a, b->ob_digit[0], &rem);
27267db96d56Sopenharmony_ci        if (z == NULL)
27277db96d56Sopenharmony_ci            return -1;
27287db96d56Sopenharmony_ci        *prem = (PyLongObject *) PyLong_FromLong((long)rem);
27297db96d56Sopenharmony_ci        if (*prem == NULL) {
27307db96d56Sopenharmony_ci            Py_DECREF(z);
27317db96d56Sopenharmony_ci            return -1;
27327db96d56Sopenharmony_ci        }
27337db96d56Sopenharmony_ci    }
27347db96d56Sopenharmony_ci    else {
27357db96d56Sopenharmony_ci        z = x_divrem(a, b, prem);
27367db96d56Sopenharmony_ci        *prem = maybe_small_long(*prem);
27377db96d56Sopenharmony_ci        if (z == NULL)
27387db96d56Sopenharmony_ci            return -1;
27397db96d56Sopenharmony_ci    }
27407db96d56Sopenharmony_ci    /* Set the signs.
27417db96d56Sopenharmony_ci       The quotient z has the sign of a*b;
27427db96d56Sopenharmony_ci       the remainder r has the sign of a,
27437db96d56Sopenharmony_ci       so a = b*z + r. */
27447db96d56Sopenharmony_ci    if ((Py_SIZE(a) < 0) != (Py_SIZE(b) < 0)) {
27457db96d56Sopenharmony_ci        _PyLong_Negate(&z);
27467db96d56Sopenharmony_ci        if (z == NULL) {
27477db96d56Sopenharmony_ci            Py_CLEAR(*prem);
27487db96d56Sopenharmony_ci            return -1;
27497db96d56Sopenharmony_ci        }
27507db96d56Sopenharmony_ci    }
27517db96d56Sopenharmony_ci    if (Py_SIZE(a) < 0 && Py_SIZE(*prem) != 0) {
27527db96d56Sopenharmony_ci        _PyLong_Negate(prem);
27537db96d56Sopenharmony_ci        if (*prem == NULL) {
27547db96d56Sopenharmony_ci            Py_DECREF(z);
27557db96d56Sopenharmony_ci            Py_CLEAR(*prem);
27567db96d56Sopenharmony_ci            return -1;
27577db96d56Sopenharmony_ci        }
27587db96d56Sopenharmony_ci    }
27597db96d56Sopenharmony_ci    *pdiv = maybe_small_long(z);
27607db96d56Sopenharmony_ci    return 0;
27617db96d56Sopenharmony_ci}
27627db96d56Sopenharmony_ci
27637db96d56Sopenharmony_ci/* Int remainder, top-level routine */
27647db96d56Sopenharmony_ci
27657db96d56Sopenharmony_cistatic int
27667db96d56Sopenharmony_cilong_rem(PyLongObject *a, PyLongObject *b, PyLongObject **prem)
27677db96d56Sopenharmony_ci{
27687db96d56Sopenharmony_ci    Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
27697db96d56Sopenharmony_ci
27707db96d56Sopenharmony_ci    if (size_b == 0) {
27717db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ZeroDivisionError,
27727db96d56Sopenharmony_ci                        "integer modulo by zero");
27737db96d56Sopenharmony_ci        return -1;
27747db96d56Sopenharmony_ci    }
27757db96d56Sopenharmony_ci    if (size_a < size_b ||
27767db96d56Sopenharmony_ci        (size_a == size_b &&
27777db96d56Sopenharmony_ci         a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
27787db96d56Sopenharmony_ci        /* |a| < |b|. */
27797db96d56Sopenharmony_ci        *prem = (PyLongObject *)long_long((PyObject *)a);
27807db96d56Sopenharmony_ci        return -(*prem == NULL);
27817db96d56Sopenharmony_ci    }
27827db96d56Sopenharmony_ci    if (size_b == 1) {
27837db96d56Sopenharmony_ci        *prem = rem1(a, b->ob_digit[0]);
27847db96d56Sopenharmony_ci        if (*prem == NULL)
27857db96d56Sopenharmony_ci            return -1;
27867db96d56Sopenharmony_ci    }
27877db96d56Sopenharmony_ci    else {
27887db96d56Sopenharmony_ci        /* Slow path using divrem. */
27897db96d56Sopenharmony_ci        Py_XDECREF(x_divrem(a, b, prem));
27907db96d56Sopenharmony_ci        *prem = maybe_small_long(*prem);
27917db96d56Sopenharmony_ci        if (*prem == NULL)
27927db96d56Sopenharmony_ci            return -1;
27937db96d56Sopenharmony_ci    }
27947db96d56Sopenharmony_ci    /* Set the sign. */
27957db96d56Sopenharmony_ci    if (Py_SIZE(a) < 0 && Py_SIZE(*prem) != 0) {
27967db96d56Sopenharmony_ci        _PyLong_Negate(prem);
27977db96d56Sopenharmony_ci        if (*prem == NULL) {
27987db96d56Sopenharmony_ci            Py_CLEAR(*prem);
27997db96d56Sopenharmony_ci            return -1;
28007db96d56Sopenharmony_ci        }
28017db96d56Sopenharmony_ci    }
28027db96d56Sopenharmony_ci    return 0;
28037db96d56Sopenharmony_ci}
28047db96d56Sopenharmony_ci
28057db96d56Sopenharmony_ci/* Unsigned int division with remainder -- the algorithm.  The arguments v1
28067db96d56Sopenharmony_ci   and w1 should satisfy 2 <= Py_ABS(Py_SIZE(w1)) <= Py_ABS(Py_SIZE(v1)). */
28077db96d56Sopenharmony_ci
28087db96d56Sopenharmony_cistatic PyLongObject *
28097db96d56Sopenharmony_cix_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
28107db96d56Sopenharmony_ci{
28117db96d56Sopenharmony_ci    PyLongObject *v, *w, *a;
28127db96d56Sopenharmony_ci    Py_ssize_t i, k, size_v, size_w;
28137db96d56Sopenharmony_ci    int d;
28147db96d56Sopenharmony_ci    digit wm1, wm2, carry, q, r, vtop, *v0, *vk, *w0, *ak;
28157db96d56Sopenharmony_ci    twodigits vv;
28167db96d56Sopenharmony_ci    sdigit zhi;
28177db96d56Sopenharmony_ci    stwodigits z;
28187db96d56Sopenharmony_ci
28197db96d56Sopenharmony_ci    /* We follow Knuth [The Art of Computer Programming, Vol. 2 (3rd
28207db96d56Sopenharmony_ci       edn.), section 4.3.1, Algorithm D], except that we don't explicitly
28217db96d56Sopenharmony_ci       handle the special case when the initial estimate q for a quotient
28227db96d56Sopenharmony_ci       digit is >= PyLong_BASE: the max value for q is PyLong_BASE+1, and
28237db96d56Sopenharmony_ci       that won't overflow a digit. */
28247db96d56Sopenharmony_ci
28257db96d56Sopenharmony_ci    /* allocate space; w will also be used to hold the final remainder */
28267db96d56Sopenharmony_ci    size_v = Py_ABS(Py_SIZE(v1));
28277db96d56Sopenharmony_ci    size_w = Py_ABS(Py_SIZE(w1));
28287db96d56Sopenharmony_ci    assert(size_v >= size_w && size_w >= 2); /* Assert checks by div() */
28297db96d56Sopenharmony_ci    v = _PyLong_New(size_v+1);
28307db96d56Sopenharmony_ci    if (v == NULL) {
28317db96d56Sopenharmony_ci        *prem = NULL;
28327db96d56Sopenharmony_ci        return NULL;
28337db96d56Sopenharmony_ci    }
28347db96d56Sopenharmony_ci    w = _PyLong_New(size_w);
28357db96d56Sopenharmony_ci    if (w == NULL) {
28367db96d56Sopenharmony_ci        Py_DECREF(v);
28377db96d56Sopenharmony_ci        *prem = NULL;
28387db96d56Sopenharmony_ci        return NULL;
28397db96d56Sopenharmony_ci    }
28407db96d56Sopenharmony_ci
28417db96d56Sopenharmony_ci    /* normalize: shift w1 left so that its top digit is >= PyLong_BASE/2.
28427db96d56Sopenharmony_ci       shift v1 left by the same amount.  Results go into w and v. */
28437db96d56Sopenharmony_ci    d = PyLong_SHIFT - bit_length_digit(w1->ob_digit[size_w-1]);
28447db96d56Sopenharmony_ci    carry = v_lshift(w->ob_digit, w1->ob_digit, size_w, d);
28457db96d56Sopenharmony_ci    assert(carry == 0);
28467db96d56Sopenharmony_ci    carry = v_lshift(v->ob_digit, v1->ob_digit, size_v, d);
28477db96d56Sopenharmony_ci    if (carry != 0 || v->ob_digit[size_v-1] >= w->ob_digit[size_w-1]) {
28487db96d56Sopenharmony_ci        v->ob_digit[size_v] = carry;
28497db96d56Sopenharmony_ci        size_v++;
28507db96d56Sopenharmony_ci    }
28517db96d56Sopenharmony_ci
28527db96d56Sopenharmony_ci    /* Now v->ob_digit[size_v-1] < w->ob_digit[size_w-1], so quotient has
28537db96d56Sopenharmony_ci       at most (and usually exactly) k = size_v - size_w digits. */
28547db96d56Sopenharmony_ci    k = size_v - size_w;
28557db96d56Sopenharmony_ci    assert(k >= 0);
28567db96d56Sopenharmony_ci    a = _PyLong_New(k);
28577db96d56Sopenharmony_ci    if (a == NULL) {
28587db96d56Sopenharmony_ci        Py_DECREF(w);
28597db96d56Sopenharmony_ci        Py_DECREF(v);
28607db96d56Sopenharmony_ci        *prem = NULL;
28617db96d56Sopenharmony_ci        return NULL;
28627db96d56Sopenharmony_ci    }
28637db96d56Sopenharmony_ci    v0 = v->ob_digit;
28647db96d56Sopenharmony_ci    w0 = w->ob_digit;
28657db96d56Sopenharmony_ci    wm1 = w0[size_w-1];
28667db96d56Sopenharmony_ci    wm2 = w0[size_w-2];
28677db96d56Sopenharmony_ci    for (vk = v0+k, ak = a->ob_digit + k; vk-- > v0;) {
28687db96d56Sopenharmony_ci        /* inner loop: divide vk[0:size_w+1] by w0[0:size_w], giving
28697db96d56Sopenharmony_ci           single-digit quotient q, remainder in vk[0:size_w]. */
28707db96d56Sopenharmony_ci
28717db96d56Sopenharmony_ci        SIGCHECK({
28727db96d56Sopenharmony_ci                Py_DECREF(a);
28737db96d56Sopenharmony_ci                Py_DECREF(w);
28747db96d56Sopenharmony_ci                Py_DECREF(v);
28757db96d56Sopenharmony_ci                *prem = NULL;
28767db96d56Sopenharmony_ci                return NULL;
28777db96d56Sopenharmony_ci            });
28787db96d56Sopenharmony_ci
28797db96d56Sopenharmony_ci        /* estimate quotient digit q; may overestimate by 1 (rare) */
28807db96d56Sopenharmony_ci        vtop = vk[size_w];
28817db96d56Sopenharmony_ci        assert(vtop <= wm1);
28827db96d56Sopenharmony_ci        vv = ((twodigits)vtop << PyLong_SHIFT) | vk[size_w-1];
28837db96d56Sopenharmony_ci        /* The code used to compute the remainder via
28847db96d56Sopenharmony_ci         *     r = (digit)(vv - (twodigits)wm1 * q);
28857db96d56Sopenharmony_ci         * and compilers generally generated code to do the * and -.
28867db96d56Sopenharmony_ci         * But modern processors generally compute q and r with a single
28877db96d56Sopenharmony_ci         * instruction, and modern optimizing compilers exploit that if we
28887db96d56Sopenharmony_ci         * _don't_ try to optimize it.
28897db96d56Sopenharmony_ci         */
28907db96d56Sopenharmony_ci        q = (digit)(vv / wm1);
28917db96d56Sopenharmony_ci        r = (digit)(vv % wm1);
28927db96d56Sopenharmony_ci        while ((twodigits)wm2 * q > (((twodigits)r << PyLong_SHIFT)
28937db96d56Sopenharmony_ci                                     | vk[size_w-2])) {
28947db96d56Sopenharmony_ci            --q;
28957db96d56Sopenharmony_ci            r += wm1;
28967db96d56Sopenharmony_ci            if (r >= PyLong_BASE)
28977db96d56Sopenharmony_ci                break;
28987db96d56Sopenharmony_ci        }
28997db96d56Sopenharmony_ci        assert(q <= PyLong_BASE);
29007db96d56Sopenharmony_ci
29017db96d56Sopenharmony_ci        /* subtract q*w0[0:size_w] from vk[0:size_w+1] */
29027db96d56Sopenharmony_ci        zhi = 0;
29037db96d56Sopenharmony_ci        for (i = 0; i < size_w; ++i) {
29047db96d56Sopenharmony_ci            /* invariants: -PyLong_BASE <= -q <= zhi <= 0;
29057db96d56Sopenharmony_ci               -PyLong_BASE * q <= z < PyLong_BASE */
29067db96d56Sopenharmony_ci            z = (sdigit)vk[i] + zhi -
29077db96d56Sopenharmony_ci                (stwodigits)q * (stwodigits)w0[i];
29087db96d56Sopenharmony_ci            vk[i] = (digit)z & PyLong_MASK;
29097db96d56Sopenharmony_ci            zhi = (sdigit)Py_ARITHMETIC_RIGHT_SHIFT(stwodigits,
29107db96d56Sopenharmony_ci                                                    z, PyLong_SHIFT);
29117db96d56Sopenharmony_ci        }
29127db96d56Sopenharmony_ci
29137db96d56Sopenharmony_ci        /* add w back if q was too large (this branch taken rarely) */
29147db96d56Sopenharmony_ci        assert((sdigit)vtop + zhi == -1 || (sdigit)vtop + zhi == 0);
29157db96d56Sopenharmony_ci        if ((sdigit)vtop + zhi < 0) {
29167db96d56Sopenharmony_ci            carry = 0;
29177db96d56Sopenharmony_ci            for (i = 0; i < size_w; ++i) {
29187db96d56Sopenharmony_ci                carry += vk[i] + w0[i];
29197db96d56Sopenharmony_ci                vk[i] = carry & PyLong_MASK;
29207db96d56Sopenharmony_ci                carry >>= PyLong_SHIFT;
29217db96d56Sopenharmony_ci            }
29227db96d56Sopenharmony_ci            --q;
29237db96d56Sopenharmony_ci        }
29247db96d56Sopenharmony_ci
29257db96d56Sopenharmony_ci        /* store quotient digit */
29267db96d56Sopenharmony_ci        assert(q < PyLong_BASE);
29277db96d56Sopenharmony_ci        *--ak = q;
29287db96d56Sopenharmony_ci    }
29297db96d56Sopenharmony_ci
29307db96d56Sopenharmony_ci    /* unshift remainder; we reuse w to store the result */
29317db96d56Sopenharmony_ci    carry = v_rshift(w0, v0, size_w, d);
29327db96d56Sopenharmony_ci    assert(carry==0);
29337db96d56Sopenharmony_ci    Py_DECREF(v);
29347db96d56Sopenharmony_ci
29357db96d56Sopenharmony_ci    *prem = long_normalize(w);
29367db96d56Sopenharmony_ci    return long_normalize(a);
29377db96d56Sopenharmony_ci}
29387db96d56Sopenharmony_ci
29397db96d56Sopenharmony_ci/* For a nonzero PyLong a, express a in the form x * 2**e, with 0.5 <=
29407db96d56Sopenharmony_ci   abs(x) < 1.0 and e >= 0; return x and put e in *e.  Here x is
29417db96d56Sopenharmony_ci   rounded to DBL_MANT_DIG significant bits using round-half-to-even.
29427db96d56Sopenharmony_ci   If a == 0, return 0.0 and set *e = 0.  If the resulting exponent
29437db96d56Sopenharmony_ci   e is larger than PY_SSIZE_T_MAX, raise OverflowError and return
29447db96d56Sopenharmony_ci   -1.0. */
29457db96d56Sopenharmony_ci
29467db96d56Sopenharmony_ci/* attempt to define 2.0**DBL_MANT_DIG as a compile-time constant */
29477db96d56Sopenharmony_ci#if DBL_MANT_DIG == 53
29487db96d56Sopenharmony_ci#define EXP2_DBL_MANT_DIG 9007199254740992.0
29497db96d56Sopenharmony_ci#else
29507db96d56Sopenharmony_ci#define EXP2_DBL_MANT_DIG (ldexp(1.0, DBL_MANT_DIG))
29517db96d56Sopenharmony_ci#endif
29527db96d56Sopenharmony_ci
29537db96d56Sopenharmony_cidouble
29547db96d56Sopenharmony_ci_PyLong_Frexp(PyLongObject *a, Py_ssize_t *e)
29557db96d56Sopenharmony_ci{
29567db96d56Sopenharmony_ci    Py_ssize_t a_size, a_bits, shift_digits, shift_bits, x_size;
29577db96d56Sopenharmony_ci    /* See below for why x_digits is always large enough. */
29587db96d56Sopenharmony_ci    digit rem;
29597db96d56Sopenharmony_ci    digit x_digits[2 + (DBL_MANT_DIG + 1) / PyLong_SHIFT] = {0,};
29607db96d56Sopenharmony_ci    double dx;
29617db96d56Sopenharmony_ci    /* Correction term for round-half-to-even rounding.  For a digit x,
29627db96d56Sopenharmony_ci       "x + half_even_correction[x & 7]" gives x rounded to the nearest
29637db96d56Sopenharmony_ci       multiple of 4, rounding ties to a multiple of 8. */
29647db96d56Sopenharmony_ci    static const int half_even_correction[8] = {0, -1, -2, 1, 0, -1, 2, 1};
29657db96d56Sopenharmony_ci
29667db96d56Sopenharmony_ci    a_size = Py_ABS(Py_SIZE(a));
29677db96d56Sopenharmony_ci    if (a_size == 0) {
29687db96d56Sopenharmony_ci        /* Special case for 0: significand 0.0, exponent 0. */
29697db96d56Sopenharmony_ci        *e = 0;
29707db96d56Sopenharmony_ci        return 0.0;
29717db96d56Sopenharmony_ci    }
29727db96d56Sopenharmony_ci    a_bits = bit_length_digit(a->ob_digit[a_size-1]);
29737db96d56Sopenharmony_ci    /* The following is an overflow-free version of the check
29747db96d56Sopenharmony_ci       "if ((a_size - 1) * PyLong_SHIFT + a_bits > PY_SSIZE_T_MAX) ..." */
29757db96d56Sopenharmony_ci    if (a_size >= (PY_SSIZE_T_MAX - 1) / PyLong_SHIFT + 1 &&
29767db96d56Sopenharmony_ci        (a_size > (PY_SSIZE_T_MAX - 1) / PyLong_SHIFT + 1 ||
29777db96d56Sopenharmony_ci         a_bits > (PY_SSIZE_T_MAX - 1) % PyLong_SHIFT + 1))
29787db96d56Sopenharmony_ci        goto overflow;
29797db96d56Sopenharmony_ci    a_bits = (a_size - 1) * PyLong_SHIFT + a_bits;
29807db96d56Sopenharmony_ci
29817db96d56Sopenharmony_ci    /* Shift the first DBL_MANT_DIG + 2 bits of a into x_digits[0:x_size]
29827db96d56Sopenharmony_ci       (shifting left if a_bits <= DBL_MANT_DIG + 2).
29837db96d56Sopenharmony_ci
29847db96d56Sopenharmony_ci       Number of digits needed for result: write // for floor division.
29857db96d56Sopenharmony_ci       Then if shifting left, we end up using
29867db96d56Sopenharmony_ci
29877db96d56Sopenharmony_ci         1 + a_size + (DBL_MANT_DIG + 2 - a_bits) // PyLong_SHIFT
29887db96d56Sopenharmony_ci
29897db96d56Sopenharmony_ci       digits.  If shifting right, we use
29907db96d56Sopenharmony_ci
29917db96d56Sopenharmony_ci         a_size - (a_bits - DBL_MANT_DIG - 2) // PyLong_SHIFT
29927db96d56Sopenharmony_ci
29937db96d56Sopenharmony_ci       digits.  Using a_size = 1 + (a_bits - 1) // PyLong_SHIFT along with
29947db96d56Sopenharmony_ci       the inequalities
29957db96d56Sopenharmony_ci
29967db96d56Sopenharmony_ci         m // PyLong_SHIFT + n // PyLong_SHIFT <= (m + n) // PyLong_SHIFT
29977db96d56Sopenharmony_ci         m // PyLong_SHIFT - n // PyLong_SHIFT <=
29987db96d56Sopenharmony_ci                                          1 + (m - n - 1) // PyLong_SHIFT,
29997db96d56Sopenharmony_ci
30007db96d56Sopenharmony_ci       valid for any integers m and n, we find that x_size satisfies
30017db96d56Sopenharmony_ci
30027db96d56Sopenharmony_ci         x_size <= 2 + (DBL_MANT_DIG + 1) // PyLong_SHIFT
30037db96d56Sopenharmony_ci
30047db96d56Sopenharmony_ci       in both cases.
30057db96d56Sopenharmony_ci    */
30067db96d56Sopenharmony_ci    if (a_bits <= DBL_MANT_DIG + 2) {
30077db96d56Sopenharmony_ci        shift_digits = (DBL_MANT_DIG + 2 - a_bits) / PyLong_SHIFT;
30087db96d56Sopenharmony_ci        shift_bits = (DBL_MANT_DIG + 2 - a_bits) % PyLong_SHIFT;
30097db96d56Sopenharmony_ci        x_size = shift_digits;
30107db96d56Sopenharmony_ci        rem = v_lshift(x_digits + x_size, a->ob_digit, a_size,
30117db96d56Sopenharmony_ci                       (int)shift_bits);
30127db96d56Sopenharmony_ci        x_size += a_size;
30137db96d56Sopenharmony_ci        x_digits[x_size++] = rem;
30147db96d56Sopenharmony_ci    }
30157db96d56Sopenharmony_ci    else {
30167db96d56Sopenharmony_ci        shift_digits = (a_bits - DBL_MANT_DIG - 2) / PyLong_SHIFT;
30177db96d56Sopenharmony_ci        shift_bits = (a_bits - DBL_MANT_DIG - 2) % PyLong_SHIFT;
30187db96d56Sopenharmony_ci        rem = v_rshift(x_digits, a->ob_digit + shift_digits,
30197db96d56Sopenharmony_ci                       a_size - shift_digits, (int)shift_bits);
30207db96d56Sopenharmony_ci        x_size = a_size - shift_digits;
30217db96d56Sopenharmony_ci        /* For correct rounding below, we need the least significant
30227db96d56Sopenharmony_ci           bit of x to be 'sticky' for this shift: if any of the bits
30237db96d56Sopenharmony_ci           shifted out was nonzero, we set the least significant bit
30247db96d56Sopenharmony_ci           of x. */
30257db96d56Sopenharmony_ci        if (rem)
30267db96d56Sopenharmony_ci            x_digits[0] |= 1;
30277db96d56Sopenharmony_ci        else
30287db96d56Sopenharmony_ci            while (shift_digits > 0)
30297db96d56Sopenharmony_ci                if (a->ob_digit[--shift_digits]) {
30307db96d56Sopenharmony_ci                    x_digits[0] |= 1;
30317db96d56Sopenharmony_ci                    break;
30327db96d56Sopenharmony_ci                }
30337db96d56Sopenharmony_ci    }
30347db96d56Sopenharmony_ci    assert(1 <= x_size && x_size <= (Py_ssize_t)Py_ARRAY_LENGTH(x_digits));
30357db96d56Sopenharmony_ci
30367db96d56Sopenharmony_ci    /* Round, and convert to double. */
30377db96d56Sopenharmony_ci    x_digits[0] += half_even_correction[x_digits[0] & 7];
30387db96d56Sopenharmony_ci    dx = x_digits[--x_size];
30397db96d56Sopenharmony_ci    while (x_size > 0)
30407db96d56Sopenharmony_ci        dx = dx * PyLong_BASE + x_digits[--x_size];
30417db96d56Sopenharmony_ci
30427db96d56Sopenharmony_ci    /* Rescale;  make correction if result is 1.0. */
30437db96d56Sopenharmony_ci    dx /= 4.0 * EXP2_DBL_MANT_DIG;
30447db96d56Sopenharmony_ci    if (dx == 1.0) {
30457db96d56Sopenharmony_ci        if (a_bits == PY_SSIZE_T_MAX)
30467db96d56Sopenharmony_ci            goto overflow;
30477db96d56Sopenharmony_ci        dx = 0.5;
30487db96d56Sopenharmony_ci        a_bits += 1;
30497db96d56Sopenharmony_ci    }
30507db96d56Sopenharmony_ci
30517db96d56Sopenharmony_ci    *e = a_bits;
30527db96d56Sopenharmony_ci    return Py_SIZE(a) < 0 ? -dx : dx;
30537db96d56Sopenharmony_ci
30547db96d56Sopenharmony_ci  overflow:
30557db96d56Sopenharmony_ci    /* exponent > PY_SSIZE_T_MAX */
30567db96d56Sopenharmony_ci    PyErr_SetString(PyExc_OverflowError,
30577db96d56Sopenharmony_ci                    "huge integer: number of bits overflows a Py_ssize_t");
30587db96d56Sopenharmony_ci    *e = 0;
30597db96d56Sopenharmony_ci    return -1.0;
30607db96d56Sopenharmony_ci}
30617db96d56Sopenharmony_ci
30627db96d56Sopenharmony_ci/* Get a C double from an int object.  Rounds to the nearest double,
30637db96d56Sopenharmony_ci   using the round-half-to-even rule in the case of a tie. */
30647db96d56Sopenharmony_ci
30657db96d56Sopenharmony_cidouble
30667db96d56Sopenharmony_ciPyLong_AsDouble(PyObject *v)
30677db96d56Sopenharmony_ci{
30687db96d56Sopenharmony_ci    Py_ssize_t exponent;
30697db96d56Sopenharmony_ci    double x;
30707db96d56Sopenharmony_ci
30717db96d56Sopenharmony_ci    if (v == NULL) {
30727db96d56Sopenharmony_ci        PyErr_BadInternalCall();
30737db96d56Sopenharmony_ci        return -1.0;
30747db96d56Sopenharmony_ci    }
30757db96d56Sopenharmony_ci    if (!PyLong_Check(v)) {
30767db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "an integer is required");
30777db96d56Sopenharmony_ci        return -1.0;
30787db96d56Sopenharmony_ci    }
30797db96d56Sopenharmony_ci    if (IS_MEDIUM_VALUE(v)) {
30807db96d56Sopenharmony_ci        /* Fast path; single digit long (31 bits) will cast safely
30817db96d56Sopenharmony_ci           to double.  This improves performance of FP/long operations
30827db96d56Sopenharmony_ci           by 20%.
30837db96d56Sopenharmony_ci        */
30847db96d56Sopenharmony_ci        return (double)medium_value((PyLongObject *)v);
30857db96d56Sopenharmony_ci    }
30867db96d56Sopenharmony_ci    x = _PyLong_Frexp((PyLongObject *)v, &exponent);
30877db96d56Sopenharmony_ci    if ((x == -1.0 && PyErr_Occurred()) || exponent > DBL_MAX_EXP) {
30887db96d56Sopenharmony_ci        PyErr_SetString(PyExc_OverflowError,
30897db96d56Sopenharmony_ci                        "int too large to convert to float");
30907db96d56Sopenharmony_ci        return -1.0;
30917db96d56Sopenharmony_ci    }
30927db96d56Sopenharmony_ci    return ldexp(x, (int)exponent);
30937db96d56Sopenharmony_ci}
30947db96d56Sopenharmony_ci
30957db96d56Sopenharmony_ci/* Methods */
30967db96d56Sopenharmony_ci
30977db96d56Sopenharmony_ci/* if a < b, return a negative number
30987db96d56Sopenharmony_ci   if a == b, return 0
30997db96d56Sopenharmony_ci   if a > b, return a positive number */
31007db96d56Sopenharmony_ci
31017db96d56Sopenharmony_cistatic Py_ssize_t
31027db96d56Sopenharmony_cilong_compare(PyLongObject *a, PyLongObject *b)
31037db96d56Sopenharmony_ci{
31047db96d56Sopenharmony_ci    Py_ssize_t sign = Py_SIZE(a) - Py_SIZE(b);
31057db96d56Sopenharmony_ci    if (sign == 0) {
31067db96d56Sopenharmony_ci        Py_ssize_t i = Py_ABS(Py_SIZE(a));
31077db96d56Sopenharmony_ci        sdigit diff = 0;
31087db96d56Sopenharmony_ci        while (--i >= 0) {
31097db96d56Sopenharmony_ci            diff = (sdigit) a->ob_digit[i] - (sdigit) b->ob_digit[i];
31107db96d56Sopenharmony_ci            if (diff) {
31117db96d56Sopenharmony_ci                break;
31127db96d56Sopenharmony_ci            }
31137db96d56Sopenharmony_ci        }
31147db96d56Sopenharmony_ci        sign = Py_SIZE(a) < 0 ? -diff : diff;
31157db96d56Sopenharmony_ci    }
31167db96d56Sopenharmony_ci    return sign;
31177db96d56Sopenharmony_ci}
31187db96d56Sopenharmony_ci
31197db96d56Sopenharmony_cistatic PyObject *
31207db96d56Sopenharmony_cilong_richcompare(PyObject *self, PyObject *other, int op)
31217db96d56Sopenharmony_ci{
31227db96d56Sopenharmony_ci    Py_ssize_t result;
31237db96d56Sopenharmony_ci    CHECK_BINOP(self, other);
31247db96d56Sopenharmony_ci    if (self == other)
31257db96d56Sopenharmony_ci        result = 0;
31267db96d56Sopenharmony_ci    else
31277db96d56Sopenharmony_ci        result = long_compare((PyLongObject*)self, (PyLongObject*)other);
31287db96d56Sopenharmony_ci    Py_RETURN_RICHCOMPARE(result, 0, op);
31297db96d56Sopenharmony_ci}
31307db96d56Sopenharmony_ci
31317db96d56Sopenharmony_cistatic Py_hash_t
31327db96d56Sopenharmony_cilong_hash(PyLongObject *v)
31337db96d56Sopenharmony_ci{
31347db96d56Sopenharmony_ci    Py_uhash_t x;
31357db96d56Sopenharmony_ci    Py_ssize_t i;
31367db96d56Sopenharmony_ci    int sign;
31377db96d56Sopenharmony_ci
31387db96d56Sopenharmony_ci    i = Py_SIZE(v);
31397db96d56Sopenharmony_ci    switch(i) {
31407db96d56Sopenharmony_ci    case -1: return v->ob_digit[0]==1 ? -2 : -(sdigit)v->ob_digit[0];
31417db96d56Sopenharmony_ci    case 0: return 0;
31427db96d56Sopenharmony_ci    case 1: return v->ob_digit[0];
31437db96d56Sopenharmony_ci    }
31447db96d56Sopenharmony_ci    sign = 1;
31457db96d56Sopenharmony_ci    x = 0;
31467db96d56Sopenharmony_ci    if (i < 0) {
31477db96d56Sopenharmony_ci        sign = -1;
31487db96d56Sopenharmony_ci        i = -(i);
31497db96d56Sopenharmony_ci    }
31507db96d56Sopenharmony_ci    while (--i >= 0) {
31517db96d56Sopenharmony_ci        /* Here x is a quantity in the range [0, _PyHASH_MODULUS); we
31527db96d56Sopenharmony_ci           want to compute x * 2**PyLong_SHIFT + v->ob_digit[i] modulo
31537db96d56Sopenharmony_ci           _PyHASH_MODULUS.
31547db96d56Sopenharmony_ci
31557db96d56Sopenharmony_ci           The computation of x * 2**PyLong_SHIFT % _PyHASH_MODULUS
31567db96d56Sopenharmony_ci           amounts to a rotation of the bits of x.  To see this, write
31577db96d56Sopenharmony_ci
31587db96d56Sopenharmony_ci             x * 2**PyLong_SHIFT = y * 2**_PyHASH_BITS + z
31597db96d56Sopenharmony_ci
31607db96d56Sopenharmony_ci           where y = x >> (_PyHASH_BITS - PyLong_SHIFT) gives the top
31617db96d56Sopenharmony_ci           PyLong_SHIFT bits of x (those that are shifted out of the
31627db96d56Sopenharmony_ci           original _PyHASH_BITS bits, and z = (x << PyLong_SHIFT) &
31637db96d56Sopenharmony_ci           _PyHASH_MODULUS gives the bottom _PyHASH_BITS - PyLong_SHIFT
31647db96d56Sopenharmony_ci           bits of x, shifted up.  Then since 2**_PyHASH_BITS is
31657db96d56Sopenharmony_ci           congruent to 1 modulo _PyHASH_MODULUS, y*2**_PyHASH_BITS is
31667db96d56Sopenharmony_ci           congruent to y modulo _PyHASH_MODULUS.  So
31677db96d56Sopenharmony_ci
31687db96d56Sopenharmony_ci             x * 2**PyLong_SHIFT = y + z (mod _PyHASH_MODULUS).
31697db96d56Sopenharmony_ci
31707db96d56Sopenharmony_ci           The right-hand side is just the result of rotating the
31717db96d56Sopenharmony_ci           _PyHASH_BITS bits of x left by PyLong_SHIFT places; since
31727db96d56Sopenharmony_ci           not all _PyHASH_BITS bits of x are 1s, the same is true
31737db96d56Sopenharmony_ci           after rotation, so 0 <= y+z < _PyHASH_MODULUS and y + z is
31747db96d56Sopenharmony_ci           the reduction of x*2**PyLong_SHIFT modulo
31757db96d56Sopenharmony_ci           _PyHASH_MODULUS. */
31767db96d56Sopenharmony_ci        x = ((x << PyLong_SHIFT) & _PyHASH_MODULUS) |
31777db96d56Sopenharmony_ci            (x >> (_PyHASH_BITS - PyLong_SHIFT));
31787db96d56Sopenharmony_ci        x += v->ob_digit[i];
31797db96d56Sopenharmony_ci        if (x >= _PyHASH_MODULUS)
31807db96d56Sopenharmony_ci            x -= _PyHASH_MODULUS;
31817db96d56Sopenharmony_ci    }
31827db96d56Sopenharmony_ci    x = x * sign;
31837db96d56Sopenharmony_ci    if (x == (Py_uhash_t)-1)
31847db96d56Sopenharmony_ci        x = (Py_uhash_t)-2;
31857db96d56Sopenharmony_ci    return (Py_hash_t)x;
31867db96d56Sopenharmony_ci}
31877db96d56Sopenharmony_ci
31887db96d56Sopenharmony_ci
31897db96d56Sopenharmony_ci/* Add the absolute values of two integers. */
31907db96d56Sopenharmony_ci
31917db96d56Sopenharmony_cistatic PyLongObject *
31927db96d56Sopenharmony_cix_add(PyLongObject *a, PyLongObject *b)
31937db96d56Sopenharmony_ci{
31947db96d56Sopenharmony_ci    Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
31957db96d56Sopenharmony_ci    PyLongObject *z;
31967db96d56Sopenharmony_ci    Py_ssize_t i;
31977db96d56Sopenharmony_ci    digit carry = 0;
31987db96d56Sopenharmony_ci
31997db96d56Sopenharmony_ci    /* Ensure a is the larger of the two: */
32007db96d56Sopenharmony_ci    if (size_a < size_b) {
32017db96d56Sopenharmony_ci        { PyLongObject *temp = a; a = b; b = temp; }
32027db96d56Sopenharmony_ci        { Py_ssize_t size_temp = size_a;
32037db96d56Sopenharmony_ci            size_a = size_b;
32047db96d56Sopenharmony_ci            size_b = size_temp; }
32057db96d56Sopenharmony_ci    }
32067db96d56Sopenharmony_ci    z = _PyLong_New(size_a+1);
32077db96d56Sopenharmony_ci    if (z == NULL)
32087db96d56Sopenharmony_ci        return NULL;
32097db96d56Sopenharmony_ci    for (i = 0; i < size_b; ++i) {
32107db96d56Sopenharmony_ci        carry += a->ob_digit[i] + b->ob_digit[i];
32117db96d56Sopenharmony_ci        z->ob_digit[i] = carry & PyLong_MASK;
32127db96d56Sopenharmony_ci        carry >>= PyLong_SHIFT;
32137db96d56Sopenharmony_ci    }
32147db96d56Sopenharmony_ci    for (; i < size_a; ++i) {
32157db96d56Sopenharmony_ci        carry += a->ob_digit[i];
32167db96d56Sopenharmony_ci        z->ob_digit[i] = carry & PyLong_MASK;
32177db96d56Sopenharmony_ci        carry >>= PyLong_SHIFT;
32187db96d56Sopenharmony_ci    }
32197db96d56Sopenharmony_ci    z->ob_digit[i] = carry;
32207db96d56Sopenharmony_ci    return long_normalize(z);
32217db96d56Sopenharmony_ci}
32227db96d56Sopenharmony_ci
32237db96d56Sopenharmony_ci/* Subtract the absolute values of two integers. */
32247db96d56Sopenharmony_ci
32257db96d56Sopenharmony_cistatic PyLongObject *
32267db96d56Sopenharmony_cix_sub(PyLongObject *a, PyLongObject *b)
32277db96d56Sopenharmony_ci{
32287db96d56Sopenharmony_ci    Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
32297db96d56Sopenharmony_ci    PyLongObject *z;
32307db96d56Sopenharmony_ci    Py_ssize_t i;
32317db96d56Sopenharmony_ci    int sign = 1;
32327db96d56Sopenharmony_ci    digit borrow = 0;
32337db96d56Sopenharmony_ci
32347db96d56Sopenharmony_ci    /* Ensure a is the larger of the two: */
32357db96d56Sopenharmony_ci    if (size_a < size_b) {
32367db96d56Sopenharmony_ci        sign = -1;
32377db96d56Sopenharmony_ci        { PyLongObject *temp = a; a = b; b = temp; }
32387db96d56Sopenharmony_ci        { Py_ssize_t size_temp = size_a;
32397db96d56Sopenharmony_ci            size_a = size_b;
32407db96d56Sopenharmony_ci            size_b = size_temp; }
32417db96d56Sopenharmony_ci    }
32427db96d56Sopenharmony_ci    else if (size_a == size_b) {
32437db96d56Sopenharmony_ci        /* Find highest digit where a and b differ: */
32447db96d56Sopenharmony_ci        i = size_a;
32457db96d56Sopenharmony_ci        while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
32467db96d56Sopenharmony_ci            ;
32477db96d56Sopenharmony_ci        if (i < 0)
32487db96d56Sopenharmony_ci            return (PyLongObject *)PyLong_FromLong(0);
32497db96d56Sopenharmony_ci        if (a->ob_digit[i] < b->ob_digit[i]) {
32507db96d56Sopenharmony_ci            sign = -1;
32517db96d56Sopenharmony_ci            { PyLongObject *temp = a; a = b; b = temp; }
32527db96d56Sopenharmony_ci        }
32537db96d56Sopenharmony_ci        size_a = size_b = i+1;
32547db96d56Sopenharmony_ci    }
32557db96d56Sopenharmony_ci    z = _PyLong_New(size_a);
32567db96d56Sopenharmony_ci    if (z == NULL)
32577db96d56Sopenharmony_ci        return NULL;
32587db96d56Sopenharmony_ci    for (i = 0; i < size_b; ++i) {
32597db96d56Sopenharmony_ci        /* The following assumes unsigned arithmetic
32607db96d56Sopenharmony_ci           works module 2**N for some N>PyLong_SHIFT. */
32617db96d56Sopenharmony_ci        borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
32627db96d56Sopenharmony_ci        z->ob_digit[i] = borrow & PyLong_MASK;
32637db96d56Sopenharmony_ci        borrow >>= PyLong_SHIFT;
32647db96d56Sopenharmony_ci        borrow &= 1; /* Keep only one sign bit */
32657db96d56Sopenharmony_ci    }
32667db96d56Sopenharmony_ci    for (; i < size_a; ++i) {
32677db96d56Sopenharmony_ci        borrow = a->ob_digit[i] - borrow;
32687db96d56Sopenharmony_ci        z->ob_digit[i] = borrow & PyLong_MASK;
32697db96d56Sopenharmony_ci        borrow >>= PyLong_SHIFT;
32707db96d56Sopenharmony_ci        borrow &= 1; /* Keep only one sign bit */
32717db96d56Sopenharmony_ci    }
32727db96d56Sopenharmony_ci    assert(borrow == 0);
32737db96d56Sopenharmony_ci    if (sign < 0) {
32747db96d56Sopenharmony_ci        Py_SET_SIZE(z, -Py_SIZE(z));
32757db96d56Sopenharmony_ci    }
32767db96d56Sopenharmony_ci    return maybe_small_long(long_normalize(z));
32777db96d56Sopenharmony_ci}
32787db96d56Sopenharmony_ci
32797db96d56Sopenharmony_ciPyObject *
32807db96d56Sopenharmony_ci_PyLong_Add(PyLongObject *a, PyLongObject *b)
32817db96d56Sopenharmony_ci{
32827db96d56Sopenharmony_ci    if (IS_MEDIUM_VALUE(a) && IS_MEDIUM_VALUE(b)) {
32837db96d56Sopenharmony_ci        return _PyLong_FromSTwoDigits(medium_value(a) + medium_value(b));
32847db96d56Sopenharmony_ci    }
32857db96d56Sopenharmony_ci
32867db96d56Sopenharmony_ci    PyLongObject *z;
32877db96d56Sopenharmony_ci    if (Py_SIZE(a) < 0) {
32887db96d56Sopenharmony_ci        if (Py_SIZE(b) < 0) {
32897db96d56Sopenharmony_ci            z = x_add(a, b);
32907db96d56Sopenharmony_ci            if (z != NULL) {
32917db96d56Sopenharmony_ci                /* x_add received at least one multiple-digit int,
32927db96d56Sopenharmony_ci                   and thus z must be a multiple-digit int.
32937db96d56Sopenharmony_ci                   That also means z is not an element of
32947db96d56Sopenharmony_ci                   small_ints, so negating it in-place is safe. */
32957db96d56Sopenharmony_ci                assert(Py_REFCNT(z) == 1);
32967db96d56Sopenharmony_ci                Py_SET_SIZE(z, -(Py_SIZE(z)));
32977db96d56Sopenharmony_ci            }
32987db96d56Sopenharmony_ci        }
32997db96d56Sopenharmony_ci        else
33007db96d56Sopenharmony_ci            z = x_sub(b, a);
33017db96d56Sopenharmony_ci    }
33027db96d56Sopenharmony_ci    else {
33037db96d56Sopenharmony_ci        if (Py_SIZE(b) < 0)
33047db96d56Sopenharmony_ci            z = x_sub(a, b);
33057db96d56Sopenharmony_ci        else
33067db96d56Sopenharmony_ci            z = x_add(a, b);
33077db96d56Sopenharmony_ci    }
33087db96d56Sopenharmony_ci    return (PyObject *)z;
33097db96d56Sopenharmony_ci}
33107db96d56Sopenharmony_ci
33117db96d56Sopenharmony_cistatic PyObject *
33127db96d56Sopenharmony_cilong_add(PyLongObject *a, PyLongObject *b)
33137db96d56Sopenharmony_ci{
33147db96d56Sopenharmony_ci    CHECK_BINOP(a, b);
33157db96d56Sopenharmony_ci    return _PyLong_Add(a, b);
33167db96d56Sopenharmony_ci}
33177db96d56Sopenharmony_ci
33187db96d56Sopenharmony_ciPyObject *
33197db96d56Sopenharmony_ci_PyLong_Subtract(PyLongObject *a, PyLongObject *b)
33207db96d56Sopenharmony_ci{
33217db96d56Sopenharmony_ci    PyLongObject *z;
33227db96d56Sopenharmony_ci
33237db96d56Sopenharmony_ci    if (IS_MEDIUM_VALUE(a) && IS_MEDIUM_VALUE(b)) {
33247db96d56Sopenharmony_ci        return _PyLong_FromSTwoDigits(medium_value(a) - medium_value(b));
33257db96d56Sopenharmony_ci    }
33267db96d56Sopenharmony_ci    if (Py_SIZE(a) < 0) {
33277db96d56Sopenharmony_ci        if (Py_SIZE(b) < 0) {
33287db96d56Sopenharmony_ci            z = x_sub(b, a);
33297db96d56Sopenharmony_ci        }
33307db96d56Sopenharmony_ci        else {
33317db96d56Sopenharmony_ci            z = x_add(a, b);
33327db96d56Sopenharmony_ci            if (z != NULL) {
33337db96d56Sopenharmony_ci                assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1);
33347db96d56Sopenharmony_ci                Py_SET_SIZE(z, -(Py_SIZE(z)));
33357db96d56Sopenharmony_ci            }
33367db96d56Sopenharmony_ci        }
33377db96d56Sopenharmony_ci    }
33387db96d56Sopenharmony_ci    else {
33397db96d56Sopenharmony_ci        if (Py_SIZE(b) < 0)
33407db96d56Sopenharmony_ci            z = x_add(a, b);
33417db96d56Sopenharmony_ci        else
33427db96d56Sopenharmony_ci            z = x_sub(a, b);
33437db96d56Sopenharmony_ci    }
33447db96d56Sopenharmony_ci    return (PyObject *)z;
33457db96d56Sopenharmony_ci}
33467db96d56Sopenharmony_ci
33477db96d56Sopenharmony_cistatic PyObject *
33487db96d56Sopenharmony_cilong_sub(PyLongObject *a, PyLongObject *b)
33497db96d56Sopenharmony_ci{
33507db96d56Sopenharmony_ci    CHECK_BINOP(a, b);
33517db96d56Sopenharmony_ci    return _PyLong_Subtract(a, b);
33527db96d56Sopenharmony_ci}
33537db96d56Sopenharmony_ci
33547db96d56Sopenharmony_ci/* Grade school multiplication, ignoring the signs.
33557db96d56Sopenharmony_ci * Returns the absolute value of the product, or NULL if error.
33567db96d56Sopenharmony_ci */
33577db96d56Sopenharmony_cistatic PyLongObject *
33587db96d56Sopenharmony_cix_mul(PyLongObject *a, PyLongObject *b)
33597db96d56Sopenharmony_ci{
33607db96d56Sopenharmony_ci    PyLongObject *z;
33617db96d56Sopenharmony_ci    Py_ssize_t size_a = Py_ABS(Py_SIZE(a));
33627db96d56Sopenharmony_ci    Py_ssize_t size_b = Py_ABS(Py_SIZE(b));
33637db96d56Sopenharmony_ci    Py_ssize_t i;
33647db96d56Sopenharmony_ci
33657db96d56Sopenharmony_ci    z = _PyLong_New(size_a + size_b);
33667db96d56Sopenharmony_ci    if (z == NULL)
33677db96d56Sopenharmony_ci        return NULL;
33687db96d56Sopenharmony_ci
33697db96d56Sopenharmony_ci    memset(z->ob_digit, 0, Py_SIZE(z) * sizeof(digit));
33707db96d56Sopenharmony_ci    if (a == b) {
33717db96d56Sopenharmony_ci        /* Efficient squaring per HAC, Algorithm 14.16:
33727db96d56Sopenharmony_ci         * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
33737db96d56Sopenharmony_ci         * Gives slightly less than a 2x speedup when a == b,
33747db96d56Sopenharmony_ci         * via exploiting that each entry in the multiplication
33757db96d56Sopenharmony_ci         * pyramid appears twice (except for the size_a squares).
33767db96d56Sopenharmony_ci         */
33777db96d56Sopenharmony_ci        digit *paend = a->ob_digit + size_a;
33787db96d56Sopenharmony_ci        for (i = 0; i < size_a; ++i) {
33797db96d56Sopenharmony_ci            twodigits carry;
33807db96d56Sopenharmony_ci            twodigits f = a->ob_digit[i];
33817db96d56Sopenharmony_ci            digit *pz = z->ob_digit + (i << 1);
33827db96d56Sopenharmony_ci            digit *pa = a->ob_digit + i + 1;
33837db96d56Sopenharmony_ci
33847db96d56Sopenharmony_ci            SIGCHECK({
33857db96d56Sopenharmony_ci                    Py_DECREF(z);
33867db96d56Sopenharmony_ci                    return NULL;
33877db96d56Sopenharmony_ci                });
33887db96d56Sopenharmony_ci
33897db96d56Sopenharmony_ci            carry = *pz + f * f;
33907db96d56Sopenharmony_ci            *pz++ = (digit)(carry & PyLong_MASK);
33917db96d56Sopenharmony_ci            carry >>= PyLong_SHIFT;
33927db96d56Sopenharmony_ci            assert(carry <= PyLong_MASK);
33937db96d56Sopenharmony_ci
33947db96d56Sopenharmony_ci            /* Now f is added in twice in each column of the
33957db96d56Sopenharmony_ci             * pyramid it appears.  Same as adding f<<1 once.
33967db96d56Sopenharmony_ci             */
33977db96d56Sopenharmony_ci            f <<= 1;
33987db96d56Sopenharmony_ci            while (pa < paend) {
33997db96d56Sopenharmony_ci                carry += *pz + *pa++ * f;
34007db96d56Sopenharmony_ci                *pz++ = (digit)(carry & PyLong_MASK);
34017db96d56Sopenharmony_ci                carry >>= PyLong_SHIFT;
34027db96d56Sopenharmony_ci                assert(carry <= (PyLong_MASK << 1));
34037db96d56Sopenharmony_ci            }
34047db96d56Sopenharmony_ci            if (carry) {
34057db96d56Sopenharmony_ci                /* See comment below. pz points at the highest possible
34067db96d56Sopenharmony_ci                 * carry position from the last outer loop iteration, so
34077db96d56Sopenharmony_ci                 * *pz is at most 1.
34087db96d56Sopenharmony_ci                 */
34097db96d56Sopenharmony_ci                assert(*pz <= 1);
34107db96d56Sopenharmony_ci                carry += *pz;
34117db96d56Sopenharmony_ci                *pz = (digit)(carry & PyLong_MASK);
34127db96d56Sopenharmony_ci                carry >>= PyLong_SHIFT;
34137db96d56Sopenharmony_ci                if (carry) {
34147db96d56Sopenharmony_ci                    /* If there's still a carry, it must be into a position
34157db96d56Sopenharmony_ci                     * that still holds a 0. Where the base
34167db96d56Sopenharmony_ci                     ^ B is 1 << PyLong_SHIFT, the last add was of a carry no
34177db96d56Sopenharmony_ci                     * more than 2*B - 2 to a stored digit no more than 1.
34187db96d56Sopenharmony_ci                     * So the sum was no more than 2*B - 1, so the current
34197db96d56Sopenharmony_ci                     * carry no more than floor((2*B - 1)/B) = 1.
34207db96d56Sopenharmony_ci                     */
34217db96d56Sopenharmony_ci                    assert(carry == 1);
34227db96d56Sopenharmony_ci                    assert(pz[1] == 0);
34237db96d56Sopenharmony_ci                    pz[1] = (digit)carry;
34247db96d56Sopenharmony_ci                }
34257db96d56Sopenharmony_ci            }
34267db96d56Sopenharmony_ci        }
34277db96d56Sopenharmony_ci    }
34287db96d56Sopenharmony_ci    else {      /* a is not the same as b -- gradeschool int mult */
34297db96d56Sopenharmony_ci        for (i = 0; i < size_a; ++i) {
34307db96d56Sopenharmony_ci            twodigits carry = 0;
34317db96d56Sopenharmony_ci            twodigits f = a->ob_digit[i];
34327db96d56Sopenharmony_ci            digit *pz = z->ob_digit + i;
34337db96d56Sopenharmony_ci            digit *pb = b->ob_digit;
34347db96d56Sopenharmony_ci            digit *pbend = b->ob_digit + size_b;
34357db96d56Sopenharmony_ci
34367db96d56Sopenharmony_ci            SIGCHECK({
34377db96d56Sopenharmony_ci                    Py_DECREF(z);
34387db96d56Sopenharmony_ci                    return NULL;
34397db96d56Sopenharmony_ci                });
34407db96d56Sopenharmony_ci
34417db96d56Sopenharmony_ci            while (pb < pbend) {
34427db96d56Sopenharmony_ci                carry += *pz + *pb++ * f;
34437db96d56Sopenharmony_ci                *pz++ = (digit)(carry & PyLong_MASK);
34447db96d56Sopenharmony_ci                carry >>= PyLong_SHIFT;
34457db96d56Sopenharmony_ci                assert(carry <= PyLong_MASK);
34467db96d56Sopenharmony_ci            }
34477db96d56Sopenharmony_ci            if (carry)
34487db96d56Sopenharmony_ci                *pz += (digit)(carry & PyLong_MASK);
34497db96d56Sopenharmony_ci            assert((carry >> PyLong_SHIFT) == 0);
34507db96d56Sopenharmony_ci        }
34517db96d56Sopenharmony_ci    }
34527db96d56Sopenharmony_ci    return long_normalize(z);
34537db96d56Sopenharmony_ci}
34547db96d56Sopenharmony_ci
34557db96d56Sopenharmony_ci/* A helper for Karatsuba multiplication (k_mul).
34567db96d56Sopenharmony_ci   Takes an int "n" and an integer "size" representing the place to
34577db96d56Sopenharmony_ci   split, and sets low and high such that abs(n) == (high << size) + low,
34587db96d56Sopenharmony_ci   viewing the shift as being by digits.  The sign bit is ignored, and
34597db96d56Sopenharmony_ci   the return values are >= 0.
34607db96d56Sopenharmony_ci   Returns 0 on success, -1 on failure.
34617db96d56Sopenharmony_ci*/
34627db96d56Sopenharmony_cistatic int
34637db96d56Sopenharmony_cikmul_split(PyLongObject *n,
34647db96d56Sopenharmony_ci           Py_ssize_t size,
34657db96d56Sopenharmony_ci           PyLongObject **high,
34667db96d56Sopenharmony_ci           PyLongObject **low)
34677db96d56Sopenharmony_ci{
34687db96d56Sopenharmony_ci    PyLongObject *hi, *lo;
34697db96d56Sopenharmony_ci    Py_ssize_t size_lo, size_hi;
34707db96d56Sopenharmony_ci    const Py_ssize_t size_n = Py_ABS(Py_SIZE(n));
34717db96d56Sopenharmony_ci
34727db96d56Sopenharmony_ci    size_lo = Py_MIN(size_n, size);
34737db96d56Sopenharmony_ci    size_hi = size_n - size_lo;
34747db96d56Sopenharmony_ci
34757db96d56Sopenharmony_ci    if ((hi = _PyLong_New(size_hi)) == NULL)
34767db96d56Sopenharmony_ci        return -1;
34777db96d56Sopenharmony_ci    if ((lo = _PyLong_New(size_lo)) == NULL) {
34787db96d56Sopenharmony_ci        Py_DECREF(hi);
34797db96d56Sopenharmony_ci        return -1;
34807db96d56Sopenharmony_ci    }
34817db96d56Sopenharmony_ci
34827db96d56Sopenharmony_ci    memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
34837db96d56Sopenharmony_ci    memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
34847db96d56Sopenharmony_ci
34857db96d56Sopenharmony_ci    *high = long_normalize(hi);
34867db96d56Sopenharmony_ci    *low = long_normalize(lo);
34877db96d56Sopenharmony_ci    return 0;
34887db96d56Sopenharmony_ci}
34897db96d56Sopenharmony_ci
34907db96d56Sopenharmony_cistatic PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
34917db96d56Sopenharmony_ci
34927db96d56Sopenharmony_ci/* Karatsuba multiplication.  Ignores the input signs, and returns the
34937db96d56Sopenharmony_ci * absolute value of the product (or NULL if error).
34947db96d56Sopenharmony_ci * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
34957db96d56Sopenharmony_ci */
34967db96d56Sopenharmony_cistatic PyLongObject *
34977db96d56Sopenharmony_cik_mul(PyLongObject *a, PyLongObject *b)
34987db96d56Sopenharmony_ci{
34997db96d56Sopenharmony_ci    Py_ssize_t asize = Py_ABS(Py_SIZE(a));
35007db96d56Sopenharmony_ci    Py_ssize_t bsize = Py_ABS(Py_SIZE(b));
35017db96d56Sopenharmony_ci    PyLongObject *ah = NULL;
35027db96d56Sopenharmony_ci    PyLongObject *al = NULL;
35037db96d56Sopenharmony_ci    PyLongObject *bh = NULL;
35047db96d56Sopenharmony_ci    PyLongObject *bl = NULL;
35057db96d56Sopenharmony_ci    PyLongObject *ret = NULL;
35067db96d56Sopenharmony_ci    PyLongObject *t1, *t2, *t3;
35077db96d56Sopenharmony_ci    Py_ssize_t shift;           /* the number of digits we split off */
35087db96d56Sopenharmony_ci    Py_ssize_t i;
35097db96d56Sopenharmony_ci
35107db96d56Sopenharmony_ci    /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
35117db96d56Sopenharmony_ci     * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh  + ah*bh + al*bl
35127db96d56Sopenharmony_ci     * Then the original product is
35137db96d56Sopenharmony_ci     *     ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
35147db96d56Sopenharmony_ci     * By picking X to be a power of 2, "*X" is just shifting, and it's
35157db96d56Sopenharmony_ci     * been reduced to 3 multiplies on numbers half the size.
35167db96d56Sopenharmony_ci     */
35177db96d56Sopenharmony_ci
35187db96d56Sopenharmony_ci    /* We want to split based on the larger number; fiddle so that b
35197db96d56Sopenharmony_ci     * is largest.
35207db96d56Sopenharmony_ci     */
35217db96d56Sopenharmony_ci    if (asize > bsize) {
35227db96d56Sopenharmony_ci        t1 = a;
35237db96d56Sopenharmony_ci        a = b;
35247db96d56Sopenharmony_ci        b = t1;
35257db96d56Sopenharmony_ci
35267db96d56Sopenharmony_ci        i = asize;
35277db96d56Sopenharmony_ci        asize = bsize;
35287db96d56Sopenharmony_ci        bsize = i;
35297db96d56Sopenharmony_ci    }
35307db96d56Sopenharmony_ci
35317db96d56Sopenharmony_ci    /* Use gradeschool math when either number is too small. */
35327db96d56Sopenharmony_ci    i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF;
35337db96d56Sopenharmony_ci    if (asize <= i) {
35347db96d56Sopenharmony_ci        if (asize == 0)
35357db96d56Sopenharmony_ci            return (PyLongObject *)PyLong_FromLong(0);
35367db96d56Sopenharmony_ci        else
35377db96d56Sopenharmony_ci            return x_mul(a, b);
35387db96d56Sopenharmony_ci    }
35397db96d56Sopenharmony_ci
35407db96d56Sopenharmony_ci    /* If a is small compared to b, splitting on b gives a degenerate
35417db96d56Sopenharmony_ci     * case with ah==0, and Karatsuba may be (even much) less efficient
35427db96d56Sopenharmony_ci     * than "grade school" then.  However, we can still win, by viewing
35437db96d56Sopenharmony_ci     * b as a string of "big digits", each of width a->ob_size.  That
35447db96d56Sopenharmony_ci     * leads to a sequence of balanced calls to k_mul.
35457db96d56Sopenharmony_ci     */
35467db96d56Sopenharmony_ci    if (2 * asize <= bsize)
35477db96d56Sopenharmony_ci        return k_lopsided_mul(a, b);
35487db96d56Sopenharmony_ci
35497db96d56Sopenharmony_ci    /* Split a & b into hi & lo pieces. */
35507db96d56Sopenharmony_ci    shift = bsize >> 1;
35517db96d56Sopenharmony_ci    if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
35527db96d56Sopenharmony_ci    assert(Py_SIZE(ah) > 0);            /* the split isn't degenerate */
35537db96d56Sopenharmony_ci
35547db96d56Sopenharmony_ci    if (a == b) {
35557db96d56Sopenharmony_ci        bh = ah;
35567db96d56Sopenharmony_ci        bl = al;
35577db96d56Sopenharmony_ci        Py_INCREF(bh);
35587db96d56Sopenharmony_ci        Py_INCREF(bl);
35597db96d56Sopenharmony_ci    }
35607db96d56Sopenharmony_ci    else if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
35617db96d56Sopenharmony_ci
35627db96d56Sopenharmony_ci    /* The plan:
35637db96d56Sopenharmony_ci     * 1. Allocate result space (asize + bsize digits:  that's always
35647db96d56Sopenharmony_ci     *    enough).
35657db96d56Sopenharmony_ci     * 2. Compute ah*bh, and copy into result at 2*shift.
35667db96d56Sopenharmony_ci     * 3. Compute al*bl, and copy into result at 0.  Note that this
35677db96d56Sopenharmony_ci     *    can't overlap with #2.
35687db96d56Sopenharmony_ci     * 4. Subtract al*bl from the result, starting at shift.  This may
35697db96d56Sopenharmony_ci     *    underflow (borrow out of the high digit), but we don't care:
35707db96d56Sopenharmony_ci     *    we're effectively doing unsigned arithmetic mod
35717db96d56Sopenharmony_ci     *    BASE**(sizea + sizeb), and so long as the *final* result fits,
35727db96d56Sopenharmony_ci     *    borrows and carries out of the high digit can be ignored.
35737db96d56Sopenharmony_ci     * 5. Subtract ah*bh from the result, starting at shift.
35747db96d56Sopenharmony_ci     * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
35757db96d56Sopenharmony_ci     *    at shift.
35767db96d56Sopenharmony_ci     */
35777db96d56Sopenharmony_ci
35787db96d56Sopenharmony_ci    /* 1. Allocate result space. */
35797db96d56Sopenharmony_ci    ret = _PyLong_New(asize + bsize);
35807db96d56Sopenharmony_ci    if (ret == NULL) goto fail;
35817db96d56Sopenharmony_ci#ifdef Py_DEBUG
35827db96d56Sopenharmony_ci    /* Fill with trash, to catch reference to uninitialized digits. */
35837db96d56Sopenharmony_ci    memset(ret->ob_digit, 0xDF, Py_SIZE(ret) * sizeof(digit));
35847db96d56Sopenharmony_ci#endif
35857db96d56Sopenharmony_ci
35867db96d56Sopenharmony_ci    /* 2. t1 <- ah*bh, and copy into high digits of result. */
35877db96d56Sopenharmony_ci    if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
35887db96d56Sopenharmony_ci    assert(Py_SIZE(t1) >= 0);
35897db96d56Sopenharmony_ci    assert(2*shift + Py_SIZE(t1) <= Py_SIZE(ret));
35907db96d56Sopenharmony_ci    memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
35917db96d56Sopenharmony_ci           Py_SIZE(t1) * sizeof(digit));
35927db96d56Sopenharmony_ci
35937db96d56Sopenharmony_ci    /* Zero-out the digits higher than the ah*bh copy. */
35947db96d56Sopenharmony_ci    i = Py_SIZE(ret) - 2*shift - Py_SIZE(t1);
35957db96d56Sopenharmony_ci    if (i)
35967db96d56Sopenharmony_ci        memset(ret->ob_digit + 2*shift + Py_SIZE(t1), 0,
35977db96d56Sopenharmony_ci               i * sizeof(digit));
35987db96d56Sopenharmony_ci
35997db96d56Sopenharmony_ci    /* 3. t2 <- al*bl, and copy into the low digits. */
36007db96d56Sopenharmony_ci    if ((t2 = k_mul(al, bl)) == NULL) {
36017db96d56Sopenharmony_ci        Py_DECREF(t1);
36027db96d56Sopenharmony_ci        goto fail;
36037db96d56Sopenharmony_ci    }
36047db96d56Sopenharmony_ci    assert(Py_SIZE(t2) >= 0);
36057db96d56Sopenharmony_ci    assert(Py_SIZE(t2) <= 2*shift); /* no overlap with high digits */
36067db96d56Sopenharmony_ci    memcpy(ret->ob_digit, t2->ob_digit, Py_SIZE(t2) * sizeof(digit));
36077db96d56Sopenharmony_ci
36087db96d56Sopenharmony_ci    /* Zero out remaining digits. */
36097db96d56Sopenharmony_ci    i = 2*shift - Py_SIZE(t2);          /* number of uninitialized digits */
36107db96d56Sopenharmony_ci    if (i)
36117db96d56Sopenharmony_ci        memset(ret->ob_digit + Py_SIZE(t2), 0, i * sizeof(digit));
36127db96d56Sopenharmony_ci
36137db96d56Sopenharmony_ci    /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2).  We do al*bl first
36147db96d56Sopenharmony_ci     * because it's fresher in cache.
36157db96d56Sopenharmony_ci     */
36167db96d56Sopenharmony_ci    i = Py_SIZE(ret) - shift;  /* # digits after shift */
36177db96d56Sopenharmony_ci    (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, Py_SIZE(t2));
36187db96d56Sopenharmony_ci    _Py_DECREF_INT(t2);
36197db96d56Sopenharmony_ci
36207db96d56Sopenharmony_ci    (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, Py_SIZE(t1));
36217db96d56Sopenharmony_ci    _Py_DECREF_INT(t1);
36227db96d56Sopenharmony_ci
36237db96d56Sopenharmony_ci    /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
36247db96d56Sopenharmony_ci    if ((t1 = x_add(ah, al)) == NULL) goto fail;
36257db96d56Sopenharmony_ci    _Py_DECREF_INT(ah);
36267db96d56Sopenharmony_ci    _Py_DECREF_INT(al);
36277db96d56Sopenharmony_ci    ah = al = NULL;
36287db96d56Sopenharmony_ci
36297db96d56Sopenharmony_ci    if (a == b) {
36307db96d56Sopenharmony_ci        t2 = t1;
36317db96d56Sopenharmony_ci        Py_INCREF(t2);
36327db96d56Sopenharmony_ci    }
36337db96d56Sopenharmony_ci    else if ((t2 = x_add(bh, bl)) == NULL) {
36347db96d56Sopenharmony_ci        Py_DECREF(t1);
36357db96d56Sopenharmony_ci        goto fail;
36367db96d56Sopenharmony_ci    }
36377db96d56Sopenharmony_ci    _Py_DECREF_INT(bh);
36387db96d56Sopenharmony_ci    _Py_DECREF_INT(bl);
36397db96d56Sopenharmony_ci    bh = bl = NULL;
36407db96d56Sopenharmony_ci
36417db96d56Sopenharmony_ci    t3 = k_mul(t1, t2);
36427db96d56Sopenharmony_ci    _Py_DECREF_INT(t1);
36437db96d56Sopenharmony_ci    _Py_DECREF_INT(t2);
36447db96d56Sopenharmony_ci    if (t3 == NULL) goto fail;
36457db96d56Sopenharmony_ci    assert(Py_SIZE(t3) >= 0);
36467db96d56Sopenharmony_ci
36477db96d56Sopenharmony_ci    /* Add t3.  It's not obvious why we can't run out of room here.
36487db96d56Sopenharmony_ci     * See the (*) comment after this function.
36497db96d56Sopenharmony_ci     */
36507db96d56Sopenharmony_ci    (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, Py_SIZE(t3));
36517db96d56Sopenharmony_ci    _Py_DECREF_INT(t3);
36527db96d56Sopenharmony_ci
36537db96d56Sopenharmony_ci    return long_normalize(ret);
36547db96d56Sopenharmony_ci
36557db96d56Sopenharmony_ci  fail:
36567db96d56Sopenharmony_ci    Py_XDECREF(ret);
36577db96d56Sopenharmony_ci    Py_XDECREF(ah);
36587db96d56Sopenharmony_ci    Py_XDECREF(al);
36597db96d56Sopenharmony_ci    Py_XDECREF(bh);
36607db96d56Sopenharmony_ci    Py_XDECREF(bl);
36617db96d56Sopenharmony_ci    return NULL;
36627db96d56Sopenharmony_ci}
36637db96d56Sopenharmony_ci
36647db96d56Sopenharmony_ci/* (*) Why adding t3 can't "run out of room" above.
36657db96d56Sopenharmony_ci
36667db96d56Sopenharmony_ciLet f(x) mean the floor of x and c(x) mean the ceiling of x.  Some facts
36677db96d56Sopenharmony_cito start with:
36687db96d56Sopenharmony_ci
36697db96d56Sopenharmony_ci1. For any integer i, i = c(i/2) + f(i/2).  In particular,
36707db96d56Sopenharmony_ci   bsize = c(bsize/2) + f(bsize/2).
36717db96d56Sopenharmony_ci2. shift = f(bsize/2)
36727db96d56Sopenharmony_ci3. asize <= bsize
36737db96d56Sopenharmony_ci4. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
36747db96d56Sopenharmony_ci   routine, so asize > bsize/2 >= f(bsize/2) in this routine.
36757db96d56Sopenharmony_ci
36767db96d56Sopenharmony_ciWe allocated asize + bsize result digits, and add t3 into them at an offset
36777db96d56Sopenharmony_ciof shift.  This leaves asize+bsize-shift allocated digit positions for t3
36787db96d56Sopenharmony_cito fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
36797db96d56Sopenharmony_ciasize + c(bsize/2) available digit positions.
36807db96d56Sopenharmony_ci
36817db96d56Sopenharmony_cibh has c(bsize/2) digits, and bl at most f(size/2) digits.  So bh+hl has
36827db96d56Sopenharmony_ciat most c(bsize/2) digits + 1 bit.
36837db96d56Sopenharmony_ci
36847db96d56Sopenharmony_ciIf asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
36857db96d56Sopenharmony_cidigits, and al has at most f(bsize/2) digits in any case.  So ah+al has at
36867db96d56Sopenharmony_cimost (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
36877db96d56Sopenharmony_ci
36887db96d56Sopenharmony_ciThe product (ah+al)*(bh+bl) therefore has at most
36897db96d56Sopenharmony_ci
36907db96d56Sopenharmony_ci    c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
36917db96d56Sopenharmony_ci
36927db96d56Sopenharmony_ciand we have asize + c(bsize/2) available digit positions.  We need to show
36937db96d56Sopenharmony_cithis is always enough.  An instance of c(bsize/2) cancels out in both, so
36947db96d56Sopenharmony_cithe question reduces to whether asize digits is enough to hold
36957db96d56Sopenharmony_ci(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits.  If asize < bsize,
36967db96d56Sopenharmony_cithen we're asking whether asize digits >= f(bsize/2) digits + 2 bits.  By #4,
36977db96d56Sopenharmony_ciasize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
36987db96d56Sopenharmony_cidigit is enough to hold 2 bits.  This is so since PyLong_SHIFT=15 >= 2.  If
36997db96d56Sopenharmony_ciasize == bsize, then we're asking whether bsize digits is enough to hold
37007db96d56Sopenharmony_cic(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
37017db96d56Sopenharmony_ciis enough to hold 2 bits.  This is so if bsize >= 2, which holds because
37027db96d56Sopenharmony_cibsize >= KARATSUBA_CUTOFF >= 2.
37037db96d56Sopenharmony_ci
37047db96d56Sopenharmony_ciNote that since there's always enough room for (ah+al)*(bh+bl), and that's
37057db96d56Sopenharmony_ciclearly >= each of ah*bh and al*bl, there's always enough room to subtract
37067db96d56Sopenharmony_ciah*bh and al*bl too.
37077db96d56Sopenharmony_ci*/
37087db96d56Sopenharmony_ci
37097db96d56Sopenharmony_ci/* b has at least twice the digits of a, and a is big enough that Karatsuba
37107db96d56Sopenharmony_ci * would pay off *if* the inputs had balanced sizes.  View b as a sequence
37117db96d56Sopenharmony_ci * of slices, each with a->ob_size digits, and multiply the slices by a,
37127db96d56Sopenharmony_ci * one at a time.  This gives k_mul balanced inputs to work with, and is
37137db96d56Sopenharmony_ci * also cache-friendly (we compute one double-width slice of the result
37147db96d56Sopenharmony_ci * at a time, then move on, never backtracking except for the helpful
37157db96d56Sopenharmony_ci * single-width slice overlap between successive partial sums).
37167db96d56Sopenharmony_ci */
37177db96d56Sopenharmony_cistatic PyLongObject *
37187db96d56Sopenharmony_cik_lopsided_mul(PyLongObject *a, PyLongObject *b)
37197db96d56Sopenharmony_ci{
37207db96d56Sopenharmony_ci    const Py_ssize_t asize = Py_ABS(Py_SIZE(a));
37217db96d56Sopenharmony_ci    Py_ssize_t bsize = Py_ABS(Py_SIZE(b));
37227db96d56Sopenharmony_ci    Py_ssize_t nbdone;          /* # of b digits already multiplied */
37237db96d56Sopenharmony_ci    PyLongObject *ret;
37247db96d56Sopenharmony_ci    PyLongObject *bslice = NULL;
37257db96d56Sopenharmony_ci
37267db96d56Sopenharmony_ci    assert(asize > KARATSUBA_CUTOFF);
37277db96d56Sopenharmony_ci    assert(2 * asize <= bsize);
37287db96d56Sopenharmony_ci
37297db96d56Sopenharmony_ci    /* Allocate result space, and zero it out. */
37307db96d56Sopenharmony_ci    ret = _PyLong_New(asize + bsize);
37317db96d56Sopenharmony_ci    if (ret == NULL)
37327db96d56Sopenharmony_ci        return NULL;
37337db96d56Sopenharmony_ci    memset(ret->ob_digit, 0, Py_SIZE(ret) * sizeof(digit));
37347db96d56Sopenharmony_ci
37357db96d56Sopenharmony_ci    /* Successive slices of b are copied into bslice. */
37367db96d56Sopenharmony_ci    bslice = _PyLong_New(asize);
37377db96d56Sopenharmony_ci    if (bslice == NULL)
37387db96d56Sopenharmony_ci        goto fail;
37397db96d56Sopenharmony_ci
37407db96d56Sopenharmony_ci    nbdone = 0;
37417db96d56Sopenharmony_ci    while (bsize > 0) {
37427db96d56Sopenharmony_ci        PyLongObject *product;
37437db96d56Sopenharmony_ci        const Py_ssize_t nbtouse = Py_MIN(bsize, asize);
37447db96d56Sopenharmony_ci
37457db96d56Sopenharmony_ci        /* Multiply the next slice of b by a. */
37467db96d56Sopenharmony_ci        memcpy(bslice->ob_digit, b->ob_digit + nbdone,
37477db96d56Sopenharmony_ci               nbtouse * sizeof(digit));
37487db96d56Sopenharmony_ci        Py_SET_SIZE(bslice, nbtouse);
37497db96d56Sopenharmony_ci        product = k_mul(a, bslice);
37507db96d56Sopenharmony_ci        if (product == NULL)
37517db96d56Sopenharmony_ci            goto fail;
37527db96d56Sopenharmony_ci
37537db96d56Sopenharmony_ci        /* Add into result. */
37547db96d56Sopenharmony_ci        (void)v_iadd(ret->ob_digit + nbdone, Py_SIZE(ret) - nbdone,
37557db96d56Sopenharmony_ci                     product->ob_digit, Py_SIZE(product));
37567db96d56Sopenharmony_ci        _Py_DECREF_INT(product);
37577db96d56Sopenharmony_ci
37587db96d56Sopenharmony_ci        bsize -= nbtouse;
37597db96d56Sopenharmony_ci        nbdone += nbtouse;
37607db96d56Sopenharmony_ci    }
37617db96d56Sopenharmony_ci
37627db96d56Sopenharmony_ci    _Py_DECREF_INT(bslice);
37637db96d56Sopenharmony_ci    return long_normalize(ret);
37647db96d56Sopenharmony_ci
37657db96d56Sopenharmony_ci  fail:
37667db96d56Sopenharmony_ci    Py_DECREF(ret);
37677db96d56Sopenharmony_ci    Py_XDECREF(bslice);
37687db96d56Sopenharmony_ci    return NULL;
37697db96d56Sopenharmony_ci}
37707db96d56Sopenharmony_ci
37717db96d56Sopenharmony_ciPyObject *
37727db96d56Sopenharmony_ci_PyLong_Multiply(PyLongObject *a, PyLongObject *b)
37737db96d56Sopenharmony_ci{
37747db96d56Sopenharmony_ci    PyLongObject *z;
37757db96d56Sopenharmony_ci
37767db96d56Sopenharmony_ci    /* fast path for single-digit multiplication */
37777db96d56Sopenharmony_ci    if (IS_MEDIUM_VALUE(a) && IS_MEDIUM_VALUE(b)) {
37787db96d56Sopenharmony_ci        stwodigits v = medium_value(a) * medium_value(b);
37797db96d56Sopenharmony_ci        return _PyLong_FromSTwoDigits(v);
37807db96d56Sopenharmony_ci    }
37817db96d56Sopenharmony_ci
37827db96d56Sopenharmony_ci    z = k_mul(a, b);
37837db96d56Sopenharmony_ci    /* Negate if exactly one of the inputs is negative. */
37847db96d56Sopenharmony_ci    if (((Py_SIZE(a) ^ Py_SIZE(b)) < 0) && z) {
37857db96d56Sopenharmony_ci        _PyLong_Negate(&z);
37867db96d56Sopenharmony_ci        if (z == NULL)
37877db96d56Sopenharmony_ci            return NULL;
37887db96d56Sopenharmony_ci    }
37897db96d56Sopenharmony_ci    return (PyObject *)z;
37907db96d56Sopenharmony_ci}
37917db96d56Sopenharmony_ci
37927db96d56Sopenharmony_cistatic PyObject *
37937db96d56Sopenharmony_cilong_mul(PyLongObject *a, PyLongObject *b)
37947db96d56Sopenharmony_ci{
37957db96d56Sopenharmony_ci    CHECK_BINOP(a, b);
37967db96d56Sopenharmony_ci    return _PyLong_Multiply(a, b);
37977db96d56Sopenharmony_ci}
37987db96d56Sopenharmony_ci
37997db96d56Sopenharmony_ci/* Fast modulo division for single-digit longs. */
38007db96d56Sopenharmony_cistatic PyObject *
38017db96d56Sopenharmony_cifast_mod(PyLongObject *a, PyLongObject *b)
38027db96d56Sopenharmony_ci{
38037db96d56Sopenharmony_ci    sdigit left = a->ob_digit[0];
38047db96d56Sopenharmony_ci    sdigit right = b->ob_digit[0];
38057db96d56Sopenharmony_ci    sdigit mod;
38067db96d56Sopenharmony_ci
38077db96d56Sopenharmony_ci    assert(Py_ABS(Py_SIZE(a)) == 1);
38087db96d56Sopenharmony_ci    assert(Py_ABS(Py_SIZE(b)) == 1);
38097db96d56Sopenharmony_ci
38107db96d56Sopenharmony_ci    if (Py_SIZE(a) == Py_SIZE(b)) {
38117db96d56Sopenharmony_ci        /* 'a' and 'b' have the same sign. */
38127db96d56Sopenharmony_ci        mod = left % right;
38137db96d56Sopenharmony_ci    }
38147db96d56Sopenharmony_ci    else {
38157db96d56Sopenharmony_ci        /* Either 'a' or 'b' is negative. */
38167db96d56Sopenharmony_ci        mod = right - 1 - (left - 1) % right;
38177db96d56Sopenharmony_ci    }
38187db96d56Sopenharmony_ci
38197db96d56Sopenharmony_ci    return PyLong_FromLong(mod * (sdigit)Py_SIZE(b));
38207db96d56Sopenharmony_ci}
38217db96d56Sopenharmony_ci
38227db96d56Sopenharmony_ci/* Fast floor division for single-digit longs. */
38237db96d56Sopenharmony_cistatic PyObject *
38247db96d56Sopenharmony_cifast_floor_div(PyLongObject *a, PyLongObject *b)
38257db96d56Sopenharmony_ci{
38267db96d56Sopenharmony_ci    sdigit left = a->ob_digit[0];
38277db96d56Sopenharmony_ci    sdigit right = b->ob_digit[0];
38287db96d56Sopenharmony_ci    sdigit div;
38297db96d56Sopenharmony_ci
38307db96d56Sopenharmony_ci    assert(Py_ABS(Py_SIZE(a)) == 1);
38317db96d56Sopenharmony_ci    assert(Py_ABS(Py_SIZE(b)) == 1);
38327db96d56Sopenharmony_ci
38337db96d56Sopenharmony_ci    if (Py_SIZE(a) == Py_SIZE(b)) {
38347db96d56Sopenharmony_ci        /* 'a' and 'b' have the same sign. */
38357db96d56Sopenharmony_ci        div = left / right;
38367db96d56Sopenharmony_ci    }
38377db96d56Sopenharmony_ci    else {
38387db96d56Sopenharmony_ci        /* Either 'a' or 'b' is negative. */
38397db96d56Sopenharmony_ci        div = -1 - (left - 1) / right;
38407db96d56Sopenharmony_ci    }
38417db96d56Sopenharmony_ci
38427db96d56Sopenharmony_ci    return PyLong_FromLong(div);
38437db96d56Sopenharmony_ci}
38447db96d56Sopenharmony_ci
38457db96d56Sopenharmony_ci/* The / and % operators are now defined in terms of divmod().
38467db96d56Sopenharmony_ci   The expression a mod b has the value a - b*floor(a/b).
38477db96d56Sopenharmony_ci   The long_divrem function gives the remainder after division of
38487db96d56Sopenharmony_ci   |a| by |b|, with the sign of a.  This is also expressed
38497db96d56Sopenharmony_ci   as a - b*trunc(a/b), if trunc truncates towards zero.
38507db96d56Sopenharmony_ci   Some examples:
38517db96d56Sopenharmony_ci     a           b      a rem b         a mod b
38527db96d56Sopenharmony_ci     13          10      3               3
38537db96d56Sopenharmony_ci    -13          10     -3               7
38547db96d56Sopenharmony_ci     13         -10      3              -7
38557db96d56Sopenharmony_ci    -13         -10     -3              -3
38567db96d56Sopenharmony_ci   So, to get from rem to mod, we have to add b if a and b
38577db96d56Sopenharmony_ci   have different signs.  We then subtract one from the 'div'
38587db96d56Sopenharmony_ci   part of the outcome to keep the invariant intact. */
38597db96d56Sopenharmony_ci
38607db96d56Sopenharmony_ci/* Compute
38617db96d56Sopenharmony_ci *     *pdiv, *pmod = divmod(v, w)
38627db96d56Sopenharmony_ci * NULL can be passed for pdiv or pmod, in which case that part of
38637db96d56Sopenharmony_ci * the result is simply thrown away.  The caller owns a reference to
38647db96d56Sopenharmony_ci * each of these it requests (does not pass NULL for).
38657db96d56Sopenharmony_ci */
38667db96d56Sopenharmony_cistatic int
38677db96d56Sopenharmony_cil_divmod(PyLongObject *v, PyLongObject *w,
38687db96d56Sopenharmony_ci         PyLongObject **pdiv, PyLongObject **pmod)
38697db96d56Sopenharmony_ci{
38707db96d56Sopenharmony_ci    PyLongObject *div, *mod;
38717db96d56Sopenharmony_ci
38727db96d56Sopenharmony_ci    if (Py_ABS(Py_SIZE(v)) == 1 && Py_ABS(Py_SIZE(w)) == 1) {
38737db96d56Sopenharmony_ci        /* Fast path for single-digit longs */
38747db96d56Sopenharmony_ci        div = NULL;
38757db96d56Sopenharmony_ci        if (pdiv != NULL) {
38767db96d56Sopenharmony_ci            div = (PyLongObject *)fast_floor_div(v, w);
38777db96d56Sopenharmony_ci            if (div == NULL) {
38787db96d56Sopenharmony_ci                return -1;
38797db96d56Sopenharmony_ci            }
38807db96d56Sopenharmony_ci        }
38817db96d56Sopenharmony_ci        if (pmod != NULL) {
38827db96d56Sopenharmony_ci            mod = (PyLongObject *)fast_mod(v, w);
38837db96d56Sopenharmony_ci            if (mod == NULL) {
38847db96d56Sopenharmony_ci                Py_XDECREF(div);
38857db96d56Sopenharmony_ci                return -1;
38867db96d56Sopenharmony_ci            }
38877db96d56Sopenharmony_ci            *pmod = mod;
38887db96d56Sopenharmony_ci        }
38897db96d56Sopenharmony_ci        if (pdiv != NULL) {
38907db96d56Sopenharmony_ci            /* We only want to set `*pdiv` when `*pmod` is
38917db96d56Sopenharmony_ci               set successfully. */
38927db96d56Sopenharmony_ci            *pdiv = div;
38937db96d56Sopenharmony_ci        }
38947db96d56Sopenharmony_ci        return 0;
38957db96d56Sopenharmony_ci    }
38967db96d56Sopenharmony_ci    if (long_divrem(v, w, &div, &mod) < 0)
38977db96d56Sopenharmony_ci        return -1;
38987db96d56Sopenharmony_ci    if ((Py_SIZE(mod) < 0 && Py_SIZE(w) > 0) ||
38997db96d56Sopenharmony_ci        (Py_SIZE(mod) > 0 && Py_SIZE(w) < 0)) {
39007db96d56Sopenharmony_ci        PyLongObject *temp;
39017db96d56Sopenharmony_ci        temp = (PyLongObject *) long_add(mod, w);
39027db96d56Sopenharmony_ci        Py_DECREF(mod);
39037db96d56Sopenharmony_ci        mod = temp;
39047db96d56Sopenharmony_ci        if (mod == NULL) {
39057db96d56Sopenharmony_ci            Py_DECREF(div);
39067db96d56Sopenharmony_ci            return -1;
39077db96d56Sopenharmony_ci        }
39087db96d56Sopenharmony_ci        temp = (PyLongObject *) long_sub(div, (PyLongObject *)_PyLong_GetOne());
39097db96d56Sopenharmony_ci        if (temp == NULL) {
39107db96d56Sopenharmony_ci            Py_DECREF(mod);
39117db96d56Sopenharmony_ci            Py_DECREF(div);
39127db96d56Sopenharmony_ci            return -1;
39137db96d56Sopenharmony_ci        }
39147db96d56Sopenharmony_ci        Py_DECREF(div);
39157db96d56Sopenharmony_ci        div = temp;
39167db96d56Sopenharmony_ci    }
39177db96d56Sopenharmony_ci    if (pdiv != NULL)
39187db96d56Sopenharmony_ci        *pdiv = div;
39197db96d56Sopenharmony_ci    else
39207db96d56Sopenharmony_ci        Py_DECREF(div);
39217db96d56Sopenharmony_ci
39227db96d56Sopenharmony_ci    if (pmod != NULL)
39237db96d56Sopenharmony_ci        *pmod = mod;
39247db96d56Sopenharmony_ci    else
39257db96d56Sopenharmony_ci        Py_DECREF(mod);
39267db96d56Sopenharmony_ci
39277db96d56Sopenharmony_ci    return 0;
39287db96d56Sopenharmony_ci}
39297db96d56Sopenharmony_ci
39307db96d56Sopenharmony_ci/* Compute
39317db96d56Sopenharmony_ci *     *pmod = v % w
39327db96d56Sopenharmony_ci * pmod cannot be NULL. The caller owns a reference to pmod.
39337db96d56Sopenharmony_ci */
39347db96d56Sopenharmony_cistatic int
39357db96d56Sopenharmony_cil_mod(PyLongObject *v, PyLongObject *w, PyLongObject **pmod)
39367db96d56Sopenharmony_ci{
39377db96d56Sopenharmony_ci    PyLongObject *mod;
39387db96d56Sopenharmony_ci
39397db96d56Sopenharmony_ci    assert(pmod);
39407db96d56Sopenharmony_ci    if (Py_ABS(Py_SIZE(v)) == 1 && Py_ABS(Py_SIZE(w)) == 1) {
39417db96d56Sopenharmony_ci        /* Fast path for single-digit longs */
39427db96d56Sopenharmony_ci        *pmod = (PyLongObject *)fast_mod(v, w);
39437db96d56Sopenharmony_ci        return -(*pmod == NULL);
39447db96d56Sopenharmony_ci    }
39457db96d56Sopenharmony_ci    if (long_rem(v, w, &mod) < 0)
39467db96d56Sopenharmony_ci        return -1;
39477db96d56Sopenharmony_ci    if ((Py_SIZE(mod) < 0 && Py_SIZE(w) > 0) ||
39487db96d56Sopenharmony_ci        (Py_SIZE(mod) > 0 && Py_SIZE(w) < 0)) {
39497db96d56Sopenharmony_ci        PyLongObject *temp;
39507db96d56Sopenharmony_ci        temp = (PyLongObject *) long_add(mod, w);
39517db96d56Sopenharmony_ci        Py_DECREF(mod);
39527db96d56Sopenharmony_ci        mod = temp;
39537db96d56Sopenharmony_ci        if (mod == NULL)
39547db96d56Sopenharmony_ci            return -1;
39557db96d56Sopenharmony_ci    }
39567db96d56Sopenharmony_ci    *pmod = mod;
39577db96d56Sopenharmony_ci
39587db96d56Sopenharmony_ci    return 0;
39597db96d56Sopenharmony_ci}
39607db96d56Sopenharmony_ci
39617db96d56Sopenharmony_cistatic PyObject *
39627db96d56Sopenharmony_cilong_div(PyObject *a, PyObject *b)
39637db96d56Sopenharmony_ci{
39647db96d56Sopenharmony_ci    PyLongObject *div;
39657db96d56Sopenharmony_ci
39667db96d56Sopenharmony_ci    CHECK_BINOP(a, b);
39677db96d56Sopenharmony_ci
39687db96d56Sopenharmony_ci    if (Py_ABS(Py_SIZE(a)) == 1 && Py_ABS(Py_SIZE(b)) == 1) {
39697db96d56Sopenharmony_ci        return fast_floor_div((PyLongObject*)a, (PyLongObject*)b);
39707db96d56Sopenharmony_ci    }
39717db96d56Sopenharmony_ci
39727db96d56Sopenharmony_ci    if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, NULL) < 0)
39737db96d56Sopenharmony_ci        div = NULL;
39747db96d56Sopenharmony_ci    return (PyObject *)div;
39757db96d56Sopenharmony_ci}
39767db96d56Sopenharmony_ci
39777db96d56Sopenharmony_ci/* PyLong/PyLong -> float, with correctly rounded result. */
39787db96d56Sopenharmony_ci
39797db96d56Sopenharmony_ci#define MANT_DIG_DIGITS (DBL_MANT_DIG / PyLong_SHIFT)
39807db96d56Sopenharmony_ci#define MANT_DIG_BITS (DBL_MANT_DIG % PyLong_SHIFT)
39817db96d56Sopenharmony_ci
39827db96d56Sopenharmony_cistatic PyObject *
39837db96d56Sopenharmony_cilong_true_divide(PyObject *v, PyObject *w)
39847db96d56Sopenharmony_ci{
39857db96d56Sopenharmony_ci    PyLongObject *a, *b, *x;
39867db96d56Sopenharmony_ci    Py_ssize_t a_size, b_size, shift, extra_bits, diff, x_size, x_bits;
39877db96d56Sopenharmony_ci    digit mask, low;
39887db96d56Sopenharmony_ci    int inexact, negate, a_is_small, b_is_small;
39897db96d56Sopenharmony_ci    double dx, result;
39907db96d56Sopenharmony_ci
39917db96d56Sopenharmony_ci    CHECK_BINOP(v, w);
39927db96d56Sopenharmony_ci    a = (PyLongObject *)v;
39937db96d56Sopenharmony_ci    b = (PyLongObject *)w;
39947db96d56Sopenharmony_ci
39957db96d56Sopenharmony_ci    /*
39967db96d56Sopenharmony_ci       Method in a nutshell:
39977db96d56Sopenharmony_ci
39987db96d56Sopenharmony_ci         0. reduce to case a, b > 0; filter out obvious underflow/overflow
39997db96d56Sopenharmony_ci         1. choose a suitable integer 'shift'
40007db96d56Sopenharmony_ci         2. use integer arithmetic to compute x = floor(2**-shift*a/b)
40017db96d56Sopenharmony_ci         3. adjust x for correct rounding
40027db96d56Sopenharmony_ci         4. convert x to a double dx with the same value
40037db96d56Sopenharmony_ci         5. return ldexp(dx, shift).
40047db96d56Sopenharmony_ci
40057db96d56Sopenharmony_ci       In more detail:
40067db96d56Sopenharmony_ci
40077db96d56Sopenharmony_ci       0. For any a, a/0 raises ZeroDivisionError; for nonzero b, 0/b
40087db96d56Sopenharmony_ci       returns either 0.0 or -0.0, depending on the sign of b.  For a and
40097db96d56Sopenharmony_ci       b both nonzero, ignore signs of a and b, and add the sign back in
40107db96d56Sopenharmony_ci       at the end.  Now write a_bits and b_bits for the bit lengths of a
40117db96d56Sopenharmony_ci       and b respectively (that is, a_bits = 1 + floor(log_2(a)); likewise
40127db96d56Sopenharmony_ci       for b).  Then
40137db96d56Sopenharmony_ci
40147db96d56Sopenharmony_ci          2**(a_bits - b_bits - 1) < a/b < 2**(a_bits - b_bits + 1).
40157db96d56Sopenharmony_ci
40167db96d56Sopenharmony_ci       So if a_bits - b_bits > DBL_MAX_EXP then a/b > 2**DBL_MAX_EXP and
40177db96d56Sopenharmony_ci       so overflows.  Similarly, if a_bits - b_bits < DBL_MIN_EXP -
40187db96d56Sopenharmony_ci       DBL_MANT_DIG - 1 then a/b underflows to 0.  With these cases out of
40197db96d56Sopenharmony_ci       the way, we can assume that
40207db96d56Sopenharmony_ci
40217db96d56Sopenharmony_ci          DBL_MIN_EXP - DBL_MANT_DIG - 1 <= a_bits - b_bits <= DBL_MAX_EXP.
40227db96d56Sopenharmony_ci
40237db96d56Sopenharmony_ci       1. The integer 'shift' is chosen so that x has the right number of
40247db96d56Sopenharmony_ci       bits for a double, plus two or three extra bits that will be used
40257db96d56Sopenharmony_ci       in the rounding decisions.  Writing a_bits and b_bits for the
40267db96d56Sopenharmony_ci       number of significant bits in a and b respectively, a
40277db96d56Sopenharmony_ci       straightforward formula for shift is:
40287db96d56Sopenharmony_ci
40297db96d56Sopenharmony_ci          shift = a_bits - b_bits - DBL_MANT_DIG - 2
40307db96d56Sopenharmony_ci
40317db96d56Sopenharmony_ci       This is fine in the usual case, but if a/b is smaller than the
40327db96d56Sopenharmony_ci       smallest normal float then it can lead to double rounding on an
40337db96d56Sopenharmony_ci       IEEE 754 platform, giving incorrectly rounded results.  So we
40347db96d56Sopenharmony_ci       adjust the formula slightly.  The actual formula used is:
40357db96d56Sopenharmony_ci
40367db96d56Sopenharmony_ci           shift = MAX(a_bits - b_bits, DBL_MIN_EXP) - DBL_MANT_DIG - 2
40377db96d56Sopenharmony_ci
40387db96d56Sopenharmony_ci       2. The quantity x is computed by first shifting a (left -shift bits
40397db96d56Sopenharmony_ci       if shift <= 0, right shift bits if shift > 0) and then dividing by
40407db96d56Sopenharmony_ci       b.  For both the shift and the division, we keep track of whether
40417db96d56Sopenharmony_ci       the result is inexact, in a flag 'inexact'; this information is
40427db96d56Sopenharmony_ci       needed at the rounding stage.
40437db96d56Sopenharmony_ci
40447db96d56Sopenharmony_ci       With the choice of shift above, together with our assumption that
40457db96d56Sopenharmony_ci       a_bits - b_bits >= DBL_MIN_EXP - DBL_MANT_DIG - 1, it follows
40467db96d56Sopenharmony_ci       that x >= 1.
40477db96d56Sopenharmony_ci
40487db96d56Sopenharmony_ci       3. Now x * 2**shift <= a/b < (x+1) * 2**shift.  We want to replace
40497db96d56Sopenharmony_ci       this with an exactly representable float of the form
40507db96d56Sopenharmony_ci
40517db96d56Sopenharmony_ci          round(x/2**extra_bits) * 2**(extra_bits+shift).
40527db96d56Sopenharmony_ci
40537db96d56Sopenharmony_ci       For float representability, we need x/2**extra_bits <
40547db96d56Sopenharmony_ci       2**DBL_MANT_DIG and extra_bits + shift >= DBL_MIN_EXP -
40557db96d56Sopenharmony_ci       DBL_MANT_DIG.  This translates to the condition:
40567db96d56Sopenharmony_ci
40577db96d56Sopenharmony_ci          extra_bits >= MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG
40587db96d56Sopenharmony_ci
40597db96d56Sopenharmony_ci       To round, we just modify the bottom digit of x in-place; this can
40607db96d56Sopenharmony_ci       end up giving a digit with value > PyLONG_MASK, but that's not a
40617db96d56Sopenharmony_ci       problem since digits can hold values up to 2*PyLONG_MASK+1.
40627db96d56Sopenharmony_ci
40637db96d56Sopenharmony_ci       With the original choices for shift above, extra_bits will always
40647db96d56Sopenharmony_ci       be 2 or 3.  Then rounding under the round-half-to-even rule, we
40657db96d56Sopenharmony_ci       round up iff the most significant of the extra bits is 1, and
40667db96d56Sopenharmony_ci       either: (a) the computation of x in step 2 had an inexact result,
40677db96d56Sopenharmony_ci       or (b) at least one other of the extra bits is 1, or (c) the least
40687db96d56Sopenharmony_ci       significant bit of x (above those to be rounded) is 1.
40697db96d56Sopenharmony_ci
40707db96d56Sopenharmony_ci       4. Conversion to a double is straightforward; all floating-point
40717db96d56Sopenharmony_ci       operations involved in the conversion are exact, so there's no
40727db96d56Sopenharmony_ci       danger of rounding errors.
40737db96d56Sopenharmony_ci
40747db96d56Sopenharmony_ci       5. Use ldexp(x, shift) to compute x*2**shift, the final result.
40757db96d56Sopenharmony_ci       The result will always be exactly representable as a double, except
40767db96d56Sopenharmony_ci       in the case that it overflows.  To avoid dependence on the exact
40777db96d56Sopenharmony_ci       behaviour of ldexp on overflow, we check for overflow before
40787db96d56Sopenharmony_ci       applying ldexp.  The result of ldexp is adjusted for sign before
40797db96d56Sopenharmony_ci       returning.
40807db96d56Sopenharmony_ci    */
40817db96d56Sopenharmony_ci
40827db96d56Sopenharmony_ci    /* Reduce to case where a and b are both positive. */
40837db96d56Sopenharmony_ci    a_size = Py_ABS(Py_SIZE(a));
40847db96d56Sopenharmony_ci    b_size = Py_ABS(Py_SIZE(b));
40857db96d56Sopenharmony_ci    negate = (Py_SIZE(a) < 0) ^ (Py_SIZE(b) < 0);
40867db96d56Sopenharmony_ci    if (b_size == 0) {
40877db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ZeroDivisionError,
40887db96d56Sopenharmony_ci                        "division by zero");
40897db96d56Sopenharmony_ci        goto error;
40907db96d56Sopenharmony_ci    }
40917db96d56Sopenharmony_ci    if (a_size == 0)
40927db96d56Sopenharmony_ci        goto underflow_or_zero;
40937db96d56Sopenharmony_ci
40947db96d56Sopenharmony_ci    /* Fast path for a and b small (exactly representable in a double).
40957db96d56Sopenharmony_ci       Relies on floating-point division being correctly rounded; results
40967db96d56Sopenharmony_ci       may be subject to double rounding on x86 machines that operate with
40977db96d56Sopenharmony_ci       the x87 FPU set to 64-bit precision. */
40987db96d56Sopenharmony_ci    a_is_small = a_size <= MANT_DIG_DIGITS ||
40997db96d56Sopenharmony_ci        (a_size == MANT_DIG_DIGITS+1 &&
41007db96d56Sopenharmony_ci         a->ob_digit[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0);
41017db96d56Sopenharmony_ci    b_is_small = b_size <= MANT_DIG_DIGITS ||
41027db96d56Sopenharmony_ci        (b_size == MANT_DIG_DIGITS+1 &&
41037db96d56Sopenharmony_ci         b->ob_digit[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0);
41047db96d56Sopenharmony_ci    if (a_is_small && b_is_small) {
41057db96d56Sopenharmony_ci        double da, db;
41067db96d56Sopenharmony_ci        da = a->ob_digit[--a_size];
41077db96d56Sopenharmony_ci        while (a_size > 0)
41087db96d56Sopenharmony_ci            da = da * PyLong_BASE + a->ob_digit[--a_size];
41097db96d56Sopenharmony_ci        db = b->ob_digit[--b_size];
41107db96d56Sopenharmony_ci        while (b_size > 0)
41117db96d56Sopenharmony_ci            db = db * PyLong_BASE + b->ob_digit[--b_size];
41127db96d56Sopenharmony_ci        result = da / db;
41137db96d56Sopenharmony_ci        goto success;
41147db96d56Sopenharmony_ci    }
41157db96d56Sopenharmony_ci
41167db96d56Sopenharmony_ci    /* Catch obvious cases of underflow and overflow */
41177db96d56Sopenharmony_ci    diff = a_size - b_size;
41187db96d56Sopenharmony_ci    if (diff > PY_SSIZE_T_MAX/PyLong_SHIFT - 1)
41197db96d56Sopenharmony_ci        /* Extreme overflow */
41207db96d56Sopenharmony_ci        goto overflow;
41217db96d56Sopenharmony_ci    else if (diff < 1 - PY_SSIZE_T_MAX/PyLong_SHIFT)
41227db96d56Sopenharmony_ci        /* Extreme underflow */
41237db96d56Sopenharmony_ci        goto underflow_or_zero;
41247db96d56Sopenharmony_ci    /* Next line is now safe from overflowing a Py_ssize_t */
41257db96d56Sopenharmony_ci    diff = diff * PyLong_SHIFT + bit_length_digit(a->ob_digit[a_size - 1]) -
41267db96d56Sopenharmony_ci        bit_length_digit(b->ob_digit[b_size - 1]);
41277db96d56Sopenharmony_ci    /* Now diff = a_bits - b_bits. */
41287db96d56Sopenharmony_ci    if (diff > DBL_MAX_EXP)
41297db96d56Sopenharmony_ci        goto overflow;
41307db96d56Sopenharmony_ci    else if (diff < DBL_MIN_EXP - DBL_MANT_DIG - 1)
41317db96d56Sopenharmony_ci        goto underflow_or_zero;
41327db96d56Sopenharmony_ci
41337db96d56Sopenharmony_ci    /* Choose value for shift; see comments for step 1 above. */
41347db96d56Sopenharmony_ci    shift = Py_MAX(diff, DBL_MIN_EXP) - DBL_MANT_DIG - 2;
41357db96d56Sopenharmony_ci
41367db96d56Sopenharmony_ci    inexact = 0;
41377db96d56Sopenharmony_ci
41387db96d56Sopenharmony_ci    /* x = abs(a * 2**-shift) */
41397db96d56Sopenharmony_ci    if (shift <= 0) {
41407db96d56Sopenharmony_ci        Py_ssize_t i, shift_digits = -shift / PyLong_SHIFT;
41417db96d56Sopenharmony_ci        digit rem;
41427db96d56Sopenharmony_ci        /* x = a << -shift */
41437db96d56Sopenharmony_ci        if (a_size >= PY_SSIZE_T_MAX - 1 - shift_digits) {
41447db96d56Sopenharmony_ci            /* In practice, it's probably impossible to end up
41457db96d56Sopenharmony_ci               here.  Both a and b would have to be enormous,
41467db96d56Sopenharmony_ci               using close to SIZE_T_MAX bytes of memory each. */
41477db96d56Sopenharmony_ci            PyErr_SetString(PyExc_OverflowError,
41487db96d56Sopenharmony_ci                            "intermediate overflow during division");
41497db96d56Sopenharmony_ci            goto error;
41507db96d56Sopenharmony_ci        }
41517db96d56Sopenharmony_ci        x = _PyLong_New(a_size + shift_digits + 1);
41527db96d56Sopenharmony_ci        if (x == NULL)
41537db96d56Sopenharmony_ci            goto error;
41547db96d56Sopenharmony_ci        for (i = 0; i < shift_digits; i++)
41557db96d56Sopenharmony_ci            x->ob_digit[i] = 0;
41567db96d56Sopenharmony_ci        rem = v_lshift(x->ob_digit + shift_digits, a->ob_digit,
41577db96d56Sopenharmony_ci                       a_size, -shift % PyLong_SHIFT);
41587db96d56Sopenharmony_ci        x->ob_digit[a_size + shift_digits] = rem;
41597db96d56Sopenharmony_ci    }
41607db96d56Sopenharmony_ci    else {
41617db96d56Sopenharmony_ci        Py_ssize_t shift_digits = shift / PyLong_SHIFT;
41627db96d56Sopenharmony_ci        digit rem;
41637db96d56Sopenharmony_ci        /* x = a >> shift */
41647db96d56Sopenharmony_ci        assert(a_size >= shift_digits);
41657db96d56Sopenharmony_ci        x = _PyLong_New(a_size - shift_digits);
41667db96d56Sopenharmony_ci        if (x == NULL)
41677db96d56Sopenharmony_ci            goto error;
41687db96d56Sopenharmony_ci        rem = v_rshift(x->ob_digit, a->ob_digit + shift_digits,
41697db96d56Sopenharmony_ci                       a_size - shift_digits, shift % PyLong_SHIFT);
41707db96d56Sopenharmony_ci        /* set inexact if any of the bits shifted out is nonzero */
41717db96d56Sopenharmony_ci        if (rem)
41727db96d56Sopenharmony_ci            inexact = 1;
41737db96d56Sopenharmony_ci        while (!inexact && shift_digits > 0)
41747db96d56Sopenharmony_ci            if (a->ob_digit[--shift_digits])
41757db96d56Sopenharmony_ci                inexact = 1;
41767db96d56Sopenharmony_ci    }
41777db96d56Sopenharmony_ci    long_normalize(x);
41787db96d56Sopenharmony_ci    x_size = Py_SIZE(x);
41797db96d56Sopenharmony_ci
41807db96d56Sopenharmony_ci    /* x //= b. If the remainder is nonzero, set inexact.  We own the only
41817db96d56Sopenharmony_ci       reference to x, so it's safe to modify it in-place. */
41827db96d56Sopenharmony_ci    if (b_size == 1) {
41837db96d56Sopenharmony_ci        digit rem = inplace_divrem1(x->ob_digit, x->ob_digit, x_size,
41847db96d56Sopenharmony_ci                              b->ob_digit[0]);
41857db96d56Sopenharmony_ci        long_normalize(x);
41867db96d56Sopenharmony_ci        if (rem)
41877db96d56Sopenharmony_ci            inexact = 1;
41887db96d56Sopenharmony_ci    }
41897db96d56Sopenharmony_ci    else {
41907db96d56Sopenharmony_ci        PyLongObject *div, *rem;
41917db96d56Sopenharmony_ci        div = x_divrem(x, b, &rem);
41927db96d56Sopenharmony_ci        Py_DECREF(x);
41937db96d56Sopenharmony_ci        x = div;
41947db96d56Sopenharmony_ci        if (x == NULL)
41957db96d56Sopenharmony_ci            goto error;
41967db96d56Sopenharmony_ci        if (Py_SIZE(rem))
41977db96d56Sopenharmony_ci            inexact = 1;
41987db96d56Sopenharmony_ci        Py_DECREF(rem);
41997db96d56Sopenharmony_ci    }
42007db96d56Sopenharmony_ci    x_size = Py_ABS(Py_SIZE(x));
42017db96d56Sopenharmony_ci    assert(x_size > 0); /* result of division is never zero */
42027db96d56Sopenharmony_ci    x_bits = (x_size-1)*PyLong_SHIFT+bit_length_digit(x->ob_digit[x_size-1]);
42037db96d56Sopenharmony_ci
42047db96d56Sopenharmony_ci    /* The number of extra bits that have to be rounded away. */
42057db96d56Sopenharmony_ci    extra_bits = Py_MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG;
42067db96d56Sopenharmony_ci    assert(extra_bits == 2 || extra_bits == 3);
42077db96d56Sopenharmony_ci
42087db96d56Sopenharmony_ci    /* Round by directly modifying the low digit of x. */
42097db96d56Sopenharmony_ci    mask = (digit)1 << (extra_bits - 1);
42107db96d56Sopenharmony_ci    low = x->ob_digit[0] | inexact;
42117db96d56Sopenharmony_ci    if ((low & mask) && (low & (3U*mask-1U)))
42127db96d56Sopenharmony_ci        low += mask;
42137db96d56Sopenharmony_ci    x->ob_digit[0] = low & ~(2U*mask-1U);
42147db96d56Sopenharmony_ci
42157db96d56Sopenharmony_ci    /* Convert x to a double dx; the conversion is exact. */
42167db96d56Sopenharmony_ci    dx = x->ob_digit[--x_size];
42177db96d56Sopenharmony_ci    while (x_size > 0)
42187db96d56Sopenharmony_ci        dx = dx * PyLong_BASE + x->ob_digit[--x_size];
42197db96d56Sopenharmony_ci    Py_DECREF(x);
42207db96d56Sopenharmony_ci
42217db96d56Sopenharmony_ci    /* Check whether ldexp result will overflow a double. */
42227db96d56Sopenharmony_ci    if (shift + x_bits >= DBL_MAX_EXP &&
42237db96d56Sopenharmony_ci        (shift + x_bits > DBL_MAX_EXP || dx == ldexp(1.0, (int)x_bits)))
42247db96d56Sopenharmony_ci        goto overflow;
42257db96d56Sopenharmony_ci    result = ldexp(dx, (int)shift);
42267db96d56Sopenharmony_ci
42277db96d56Sopenharmony_ci  success:
42287db96d56Sopenharmony_ci    return PyFloat_FromDouble(negate ? -result : result);
42297db96d56Sopenharmony_ci
42307db96d56Sopenharmony_ci  underflow_or_zero:
42317db96d56Sopenharmony_ci    return PyFloat_FromDouble(negate ? -0.0 : 0.0);
42327db96d56Sopenharmony_ci
42337db96d56Sopenharmony_ci  overflow:
42347db96d56Sopenharmony_ci    PyErr_SetString(PyExc_OverflowError,
42357db96d56Sopenharmony_ci                    "integer division result too large for a float");
42367db96d56Sopenharmony_ci  error:
42377db96d56Sopenharmony_ci    return NULL;
42387db96d56Sopenharmony_ci}
42397db96d56Sopenharmony_ci
42407db96d56Sopenharmony_cistatic PyObject *
42417db96d56Sopenharmony_cilong_mod(PyObject *a, PyObject *b)
42427db96d56Sopenharmony_ci{
42437db96d56Sopenharmony_ci    PyLongObject *mod;
42447db96d56Sopenharmony_ci
42457db96d56Sopenharmony_ci    CHECK_BINOP(a, b);
42467db96d56Sopenharmony_ci
42477db96d56Sopenharmony_ci    if (l_mod((PyLongObject*)a, (PyLongObject*)b, &mod) < 0)
42487db96d56Sopenharmony_ci        mod = NULL;
42497db96d56Sopenharmony_ci    return (PyObject *)mod;
42507db96d56Sopenharmony_ci}
42517db96d56Sopenharmony_ci
42527db96d56Sopenharmony_cistatic PyObject *
42537db96d56Sopenharmony_cilong_divmod(PyObject *a, PyObject *b)
42547db96d56Sopenharmony_ci{
42557db96d56Sopenharmony_ci    PyLongObject *div, *mod;
42567db96d56Sopenharmony_ci    PyObject *z;
42577db96d56Sopenharmony_ci
42587db96d56Sopenharmony_ci    CHECK_BINOP(a, b);
42597db96d56Sopenharmony_ci
42607db96d56Sopenharmony_ci    if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, &mod) < 0) {
42617db96d56Sopenharmony_ci        return NULL;
42627db96d56Sopenharmony_ci    }
42637db96d56Sopenharmony_ci    z = PyTuple_New(2);
42647db96d56Sopenharmony_ci    if (z != NULL) {
42657db96d56Sopenharmony_ci        PyTuple_SET_ITEM(z, 0, (PyObject *) div);
42667db96d56Sopenharmony_ci        PyTuple_SET_ITEM(z, 1, (PyObject *) mod);
42677db96d56Sopenharmony_ci    }
42687db96d56Sopenharmony_ci    else {
42697db96d56Sopenharmony_ci        Py_DECREF(div);
42707db96d56Sopenharmony_ci        Py_DECREF(mod);
42717db96d56Sopenharmony_ci    }
42727db96d56Sopenharmony_ci    return z;
42737db96d56Sopenharmony_ci}
42747db96d56Sopenharmony_ci
42757db96d56Sopenharmony_ci
42767db96d56Sopenharmony_ci/* Compute an inverse to a modulo n, or raise ValueError if a is not
42777db96d56Sopenharmony_ci   invertible modulo n. Assumes n is positive. The inverse returned
42787db96d56Sopenharmony_ci   is whatever falls out of the extended Euclidean algorithm: it may
42797db96d56Sopenharmony_ci   be either positive or negative, but will be smaller than n in
42807db96d56Sopenharmony_ci   absolute value.
42817db96d56Sopenharmony_ci
42827db96d56Sopenharmony_ci   Pure Python equivalent for long_invmod:
42837db96d56Sopenharmony_ci
42847db96d56Sopenharmony_ci        def invmod(a, n):
42857db96d56Sopenharmony_ci            b, c = 1, 0
42867db96d56Sopenharmony_ci            while n:
42877db96d56Sopenharmony_ci                q, r = divmod(a, n)
42887db96d56Sopenharmony_ci                a, b, c, n = n, c, b - q*c, r
42897db96d56Sopenharmony_ci
42907db96d56Sopenharmony_ci            # at this point a is the gcd of the original inputs
42917db96d56Sopenharmony_ci            if a == 1:
42927db96d56Sopenharmony_ci                return b
42937db96d56Sopenharmony_ci            raise ValueError("Not invertible")
42947db96d56Sopenharmony_ci*/
42957db96d56Sopenharmony_ci
42967db96d56Sopenharmony_cistatic PyLongObject *
42977db96d56Sopenharmony_cilong_invmod(PyLongObject *a, PyLongObject *n)
42987db96d56Sopenharmony_ci{
42997db96d56Sopenharmony_ci    PyLongObject *b, *c;
43007db96d56Sopenharmony_ci
43017db96d56Sopenharmony_ci    /* Should only ever be called for positive n */
43027db96d56Sopenharmony_ci    assert(Py_SIZE(n) > 0);
43037db96d56Sopenharmony_ci
43047db96d56Sopenharmony_ci    b = (PyLongObject *)PyLong_FromLong(1L);
43057db96d56Sopenharmony_ci    if (b == NULL) {
43067db96d56Sopenharmony_ci        return NULL;
43077db96d56Sopenharmony_ci    }
43087db96d56Sopenharmony_ci    c = (PyLongObject *)PyLong_FromLong(0L);
43097db96d56Sopenharmony_ci    if (c == NULL) {
43107db96d56Sopenharmony_ci        Py_DECREF(b);
43117db96d56Sopenharmony_ci        return NULL;
43127db96d56Sopenharmony_ci    }
43137db96d56Sopenharmony_ci    Py_INCREF(a);
43147db96d56Sopenharmony_ci    Py_INCREF(n);
43157db96d56Sopenharmony_ci
43167db96d56Sopenharmony_ci    /* references now owned: a, b, c, n */
43177db96d56Sopenharmony_ci    while (Py_SIZE(n) != 0) {
43187db96d56Sopenharmony_ci        PyLongObject *q, *r, *s, *t;
43197db96d56Sopenharmony_ci
43207db96d56Sopenharmony_ci        if (l_divmod(a, n, &q, &r) == -1) {
43217db96d56Sopenharmony_ci            goto Error;
43227db96d56Sopenharmony_ci        }
43237db96d56Sopenharmony_ci        Py_DECREF(a);
43247db96d56Sopenharmony_ci        a = n;
43257db96d56Sopenharmony_ci        n = r;
43267db96d56Sopenharmony_ci        t = (PyLongObject *)long_mul(q, c);
43277db96d56Sopenharmony_ci        Py_DECREF(q);
43287db96d56Sopenharmony_ci        if (t == NULL) {
43297db96d56Sopenharmony_ci            goto Error;
43307db96d56Sopenharmony_ci        }
43317db96d56Sopenharmony_ci        s = (PyLongObject *)long_sub(b, t);
43327db96d56Sopenharmony_ci        Py_DECREF(t);
43337db96d56Sopenharmony_ci        if (s == NULL) {
43347db96d56Sopenharmony_ci            goto Error;
43357db96d56Sopenharmony_ci        }
43367db96d56Sopenharmony_ci        Py_DECREF(b);
43377db96d56Sopenharmony_ci        b = c;
43387db96d56Sopenharmony_ci        c = s;
43397db96d56Sopenharmony_ci    }
43407db96d56Sopenharmony_ci    /* references now owned: a, b, c, n */
43417db96d56Sopenharmony_ci
43427db96d56Sopenharmony_ci    Py_DECREF(c);
43437db96d56Sopenharmony_ci    Py_DECREF(n);
43447db96d56Sopenharmony_ci    if (long_compare(a, (PyLongObject *)_PyLong_GetOne())) {
43457db96d56Sopenharmony_ci        /* a != 1; we don't have an inverse. */
43467db96d56Sopenharmony_ci        Py_DECREF(a);
43477db96d56Sopenharmony_ci        Py_DECREF(b);
43487db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
43497db96d56Sopenharmony_ci                        "base is not invertible for the given modulus");
43507db96d56Sopenharmony_ci        return NULL;
43517db96d56Sopenharmony_ci    }
43527db96d56Sopenharmony_ci    else {
43537db96d56Sopenharmony_ci        /* a == 1; b gives an inverse modulo n */
43547db96d56Sopenharmony_ci        Py_DECREF(a);
43557db96d56Sopenharmony_ci        return b;
43567db96d56Sopenharmony_ci    }
43577db96d56Sopenharmony_ci
43587db96d56Sopenharmony_ci  Error:
43597db96d56Sopenharmony_ci    Py_DECREF(a);
43607db96d56Sopenharmony_ci    Py_DECREF(b);
43617db96d56Sopenharmony_ci    Py_DECREF(c);
43627db96d56Sopenharmony_ci    Py_DECREF(n);
43637db96d56Sopenharmony_ci    return NULL;
43647db96d56Sopenharmony_ci}
43657db96d56Sopenharmony_ci
43667db96d56Sopenharmony_ci
43677db96d56Sopenharmony_ci/* pow(v, w, x) */
43687db96d56Sopenharmony_cistatic PyObject *
43697db96d56Sopenharmony_cilong_pow(PyObject *v, PyObject *w, PyObject *x)
43707db96d56Sopenharmony_ci{
43717db96d56Sopenharmony_ci    PyLongObject *a, *b, *c; /* a,b,c = v,w,x */
43727db96d56Sopenharmony_ci    int negativeOutput = 0;  /* if x<0 return negative output */
43737db96d56Sopenharmony_ci
43747db96d56Sopenharmony_ci    PyLongObject *z = NULL;  /* accumulated result */
43757db96d56Sopenharmony_ci    Py_ssize_t i, j;             /* counters */
43767db96d56Sopenharmony_ci    PyLongObject *temp = NULL;
43777db96d56Sopenharmony_ci    PyLongObject *a2 = NULL; /* may temporarily hold a**2 % c */
43787db96d56Sopenharmony_ci
43797db96d56Sopenharmony_ci    /* k-ary values.  If the exponent is large enough, table is
43807db96d56Sopenharmony_ci     * precomputed so that table[i] == a**(2*i+1) % c for i in
43817db96d56Sopenharmony_ci     * range(EXP_TABLE_LEN).
43827db96d56Sopenharmony_ci     * Note: this is uninitialzed stack trash: don't pay to set it to known
43837db96d56Sopenharmony_ci     * values unless it's needed. Instead ensure that num_table_entries is
43847db96d56Sopenharmony_ci     * set to the number of entries actually filled whenever a branch to the
43857db96d56Sopenharmony_ci     * Error or Done labels is possible.
43867db96d56Sopenharmony_ci     */
43877db96d56Sopenharmony_ci    PyLongObject *table[EXP_TABLE_LEN];
43887db96d56Sopenharmony_ci    Py_ssize_t num_table_entries = 0;
43897db96d56Sopenharmony_ci
43907db96d56Sopenharmony_ci    /* a, b, c = v, w, x */
43917db96d56Sopenharmony_ci    CHECK_BINOP(v, w);
43927db96d56Sopenharmony_ci    a = (PyLongObject*)v; Py_INCREF(a);
43937db96d56Sopenharmony_ci    b = (PyLongObject*)w; Py_INCREF(b);
43947db96d56Sopenharmony_ci    if (PyLong_Check(x)) {
43957db96d56Sopenharmony_ci        c = (PyLongObject *)x;
43967db96d56Sopenharmony_ci        Py_INCREF(x);
43977db96d56Sopenharmony_ci    }
43987db96d56Sopenharmony_ci    else if (x == Py_None)
43997db96d56Sopenharmony_ci        c = NULL;
44007db96d56Sopenharmony_ci    else {
44017db96d56Sopenharmony_ci        Py_DECREF(a);
44027db96d56Sopenharmony_ci        Py_DECREF(b);
44037db96d56Sopenharmony_ci        Py_RETURN_NOTIMPLEMENTED;
44047db96d56Sopenharmony_ci    }
44057db96d56Sopenharmony_ci
44067db96d56Sopenharmony_ci    if (Py_SIZE(b) < 0 && c == NULL) {
44077db96d56Sopenharmony_ci        /* if exponent is negative and there's no modulus:
44087db96d56Sopenharmony_ci               return a float.  This works because we know
44097db96d56Sopenharmony_ci               that this calls float_pow() which converts its
44107db96d56Sopenharmony_ci               arguments to double. */
44117db96d56Sopenharmony_ci        Py_DECREF(a);
44127db96d56Sopenharmony_ci        Py_DECREF(b);
44137db96d56Sopenharmony_ci        return PyFloat_Type.tp_as_number->nb_power(v, w, x);
44147db96d56Sopenharmony_ci    }
44157db96d56Sopenharmony_ci
44167db96d56Sopenharmony_ci    if (c) {
44177db96d56Sopenharmony_ci        /* if modulus == 0:
44187db96d56Sopenharmony_ci               raise ValueError() */
44197db96d56Sopenharmony_ci        if (Py_SIZE(c) == 0) {
44207db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError,
44217db96d56Sopenharmony_ci                            "pow() 3rd argument cannot be 0");
44227db96d56Sopenharmony_ci            goto Error;
44237db96d56Sopenharmony_ci        }
44247db96d56Sopenharmony_ci
44257db96d56Sopenharmony_ci        /* if modulus < 0:
44267db96d56Sopenharmony_ci               negativeOutput = True
44277db96d56Sopenharmony_ci               modulus = -modulus */
44287db96d56Sopenharmony_ci        if (Py_SIZE(c) < 0) {
44297db96d56Sopenharmony_ci            negativeOutput = 1;
44307db96d56Sopenharmony_ci            temp = (PyLongObject *)_PyLong_Copy(c);
44317db96d56Sopenharmony_ci            if (temp == NULL)
44327db96d56Sopenharmony_ci                goto Error;
44337db96d56Sopenharmony_ci            Py_DECREF(c);
44347db96d56Sopenharmony_ci            c = temp;
44357db96d56Sopenharmony_ci            temp = NULL;
44367db96d56Sopenharmony_ci            _PyLong_Negate(&c);
44377db96d56Sopenharmony_ci            if (c == NULL)
44387db96d56Sopenharmony_ci                goto Error;
44397db96d56Sopenharmony_ci        }
44407db96d56Sopenharmony_ci
44417db96d56Sopenharmony_ci        /* if modulus == 1:
44427db96d56Sopenharmony_ci               return 0 */
44437db96d56Sopenharmony_ci        if ((Py_SIZE(c) == 1) && (c->ob_digit[0] == 1)) {
44447db96d56Sopenharmony_ci            z = (PyLongObject *)PyLong_FromLong(0L);
44457db96d56Sopenharmony_ci            goto Done;
44467db96d56Sopenharmony_ci        }
44477db96d56Sopenharmony_ci
44487db96d56Sopenharmony_ci        /* if exponent is negative, negate the exponent and
44497db96d56Sopenharmony_ci           replace the base with a modular inverse */
44507db96d56Sopenharmony_ci        if (Py_SIZE(b) < 0) {
44517db96d56Sopenharmony_ci            temp = (PyLongObject *)_PyLong_Copy(b);
44527db96d56Sopenharmony_ci            if (temp == NULL)
44537db96d56Sopenharmony_ci                goto Error;
44547db96d56Sopenharmony_ci            Py_DECREF(b);
44557db96d56Sopenharmony_ci            b = temp;
44567db96d56Sopenharmony_ci            temp = NULL;
44577db96d56Sopenharmony_ci            _PyLong_Negate(&b);
44587db96d56Sopenharmony_ci            if (b == NULL)
44597db96d56Sopenharmony_ci                goto Error;
44607db96d56Sopenharmony_ci
44617db96d56Sopenharmony_ci            temp = long_invmod(a, c);
44627db96d56Sopenharmony_ci            if (temp == NULL)
44637db96d56Sopenharmony_ci                goto Error;
44647db96d56Sopenharmony_ci            Py_DECREF(a);
44657db96d56Sopenharmony_ci            a = temp;
44667db96d56Sopenharmony_ci            temp = NULL;
44677db96d56Sopenharmony_ci        }
44687db96d56Sopenharmony_ci
44697db96d56Sopenharmony_ci        /* Reduce base by modulus in some cases:
44707db96d56Sopenharmony_ci           1. If base < 0.  Forcing the base non-negative makes things easier.
44717db96d56Sopenharmony_ci           2. If base is obviously larger than the modulus.  The "small
44727db96d56Sopenharmony_ci              exponent" case later can multiply directly by base repeatedly,
44737db96d56Sopenharmony_ci              while the "large exponent" case multiplies directly by base 31
44747db96d56Sopenharmony_ci              times.  It can be unboundedly faster to multiply by
44757db96d56Sopenharmony_ci              base % modulus instead.
44767db96d56Sopenharmony_ci           We could _always_ do this reduction, but l_mod() isn't cheap,
44777db96d56Sopenharmony_ci           so we only do it when it buys something. */
44787db96d56Sopenharmony_ci        if (Py_SIZE(a) < 0 || Py_SIZE(a) > Py_SIZE(c)) {
44797db96d56Sopenharmony_ci            if (l_mod(a, c, &temp) < 0)
44807db96d56Sopenharmony_ci                goto Error;
44817db96d56Sopenharmony_ci            Py_DECREF(a);
44827db96d56Sopenharmony_ci            a = temp;
44837db96d56Sopenharmony_ci            temp = NULL;
44847db96d56Sopenharmony_ci        }
44857db96d56Sopenharmony_ci    }
44867db96d56Sopenharmony_ci
44877db96d56Sopenharmony_ci    /* At this point a, b, and c are guaranteed non-negative UNLESS
44887db96d56Sopenharmony_ci       c is NULL, in which case a may be negative. */
44897db96d56Sopenharmony_ci
44907db96d56Sopenharmony_ci    z = (PyLongObject *)PyLong_FromLong(1L);
44917db96d56Sopenharmony_ci    if (z == NULL)
44927db96d56Sopenharmony_ci        goto Error;
44937db96d56Sopenharmony_ci
44947db96d56Sopenharmony_ci    /* Perform a modular reduction, X = X % c, but leave X alone if c
44957db96d56Sopenharmony_ci     * is NULL.
44967db96d56Sopenharmony_ci     */
44977db96d56Sopenharmony_ci#define REDUCE(X)                                       \
44987db96d56Sopenharmony_ci    do {                                                \
44997db96d56Sopenharmony_ci        if (c != NULL) {                                \
45007db96d56Sopenharmony_ci            if (l_mod(X, c, &temp) < 0)                 \
45017db96d56Sopenharmony_ci                goto Error;                             \
45027db96d56Sopenharmony_ci            Py_XDECREF(X);                              \
45037db96d56Sopenharmony_ci            X = temp;                                   \
45047db96d56Sopenharmony_ci            temp = NULL;                                \
45057db96d56Sopenharmony_ci        }                                               \
45067db96d56Sopenharmony_ci    } while(0)
45077db96d56Sopenharmony_ci
45087db96d56Sopenharmony_ci    /* Multiply two values, then reduce the result:
45097db96d56Sopenharmony_ci       result = X*Y % c.  If c is NULL, skip the mod. */
45107db96d56Sopenharmony_ci#define MULT(X, Y, result)                      \
45117db96d56Sopenharmony_ci    do {                                        \
45127db96d56Sopenharmony_ci        temp = (PyLongObject *)long_mul(X, Y);  \
45137db96d56Sopenharmony_ci        if (temp == NULL)                       \
45147db96d56Sopenharmony_ci            goto Error;                         \
45157db96d56Sopenharmony_ci        Py_XDECREF(result);                     \
45167db96d56Sopenharmony_ci        result = temp;                          \
45177db96d56Sopenharmony_ci        temp = NULL;                            \
45187db96d56Sopenharmony_ci        REDUCE(result);                         \
45197db96d56Sopenharmony_ci    } while(0)
45207db96d56Sopenharmony_ci
45217db96d56Sopenharmony_ci    i = Py_SIZE(b);
45227db96d56Sopenharmony_ci    digit bi = i ? b->ob_digit[i-1] : 0;
45237db96d56Sopenharmony_ci    digit bit;
45247db96d56Sopenharmony_ci    if (i <= 1 && bi <= 3) {
45257db96d56Sopenharmony_ci        /* aim for minimal overhead */
45267db96d56Sopenharmony_ci        if (bi >= 2) {
45277db96d56Sopenharmony_ci            MULT(a, a, z);
45287db96d56Sopenharmony_ci            if (bi == 3) {
45297db96d56Sopenharmony_ci                MULT(z, a, z);
45307db96d56Sopenharmony_ci            }
45317db96d56Sopenharmony_ci        }
45327db96d56Sopenharmony_ci        else if (bi == 1) {
45337db96d56Sopenharmony_ci            /* Multiplying by 1 serves two purposes: if `a` is of an int
45347db96d56Sopenharmony_ci             * subclass, makes the result an int (e.g., pow(False, 1) returns
45357db96d56Sopenharmony_ci             * 0 instead of False), and potentially reduces `a` by the modulus.
45367db96d56Sopenharmony_ci             */
45377db96d56Sopenharmony_ci            MULT(a, z, z);
45387db96d56Sopenharmony_ci        }
45397db96d56Sopenharmony_ci        /* else bi is 0, and z==1 is correct */
45407db96d56Sopenharmony_ci    }
45417db96d56Sopenharmony_ci    else if (i <= HUGE_EXP_CUTOFF / PyLong_SHIFT ) {
45427db96d56Sopenharmony_ci        /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
45437db96d56Sopenharmony_ci        /* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf    */
45447db96d56Sopenharmony_ci
45457db96d56Sopenharmony_ci        /* Find the first significant exponent bit. Search right to left
45467db96d56Sopenharmony_ci         * because we're primarily trying to cut overhead for small powers.
45477db96d56Sopenharmony_ci         */
45487db96d56Sopenharmony_ci        assert(bi);  /* else there is no significant bit */
45497db96d56Sopenharmony_ci        Py_INCREF(a);
45507db96d56Sopenharmony_ci        Py_DECREF(z);
45517db96d56Sopenharmony_ci        z = a;
45527db96d56Sopenharmony_ci        for (bit = 2; ; bit <<= 1) {
45537db96d56Sopenharmony_ci            if (bit > bi) { /* found the first bit */
45547db96d56Sopenharmony_ci                assert((bi & bit) == 0);
45557db96d56Sopenharmony_ci                bit >>= 1;
45567db96d56Sopenharmony_ci                assert(bi & bit);
45577db96d56Sopenharmony_ci                break;
45587db96d56Sopenharmony_ci            }
45597db96d56Sopenharmony_ci        }
45607db96d56Sopenharmony_ci        for (--i, bit >>= 1;;) {
45617db96d56Sopenharmony_ci            for (; bit != 0; bit >>= 1) {
45627db96d56Sopenharmony_ci                MULT(z, z, z);
45637db96d56Sopenharmony_ci                if (bi & bit) {
45647db96d56Sopenharmony_ci                    MULT(z, a, z);
45657db96d56Sopenharmony_ci                }
45667db96d56Sopenharmony_ci            }
45677db96d56Sopenharmony_ci            if (--i < 0) {
45687db96d56Sopenharmony_ci                break;
45697db96d56Sopenharmony_ci            }
45707db96d56Sopenharmony_ci            bi = b->ob_digit[i];
45717db96d56Sopenharmony_ci            bit = (digit)1 << (PyLong_SHIFT-1);
45727db96d56Sopenharmony_ci        }
45737db96d56Sopenharmony_ci    }
45747db96d56Sopenharmony_ci    else {
45757db96d56Sopenharmony_ci        /* Left-to-right k-ary sliding window exponentiation
45767db96d56Sopenharmony_ci         * (Handbook of Applied Cryptography (HAC) Algorithm 14.85)
45777db96d56Sopenharmony_ci         */
45787db96d56Sopenharmony_ci        Py_INCREF(a);
45797db96d56Sopenharmony_ci        table[0] = a;
45807db96d56Sopenharmony_ci        num_table_entries = 1;
45817db96d56Sopenharmony_ci        MULT(a, a, a2);
45827db96d56Sopenharmony_ci        /* table[i] == a**(2*i + 1) % c */
45837db96d56Sopenharmony_ci        for (i = 1; i < EXP_TABLE_LEN; ++i) {
45847db96d56Sopenharmony_ci            table[i] = NULL; /* must set to known value for MULT */
45857db96d56Sopenharmony_ci            MULT(table[i-1], a2, table[i]);
45867db96d56Sopenharmony_ci            ++num_table_entries; /* incremented iff MULT succeeded */
45877db96d56Sopenharmony_ci        }
45887db96d56Sopenharmony_ci        Py_CLEAR(a2);
45897db96d56Sopenharmony_ci
45907db96d56Sopenharmony_ci        /* Repeatedly extract the next (no more than) EXP_WINDOW_SIZE bits
45917db96d56Sopenharmony_ci         * into `pending`, starting with the next 1 bit.  The current bit
45927db96d56Sopenharmony_ci         * length of `pending` is `blen`.
45937db96d56Sopenharmony_ci         */
45947db96d56Sopenharmony_ci        int pending = 0, blen = 0;
45957db96d56Sopenharmony_ci#define ABSORB_PENDING  do { \
45967db96d56Sopenharmony_ci            int ntz = 0; /* number of trailing zeroes in `pending` */ \
45977db96d56Sopenharmony_ci            assert(pending && blen); \
45987db96d56Sopenharmony_ci            assert(pending >> (blen - 1)); \
45997db96d56Sopenharmony_ci            assert(pending >> blen == 0); \
46007db96d56Sopenharmony_ci            while ((pending & 1) == 0) { \
46017db96d56Sopenharmony_ci                ++ntz; \
46027db96d56Sopenharmony_ci                pending >>= 1; \
46037db96d56Sopenharmony_ci            } \
46047db96d56Sopenharmony_ci            assert(ntz < blen); \
46057db96d56Sopenharmony_ci            blen -= ntz; \
46067db96d56Sopenharmony_ci            do { \
46077db96d56Sopenharmony_ci                MULT(z, z, z); \
46087db96d56Sopenharmony_ci            } while (--blen); \
46097db96d56Sopenharmony_ci            MULT(z, table[pending >> 1], z); \
46107db96d56Sopenharmony_ci            while (ntz-- > 0) \
46117db96d56Sopenharmony_ci                MULT(z, z, z); \
46127db96d56Sopenharmony_ci            assert(blen == 0); \
46137db96d56Sopenharmony_ci            pending = 0; \
46147db96d56Sopenharmony_ci        } while(0)
46157db96d56Sopenharmony_ci
46167db96d56Sopenharmony_ci        for (i = Py_SIZE(b) - 1; i >= 0; --i) {
46177db96d56Sopenharmony_ci            const digit bi = b->ob_digit[i];
46187db96d56Sopenharmony_ci            for (j = PyLong_SHIFT - 1; j >= 0; --j) {
46197db96d56Sopenharmony_ci                const int bit = (bi >> j) & 1;
46207db96d56Sopenharmony_ci                pending = (pending << 1) | bit;
46217db96d56Sopenharmony_ci                if (pending) {
46227db96d56Sopenharmony_ci                    ++blen;
46237db96d56Sopenharmony_ci                    if (blen == EXP_WINDOW_SIZE)
46247db96d56Sopenharmony_ci                        ABSORB_PENDING;
46257db96d56Sopenharmony_ci                }
46267db96d56Sopenharmony_ci                else /* absorb strings of 0 bits */
46277db96d56Sopenharmony_ci                    MULT(z, z, z);
46287db96d56Sopenharmony_ci            }
46297db96d56Sopenharmony_ci        }
46307db96d56Sopenharmony_ci        if (pending)
46317db96d56Sopenharmony_ci            ABSORB_PENDING;
46327db96d56Sopenharmony_ci    }
46337db96d56Sopenharmony_ci
46347db96d56Sopenharmony_ci    if (negativeOutput && (Py_SIZE(z) != 0)) {
46357db96d56Sopenharmony_ci        temp = (PyLongObject *)long_sub(z, c);
46367db96d56Sopenharmony_ci        if (temp == NULL)
46377db96d56Sopenharmony_ci            goto Error;
46387db96d56Sopenharmony_ci        Py_DECREF(z);
46397db96d56Sopenharmony_ci        z = temp;
46407db96d56Sopenharmony_ci        temp = NULL;
46417db96d56Sopenharmony_ci    }
46427db96d56Sopenharmony_ci    goto Done;
46437db96d56Sopenharmony_ci
46447db96d56Sopenharmony_ci  Error:
46457db96d56Sopenharmony_ci    Py_CLEAR(z);
46467db96d56Sopenharmony_ci    /* fall through */
46477db96d56Sopenharmony_ci  Done:
46487db96d56Sopenharmony_ci    for (i = 0; i < num_table_entries; ++i)
46497db96d56Sopenharmony_ci        Py_DECREF(table[i]);
46507db96d56Sopenharmony_ci    Py_DECREF(a);
46517db96d56Sopenharmony_ci    Py_DECREF(b);
46527db96d56Sopenharmony_ci    Py_XDECREF(c);
46537db96d56Sopenharmony_ci    Py_XDECREF(a2);
46547db96d56Sopenharmony_ci    Py_XDECREF(temp);
46557db96d56Sopenharmony_ci    return (PyObject *)z;
46567db96d56Sopenharmony_ci}
46577db96d56Sopenharmony_ci
46587db96d56Sopenharmony_cistatic PyObject *
46597db96d56Sopenharmony_cilong_invert(PyLongObject *v)
46607db96d56Sopenharmony_ci{
46617db96d56Sopenharmony_ci    /* Implement ~x as -(x+1) */
46627db96d56Sopenharmony_ci    PyLongObject *x;
46637db96d56Sopenharmony_ci    if (IS_MEDIUM_VALUE(v))
46647db96d56Sopenharmony_ci        return _PyLong_FromSTwoDigits(~medium_value(v));
46657db96d56Sopenharmony_ci    x = (PyLongObject *) long_add(v, (PyLongObject *)_PyLong_GetOne());
46667db96d56Sopenharmony_ci    if (x == NULL)
46677db96d56Sopenharmony_ci        return NULL;
46687db96d56Sopenharmony_ci    _PyLong_Negate(&x);
46697db96d56Sopenharmony_ci    /* No need for maybe_small_long here, since any small
46707db96d56Sopenharmony_ci       longs will have been caught in the Py_SIZE <= 1 fast path. */
46717db96d56Sopenharmony_ci    return (PyObject *)x;
46727db96d56Sopenharmony_ci}
46737db96d56Sopenharmony_ci
46747db96d56Sopenharmony_cistatic PyObject *
46757db96d56Sopenharmony_cilong_neg(PyLongObject *v)
46767db96d56Sopenharmony_ci{
46777db96d56Sopenharmony_ci    PyLongObject *z;
46787db96d56Sopenharmony_ci    if (IS_MEDIUM_VALUE(v))
46797db96d56Sopenharmony_ci        return _PyLong_FromSTwoDigits(-medium_value(v));
46807db96d56Sopenharmony_ci    z = (PyLongObject *)_PyLong_Copy(v);
46817db96d56Sopenharmony_ci    if (z != NULL)
46827db96d56Sopenharmony_ci        Py_SET_SIZE(z, -(Py_SIZE(v)));
46837db96d56Sopenharmony_ci    return (PyObject *)z;
46847db96d56Sopenharmony_ci}
46857db96d56Sopenharmony_ci
46867db96d56Sopenharmony_cistatic PyObject *
46877db96d56Sopenharmony_cilong_abs(PyLongObject *v)
46887db96d56Sopenharmony_ci{
46897db96d56Sopenharmony_ci    if (Py_SIZE(v) < 0)
46907db96d56Sopenharmony_ci        return long_neg(v);
46917db96d56Sopenharmony_ci    else
46927db96d56Sopenharmony_ci        return long_long((PyObject *)v);
46937db96d56Sopenharmony_ci}
46947db96d56Sopenharmony_ci
46957db96d56Sopenharmony_cistatic int
46967db96d56Sopenharmony_cilong_bool(PyLongObject *v)
46977db96d56Sopenharmony_ci{
46987db96d56Sopenharmony_ci    return Py_SIZE(v) != 0;
46997db96d56Sopenharmony_ci}
47007db96d56Sopenharmony_ci
47017db96d56Sopenharmony_ci/* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
47027db96d56Sopenharmony_cistatic int
47037db96d56Sopenharmony_cidivmod_shift(PyObject *shiftby, Py_ssize_t *wordshift, digit *remshift)
47047db96d56Sopenharmony_ci{
47057db96d56Sopenharmony_ci    assert(PyLong_Check(shiftby));
47067db96d56Sopenharmony_ci    assert(Py_SIZE(shiftby) >= 0);
47077db96d56Sopenharmony_ci    Py_ssize_t lshiftby = PyLong_AsSsize_t((PyObject *)shiftby);
47087db96d56Sopenharmony_ci    if (lshiftby >= 0) {
47097db96d56Sopenharmony_ci        *wordshift = lshiftby / PyLong_SHIFT;
47107db96d56Sopenharmony_ci        *remshift = lshiftby % PyLong_SHIFT;
47117db96d56Sopenharmony_ci        return 0;
47127db96d56Sopenharmony_ci    }
47137db96d56Sopenharmony_ci    /* PyLong_Check(shiftby) is true and Py_SIZE(shiftby) >= 0, so it must
47147db96d56Sopenharmony_ci       be that PyLong_AsSsize_t raised an OverflowError. */
47157db96d56Sopenharmony_ci    assert(PyErr_ExceptionMatches(PyExc_OverflowError));
47167db96d56Sopenharmony_ci    PyErr_Clear();
47177db96d56Sopenharmony_ci    PyLongObject *wordshift_obj = divrem1((PyLongObject *)shiftby, PyLong_SHIFT, remshift);
47187db96d56Sopenharmony_ci    if (wordshift_obj == NULL) {
47197db96d56Sopenharmony_ci        return -1;
47207db96d56Sopenharmony_ci    }
47217db96d56Sopenharmony_ci    *wordshift = PyLong_AsSsize_t((PyObject *)wordshift_obj);
47227db96d56Sopenharmony_ci    Py_DECREF(wordshift_obj);
47237db96d56Sopenharmony_ci    if (*wordshift >= 0 && *wordshift < PY_SSIZE_T_MAX / (Py_ssize_t)sizeof(digit)) {
47247db96d56Sopenharmony_ci        return 0;
47257db96d56Sopenharmony_ci    }
47267db96d56Sopenharmony_ci    PyErr_Clear();
47277db96d56Sopenharmony_ci    /* Clip the value.  With such large wordshift the right shift
47287db96d56Sopenharmony_ci       returns 0 and the left shift raises an error in _PyLong_New(). */
47297db96d56Sopenharmony_ci    *wordshift = PY_SSIZE_T_MAX / sizeof(digit);
47307db96d56Sopenharmony_ci    *remshift = 0;
47317db96d56Sopenharmony_ci    return 0;
47327db96d56Sopenharmony_ci}
47337db96d56Sopenharmony_ci
47347db96d56Sopenharmony_ci/* Inner function for both long_rshift and _PyLong_Rshift, shifting an
47357db96d56Sopenharmony_ci   integer right by PyLong_SHIFT*wordshift + remshift bits.
47367db96d56Sopenharmony_ci   wordshift should be nonnegative. */
47377db96d56Sopenharmony_ci
47387db96d56Sopenharmony_cistatic PyObject *
47397db96d56Sopenharmony_cilong_rshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift)
47407db96d56Sopenharmony_ci{
47417db96d56Sopenharmony_ci    PyLongObject *z = NULL;
47427db96d56Sopenharmony_ci    Py_ssize_t newsize, hishift, size_a;
47437db96d56Sopenharmony_ci    twodigits accum;
47447db96d56Sopenharmony_ci    int a_negative;
47457db96d56Sopenharmony_ci
47467db96d56Sopenharmony_ci    /* Total number of bits shifted must be nonnegative. */
47477db96d56Sopenharmony_ci    assert(wordshift >= 0);
47487db96d56Sopenharmony_ci    assert(remshift < PyLong_SHIFT);
47497db96d56Sopenharmony_ci
47507db96d56Sopenharmony_ci    /* Fast path for small a. */
47517db96d56Sopenharmony_ci    if (IS_MEDIUM_VALUE(a)) {
47527db96d56Sopenharmony_ci        stwodigits m, x;
47537db96d56Sopenharmony_ci        digit shift;
47547db96d56Sopenharmony_ci        m = medium_value(a);
47557db96d56Sopenharmony_ci        shift = wordshift == 0 ? remshift : PyLong_SHIFT;
47567db96d56Sopenharmony_ci        x = m < 0 ? ~(~m >> shift) : m >> shift;
47577db96d56Sopenharmony_ci        return _PyLong_FromSTwoDigits(x);
47587db96d56Sopenharmony_ci    }
47597db96d56Sopenharmony_ci
47607db96d56Sopenharmony_ci    a_negative = Py_SIZE(a) < 0;
47617db96d56Sopenharmony_ci    size_a = Py_ABS(Py_SIZE(a));
47627db96d56Sopenharmony_ci
47637db96d56Sopenharmony_ci    if (a_negative) {
47647db96d56Sopenharmony_ci        /* For negative 'a', adjust so that 0 < remshift <= PyLong_SHIFT,
47657db96d56Sopenharmony_ci           while keeping PyLong_SHIFT*wordshift + remshift the same. This
47667db96d56Sopenharmony_ci           ensures that 'newsize' is computed correctly below. */
47677db96d56Sopenharmony_ci        if (remshift == 0) {
47687db96d56Sopenharmony_ci            if (wordshift == 0) {
47697db96d56Sopenharmony_ci                /* Can only happen if the original shift was 0. */
47707db96d56Sopenharmony_ci                return long_long((PyObject *)a);
47717db96d56Sopenharmony_ci            }
47727db96d56Sopenharmony_ci            remshift = PyLong_SHIFT;
47737db96d56Sopenharmony_ci            --wordshift;
47747db96d56Sopenharmony_ci        }
47757db96d56Sopenharmony_ci    }
47767db96d56Sopenharmony_ci
47777db96d56Sopenharmony_ci    assert(wordshift >= 0);
47787db96d56Sopenharmony_ci    newsize = size_a - wordshift;
47797db96d56Sopenharmony_ci    if (newsize <= 0) {
47807db96d56Sopenharmony_ci        /* Shifting all the bits of 'a' out gives either -1 or 0. */
47817db96d56Sopenharmony_ci        return PyLong_FromLong(-a_negative);
47827db96d56Sopenharmony_ci    }
47837db96d56Sopenharmony_ci    z = _PyLong_New(newsize);
47847db96d56Sopenharmony_ci    if (z == NULL) {
47857db96d56Sopenharmony_ci        return NULL;
47867db96d56Sopenharmony_ci    }
47877db96d56Sopenharmony_ci    hishift = PyLong_SHIFT - remshift;
47887db96d56Sopenharmony_ci
47897db96d56Sopenharmony_ci    accum = a->ob_digit[wordshift];
47907db96d56Sopenharmony_ci    if (a_negative) {
47917db96d56Sopenharmony_ci        /*
47927db96d56Sopenharmony_ci            For a positive integer a and nonnegative shift, we have:
47937db96d56Sopenharmony_ci
47947db96d56Sopenharmony_ci                (-a) >> shift == -((a + 2**shift - 1) >> shift).
47957db96d56Sopenharmony_ci
47967db96d56Sopenharmony_ci            In the addition `a + (2**shift - 1)`, the low `wordshift` digits of
47977db96d56Sopenharmony_ci            `2**shift - 1` all have value `PyLong_MASK`, so we get a carry out
47987db96d56Sopenharmony_ci            from the bottom `wordshift` digits when at least one of the least
47997db96d56Sopenharmony_ci            significant `wordshift` digits of `a` is nonzero. Digit `wordshift`
48007db96d56Sopenharmony_ci            of `2**shift - 1` has value `PyLong_MASK >> hishift`.
48017db96d56Sopenharmony_ci        */
48027db96d56Sopenharmony_ci        Py_SET_SIZE(z, -newsize);
48037db96d56Sopenharmony_ci
48047db96d56Sopenharmony_ci        digit sticky = 0;
48057db96d56Sopenharmony_ci        for (Py_ssize_t j = 0; j < wordshift; j++) {
48067db96d56Sopenharmony_ci            sticky |= a->ob_digit[j];
48077db96d56Sopenharmony_ci        }
48087db96d56Sopenharmony_ci        accum += (PyLong_MASK >> hishift) + (digit)(sticky != 0);
48097db96d56Sopenharmony_ci    }
48107db96d56Sopenharmony_ci
48117db96d56Sopenharmony_ci    accum >>= remshift;
48127db96d56Sopenharmony_ci    for (Py_ssize_t i = 0, j = wordshift + 1; j < size_a; i++, j++) {
48137db96d56Sopenharmony_ci        accum += (twodigits)a->ob_digit[j] << hishift;
48147db96d56Sopenharmony_ci        z->ob_digit[i] = (digit)(accum & PyLong_MASK);
48157db96d56Sopenharmony_ci        accum >>= PyLong_SHIFT;
48167db96d56Sopenharmony_ci    }
48177db96d56Sopenharmony_ci    assert(accum <= PyLong_MASK);
48187db96d56Sopenharmony_ci    z->ob_digit[newsize - 1] = (digit)accum;
48197db96d56Sopenharmony_ci
48207db96d56Sopenharmony_ci    z = maybe_small_long(long_normalize(z));
48217db96d56Sopenharmony_ci    return (PyObject *)z;
48227db96d56Sopenharmony_ci}
48237db96d56Sopenharmony_ci
48247db96d56Sopenharmony_cistatic PyObject *
48257db96d56Sopenharmony_cilong_rshift(PyObject *a, PyObject *b)
48267db96d56Sopenharmony_ci{
48277db96d56Sopenharmony_ci    Py_ssize_t wordshift;
48287db96d56Sopenharmony_ci    digit remshift;
48297db96d56Sopenharmony_ci
48307db96d56Sopenharmony_ci    CHECK_BINOP(a, b);
48317db96d56Sopenharmony_ci
48327db96d56Sopenharmony_ci    if (Py_SIZE(b) < 0) {
48337db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "negative shift count");
48347db96d56Sopenharmony_ci        return NULL;
48357db96d56Sopenharmony_ci    }
48367db96d56Sopenharmony_ci    if (Py_SIZE(a) == 0) {
48377db96d56Sopenharmony_ci        return PyLong_FromLong(0);
48387db96d56Sopenharmony_ci    }
48397db96d56Sopenharmony_ci    if (divmod_shift(b, &wordshift, &remshift) < 0)
48407db96d56Sopenharmony_ci        return NULL;
48417db96d56Sopenharmony_ci    return long_rshift1((PyLongObject *)a, wordshift, remshift);
48427db96d56Sopenharmony_ci}
48437db96d56Sopenharmony_ci
48447db96d56Sopenharmony_ci/* Return a >> shiftby. */
48457db96d56Sopenharmony_ciPyObject *
48467db96d56Sopenharmony_ci_PyLong_Rshift(PyObject *a, size_t shiftby)
48477db96d56Sopenharmony_ci{
48487db96d56Sopenharmony_ci    Py_ssize_t wordshift;
48497db96d56Sopenharmony_ci    digit remshift;
48507db96d56Sopenharmony_ci
48517db96d56Sopenharmony_ci    assert(PyLong_Check(a));
48527db96d56Sopenharmony_ci    if (Py_SIZE(a) == 0) {
48537db96d56Sopenharmony_ci        return PyLong_FromLong(0);
48547db96d56Sopenharmony_ci    }
48557db96d56Sopenharmony_ci    wordshift = shiftby / PyLong_SHIFT;
48567db96d56Sopenharmony_ci    remshift = shiftby % PyLong_SHIFT;
48577db96d56Sopenharmony_ci    return long_rshift1((PyLongObject *)a, wordshift, remshift);
48587db96d56Sopenharmony_ci}
48597db96d56Sopenharmony_ci
48607db96d56Sopenharmony_cistatic PyObject *
48617db96d56Sopenharmony_cilong_lshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift)
48627db96d56Sopenharmony_ci{
48637db96d56Sopenharmony_ci    PyLongObject *z = NULL;
48647db96d56Sopenharmony_ci    Py_ssize_t oldsize, newsize, i, j;
48657db96d56Sopenharmony_ci    twodigits accum;
48667db96d56Sopenharmony_ci
48677db96d56Sopenharmony_ci    if (wordshift == 0 && IS_MEDIUM_VALUE(a)) {
48687db96d56Sopenharmony_ci        stwodigits m = medium_value(a);
48697db96d56Sopenharmony_ci        // bypass undefined shift operator behavior
48707db96d56Sopenharmony_ci        stwodigits x = m < 0 ? -(-m << remshift) : m << remshift;
48717db96d56Sopenharmony_ci        return _PyLong_FromSTwoDigits(x);
48727db96d56Sopenharmony_ci    }
48737db96d56Sopenharmony_ci
48747db96d56Sopenharmony_ci    oldsize = Py_ABS(Py_SIZE(a));
48757db96d56Sopenharmony_ci    newsize = oldsize + wordshift;
48767db96d56Sopenharmony_ci    if (remshift)
48777db96d56Sopenharmony_ci        ++newsize;
48787db96d56Sopenharmony_ci    z = _PyLong_New(newsize);
48797db96d56Sopenharmony_ci    if (z == NULL)
48807db96d56Sopenharmony_ci        return NULL;
48817db96d56Sopenharmony_ci    if (Py_SIZE(a) < 0) {
48827db96d56Sopenharmony_ci        assert(Py_REFCNT(z) == 1);
48837db96d56Sopenharmony_ci        Py_SET_SIZE(z, -Py_SIZE(z));
48847db96d56Sopenharmony_ci    }
48857db96d56Sopenharmony_ci    for (i = 0; i < wordshift; i++)
48867db96d56Sopenharmony_ci        z->ob_digit[i] = 0;
48877db96d56Sopenharmony_ci    accum = 0;
48887db96d56Sopenharmony_ci    for (i = wordshift, j = 0; j < oldsize; i++, j++) {
48897db96d56Sopenharmony_ci        accum |= (twodigits)a->ob_digit[j] << remshift;
48907db96d56Sopenharmony_ci        z->ob_digit[i] = (digit)(accum & PyLong_MASK);
48917db96d56Sopenharmony_ci        accum >>= PyLong_SHIFT;
48927db96d56Sopenharmony_ci    }
48937db96d56Sopenharmony_ci    if (remshift)
48947db96d56Sopenharmony_ci        z->ob_digit[newsize-1] = (digit)accum;
48957db96d56Sopenharmony_ci    else
48967db96d56Sopenharmony_ci        assert(!accum);
48977db96d56Sopenharmony_ci    z = long_normalize(z);
48987db96d56Sopenharmony_ci    return (PyObject *) maybe_small_long(z);
48997db96d56Sopenharmony_ci}
49007db96d56Sopenharmony_ci
49017db96d56Sopenharmony_cistatic PyObject *
49027db96d56Sopenharmony_cilong_lshift(PyObject *a, PyObject *b)
49037db96d56Sopenharmony_ci{
49047db96d56Sopenharmony_ci    Py_ssize_t wordshift;
49057db96d56Sopenharmony_ci    digit remshift;
49067db96d56Sopenharmony_ci
49077db96d56Sopenharmony_ci    CHECK_BINOP(a, b);
49087db96d56Sopenharmony_ci
49097db96d56Sopenharmony_ci    if (Py_SIZE(b) < 0) {
49107db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "negative shift count");
49117db96d56Sopenharmony_ci        return NULL;
49127db96d56Sopenharmony_ci    }
49137db96d56Sopenharmony_ci    if (Py_SIZE(a) == 0) {
49147db96d56Sopenharmony_ci        return PyLong_FromLong(0);
49157db96d56Sopenharmony_ci    }
49167db96d56Sopenharmony_ci    if (divmod_shift(b, &wordshift, &remshift) < 0)
49177db96d56Sopenharmony_ci        return NULL;
49187db96d56Sopenharmony_ci    return long_lshift1((PyLongObject *)a, wordshift, remshift);
49197db96d56Sopenharmony_ci}
49207db96d56Sopenharmony_ci
49217db96d56Sopenharmony_ci/* Return a << shiftby. */
49227db96d56Sopenharmony_ciPyObject *
49237db96d56Sopenharmony_ci_PyLong_Lshift(PyObject *a, size_t shiftby)
49247db96d56Sopenharmony_ci{
49257db96d56Sopenharmony_ci    Py_ssize_t wordshift;
49267db96d56Sopenharmony_ci    digit remshift;
49277db96d56Sopenharmony_ci
49287db96d56Sopenharmony_ci    assert(PyLong_Check(a));
49297db96d56Sopenharmony_ci    if (Py_SIZE(a) == 0) {
49307db96d56Sopenharmony_ci        return PyLong_FromLong(0);
49317db96d56Sopenharmony_ci    }
49327db96d56Sopenharmony_ci    wordshift = shiftby / PyLong_SHIFT;
49337db96d56Sopenharmony_ci    remshift = shiftby % PyLong_SHIFT;
49347db96d56Sopenharmony_ci    return long_lshift1((PyLongObject *)a, wordshift, remshift);
49357db96d56Sopenharmony_ci}
49367db96d56Sopenharmony_ci
49377db96d56Sopenharmony_ci/* Compute two's complement of digit vector a[0:m], writing result to
49387db96d56Sopenharmony_ci   z[0:m].  The digit vector a need not be normalized, but should not
49397db96d56Sopenharmony_ci   be entirely zero.  a and z may point to the same digit vector. */
49407db96d56Sopenharmony_ci
49417db96d56Sopenharmony_cistatic void
49427db96d56Sopenharmony_civ_complement(digit *z, digit *a, Py_ssize_t m)
49437db96d56Sopenharmony_ci{
49447db96d56Sopenharmony_ci    Py_ssize_t i;
49457db96d56Sopenharmony_ci    digit carry = 1;
49467db96d56Sopenharmony_ci    for (i = 0; i < m; ++i) {
49477db96d56Sopenharmony_ci        carry += a[i] ^ PyLong_MASK;
49487db96d56Sopenharmony_ci        z[i] = carry & PyLong_MASK;
49497db96d56Sopenharmony_ci        carry >>= PyLong_SHIFT;
49507db96d56Sopenharmony_ci    }
49517db96d56Sopenharmony_ci    assert(carry == 0);
49527db96d56Sopenharmony_ci}
49537db96d56Sopenharmony_ci
49547db96d56Sopenharmony_ci/* Bitwise and/xor/or operations */
49557db96d56Sopenharmony_ci
49567db96d56Sopenharmony_cistatic PyObject *
49577db96d56Sopenharmony_cilong_bitwise(PyLongObject *a,
49587db96d56Sopenharmony_ci             char op,  /* '&', '|', '^' */
49597db96d56Sopenharmony_ci             PyLongObject *b)
49607db96d56Sopenharmony_ci{
49617db96d56Sopenharmony_ci    int nega, negb, negz;
49627db96d56Sopenharmony_ci    Py_ssize_t size_a, size_b, size_z, i;
49637db96d56Sopenharmony_ci    PyLongObject *z;
49647db96d56Sopenharmony_ci
49657db96d56Sopenharmony_ci    /* Bitwise operations for negative numbers operate as though
49667db96d56Sopenharmony_ci       on a two's complement representation.  So convert arguments
49677db96d56Sopenharmony_ci       from sign-magnitude to two's complement, and convert the
49687db96d56Sopenharmony_ci       result back to sign-magnitude at the end. */
49697db96d56Sopenharmony_ci
49707db96d56Sopenharmony_ci    /* If a is negative, replace it by its two's complement. */
49717db96d56Sopenharmony_ci    size_a = Py_ABS(Py_SIZE(a));
49727db96d56Sopenharmony_ci    nega = Py_SIZE(a) < 0;
49737db96d56Sopenharmony_ci    if (nega) {
49747db96d56Sopenharmony_ci        z = _PyLong_New(size_a);
49757db96d56Sopenharmony_ci        if (z == NULL)
49767db96d56Sopenharmony_ci            return NULL;
49777db96d56Sopenharmony_ci        v_complement(z->ob_digit, a->ob_digit, size_a);
49787db96d56Sopenharmony_ci        a = z;
49797db96d56Sopenharmony_ci    }
49807db96d56Sopenharmony_ci    else
49817db96d56Sopenharmony_ci        /* Keep reference count consistent. */
49827db96d56Sopenharmony_ci        Py_INCREF(a);
49837db96d56Sopenharmony_ci
49847db96d56Sopenharmony_ci    /* Same for b. */
49857db96d56Sopenharmony_ci    size_b = Py_ABS(Py_SIZE(b));
49867db96d56Sopenharmony_ci    negb = Py_SIZE(b) < 0;
49877db96d56Sopenharmony_ci    if (negb) {
49887db96d56Sopenharmony_ci        z = _PyLong_New(size_b);
49897db96d56Sopenharmony_ci        if (z == NULL) {
49907db96d56Sopenharmony_ci            Py_DECREF(a);
49917db96d56Sopenharmony_ci            return NULL;
49927db96d56Sopenharmony_ci        }
49937db96d56Sopenharmony_ci        v_complement(z->ob_digit, b->ob_digit, size_b);
49947db96d56Sopenharmony_ci        b = z;
49957db96d56Sopenharmony_ci    }
49967db96d56Sopenharmony_ci    else
49977db96d56Sopenharmony_ci        Py_INCREF(b);
49987db96d56Sopenharmony_ci
49997db96d56Sopenharmony_ci    /* Swap a and b if necessary to ensure size_a >= size_b. */
50007db96d56Sopenharmony_ci    if (size_a < size_b) {
50017db96d56Sopenharmony_ci        z = a; a = b; b = z;
50027db96d56Sopenharmony_ci        size_z = size_a; size_a = size_b; size_b = size_z;
50037db96d56Sopenharmony_ci        negz = nega; nega = negb; negb = negz;
50047db96d56Sopenharmony_ci    }
50057db96d56Sopenharmony_ci
50067db96d56Sopenharmony_ci    /* JRH: The original logic here was to allocate the result value (z)
50077db96d56Sopenharmony_ci       as the longer of the two operands.  However, there are some cases
50087db96d56Sopenharmony_ci       where the result is guaranteed to be shorter than that: AND of two
50097db96d56Sopenharmony_ci       positives, OR of two negatives: use the shorter number.  AND with
50107db96d56Sopenharmony_ci       mixed signs: use the positive number.  OR with mixed signs: use the
50117db96d56Sopenharmony_ci       negative number.
50127db96d56Sopenharmony_ci    */
50137db96d56Sopenharmony_ci    switch (op) {
50147db96d56Sopenharmony_ci    case '^':
50157db96d56Sopenharmony_ci        negz = nega ^ negb;
50167db96d56Sopenharmony_ci        size_z = size_a;
50177db96d56Sopenharmony_ci        break;
50187db96d56Sopenharmony_ci    case '&':
50197db96d56Sopenharmony_ci        negz = nega & negb;
50207db96d56Sopenharmony_ci        size_z = negb ? size_a : size_b;
50217db96d56Sopenharmony_ci        break;
50227db96d56Sopenharmony_ci    case '|':
50237db96d56Sopenharmony_ci        negz = nega | negb;
50247db96d56Sopenharmony_ci        size_z = negb ? size_b : size_a;
50257db96d56Sopenharmony_ci        break;
50267db96d56Sopenharmony_ci    default:
50277db96d56Sopenharmony_ci        Py_UNREACHABLE();
50287db96d56Sopenharmony_ci    }
50297db96d56Sopenharmony_ci
50307db96d56Sopenharmony_ci    /* We allow an extra digit if z is negative, to make sure that
50317db96d56Sopenharmony_ci       the final two's complement of z doesn't overflow. */
50327db96d56Sopenharmony_ci    z = _PyLong_New(size_z + negz);
50337db96d56Sopenharmony_ci    if (z == NULL) {
50347db96d56Sopenharmony_ci        Py_DECREF(a);
50357db96d56Sopenharmony_ci        Py_DECREF(b);
50367db96d56Sopenharmony_ci        return NULL;
50377db96d56Sopenharmony_ci    }
50387db96d56Sopenharmony_ci
50397db96d56Sopenharmony_ci    /* Compute digits for overlap of a and b. */
50407db96d56Sopenharmony_ci    switch(op) {
50417db96d56Sopenharmony_ci    case '&':
50427db96d56Sopenharmony_ci        for (i = 0; i < size_b; ++i)
50437db96d56Sopenharmony_ci            z->ob_digit[i] = a->ob_digit[i] & b->ob_digit[i];
50447db96d56Sopenharmony_ci        break;
50457db96d56Sopenharmony_ci    case '|':
50467db96d56Sopenharmony_ci        for (i = 0; i < size_b; ++i)
50477db96d56Sopenharmony_ci            z->ob_digit[i] = a->ob_digit[i] | b->ob_digit[i];
50487db96d56Sopenharmony_ci        break;
50497db96d56Sopenharmony_ci    case '^':
50507db96d56Sopenharmony_ci        for (i = 0; i < size_b; ++i)
50517db96d56Sopenharmony_ci            z->ob_digit[i] = a->ob_digit[i] ^ b->ob_digit[i];
50527db96d56Sopenharmony_ci        break;
50537db96d56Sopenharmony_ci    default:
50547db96d56Sopenharmony_ci        Py_UNREACHABLE();
50557db96d56Sopenharmony_ci    }
50567db96d56Sopenharmony_ci
50577db96d56Sopenharmony_ci    /* Copy any remaining digits of a, inverting if necessary. */
50587db96d56Sopenharmony_ci    if (op == '^' && negb)
50597db96d56Sopenharmony_ci        for (; i < size_z; ++i)
50607db96d56Sopenharmony_ci            z->ob_digit[i] = a->ob_digit[i] ^ PyLong_MASK;
50617db96d56Sopenharmony_ci    else if (i < size_z)
50627db96d56Sopenharmony_ci        memcpy(&z->ob_digit[i], &a->ob_digit[i],
50637db96d56Sopenharmony_ci               (size_z-i)*sizeof(digit));
50647db96d56Sopenharmony_ci
50657db96d56Sopenharmony_ci    /* Complement result if negative. */
50667db96d56Sopenharmony_ci    if (negz) {
50677db96d56Sopenharmony_ci        Py_SET_SIZE(z, -(Py_SIZE(z)));
50687db96d56Sopenharmony_ci        z->ob_digit[size_z] = PyLong_MASK;
50697db96d56Sopenharmony_ci        v_complement(z->ob_digit, z->ob_digit, size_z+1);
50707db96d56Sopenharmony_ci    }
50717db96d56Sopenharmony_ci
50727db96d56Sopenharmony_ci    Py_DECREF(a);
50737db96d56Sopenharmony_ci    Py_DECREF(b);
50747db96d56Sopenharmony_ci    return (PyObject *)maybe_small_long(long_normalize(z));
50757db96d56Sopenharmony_ci}
50767db96d56Sopenharmony_ci
50777db96d56Sopenharmony_cistatic PyObject *
50787db96d56Sopenharmony_cilong_and(PyObject *a, PyObject *b)
50797db96d56Sopenharmony_ci{
50807db96d56Sopenharmony_ci    CHECK_BINOP(a, b);
50817db96d56Sopenharmony_ci    PyLongObject *x = (PyLongObject*)a;
50827db96d56Sopenharmony_ci    PyLongObject *y = (PyLongObject*)b;
50837db96d56Sopenharmony_ci    if (IS_MEDIUM_VALUE(x) && IS_MEDIUM_VALUE(y)) {
50847db96d56Sopenharmony_ci        return _PyLong_FromSTwoDigits(medium_value(x) & medium_value(y));
50857db96d56Sopenharmony_ci    }
50867db96d56Sopenharmony_ci    return long_bitwise(x, '&', y);
50877db96d56Sopenharmony_ci}
50887db96d56Sopenharmony_ci
50897db96d56Sopenharmony_cistatic PyObject *
50907db96d56Sopenharmony_cilong_xor(PyObject *a, PyObject *b)
50917db96d56Sopenharmony_ci{
50927db96d56Sopenharmony_ci    CHECK_BINOP(a, b);
50937db96d56Sopenharmony_ci    PyLongObject *x = (PyLongObject*)a;
50947db96d56Sopenharmony_ci    PyLongObject *y = (PyLongObject*)b;
50957db96d56Sopenharmony_ci    if (IS_MEDIUM_VALUE(x) && IS_MEDIUM_VALUE(y)) {
50967db96d56Sopenharmony_ci        return _PyLong_FromSTwoDigits(medium_value(x) ^ medium_value(y));
50977db96d56Sopenharmony_ci    }
50987db96d56Sopenharmony_ci    return long_bitwise(x, '^', y);
50997db96d56Sopenharmony_ci}
51007db96d56Sopenharmony_ci
51017db96d56Sopenharmony_cistatic PyObject *
51027db96d56Sopenharmony_cilong_or(PyObject *a, PyObject *b)
51037db96d56Sopenharmony_ci{
51047db96d56Sopenharmony_ci    CHECK_BINOP(a, b);
51057db96d56Sopenharmony_ci    PyLongObject *x = (PyLongObject*)a;
51067db96d56Sopenharmony_ci    PyLongObject *y = (PyLongObject*)b;
51077db96d56Sopenharmony_ci    if (IS_MEDIUM_VALUE(x) && IS_MEDIUM_VALUE(y)) {
51087db96d56Sopenharmony_ci        return _PyLong_FromSTwoDigits(medium_value(x) | medium_value(y));
51097db96d56Sopenharmony_ci    }
51107db96d56Sopenharmony_ci    return long_bitwise(x, '|', y);
51117db96d56Sopenharmony_ci}
51127db96d56Sopenharmony_ci
51137db96d56Sopenharmony_cistatic PyObject *
51147db96d56Sopenharmony_cilong_long(PyObject *v)
51157db96d56Sopenharmony_ci{
51167db96d56Sopenharmony_ci    if (PyLong_CheckExact(v))
51177db96d56Sopenharmony_ci        Py_INCREF(v);
51187db96d56Sopenharmony_ci    else
51197db96d56Sopenharmony_ci        v = _PyLong_Copy((PyLongObject *)v);
51207db96d56Sopenharmony_ci    return v;
51217db96d56Sopenharmony_ci}
51227db96d56Sopenharmony_ci
51237db96d56Sopenharmony_ciPyObject *
51247db96d56Sopenharmony_ci_PyLong_GCD(PyObject *aarg, PyObject *barg)
51257db96d56Sopenharmony_ci{
51267db96d56Sopenharmony_ci    PyLongObject *a, *b, *c = NULL, *d = NULL, *r;
51277db96d56Sopenharmony_ci    stwodigits x, y, q, s, t, c_carry, d_carry;
51287db96d56Sopenharmony_ci    stwodigits A, B, C, D, T;
51297db96d56Sopenharmony_ci    int nbits, k;
51307db96d56Sopenharmony_ci    Py_ssize_t size_a, size_b, alloc_a, alloc_b;
51317db96d56Sopenharmony_ci    digit *a_digit, *b_digit, *c_digit, *d_digit, *a_end, *b_end;
51327db96d56Sopenharmony_ci
51337db96d56Sopenharmony_ci    a = (PyLongObject *)aarg;
51347db96d56Sopenharmony_ci    b = (PyLongObject *)barg;
51357db96d56Sopenharmony_ci    size_a = Py_SIZE(a);
51367db96d56Sopenharmony_ci    size_b = Py_SIZE(b);
51377db96d56Sopenharmony_ci    if (-2 <= size_a && size_a <= 2 && -2 <= size_b && size_b <= 2) {
51387db96d56Sopenharmony_ci        Py_INCREF(a);
51397db96d56Sopenharmony_ci        Py_INCREF(b);
51407db96d56Sopenharmony_ci        goto simple;
51417db96d56Sopenharmony_ci    }
51427db96d56Sopenharmony_ci
51437db96d56Sopenharmony_ci    /* Initial reduction: make sure that 0 <= b <= a. */
51447db96d56Sopenharmony_ci    a = (PyLongObject *)long_abs(a);
51457db96d56Sopenharmony_ci    if (a == NULL)
51467db96d56Sopenharmony_ci        return NULL;
51477db96d56Sopenharmony_ci    b = (PyLongObject *)long_abs(b);
51487db96d56Sopenharmony_ci    if (b == NULL) {
51497db96d56Sopenharmony_ci        Py_DECREF(a);
51507db96d56Sopenharmony_ci        return NULL;
51517db96d56Sopenharmony_ci    }
51527db96d56Sopenharmony_ci    if (long_compare(a, b) < 0) {
51537db96d56Sopenharmony_ci        r = a;
51547db96d56Sopenharmony_ci        a = b;
51557db96d56Sopenharmony_ci        b = r;
51567db96d56Sopenharmony_ci    }
51577db96d56Sopenharmony_ci    /* We now own references to a and b */
51587db96d56Sopenharmony_ci
51597db96d56Sopenharmony_ci    alloc_a = Py_SIZE(a);
51607db96d56Sopenharmony_ci    alloc_b = Py_SIZE(b);
51617db96d56Sopenharmony_ci    /* reduce until a fits into 2 digits */
51627db96d56Sopenharmony_ci    while ((size_a = Py_SIZE(a)) > 2) {
51637db96d56Sopenharmony_ci        nbits = bit_length_digit(a->ob_digit[size_a-1]);
51647db96d56Sopenharmony_ci        /* extract top 2*PyLong_SHIFT bits of a into x, along with
51657db96d56Sopenharmony_ci           corresponding bits of b into y */
51667db96d56Sopenharmony_ci        size_b = Py_SIZE(b);
51677db96d56Sopenharmony_ci        assert(size_b <= size_a);
51687db96d56Sopenharmony_ci        if (size_b == 0) {
51697db96d56Sopenharmony_ci            if (size_a < alloc_a) {
51707db96d56Sopenharmony_ci                r = (PyLongObject *)_PyLong_Copy(a);
51717db96d56Sopenharmony_ci                Py_DECREF(a);
51727db96d56Sopenharmony_ci            }
51737db96d56Sopenharmony_ci            else
51747db96d56Sopenharmony_ci                r = a;
51757db96d56Sopenharmony_ci            Py_DECREF(b);
51767db96d56Sopenharmony_ci            Py_XDECREF(c);
51777db96d56Sopenharmony_ci            Py_XDECREF(d);
51787db96d56Sopenharmony_ci            return (PyObject *)r;
51797db96d56Sopenharmony_ci        }
51807db96d56Sopenharmony_ci        x = (((twodigits)a->ob_digit[size_a-1] << (2*PyLong_SHIFT-nbits)) |
51817db96d56Sopenharmony_ci             ((twodigits)a->ob_digit[size_a-2] << (PyLong_SHIFT-nbits)) |
51827db96d56Sopenharmony_ci             (a->ob_digit[size_a-3] >> nbits));
51837db96d56Sopenharmony_ci
51847db96d56Sopenharmony_ci        y = ((size_b >= size_a - 2 ? b->ob_digit[size_a-3] >> nbits : 0) |
51857db96d56Sopenharmony_ci             (size_b >= size_a - 1 ? (twodigits)b->ob_digit[size_a-2] << (PyLong_SHIFT-nbits) : 0) |
51867db96d56Sopenharmony_ci             (size_b >= size_a ? (twodigits)b->ob_digit[size_a-1] << (2*PyLong_SHIFT-nbits) : 0));
51877db96d56Sopenharmony_ci
51887db96d56Sopenharmony_ci        /* inner loop of Lehmer's algorithm; A, B, C, D never grow
51897db96d56Sopenharmony_ci           larger than PyLong_MASK during the algorithm. */
51907db96d56Sopenharmony_ci        A = 1; B = 0; C = 0; D = 1;
51917db96d56Sopenharmony_ci        for (k=0;; k++) {
51927db96d56Sopenharmony_ci            if (y-C == 0)
51937db96d56Sopenharmony_ci                break;
51947db96d56Sopenharmony_ci            q = (x+(A-1))/(y-C);
51957db96d56Sopenharmony_ci            s = B+q*D;
51967db96d56Sopenharmony_ci            t = x-q*y;
51977db96d56Sopenharmony_ci            if (s > t)
51987db96d56Sopenharmony_ci                break;
51997db96d56Sopenharmony_ci            x = y; y = t;
52007db96d56Sopenharmony_ci            t = A+q*C; A = D; B = C; C = s; D = t;
52017db96d56Sopenharmony_ci        }
52027db96d56Sopenharmony_ci
52037db96d56Sopenharmony_ci        if (k == 0) {
52047db96d56Sopenharmony_ci            /* no progress; do a Euclidean step */
52057db96d56Sopenharmony_ci            if (l_mod(a, b, &r) < 0)
52067db96d56Sopenharmony_ci                goto error;
52077db96d56Sopenharmony_ci            Py_DECREF(a);
52087db96d56Sopenharmony_ci            a = b;
52097db96d56Sopenharmony_ci            b = r;
52107db96d56Sopenharmony_ci            alloc_a = alloc_b;
52117db96d56Sopenharmony_ci            alloc_b = Py_SIZE(b);
52127db96d56Sopenharmony_ci            continue;
52137db96d56Sopenharmony_ci        }
52147db96d56Sopenharmony_ci
52157db96d56Sopenharmony_ci        /*
52167db96d56Sopenharmony_ci          a, b = A*b-B*a, D*a-C*b if k is odd
52177db96d56Sopenharmony_ci          a, b = A*a-B*b, D*b-C*a if k is even
52187db96d56Sopenharmony_ci        */
52197db96d56Sopenharmony_ci        if (k&1) {
52207db96d56Sopenharmony_ci            T = -A; A = -B; B = T;
52217db96d56Sopenharmony_ci            T = -C; C = -D; D = T;
52227db96d56Sopenharmony_ci        }
52237db96d56Sopenharmony_ci        if (c != NULL) {
52247db96d56Sopenharmony_ci            Py_SET_SIZE(c, size_a);
52257db96d56Sopenharmony_ci        }
52267db96d56Sopenharmony_ci        else if (Py_REFCNT(a) == 1) {
52277db96d56Sopenharmony_ci            Py_INCREF(a);
52287db96d56Sopenharmony_ci            c = a;
52297db96d56Sopenharmony_ci        }
52307db96d56Sopenharmony_ci        else {
52317db96d56Sopenharmony_ci            alloc_a = size_a;
52327db96d56Sopenharmony_ci            c = _PyLong_New(size_a);
52337db96d56Sopenharmony_ci            if (c == NULL)
52347db96d56Sopenharmony_ci                goto error;
52357db96d56Sopenharmony_ci        }
52367db96d56Sopenharmony_ci
52377db96d56Sopenharmony_ci        if (d != NULL) {
52387db96d56Sopenharmony_ci            Py_SET_SIZE(d, size_a);
52397db96d56Sopenharmony_ci        }
52407db96d56Sopenharmony_ci        else if (Py_REFCNT(b) == 1 && size_a <= alloc_b) {
52417db96d56Sopenharmony_ci            Py_INCREF(b);
52427db96d56Sopenharmony_ci            d = b;
52437db96d56Sopenharmony_ci            Py_SET_SIZE(d, size_a);
52447db96d56Sopenharmony_ci        }
52457db96d56Sopenharmony_ci        else {
52467db96d56Sopenharmony_ci            alloc_b = size_a;
52477db96d56Sopenharmony_ci            d = _PyLong_New(size_a);
52487db96d56Sopenharmony_ci            if (d == NULL)
52497db96d56Sopenharmony_ci                goto error;
52507db96d56Sopenharmony_ci        }
52517db96d56Sopenharmony_ci        a_end = a->ob_digit + size_a;
52527db96d56Sopenharmony_ci        b_end = b->ob_digit + size_b;
52537db96d56Sopenharmony_ci
52547db96d56Sopenharmony_ci        /* compute new a and new b in parallel */
52557db96d56Sopenharmony_ci        a_digit = a->ob_digit;
52567db96d56Sopenharmony_ci        b_digit = b->ob_digit;
52577db96d56Sopenharmony_ci        c_digit = c->ob_digit;
52587db96d56Sopenharmony_ci        d_digit = d->ob_digit;
52597db96d56Sopenharmony_ci        c_carry = 0;
52607db96d56Sopenharmony_ci        d_carry = 0;
52617db96d56Sopenharmony_ci        while (b_digit < b_end) {
52627db96d56Sopenharmony_ci            c_carry += (A * *a_digit) - (B * *b_digit);
52637db96d56Sopenharmony_ci            d_carry += (D * *b_digit++) - (C * *a_digit++);
52647db96d56Sopenharmony_ci            *c_digit++ = (digit)(c_carry & PyLong_MASK);
52657db96d56Sopenharmony_ci            *d_digit++ = (digit)(d_carry & PyLong_MASK);
52667db96d56Sopenharmony_ci            c_carry >>= PyLong_SHIFT;
52677db96d56Sopenharmony_ci            d_carry >>= PyLong_SHIFT;
52687db96d56Sopenharmony_ci        }
52697db96d56Sopenharmony_ci        while (a_digit < a_end) {
52707db96d56Sopenharmony_ci            c_carry += A * *a_digit;
52717db96d56Sopenharmony_ci            d_carry -= C * *a_digit++;
52727db96d56Sopenharmony_ci            *c_digit++ = (digit)(c_carry & PyLong_MASK);
52737db96d56Sopenharmony_ci            *d_digit++ = (digit)(d_carry & PyLong_MASK);
52747db96d56Sopenharmony_ci            c_carry >>= PyLong_SHIFT;
52757db96d56Sopenharmony_ci            d_carry >>= PyLong_SHIFT;
52767db96d56Sopenharmony_ci        }
52777db96d56Sopenharmony_ci        assert(c_carry == 0);
52787db96d56Sopenharmony_ci        assert(d_carry == 0);
52797db96d56Sopenharmony_ci
52807db96d56Sopenharmony_ci        Py_INCREF(c);
52817db96d56Sopenharmony_ci        Py_INCREF(d);
52827db96d56Sopenharmony_ci        Py_DECREF(a);
52837db96d56Sopenharmony_ci        Py_DECREF(b);
52847db96d56Sopenharmony_ci        a = long_normalize(c);
52857db96d56Sopenharmony_ci        b = long_normalize(d);
52867db96d56Sopenharmony_ci    }
52877db96d56Sopenharmony_ci    Py_XDECREF(c);
52887db96d56Sopenharmony_ci    Py_XDECREF(d);
52897db96d56Sopenharmony_ci
52907db96d56Sopenharmony_cisimple:
52917db96d56Sopenharmony_ci    assert(Py_REFCNT(a) > 0);
52927db96d56Sopenharmony_ci    assert(Py_REFCNT(b) > 0);
52937db96d56Sopenharmony_ci/* Issue #24999: use two shifts instead of ">> 2*PyLong_SHIFT" to avoid
52947db96d56Sopenharmony_ci   undefined behaviour when LONG_MAX type is smaller than 60 bits */
52957db96d56Sopenharmony_ci#if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
52967db96d56Sopenharmony_ci    /* a fits into a long, so b must too */
52977db96d56Sopenharmony_ci    x = PyLong_AsLong((PyObject *)a);
52987db96d56Sopenharmony_ci    y = PyLong_AsLong((PyObject *)b);
52997db96d56Sopenharmony_ci#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
53007db96d56Sopenharmony_ci    x = PyLong_AsLongLong((PyObject *)a);
53017db96d56Sopenharmony_ci    y = PyLong_AsLongLong((PyObject *)b);
53027db96d56Sopenharmony_ci#else
53037db96d56Sopenharmony_ci# error "_PyLong_GCD"
53047db96d56Sopenharmony_ci#endif
53057db96d56Sopenharmony_ci    x = Py_ABS(x);
53067db96d56Sopenharmony_ci    y = Py_ABS(y);
53077db96d56Sopenharmony_ci    Py_DECREF(a);
53087db96d56Sopenharmony_ci    Py_DECREF(b);
53097db96d56Sopenharmony_ci
53107db96d56Sopenharmony_ci    /* usual Euclidean algorithm for longs */
53117db96d56Sopenharmony_ci    while (y != 0) {
53127db96d56Sopenharmony_ci        t = y;
53137db96d56Sopenharmony_ci        y = x % y;
53147db96d56Sopenharmony_ci        x = t;
53157db96d56Sopenharmony_ci    }
53167db96d56Sopenharmony_ci#if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
53177db96d56Sopenharmony_ci    return PyLong_FromLong(x);
53187db96d56Sopenharmony_ci#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
53197db96d56Sopenharmony_ci    return PyLong_FromLongLong(x);
53207db96d56Sopenharmony_ci#else
53217db96d56Sopenharmony_ci# error "_PyLong_GCD"
53227db96d56Sopenharmony_ci#endif
53237db96d56Sopenharmony_ci
53247db96d56Sopenharmony_cierror:
53257db96d56Sopenharmony_ci    Py_DECREF(a);
53267db96d56Sopenharmony_ci    Py_DECREF(b);
53277db96d56Sopenharmony_ci    Py_XDECREF(c);
53287db96d56Sopenharmony_ci    Py_XDECREF(d);
53297db96d56Sopenharmony_ci    return NULL;
53307db96d56Sopenharmony_ci}
53317db96d56Sopenharmony_ci
53327db96d56Sopenharmony_cistatic PyObject *
53337db96d56Sopenharmony_cilong_float(PyObject *v)
53347db96d56Sopenharmony_ci{
53357db96d56Sopenharmony_ci    double result;
53367db96d56Sopenharmony_ci    result = PyLong_AsDouble(v);
53377db96d56Sopenharmony_ci    if (result == -1.0 && PyErr_Occurred())
53387db96d56Sopenharmony_ci        return NULL;
53397db96d56Sopenharmony_ci    return PyFloat_FromDouble(result);
53407db96d56Sopenharmony_ci}
53417db96d56Sopenharmony_ci
53427db96d56Sopenharmony_cistatic PyObject *
53437db96d56Sopenharmony_cilong_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase);
53447db96d56Sopenharmony_ci
53457db96d56Sopenharmony_ci/*[clinic input]
53467db96d56Sopenharmony_ci@classmethod
53477db96d56Sopenharmony_ciint.__new__ as long_new
53487db96d56Sopenharmony_ci    x: object(c_default="NULL") = 0
53497db96d56Sopenharmony_ci    /
53507db96d56Sopenharmony_ci    base as obase: object(c_default="NULL") = 10
53517db96d56Sopenharmony_ci[clinic start generated code]*/
53527db96d56Sopenharmony_ci
53537db96d56Sopenharmony_cistatic PyObject *
53547db96d56Sopenharmony_cilong_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase)
53557db96d56Sopenharmony_ci/*[clinic end generated code: output=e47cfe777ab0f24c input=81c98f418af9eb6f]*/
53567db96d56Sopenharmony_ci{
53577db96d56Sopenharmony_ci    Py_ssize_t base;
53587db96d56Sopenharmony_ci
53597db96d56Sopenharmony_ci    if (type != &PyLong_Type)
53607db96d56Sopenharmony_ci        return long_subtype_new(type, x, obase); /* Wimp out */
53617db96d56Sopenharmony_ci    if (x == NULL) {
53627db96d56Sopenharmony_ci        if (obase != NULL) {
53637db96d56Sopenharmony_ci            PyErr_SetString(PyExc_TypeError,
53647db96d56Sopenharmony_ci                            "int() missing string argument");
53657db96d56Sopenharmony_ci            return NULL;
53667db96d56Sopenharmony_ci        }
53677db96d56Sopenharmony_ci        return PyLong_FromLong(0L);
53687db96d56Sopenharmony_ci    }
53697db96d56Sopenharmony_ci    /* default base and limit, forward to standard implementation */
53707db96d56Sopenharmony_ci    if (obase == NULL)
53717db96d56Sopenharmony_ci        return PyNumber_Long(x);
53727db96d56Sopenharmony_ci
53737db96d56Sopenharmony_ci    base = PyNumber_AsSsize_t(obase, NULL);
53747db96d56Sopenharmony_ci    if (base == -1 && PyErr_Occurred())
53757db96d56Sopenharmony_ci        return NULL;
53767db96d56Sopenharmony_ci    if ((base != 0 && base < 2) || base > 36) {
53777db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
53787db96d56Sopenharmony_ci                        "int() base must be >= 2 and <= 36, or 0");
53797db96d56Sopenharmony_ci        return NULL;
53807db96d56Sopenharmony_ci    }
53817db96d56Sopenharmony_ci
53827db96d56Sopenharmony_ci    if (PyUnicode_Check(x))
53837db96d56Sopenharmony_ci        return PyLong_FromUnicodeObject(x, (int)base);
53847db96d56Sopenharmony_ci    else if (PyByteArray_Check(x) || PyBytes_Check(x)) {
53857db96d56Sopenharmony_ci        const char *string;
53867db96d56Sopenharmony_ci        if (PyByteArray_Check(x))
53877db96d56Sopenharmony_ci            string = PyByteArray_AS_STRING(x);
53887db96d56Sopenharmony_ci        else
53897db96d56Sopenharmony_ci            string = PyBytes_AS_STRING(x);
53907db96d56Sopenharmony_ci        return _PyLong_FromBytes(string, Py_SIZE(x), (int)base);
53917db96d56Sopenharmony_ci    }
53927db96d56Sopenharmony_ci    else {
53937db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError,
53947db96d56Sopenharmony_ci                        "int() can't convert non-string with explicit base");
53957db96d56Sopenharmony_ci        return NULL;
53967db96d56Sopenharmony_ci    }
53977db96d56Sopenharmony_ci}
53987db96d56Sopenharmony_ci
53997db96d56Sopenharmony_ci/* Wimpy, slow approach to tp_new calls for subtypes of int:
54007db96d56Sopenharmony_ci   first create a regular int from whatever arguments we got,
54017db96d56Sopenharmony_ci   then allocate a subtype instance and initialize it from
54027db96d56Sopenharmony_ci   the regular int.  The regular int is then thrown away.
54037db96d56Sopenharmony_ci*/
54047db96d56Sopenharmony_cistatic PyObject *
54057db96d56Sopenharmony_cilong_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase)
54067db96d56Sopenharmony_ci{
54077db96d56Sopenharmony_ci    PyLongObject *tmp, *newobj;
54087db96d56Sopenharmony_ci    Py_ssize_t i, n;
54097db96d56Sopenharmony_ci
54107db96d56Sopenharmony_ci    assert(PyType_IsSubtype(type, &PyLong_Type));
54117db96d56Sopenharmony_ci    tmp = (PyLongObject *)long_new_impl(&PyLong_Type, x, obase);
54127db96d56Sopenharmony_ci    if (tmp == NULL)
54137db96d56Sopenharmony_ci        return NULL;
54147db96d56Sopenharmony_ci    assert(PyLong_Check(tmp));
54157db96d56Sopenharmony_ci    n = Py_SIZE(tmp);
54167db96d56Sopenharmony_ci    if (n < 0)
54177db96d56Sopenharmony_ci        n = -n;
54187db96d56Sopenharmony_ci    /* Fast operations for single digit integers (including zero)
54197db96d56Sopenharmony_ci     * assume that there is always at least one digit present. */
54207db96d56Sopenharmony_ci    if (n == 0) {
54217db96d56Sopenharmony_ci        n = 1;
54227db96d56Sopenharmony_ci    }
54237db96d56Sopenharmony_ci    newobj = (PyLongObject *)type->tp_alloc(type, n);
54247db96d56Sopenharmony_ci    if (newobj == NULL) {
54257db96d56Sopenharmony_ci        Py_DECREF(tmp);
54267db96d56Sopenharmony_ci        return NULL;
54277db96d56Sopenharmony_ci    }
54287db96d56Sopenharmony_ci    assert(PyLong_Check(newobj));
54297db96d56Sopenharmony_ci    Py_SET_SIZE(newobj, Py_SIZE(tmp));
54307db96d56Sopenharmony_ci    for (i = 0; i < n; i++) {
54317db96d56Sopenharmony_ci        newobj->ob_digit[i] = tmp->ob_digit[i];
54327db96d56Sopenharmony_ci    }
54337db96d56Sopenharmony_ci    Py_DECREF(tmp);
54347db96d56Sopenharmony_ci    return (PyObject *)newobj;
54357db96d56Sopenharmony_ci}
54367db96d56Sopenharmony_ci
54377db96d56Sopenharmony_ci/*[clinic input]
54387db96d56Sopenharmony_ciint.__getnewargs__
54397db96d56Sopenharmony_ci[clinic start generated code]*/
54407db96d56Sopenharmony_ci
54417db96d56Sopenharmony_cistatic PyObject *
54427db96d56Sopenharmony_ciint___getnewargs___impl(PyObject *self)
54437db96d56Sopenharmony_ci/*[clinic end generated code: output=839a49de3f00b61b input=5904770ab1fb8c75]*/
54447db96d56Sopenharmony_ci{
54457db96d56Sopenharmony_ci    return Py_BuildValue("(N)", _PyLong_Copy((PyLongObject *)self));
54467db96d56Sopenharmony_ci}
54477db96d56Sopenharmony_ci
54487db96d56Sopenharmony_cistatic PyObject *
54497db96d56Sopenharmony_cilong_get0(PyObject *Py_UNUSED(self), void *Py_UNUSED(context))
54507db96d56Sopenharmony_ci{
54517db96d56Sopenharmony_ci    return PyLong_FromLong(0L);
54527db96d56Sopenharmony_ci}
54537db96d56Sopenharmony_ci
54547db96d56Sopenharmony_cistatic PyObject *
54557db96d56Sopenharmony_cilong_get1(PyObject *Py_UNUSED(self), void *Py_UNUSED(ignored))
54567db96d56Sopenharmony_ci{
54577db96d56Sopenharmony_ci    return PyLong_FromLong(1L);
54587db96d56Sopenharmony_ci}
54597db96d56Sopenharmony_ci
54607db96d56Sopenharmony_ci/*[clinic input]
54617db96d56Sopenharmony_ciint.__format__
54627db96d56Sopenharmony_ci
54637db96d56Sopenharmony_ci    format_spec: unicode
54647db96d56Sopenharmony_ci    /
54657db96d56Sopenharmony_ci[clinic start generated code]*/
54667db96d56Sopenharmony_ci
54677db96d56Sopenharmony_cistatic PyObject *
54687db96d56Sopenharmony_ciint___format___impl(PyObject *self, PyObject *format_spec)
54697db96d56Sopenharmony_ci/*[clinic end generated code: output=b4929dee9ae18689 input=e31944a9b3e428b7]*/
54707db96d56Sopenharmony_ci{
54717db96d56Sopenharmony_ci    _PyUnicodeWriter writer;
54727db96d56Sopenharmony_ci    int ret;
54737db96d56Sopenharmony_ci
54747db96d56Sopenharmony_ci    _PyUnicodeWriter_Init(&writer);
54757db96d56Sopenharmony_ci    ret = _PyLong_FormatAdvancedWriter(
54767db96d56Sopenharmony_ci        &writer,
54777db96d56Sopenharmony_ci        self,
54787db96d56Sopenharmony_ci        format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
54797db96d56Sopenharmony_ci    if (ret == -1) {
54807db96d56Sopenharmony_ci        _PyUnicodeWriter_Dealloc(&writer);
54817db96d56Sopenharmony_ci        return NULL;
54827db96d56Sopenharmony_ci    }
54837db96d56Sopenharmony_ci    return _PyUnicodeWriter_Finish(&writer);
54847db96d56Sopenharmony_ci}
54857db96d56Sopenharmony_ci
54867db96d56Sopenharmony_ci/* Return a pair (q, r) such that a = b * q + r, and
54877db96d56Sopenharmony_ci   abs(r) <= abs(b)/2, with equality possible only if q is even.
54887db96d56Sopenharmony_ci   In other words, q == a / b, rounded to the nearest integer using
54897db96d56Sopenharmony_ci   round-half-to-even. */
54907db96d56Sopenharmony_ci
54917db96d56Sopenharmony_ciPyObject *
54927db96d56Sopenharmony_ci_PyLong_DivmodNear(PyObject *a, PyObject *b)
54937db96d56Sopenharmony_ci{
54947db96d56Sopenharmony_ci    PyLongObject *quo = NULL, *rem = NULL;
54957db96d56Sopenharmony_ci    PyObject *twice_rem, *result, *temp;
54967db96d56Sopenharmony_ci    int quo_is_odd, quo_is_neg;
54977db96d56Sopenharmony_ci    Py_ssize_t cmp;
54987db96d56Sopenharmony_ci
54997db96d56Sopenharmony_ci    /* Equivalent Python code:
55007db96d56Sopenharmony_ci
55017db96d56Sopenharmony_ci       def divmod_near(a, b):
55027db96d56Sopenharmony_ci           q, r = divmod(a, b)
55037db96d56Sopenharmony_ci           # round up if either r / b > 0.5, or r / b == 0.5 and q is odd.
55047db96d56Sopenharmony_ci           # The expression r / b > 0.5 is equivalent to 2 * r > b if b is
55057db96d56Sopenharmony_ci           # positive, 2 * r < b if b negative.
55067db96d56Sopenharmony_ci           greater_than_half = 2*r > b if b > 0 else 2*r < b
55077db96d56Sopenharmony_ci           exactly_half = 2*r == b
55087db96d56Sopenharmony_ci           if greater_than_half or exactly_half and q % 2 == 1:
55097db96d56Sopenharmony_ci               q += 1
55107db96d56Sopenharmony_ci               r -= b
55117db96d56Sopenharmony_ci           return q, r
55127db96d56Sopenharmony_ci
55137db96d56Sopenharmony_ci    */
55147db96d56Sopenharmony_ci    if (!PyLong_Check(a) || !PyLong_Check(b)) {
55157db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError,
55167db96d56Sopenharmony_ci                        "non-integer arguments in division");
55177db96d56Sopenharmony_ci        return NULL;
55187db96d56Sopenharmony_ci    }
55197db96d56Sopenharmony_ci
55207db96d56Sopenharmony_ci    /* Do a and b have different signs?  If so, quotient is negative. */
55217db96d56Sopenharmony_ci    quo_is_neg = (Py_SIZE(a) < 0) != (Py_SIZE(b) < 0);
55227db96d56Sopenharmony_ci
55237db96d56Sopenharmony_ci    if (long_divrem((PyLongObject*)a, (PyLongObject*)b, &quo, &rem) < 0)
55247db96d56Sopenharmony_ci        goto error;
55257db96d56Sopenharmony_ci
55267db96d56Sopenharmony_ci    /* compare twice the remainder with the divisor, to see
55277db96d56Sopenharmony_ci       if we need to adjust the quotient and remainder */
55287db96d56Sopenharmony_ci    PyObject *one = _PyLong_GetOne();  // borrowed reference
55297db96d56Sopenharmony_ci    twice_rem = long_lshift((PyObject *)rem, one);
55307db96d56Sopenharmony_ci    if (twice_rem == NULL)
55317db96d56Sopenharmony_ci        goto error;
55327db96d56Sopenharmony_ci    if (quo_is_neg) {
55337db96d56Sopenharmony_ci        temp = long_neg((PyLongObject*)twice_rem);
55347db96d56Sopenharmony_ci        Py_DECREF(twice_rem);
55357db96d56Sopenharmony_ci        twice_rem = temp;
55367db96d56Sopenharmony_ci        if (twice_rem == NULL)
55377db96d56Sopenharmony_ci            goto error;
55387db96d56Sopenharmony_ci    }
55397db96d56Sopenharmony_ci    cmp = long_compare((PyLongObject *)twice_rem, (PyLongObject *)b);
55407db96d56Sopenharmony_ci    Py_DECREF(twice_rem);
55417db96d56Sopenharmony_ci
55427db96d56Sopenharmony_ci    quo_is_odd = Py_SIZE(quo) != 0 && ((quo->ob_digit[0] & 1) != 0);
55437db96d56Sopenharmony_ci    if ((Py_SIZE(b) < 0 ? cmp < 0 : cmp > 0) || (cmp == 0 && quo_is_odd)) {
55447db96d56Sopenharmony_ci        /* fix up quotient */
55457db96d56Sopenharmony_ci        if (quo_is_neg)
55467db96d56Sopenharmony_ci            temp = long_sub(quo, (PyLongObject *)one);
55477db96d56Sopenharmony_ci        else
55487db96d56Sopenharmony_ci            temp = long_add(quo, (PyLongObject *)one);
55497db96d56Sopenharmony_ci        Py_DECREF(quo);
55507db96d56Sopenharmony_ci        quo = (PyLongObject *)temp;
55517db96d56Sopenharmony_ci        if (quo == NULL)
55527db96d56Sopenharmony_ci            goto error;
55537db96d56Sopenharmony_ci        /* and remainder */
55547db96d56Sopenharmony_ci        if (quo_is_neg)
55557db96d56Sopenharmony_ci            temp = long_add(rem, (PyLongObject *)b);
55567db96d56Sopenharmony_ci        else
55577db96d56Sopenharmony_ci            temp = long_sub(rem, (PyLongObject *)b);
55587db96d56Sopenharmony_ci        Py_DECREF(rem);
55597db96d56Sopenharmony_ci        rem = (PyLongObject *)temp;
55607db96d56Sopenharmony_ci        if (rem == NULL)
55617db96d56Sopenharmony_ci            goto error;
55627db96d56Sopenharmony_ci    }
55637db96d56Sopenharmony_ci
55647db96d56Sopenharmony_ci    result = PyTuple_New(2);
55657db96d56Sopenharmony_ci    if (result == NULL)
55667db96d56Sopenharmony_ci        goto error;
55677db96d56Sopenharmony_ci
55687db96d56Sopenharmony_ci    /* PyTuple_SET_ITEM steals references */
55697db96d56Sopenharmony_ci    PyTuple_SET_ITEM(result, 0, (PyObject *)quo);
55707db96d56Sopenharmony_ci    PyTuple_SET_ITEM(result, 1, (PyObject *)rem);
55717db96d56Sopenharmony_ci    return result;
55727db96d56Sopenharmony_ci
55737db96d56Sopenharmony_ci  error:
55747db96d56Sopenharmony_ci    Py_XDECREF(quo);
55757db96d56Sopenharmony_ci    Py_XDECREF(rem);
55767db96d56Sopenharmony_ci    return NULL;
55777db96d56Sopenharmony_ci}
55787db96d56Sopenharmony_ci
55797db96d56Sopenharmony_ci/*[clinic input]
55807db96d56Sopenharmony_ciint.__round__
55817db96d56Sopenharmony_ci
55827db96d56Sopenharmony_ci    ndigits as o_ndigits: object = NULL
55837db96d56Sopenharmony_ci    /
55847db96d56Sopenharmony_ci
55857db96d56Sopenharmony_ciRounding an Integral returns itself.
55867db96d56Sopenharmony_ci
55877db96d56Sopenharmony_ciRounding with an ndigits argument also returns an integer.
55887db96d56Sopenharmony_ci[clinic start generated code]*/
55897db96d56Sopenharmony_ci
55907db96d56Sopenharmony_cistatic PyObject *
55917db96d56Sopenharmony_ciint___round___impl(PyObject *self, PyObject *o_ndigits)
55927db96d56Sopenharmony_ci/*[clinic end generated code: output=954fda6b18875998 input=1614cf23ec9e18c3]*/
55937db96d56Sopenharmony_ci{
55947db96d56Sopenharmony_ci    PyObject *temp, *result, *ndigits;
55957db96d56Sopenharmony_ci
55967db96d56Sopenharmony_ci    /* To round an integer m to the nearest 10**n (n positive), we make use of
55977db96d56Sopenharmony_ci     * the divmod_near operation, defined by:
55987db96d56Sopenharmony_ci     *
55997db96d56Sopenharmony_ci     *   divmod_near(a, b) = (q, r)
56007db96d56Sopenharmony_ci     *
56017db96d56Sopenharmony_ci     * where q is the nearest integer to the quotient a / b (the
56027db96d56Sopenharmony_ci     * nearest even integer in the case of a tie) and r == a - q * b.
56037db96d56Sopenharmony_ci     * Hence q * b = a - r is the nearest multiple of b to a,
56047db96d56Sopenharmony_ci     * preferring even multiples in the case of a tie.
56057db96d56Sopenharmony_ci     *
56067db96d56Sopenharmony_ci     * So the nearest multiple of 10**n to m is:
56077db96d56Sopenharmony_ci     *
56087db96d56Sopenharmony_ci     *   m - divmod_near(m, 10**n)[1].
56097db96d56Sopenharmony_ci     */
56107db96d56Sopenharmony_ci    if (o_ndigits == NULL)
56117db96d56Sopenharmony_ci        return long_long(self);
56127db96d56Sopenharmony_ci
56137db96d56Sopenharmony_ci    ndigits = _PyNumber_Index(o_ndigits);
56147db96d56Sopenharmony_ci    if (ndigits == NULL)
56157db96d56Sopenharmony_ci        return NULL;
56167db96d56Sopenharmony_ci
56177db96d56Sopenharmony_ci    /* if ndigits >= 0 then no rounding is necessary; return self unchanged */
56187db96d56Sopenharmony_ci    if (Py_SIZE(ndigits) >= 0) {
56197db96d56Sopenharmony_ci        Py_DECREF(ndigits);
56207db96d56Sopenharmony_ci        return long_long(self);
56217db96d56Sopenharmony_ci    }
56227db96d56Sopenharmony_ci
56237db96d56Sopenharmony_ci    /* result = self - divmod_near(self, 10 ** -ndigits)[1] */
56247db96d56Sopenharmony_ci    temp = long_neg((PyLongObject*)ndigits);
56257db96d56Sopenharmony_ci    Py_DECREF(ndigits);
56267db96d56Sopenharmony_ci    ndigits = temp;
56277db96d56Sopenharmony_ci    if (ndigits == NULL)
56287db96d56Sopenharmony_ci        return NULL;
56297db96d56Sopenharmony_ci
56307db96d56Sopenharmony_ci    result = PyLong_FromLong(10L);
56317db96d56Sopenharmony_ci    if (result == NULL) {
56327db96d56Sopenharmony_ci        Py_DECREF(ndigits);
56337db96d56Sopenharmony_ci        return NULL;
56347db96d56Sopenharmony_ci    }
56357db96d56Sopenharmony_ci
56367db96d56Sopenharmony_ci    temp = long_pow(result, ndigits, Py_None);
56377db96d56Sopenharmony_ci    Py_DECREF(ndigits);
56387db96d56Sopenharmony_ci    Py_DECREF(result);
56397db96d56Sopenharmony_ci    result = temp;
56407db96d56Sopenharmony_ci    if (result == NULL)
56417db96d56Sopenharmony_ci        return NULL;
56427db96d56Sopenharmony_ci
56437db96d56Sopenharmony_ci    temp = _PyLong_DivmodNear(self, result);
56447db96d56Sopenharmony_ci    Py_DECREF(result);
56457db96d56Sopenharmony_ci    result = temp;
56467db96d56Sopenharmony_ci    if (result == NULL)
56477db96d56Sopenharmony_ci        return NULL;
56487db96d56Sopenharmony_ci
56497db96d56Sopenharmony_ci    temp = long_sub((PyLongObject *)self,
56507db96d56Sopenharmony_ci                    (PyLongObject *)PyTuple_GET_ITEM(result, 1));
56517db96d56Sopenharmony_ci    Py_DECREF(result);
56527db96d56Sopenharmony_ci    result = temp;
56537db96d56Sopenharmony_ci
56547db96d56Sopenharmony_ci    return result;
56557db96d56Sopenharmony_ci}
56567db96d56Sopenharmony_ci
56577db96d56Sopenharmony_ci/*[clinic input]
56587db96d56Sopenharmony_ciint.__sizeof__ -> Py_ssize_t
56597db96d56Sopenharmony_ci
56607db96d56Sopenharmony_ciReturns size in memory, in bytes.
56617db96d56Sopenharmony_ci[clinic start generated code]*/
56627db96d56Sopenharmony_ci
56637db96d56Sopenharmony_cistatic Py_ssize_t
56647db96d56Sopenharmony_ciint___sizeof___impl(PyObject *self)
56657db96d56Sopenharmony_ci/*[clinic end generated code: output=3303f008eaa6a0a5 input=9b51620c76fc4507]*/
56667db96d56Sopenharmony_ci{
56677db96d56Sopenharmony_ci    Py_ssize_t res;
56687db96d56Sopenharmony_ci
56697db96d56Sopenharmony_ci    res = offsetof(PyLongObject, ob_digit)
56707db96d56Sopenharmony_ci        /* using Py_MAX(..., 1) because we always allocate space for at least
56717db96d56Sopenharmony_ci           one digit, even though the integer zero has a Py_SIZE of 0 */
56727db96d56Sopenharmony_ci        + Py_MAX(Py_ABS(Py_SIZE(self)), 1)*sizeof(digit);
56737db96d56Sopenharmony_ci    return res;
56747db96d56Sopenharmony_ci}
56757db96d56Sopenharmony_ci
56767db96d56Sopenharmony_ci/*[clinic input]
56777db96d56Sopenharmony_ciint.bit_length
56787db96d56Sopenharmony_ci
56797db96d56Sopenharmony_ciNumber of bits necessary to represent self in binary.
56807db96d56Sopenharmony_ci
56817db96d56Sopenharmony_ci>>> bin(37)
56827db96d56Sopenharmony_ci'0b100101'
56837db96d56Sopenharmony_ci>>> (37).bit_length()
56847db96d56Sopenharmony_ci6
56857db96d56Sopenharmony_ci[clinic start generated code]*/
56867db96d56Sopenharmony_ci
56877db96d56Sopenharmony_cistatic PyObject *
56887db96d56Sopenharmony_ciint_bit_length_impl(PyObject *self)
56897db96d56Sopenharmony_ci/*[clinic end generated code: output=fc1977c9353d6a59 input=e4eb7a587e849a32]*/
56907db96d56Sopenharmony_ci{
56917db96d56Sopenharmony_ci    PyLongObject *result, *x, *y;
56927db96d56Sopenharmony_ci    Py_ssize_t ndigits;
56937db96d56Sopenharmony_ci    int msd_bits;
56947db96d56Sopenharmony_ci    digit msd;
56957db96d56Sopenharmony_ci
56967db96d56Sopenharmony_ci    assert(self != NULL);
56977db96d56Sopenharmony_ci    assert(PyLong_Check(self));
56987db96d56Sopenharmony_ci
56997db96d56Sopenharmony_ci    ndigits = Py_ABS(Py_SIZE(self));
57007db96d56Sopenharmony_ci    if (ndigits == 0)
57017db96d56Sopenharmony_ci        return PyLong_FromLong(0);
57027db96d56Sopenharmony_ci
57037db96d56Sopenharmony_ci    msd = ((PyLongObject *)self)->ob_digit[ndigits-1];
57047db96d56Sopenharmony_ci    msd_bits = bit_length_digit(msd);
57057db96d56Sopenharmony_ci
57067db96d56Sopenharmony_ci    if (ndigits <= PY_SSIZE_T_MAX/PyLong_SHIFT)
57077db96d56Sopenharmony_ci        return PyLong_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits);
57087db96d56Sopenharmony_ci
57097db96d56Sopenharmony_ci    /* expression above may overflow; use Python integers instead */
57107db96d56Sopenharmony_ci    result = (PyLongObject *)PyLong_FromSsize_t(ndigits - 1);
57117db96d56Sopenharmony_ci    if (result == NULL)
57127db96d56Sopenharmony_ci        return NULL;
57137db96d56Sopenharmony_ci    x = (PyLongObject *)PyLong_FromLong(PyLong_SHIFT);
57147db96d56Sopenharmony_ci    if (x == NULL)
57157db96d56Sopenharmony_ci        goto error;
57167db96d56Sopenharmony_ci    y = (PyLongObject *)long_mul(result, x);
57177db96d56Sopenharmony_ci    Py_DECREF(x);
57187db96d56Sopenharmony_ci    if (y == NULL)
57197db96d56Sopenharmony_ci        goto error;
57207db96d56Sopenharmony_ci    Py_DECREF(result);
57217db96d56Sopenharmony_ci    result = y;
57227db96d56Sopenharmony_ci
57237db96d56Sopenharmony_ci    x = (PyLongObject *)PyLong_FromLong((long)msd_bits);
57247db96d56Sopenharmony_ci    if (x == NULL)
57257db96d56Sopenharmony_ci        goto error;
57267db96d56Sopenharmony_ci    y = (PyLongObject *)long_add(result, x);
57277db96d56Sopenharmony_ci    Py_DECREF(x);
57287db96d56Sopenharmony_ci    if (y == NULL)
57297db96d56Sopenharmony_ci        goto error;
57307db96d56Sopenharmony_ci    Py_DECREF(result);
57317db96d56Sopenharmony_ci    result = y;
57327db96d56Sopenharmony_ci
57337db96d56Sopenharmony_ci    return (PyObject *)result;
57347db96d56Sopenharmony_ci
57357db96d56Sopenharmony_ci  error:
57367db96d56Sopenharmony_ci    Py_DECREF(result);
57377db96d56Sopenharmony_ci    return NULL;
57387db96d56Sopenharmony_ci}
57397db96d56Sopenharmony_ci
57407db96d56Sopenharmony_cistatic int
57417db96d56Sopenharmony_cipopcount_digit(digit d)
57427db96d56Sopenharmony_ci{
57437db96d56Sopenharmony_ci    // digit can be larger than uint32_t, but only PyLong_SHIFT bits
57447db96d56Sopenharmony_ci    // of it will be ever used.
57457db96d56Sopenharmony_ci    static_assert(PyLong_SHIFT <= 32, "digit is larger than uint32_t");
57467db96d56Sopenharmony_ci    return _Py_popcount32((uint32_t)d);
57477db96d56Sopenharmony_ci}
57487db96d56Sopenharmony_ci
57497db96d56Sopenharmony_ci/*[clinic input]
57507db96d56Sopenharmony_ciint.bit_count
57517db96d56Sopenharmony_ci
57527db96d56Sopenharmony_ciNumber of ones in the binary representation of the absolute value of self.
57537db96d56Sopenharmony_ci
57547db96d56Sopenharmony_ciAlso known as the population count.
57557db96d56Sopenharmony_ci
57567db96d56Sopenharmony_ci>>> bin(13)
57577db96d56Sopenharmony_ci'0b1101'
57587db96d56Sopenharmony_ci>>> (13).bit_count()
57597db96d56Sopenharmony_ci3
57607db96d56Sopenharmony_ci[clinic start generated code]*/
57617db96d56Sopenharmony_ci
57627db96d56Sopenharmony_cistatic PyObject *
57637db96d56Sopenharmony_ciint_bit_count_impl(PyObject *self)
57647db96d56Sopenharmony_ci/*[clinic end generated code: output=2e571970daf1e5c3 input=7e0adef8e8ccdf2e]*/
57657db96d56Sopenharmony_ci{
57667db96d56Sopenharmony_ci    assert(self != NULL);
57677db96d56Sopenharmony_ci    assert(PyLong_Check(self));
57687db96d56Sopenharmony_ci
57697db96d56Sopenharmony_ci    PyLongObject *z = (PyLongObject *)self;
57707db96d56Sopenharmony_ci    Py_ssize_t ndigits = Py_ABS(Py_SIZE(z));
57717db96d56Sopenharmony_ci    Py_ssize_t bit_count = 0;
57727db96d56Sopenharmony_ci
57737db96d56Sopenharmony_ci    /* Each digit has up to PyLong_SHIFT ones, so the accumulated bit count
57747db96d56Sopenharmony_ci       from the first PY_SSIZE_T_MAX/PyLong_SHIFT digits can't overflow a
57757db96d56Sopenharmony_ci       Py_ssize_t. */
57767db96d56Sopenharmony_ci    Py_ssize_t ndigits_fast = Py_MIN(ndigits, PY_SSIZE_T_MAX/PyLong_SHIFT);
57777db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < ndigits_fast; i++) {
57787db96d56Sopenharmony_ci        bit_count += popcount_digit(z->ob_digit[i]);
57797db96d56Sopenharmony_ci    }
57807db96d56Sopenharmony_ci
57817db96d56Sopenharmony_ci    PyObject *result = PyLong_FromSsize_t(bit_count);
57827db96d56Sopenharmony_ci    if (result == NULL) {
57837db96d56Sopenharmony_ci        return NULL;
57847db96d56Sopenharmony_ci    }
57857db96d56Sopenharmony_ci
57867db96d56Sopenharmony_ci    /* Use Python integers if bit_count would overflow. */
57877db96d56Sopenharmony_ci    for (Py_ssize_t i = ndigits_fast; i < ndigits; i++) {
57887db96d56Sopenharmony_ci        PyObject *x = PyLong_FromLong(popcount_digit(z->ob_digit[i]));
57897db96d56Sopenharmony_ci        if (x == NULL) {
57907db96d56Sopenharmony_ci            goto error;
57917db96d56Sopenharmony_ci        }
57927db96d56Sopenharmony_ci        PyObject *y = long_add((PyLongObject *)result, (PyLongObject *)x);
57937db96d56Sopenharmony_ci        Py_DECREF(x);
57947db96d56Sopenharmony_ci        if (y == NULL) {
57957db96d56Sopenharmony_ci            goto error;
57967db96d56Sopenharmony_ci        }
57977db96d56Sopenharmony_ci        Py_DECREF(result);
57987db96d56Sopenharmony_ci        result = y;
57997db96d56Sopenharmony_ci    }
58007db96d56Sopenharmony_ci
58017db96d56Sopenharmony_ci    return result;
58027db96d56Sopenharmony_ci
58037db96d56Sopenharmony_ci  error:
58047db96d56Sopenharmony_ci    Py_DECREF(result);
58057db96d56Sopenharmony_ci    return NULL;
58067db96d56Sopenharmony_ci}
58077db96d56Sopenharmony_ci
58087db96d56Sopenharmony_ci/*[clinic input]
58097db96d56Sopenharmony_ciint.as_integer_ratio
58107db96d56Sopenharmony_ci
58117db96d56Sopenharmony_ciReturn integer ratio.
58127db96d56Sopenharmony_ci
58137db96d56Sopenharmony_ciReturn a pair of integers, whose ratio is exactly equal to the original int
58147db96d56Sopenharmony_ciand with a positive denominator.
58157db96d56Sopenharmony_ci
58167db96d56Sopenharmony_ci>>> (10).as_integer_ratio()
58177db96d56Sopenharmony_ci(10, 1)
58187db96d56Sopenharmony_ci>>> (-10).as_integer_ratio()
58197db96d56Sopenharmony_ci(-10, 1)
58207db96d56Sopenharmony_ci>>> (0).as_integer_ratio()
58217db96d56Sopenharmony_ci(0, 1)
58227db96d56Sopenharmony_ci[clinic start generated code]*/
58237db96d56Sopenharmony_ci
58247db96d56Sopenharmony_cistatic PyObject *
58257db96d56Sopenharmony_ciint_as_integer_ratio_impl(PyObject *self)
58267db96d56Sopenharmony_ci/*[clinic end generated code: output=e60803ae1cc8621a input=55ce3058e15de393]*/
58277db96d56Sopenharmony_ci{
58287db96d56Sopenharmony_ci    PyObject *ratio_tuple;
58297db96d56Sopenharmony_ci    PyObject *numerator = long_long(self);
58307db96d56Sopenharmony_ci    if (numerator == NULL) {
58317db96d56Sopenharmony_ci        return NULL;
58327db96d56Sopenharmony_ci    }
58337db96d56Sopenharmony_ci    ratio_tuple = PyTuple_Pack(2, numerator, _PyLong_GetOne());
58347db96d56Sopenharmony_ci    Py_DECREF(numerator);
58357db96d56Sopenharmony_ci    return ratio_tuple;
58367db96d56Sopenharmony_ci}
58377db96d56Sopenharmony_ci
58387db96d56Sopenharmony_ci/*[clinic input]
58397db96d56Sopenharmony_ciint.to_bytes
58407db96d56Sopenharmony_ci
58417db96d56Sopenharmony_ci    length: Py_ssize_t = 1
58427db96d56Sopenharmony_ci        Length of bytes object to use.  An OverflowError is raised if the
58437db96d56Sopenharmony_ci        integer is not representable with the given number of bytes.  Default
58447db96d56Sopenharmony_ci        is length 1.
58457db96d56Sopenharmony_ci    byteorder: unicode(c_default="NULL") = "big"
58467db96d56Sopenharmony_ci        The byte order used to represent the integer.  If byteorder is 'big',
58477db96d56Sopenharmony_ci        the most significant byte is at the beginning of the byte array.  If
58487db96d56Sopenharmony_ci        byteorder is 'little', the most significant byte is at the end of the
58497db96d56Sopenharmony_ci        byte array.  To request the native byte order of the host system, use
58507db96d56Sopenharmony_ci        `sys.byteorder' as the byte order value.  Default is to use 'big'.
58517db96d56Sopenharmony_ci    *
58527db96d56Sopenharmony_ci    signed as is_signed: bool = False
58537db96d56Sopenharmony_ci        Determines whether two's complement is used to represent the integer.
58547db96d56Sopenharmony_ci        If signed is False and a negative integer is given, an OverflowError
58557db96d56Sopenharmony_ci        is raised.
58567db96d56Sopenharmony_ci
58577db96d56Sopenharmony_ciReturn an array of bytes representing an integer.
58587db96d56Sopenharmony_ci[clinic start generated code]*/
58597db96d56Sopenharmony_ci
58607db96d56Sopenharmony_cistatic PyObject *
58617db96d56Sopenharmony_ciint_to_bytes_impl(PyObject *self, Py_ssize_t length, PyObject *byteorder,
58627db96d56Sopenharmony_ci                  int is_signed)
58637db96d56Sopenharmony_ci/*[clinic end generated code: output=89c801df114050a3 input=d42ecfb545039d71]*/
58647db96d56Sopenharmony_ci{
58657db96d56Sopenharmony_ci    int little_endian;
58667db96d56Sopenharmony_ci    PyObject *bytes;
58677db96d56Sopenharmony_ci
58687db96d56Sopenharmony_ci    if (byteorder == NULL)
58697db96d56Sopenharmony_ci        little_endian = 0;
58707db96d56Sopenharmony_ci    else if (_PyUnicode_Equal(byteorder, &_Py_ID(little)))
58717db96d56Sopenharmony_ci        little_endian = 1;
58727db96d56Sopenharmony_ci    else if (_PyUnicode_Equal(byteorder, &_Py_ID(big)))
58737db96d56Sopenharmony_ci        little_endian = 0;
58747db96d56Sopenharmony_ci    else {
58757db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
58767db96d56Sopenharmony_ci            "byteorder must be either 'little' or 'big'");
58777db96d56Sopenharmony_ci        return NULL;
58787db96d56Sopenharmony_ci    }
58797db96d56Sopenharmony_ci
58807db96d56Sopenharmony_ci    if (length < 0) {
58817db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
58827db96d56Sopenharmony_ci                        "length argument must be non-negative");
58837db96d56Sopenharmony_ci        return NULL;
58847db96d56Sopenharmony_ci    }
58857db96d56Sopenharmony_ci
58867db96d56Sopenharmony_ci    bytes = PyBytes_FromStringAndSize(NULL, length);
58877db96d56Sopenharmony_ci    if (bytes == NULL)
58887db96d56Sopenharmony_ci        return NULL;
58897db96d56Sopenharmony_ci
58907db96d56Sopenharmony_ci    if (_PyLong_AsByteArray((PyLongObject *)self,
58917db96d56Sopenharmony_ci                            (unsigned char *)PyBytes_AS_STRING(bytes),
58927db96d56Sopenharmony_ci                            length, little_endian, is_signed) < 0) {
58937db96d56Sopenharmony_ci        Py_DECREF(bytes);
58947db96d56Sopenharmony_ci        return NULL;
58957db96d56Sopenharmony_ci    }
58967db96d56Sopenharmony_ci
58977db96d56Sopenharmony_ci    return bytes;
58987db96d56Sopenharmony_ci}
58997db96d56Sopenharmony_ci
59007db96d56Sopenharmony_ci/*[clinic input]
59017db96d56Sopenharmony_ci@classmethod
59027db96d56Sopenharmony_ciint.from_bytes
59037db96d56Sopenharmony_ci
59047db96d56Sopenharmony_ci    bytes as bytes_obj: object
59057db96d56Sopenharmony_ci        Holds the array of bytes to convert.  The argument must either
59067db96d56Sopenharmony_ci        support the buffer protocol or be an iterable object producing bytes.
59077db96d56Sopenharmony_ci        Bytes and bytearray are examples of built-in objects that support the
59087db96d56Sopenharmony_ci        buffer protocol.
59097db96d56Sopenharmony_ci    byteorder: unicode(c_default="NULL") = "big"
59107db96d56Sopenharmony_ci        The byte order used to represent the integer.  If byteorder is 'big',
59117db96d56Sopenharmony_ci        the most significant byte is at the beginning of the byte array.  If
59127db96d56Sopenharmony_ci        byteorder is 'little', the most significant byte is at the end of the
59137db96d56Sopenharmony_ci        byte array.  To request the native byte order of the host system, use
59147db96d56Sopenharmony_ci        `sys.byteorder' as the byte order value.  Default is to use 'big'.
59157db96d56Sopenharmony_ci    *
59167db96d56Sopenharmony_ci    signed as is_signed: bool = False
59177db96d56Sopenharmony_ci        Indicates whether two's complement is used to represent the integer.
59187db96d56Sopenharmony_ci
59197db96d56Sopenharmony_ciReturn the integer represented by the given array of bytes.
59207db96d56Sopenharmony_ci[clinic start generated code]*/
59217db96d56Sopenharmony_ci
59227db96d56Sopenharmony_cistatic PyObject *
59237db96d56Sopenharmony_ciint_from_bytes_impl(PyTypeObject *type, PyObject *bytes_obj,
59247db96d56Sopenharmony_ci                    PyObject *byteorder, int is_signed)
59257db96d56Sopenharmony_ci/*[clinic end generated code: output=efc5d68e31f9314f input=33326dccdd655553]*/
59267db96d56Sopenharmony_ci{
59277db96d56Sopenharmony_ci    int little_endian;
59287db96d56Sopenharmony_ci    PyObject *long_obj, *bytes;
59297db96d56Sopenharmony_ci
59307db96d56Sopenharmony_ci    if (byteorder == NULL)
59317db96d56Sopenharmony_ci        little_endian = 0;
59327db96d56Sopenharmony_ci    else if (_PyUnicode_Equal(byteorder, &_Py_ID(little)))
59337db96d56Sopenharmony_ci        little_endian = 1;
59347db96d56Sopenharmony_ci    else if (_PyUnicode_Equal(byteorder, &_Py_ID(big)))
59357db96d56Sopenharmony_ci        little_endian = 0;
59367db96d56Sopenharmony_ci    else {
59377db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
59387db96d56Sopenharmony_ci            "byteorder must be either 'little' or 'big'");
59397db96d56Sopenharmony_ci        return NULL;
59407db96d56Sopenharmony_ci    }
59417db96d56Sopenharmony_ci
59427db96d56Sopenharmony_ci    bytes = PyObject_Bytes(bytes_obj);
59437db96d56Sopenharmony_ci    if (bytes == NULL)
59447db96d56Sopenharmony_ci        return NULL;
59457db96d56Sopenharmony_ci
59467db96d56Sopenharmony_ci    long_obj = _PyLong_FromByteArray(
59477db96d56Sopenharmony_ci        (unsigned char *)PyBytes_AS_STRING(bytes), Py_SIZE(bytes),
59487db96d56Sopenharmony_ci        little_endian, is_signed);
59497db96d56Sopenharmony_ci    Py_DECREF(bytes);
59507db96d56Sopenharmony_ci
59517db96d56Sopenharmony_ci    if (long_obj != NULL && type != &PyLong_Type) {
59527db96d56Sopenharmony_ci        Py_SETREF(long_obj, PyObject_CallOneArg((PyObject *)type, long_obj));
59537db96d56Sopenharmony_ci    }
59547db96d56Sopenharmony_ci
59557db96d56Sopenharmony_ci    return long_obj;
59567db96d56Sopenharmony_ci}
59577db96d56Sopenharmony_ci
59587db96d56Sopenharmony_cistatic PyObject *
59597db96d56Sopenharmony_cilong_long_meth(PyObject *self, PyObject *Py_UNUSED(ignored))
59607db96d56Sopenharmony_ci{
59617db96d56Sopenharmony_ci    return long_long(self);
59627db96d56Sopenharmony_ci}
59637db96d56Sopenharmony_ci
59647db96d56Sopenharmony_cistatic PyMethodDef long_methods[] = {
59657db96d56Sopenharmony_ci    {"conjugate",       long_long_meth, METH_NOARGS,
59667db96d56Sopenharmony_ci     "Returns self, the complex conjugate of any int."},
59677db96d56Sopenharmony_ci    INT_BIT_LENGTH_METHODDEF
59687db96d56Sopenharmony_ci    INT_BIT_COUNT_METHODDEF
59697db96d56Sopenharmony_ci    INT_TO_BYTES_METHODDEF
59707db96d56Sopenharmony_ci    INT_FROM_BYTES_METHODDEF
59717db96d56Sopenharmony_ci    INT_AS_INTEGER_RATIO_METHODDEF
59727db96d56Sopenharmony_ci    {"__trunc__",       long_long_meth, METH_NOARGS,
59737db96d56Sopenharmony_ci     "Truncating an Integral returns itself."},
59747db96d56Sopenharmony_ci    {"__floor__",       long_long_meth, METH_NOARGS,
59757db96d56Sopenharmony_ci     "Flooring an Integral returns itself."},
59767db96d56Sopenharmony_ci    {"__ceil__",        long_long_meth, METH_NOARGS,
59777db96d56Sopenharmony_ci     "Ceiling of an Integral returns itself."},
59787db96d56Sopenharmony_ci    INT___ROUND___METHODDEF
59797db96d56Sopenharmony_ci    INT___GETNEWARGS___METHODDEF
59807db96d56Sopenharmony_ci    INT___FORMAT___METHODDEF
59817db96d56Sopenharmony_ci    INT___SIZEOF___METHODDEF
59827db96d56Sopenharmony_ci    {NULL,              NULL}           /* sentinel */
59837db96d56Sopenharmony_ci};
59847db96d56Sopenharmony_ci
59857db96d56Sopenharmony_cistatic PyGetSetDef long_getset[] = {
59867db96d56Sopenharmony_ci    {"real",
59877db96d56Sopenharmony_ci     (getter)long_long_meth, (setter)NULL,
59887db96d56Sopenharmony_ci     "the real part of a complex number",
59897db96d56Sopenharmony_ci     NULL},
59907db96d56Sopenharmony_ci    {"imag",
59917db96d56Sopenharmony_ci     long_get0, (setter)NULL,
59927db96d56Sopenharmony_ci     "the imaginary part of a complex number",
59937db96d56Sopenharmony_ci     NULL},
59947db96d56Sopenharmony_ci    {"numerator",
59957db96d56Sopenharmony_ci     (getter)long_long_meth, (setter)NULL,
59967db96d56Sopenharmony_ci     "the numerator of a rational number in lowest terms",
59977db96d56Sopenharmony_ci     NULL},
59987db96d56Sopenharmony_ci    {"denominator",
59997db96d56Sopenharmony_ci     long_get1, (setter)NULL,
60007db96d56Sopenharmony_ci     "the denominator of a rational number in lowest terms",
60017db96d56Sopenharmony_ci     NULL},
60027db96d56Sopenharmony_ci    {NULL}  /* Sentinel */
60037db96d56Sopenharmony_ci};
60047db96d56Sopenharmony_ci
60057db96d56Sopenharmony_ciPyDoc_STRVAR(long_doc,
60067db96d56Sopenharmony_ci"int([x]) -> integer\n\
60077db96d56Sopenharmony_ciint(x, base=10) -> integer\n\
60087db96d56Sopenharmony_ci\n\
60097db96d56Sopenharmony_ciConvert a number or string to an integer, or return 0 if no arguments\n\
60107db96d56Sopenharmony_ciare given.  If x is a number, return x.__int__().  For floating point\n\
60117db96d56Sopenharmony_cinumbers, this truncates towards zero.\n\
60127db96d56Sopenharmony_ci\n\
60137db96d56Sopenharmony_ciIf x is not a number or if base is given, then x must be a string,\n\
60147db96d56Sopenharmony_cibytes, or bytearray instance representing an integer literal in the\n\
60157db96d56Sopenharmony_cigiven base.  The literal can be preceded by '+' or '-' and be surrounded\n\
60167db96d56Sopenharmony_ciby whitespace.  The base defaults to 10.  Valid bases are 0 and 2-36.\n\
60177db96d56Sopenharmony_ciBase 0 means to interpret the base from the string as an integer literal.\n\
60187db96d56Sopenharmony_ci>>> int('0b100', base=0)\n\
60197db96d56Sopenharmony_ci4");
60207db96d56Sopenharmony_ci
60217db96d56Sopenharmony_cistatic PyNumberMethods long_as_number = {
60227db96d56Sopenharmony_ci    (binaryfunc)long_add,       /*nb_add*/
60237db96d56Sopenharmony_ci    (binaryfunc)long_sub,       /*nb_subtract*/
60247db96d56Sopenharmony_ci    (binaryfunc)long_mul,       /*nb_multiply*/
60257db96d56Sopenharmony_ci    long_mod,                   /*nb_remainder*/
60267db96d56Sopenharmony_ci    long_divmod,                /*nb_divmod*/
60277db96d56Sopenharmony_ci    long_pow,                   /*nb_power*/
60287db96d56Sopenharmony_ci    (unaryfunc)long_neg,        /*nb_negative*/
60297db96d56Sopenharmony_ci    long_long,                  /*tp_positive*/
60307db96d56Sopenharmony_ci    (unaryfunc)long_abs,        /*tp_absolute*/
60317db96d56Sopenharmony_ci    (inquiry)long_bool,         /*tp_bool*/
60327db96d56Sopenharmony_ci    (unaryfunc)long_invert,     /*nb_invert*/
60337db96d56Sopenharmony_ci    long_lshift,                /*nb_lshift*/
60347db96d56Sopenharmony_ci    long_rshift,                /*nb_rshift*/
60357db96d56Sopenharmony_ci    long_and,                   /*nb_and*/
60367db96d56Sopenharmony_ci    long_xor,                   /*nb_xor*/
60377db96d56Sopenharmony_ci    long_or,                    /*nb_or*/
60387db96d56Sopenharmony_ci    long_long,                  /*nb_int*/
60397db96d56Sopenharmony_ci    0,                          /*nb_reserved*/
60407db96d56Sopenharmony_ci    long_float,                 /*nb_float*/
60417db96d56Sopenharmony_ci    0,                          /* nb_inplace_add */
60427db96d56Sopenharmony_ci    0,                          /* nb_inplace_subtract */
60437db96d56Sopenharmony_ci    0,                          /* nb_inplace_multiply */
60447db96d56Sopenharmony_ci    0,                          /* nb_inplace_remainder */
60457db96d56Sopenharmony_ci    0,                          /* nb_inplace_power */
60467db96d56Sopenharmony_ci    0,                          /* nb_inplace_lshift */
60477db96d56Sopenharmony_ci    0,                          /* nb_inplace_rshift */
60487db96d56Sopenharmony_ci    0,                          /* nb_inplace_and */
60497db96d56Sopenharmony_ci    0,                          /* nb_inplace_xor */
60507db96d56Sopenharmony_ci    0,                          /* nb_inplace_or */
60517db96d56Sopenharmony_ci    long_div,                   /* nb_floor_divide */
60527db96d56Sopenharmony_ci    long_true_divide,           /* nb_true_divide */
60537db96d56Sopenharmony_ci    0,                          /* nb_inplace_floor_divide */
60547db96d56Sopenharmony_ci    0,                          /* nb_inplace_true_divide */
60557db96d56Sopenharmony_ci    long_long,                  /* nb_index */
60567db96d56Sopenharmony_ci};
60577db96d56Sopenharmony_ci
60587db96d56Sopenharmony_ciPyTypeObject PyLong_Type = {
60597db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(&PyType_Type, 0)
60607db96d56Sopenharmony_ci    "int",                                      /* tp_name */
60617db96d56Sopenharmony_ci    offsetof(PyLongObject, ob_digit),           /* tp_basicsize */
60627db96d56Sopenharmony_ci    sizeof(digit),                              /* tp_itemsize */
60637db96d56Sopenharmony_ci    0,                                          /* tp_dealloc */
60647db96d56Sopenharmony_ci    0,                                          /* tp_vectorcall_offset */
60657db96d56Sopenharmony_ci    0,                                          /* tp_getattr */
60667db96d56Sopenharmony_ci    0,                                          /* tp_setattr */
60677db96d56Sopenharmony_ci    0,                                          /* tp_as_async */
60687db96d56Sopenharmony_ci    long_to_decimal_string,                     /* tp_repr */
60697db96d56Sopenharmony_ci    &long_as_number,                            /* tp_as_number */
60707db96d56Sopenharmony_ci    0,                                          /* tp_as_sequence */
60717db96d56Sopenharmony_ci    0,                                          /* tp_as_mapping */
60727db96d56Sopenharmony_ci    (hashfunc)long_hash,                        /* tp_hash */
60737db96d56Sopenharmony_ci    0,                                          /* tp_call */
60747db96d56Sopenharmony_ci    0,                                          /* tp_str */
60757db96d56Sopenharmony_ci    PyObject_GenericGetAttr,                    /* tp_getattro */
60767db96d56Sopenharmony_ci    0,                                          /* tp_setattro */
60777db96d56Sopenharmony_ci    0,                                          /* tp_as_buffer */
60787db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
60797db96d56Sopenharmony_ci        Py_TPFLAGS_LONG_SUBCLASS |
60807db96d56Sopenharmony_ci        _Py_TPFLAGS_MATCH_SELF,               /* tp_flags */
60817db96d56Sopenharmony_ci    long_doc,                                   /* tp_doc */
60827db96d56Sopenharmony_ci    0,                                          /* tp_traverse */
60837db96d56Sopenharmony_ci    0,                                          /* tp_clear */
60847db96d56Sopenharmony_ci    long_richcompare,                           /* tp_richcompare */
60857db96d56Sopenharmony_ci    0,                                          /* tp_weaklistoffset */
60867db96d56Sopenharmony_ci    0,                                          /* tp_iter */
60877db96d56Sopenharmony_ci    0,                                          /* tp_iternext */
60887db96d56Sopenharmony_ci    long_methods,                               /* tp_methods */
60897db96d56Sopenharmony_ci    0,                                          /* tp_members */
60907db96d56Sopenharmony_ci    long_getset,                                /* tp_getset */
60917db96d56Sopenharmony_ci    0,                                          /* tp_base */
60927db96d56Sopenharmony_ci    0,                                          /* tp_dict */
60937db96d56Sopenharmony_ci    0,                                          /* tp_descr_get */
60947db96d56Sopenharmony_ci    0,                                          /* tp_descr_set */
60957db96d56Sopenharmony_ci    0,                                          /* tp_dictoffset */
60967db96d56Sopenharmony_ci    0,                                          /* tp_init */
60977db96d56Sopenharmony_ci    0,                                          /* tp_alloc */
60987db96d56Sopenharmony_ci    long_new,                                   /* tp_new */
60997db96d56Sopenharmony_ci    PyObject_Free,                              /* tp_free */
61007db96d56Sopenharmony_ci};
61017db96d56Sopenharmony_ci
61027db96d56Sopenharmony_cistatic PyTypeObject Int_InfoType;
61037db96d56Sopenharmony_ci
61047db96d56Sopenharmony_ciPyDoc_STRVAR(int_info__doc__,
61057db96d56Sopenharmony_ci"sys.int_info\n\
61067db96d56Sopenharmony_ci\n\
61077db96d56Sopenharmony_ciA named tuple that holds information about Python's\n\
61087db96d56Sopenharmony_ciinternal representation of integers.  The attributes are read only.");
61097db96d56Sopenharmony_ci
61107db96d56Sopenharmony_cistatic PyStructSequence_Field int_info_fields[] = {
61117db96d56Sopenharmony_ci    {"bits_per_digit", "size of a digit in bits"},
61127db96d56Sopenharmony_ci    {"sizeof_digit", "size in bytes of the C type used to represent a digit"},
61137db96d56Sopenharmony_ci    {"default_max_str_digits", "maximum string conversion digits limitation"},
61147db96d56Sopenharmony_ci    {"str_digits_check_threshold", "minimum positive value for int_max_str_digits"},
61157db96d56Sopenharmony_ci    {NULL, NULL}
61167db96d56Sopenharmony_ci};
61177db96d56Sopenharmony_ci
61187db96d56Sopenharmony_cistatic PyStructSequence_Desc int_info_desc = {
61197db96d56Sopenharmony_ci    "sys.int_info",   /* name */
61207db96d56Sopenharmony_ci    int_info__doc__,  /* doc */
61217db96d56Sopenharmony_ci    int_info_fields,  /* fields */
61227db96d56Sopenharmony_ci    4                 /* number of fields */
61237db96d56Sopenharmony_ci};
61247db96d56Sopenharmony_ci
61257db96d56Sopenharmony_ciPyObject *
61267db96d56Sopenharmony_ciPyLong_GetInfo(void)
61277db96d56Sopenharmony_ci{
61287db96d56Sopenharmony_ci    PyObject* int_info;
61297db96d56Sopenharmony_ci    int field = 0;
61307db96d56Sopenharmony_ci    int_info = PyStructSequence_New(&Int_InfoType);
61317db96d56Sopenharmony_ci    if (int_info == NULL)
61327db96d56Sopenharmony_ci        return NULL;
61337db96d56Sopenharmony_ci    PyStructSequence_SET_ITEM(int_info, field++,
61347db96d56Sopenharmony_ci                              PyLong_FromLong(PyLong_SHIFT));
61357db96d56Sopenharmony_ci    PyStructSequence_SET_ITEM(int_info, field++,
61367db96d56Sopenharmony_ci                              PyLong_FromLong(sizeof(digit)));
61377db96d56Sopenharmony_ci    /*
61387db96d56Sopenharmony_ci     * The following two fields were added after investigating uses of
61397db96d56Sopenharmony_ci     * sys.int_info in the wild: Exceedingly rarely used. The ONLY use found was
61407db96d56Sopenharmony_ci     * numba using sys.int_info.bits_per_digit as attribute access rather than
61417db96d56Sopenharmony_ci     * sequence unpacking. Cython and sympy also refer to sys.int_info but only
61427db96d56Sopenharmony_ci     * as info for debugging. No concern about adding these in a backport.
61437db96d56Sopenharmony_ci     */
61447db96d56Sopenharmony_ci    PyStructSequence_SET_ITEM(int_info, field++,
61457db96d56Sopenharmony_ci                              PyLong_FromLong(_PY_LONG_DEFAULT_MAX_STR_DIGITS));
61467db96d56Sopenharmony_ci    PyStructSequence_SET_ITEM(int_info, field++,
61477db96d56Sopenharmony_ci                              PyLong_FromLong(_PY_LONG_MAX_STR_DIGITS_THRESHOLD));
61487db96d56Sopenharmony_ci    if (PyErr_Occurred()) {
61497db96d56Sopenharmony_ci        Py_CLEAR(int_info);
61507db96d56Sopenharmony_ci        return NULL;
61517db96d56Sopenharmony_ci    }
61527db96d56Sopenharmony_ci    return int_info;
61537db96d56Sopenharmony_ci}
61547db96d56Sopenharmony_ci
61557db96d56Sopenharmony_ci
61567db96d56Sopenharmony_ci/* runtime lifecycle */
61577db96d56Sopenharmony_ci
61587db96d56Sopenharmony_ciPyStatus
61597db96d56Sopenharmony_ci_PyLong_InitTypes(PyInterpreterState *interp)
61607db96d56Sopenharmony_ci{
61617db96d56Sopenharmony_ci    if (!_Py_IsMainInterpreter(interp)) {
61627db96d56Sopenharmony_ci        return _PyStatus_OK();
61637db96d56Sopenharmony_ci    }
61647db96d56Sopenharmony_ci
61657db96d56Sopenharmony_ci    if (PyType_Ready(&PyLong_Type) < 0) {
61667db96d56Sopenharmony_ci        return _PyStatus_ERR("Can't initialize int type");
61677db96d56Sopenharmony_ci    }
61687db96d56Sopenharmony_ci
61697db96d56Sopenharmony_ci    /* initialize int_info */
61707db96d56Sopenharmony_ci    if (Int_InfoType.tp_name == NULL) {
61717db96d56Sopenharmony_ci        if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) {
61727db96d56Sopenharmony_ci            return _PyStatus_ERR("can't init int info type");
61737db96d56Sopenharmony_ci        }
61747db96d56Sopenharmony_ci    }
61757db96d56Sopenharmony_ci    interp->int_max_str_digits = _Py_global_config_int_max_str_digits;
61767db96d56Sopenharmony_ci    if (interp->int_max_str_digits == -1) {
61777db96d56Sopenharmony_ci        interp->int_max_str_digits = _PY_LONG_DEFAULT_MAX_STR_DIGITS;
61787db96d56Sopenharmony_ci    }
61797db96d56Sopenharmony_ci
61807db96d56Sopenharmony_ci    return _PyStatus_OK();
61817db96d56Sopenharmony_ci}
61827db96d56Sopenharmony_ci
61837db96d56Sopenharmony_ci
61847db96d56Sopenharmony_civoid
61857db96d56Sopenharmony_ci_PyLong_FiniTypes(PyInterpreterState *interp)
61867db96d56Sopenharmony_ci{
61877db96d56Sopenharmony_ci    if (!_Py_IsMainInterpreter(interp)) {
61887db96d56Sopenharmony_ci        return;
61897db96d56Sopenharmony_ci    }
61907db96d56Sopenharmony_ci
61917db96d56Sopenharmony_ci    _PyStructSequence_FiniType(&Int_InfoType);
61927db96d56Sopenharmony_ci}
6193