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