blob: ce10c4f66586a18e0dcf0ca5b0fea5dd9c8304bb [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001/* Long (arbitrary precision) integer object implementation */
2
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00003/* XXX The functional organization of this file is terrible */
4
Guido van Rossumc0b618a1997-05-02 03:12:38 +00005#include "Python.h"
Victor Stinnerc6b292c2020-06-08 16:30:33 +02006#include "pycore_bitutils.h" // _Py_popcount32()
7#include "pycore_interp.h" // _PY_NSMALLPOSINTS
8#include "pycore_pystate.h" // _Py_IsMainInterpreter()
Guido van Rossumedcc38a1991-05-05 20:09:44 +00009#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010
Mark Dickinsonc6300392009-04-20 21:38:00 +000011#include <float.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000012#include <ctype.h>
Mark Dickinson5a74bf62009-02-15 11:04:38 +000013#include <stddef.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000014
Serhiy Storchaka495e8802017-02-01 23:12:20 +020015#include "clinic/longobject.c.h"
16/*[clinic input]
17class int "PyObject *" "&PyLong_Type"
18[clinic start generated code]*/
19/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ec0275e3422a36e3]*/
20
Victor Stinner630c8df2019-12-17 13:02:18 +010021#define NSMALLPOSINTS _PY_NSMALLPOSINTS
22#define NSMALLNEGINTS _PY_NSMALLNEGINTS
Facundo Batista6e6f59b2008-07-24 18:57:11 +000023
Serhiy Storchaka196a7bc2017-02-02 16:54:45 +020024_Py_IDENTIFIER(little);
25_Py_IDENTIFIER(big);
26
Mark Dickinsone4416742009-02-15 15:14:57 +000027/* convert a PyLong of size 1, 0 or -1 to an sdigit */
Victor Stinner08a80b12013-07-17 22:33:42 +020028#define MEDIUM_VALUE(x) (assert(-1 <= Py_SIZE(x) && Py_SIZE(x) <= 1), \
29 Py_SIZE(x) < 0 ? -(sdigit)(x)->ob_digit[0] : \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (Py_SIZE(x) == 0 ? (sdigit)0 : \
31 (sdigit)(x)->ob_digit[0]))
Facundo Batista6e6f59b2008-07-24 18:57:11 +000032
Serhiy Storchakaba85d692017-03-30 09:09:41 +030033PyObject *_PyLong_Zero = NULL;
34PyObject *_PyLong_One = NULL;
35
Guido van Rossumddefaf32007-01-14 03:31:43 +000036#if NSMALLNEGINTS + NSMALLPOSINTS > 0
animalize6b519982019-09-06 14:00:56 +080037#define IS_SMALL_INT(ival) (-NSMALLNEGINTS <= (ival) && (ival) < NSMALLPOSINTS)
Sergey Fedoseevc6734ee2019-09-12 19:41:14 +050038#define IS_SMALL_UINT(ival) ((ival) < NSMALLPOSINTS)
Greg Price5e63ab02019-08-24 10:19:37 -070039
Guido van Rossum7eaf8222007-06-18 17:58:50 +000040static PyObject *
Mark Dickinsone4416742009-02-15 15:14:57 +000041get_small_int(sdigit ival)
Guido van Rossumddefaf32007-01-14 03:31:43 +000042{
animalize6b519982019-09-06 14:00:56 +080043 assert(IS_SMALL_INT(ival));
Victor Stinner630c8df2019-12-17 13:02:18 +010044 PyThreadState *tstate = _PyThreadState_GET();
45 PyObject *v = (PyObject*)tstate->interp->small_ints[ival + NSMALLNEGINTS];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 Py_INCREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 return v;
Guido van Rossumddefaf32007-01-14 03:31:43 +000048}
Guido van Rossumddefaf32007-01-14 03:31:43 +000049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050static PyLongObject *
Facundo Batista6e6f59b2008-07-24 18:57:11 +000051maybe_small_long(PyLongObject *v)
52{
Victor Stinner45e8e2f2014-05-14 17:24:35 +020053 if (v && Py_ABS(Py_SIZE(v)) <= 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 sdigit ival = MEDIUM_VALUE(v);
animalize6b519982019-09-06 14:00:56 +080055 if (IS_SMALL_INT(ival)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 Py_DECREF(v);
57 return (PyLongObject *)get_small_int(ival);
58 }
59 }
60 return v;
Facundo Batista6e6f59b2008-07-24 18:57:11 +000061}
Guido van Rossumddefaf32007-01-14 03:31:43 +000062#else
animalize6b519982019-09-06 14:00:56 +080063#define IS_SMALL_INT(ival) 0
Sergey Fedoseevc6734ee2019-09-12 19:41:14 +050064#define IS_SMALL_UINT(ival) 0
animalize6b519982019-09-06 14:00:56 +080065#define get_small_int(ival) (Py_UNREACHABLE(), NULL)
Facundo Batista6e6f59b2008-07-24 18:57:11 +000066#define maybe_small_long(val) (val)
Guido van Rossumddefaf32007-01-14 03:31:43 +000067#endif
68
Serhiy Storchaka95949422013-08-27 19:40:23 +030069/* If a freshly-allocated int is already shared, it must
Guido van Rossumddefaf32007-01-14 03:31:43 +000070 be a small integer, so negating it must go to PyLong_FromLong */
Victor Stinner8aed6f12013-07-17 22:31:17 +020071Py_LOCAL_INLINE(void)
72_PyLong_Negate(PyLongObject **x_p)
73{
74 PyLongObject *x;
75
76 x = (PyLongObject *)*x_p;
77 if (Py_REFCNT(x) == 1) {
Victor Stinner60ac6ed2020-02-07 23:18:08 +010078 Py_SET_SIZE(x, -Py_SIZE(x));
Victor Stinner8aed6f12013-07-17 22:31:17 +020079 return;
80 }
81
82 *x_p = (PyLongObject *)PyLong_FromLong(-MEDIUM_VALUE(x));
83 Py_DECREF(x);
84}
85
Serhiy Storchaka95949422013-08-27 19:40:23 +030086/* For int multiplication, use the O(N**2) school algorithm unless
Tim Peters5af4e6c2002-08-12 02:31:19 +000087 * both operands contain more than KARATSUBA_CUTOFF digits (this
Serhiy Storchaka95949422013-08-27 19:40:23 +030088 * being an internal Python int digit, in base BASE).
Tim Peters5af4e6c2002-08-12 02:31:19 +000089 */
Tim Peters0973b992004-08-29 22:16:50 +000090#define KARATSUBA_CUTOFF 70
91#define KARATSUBA_SQUARE_CUTOFF (2 * KARATSUBA_CUTOFF)
Tim Peters5af4e6c2002-08-12 02:31:19 +000092
Tim Peters47e52ee2004-08-30 02:44:38 +000093/* For exponentiation, use the binary left-to-right algorithm
94 * unless the exponent contains more than FIVEARY_CUTOFF digits.
95 * In that case, do 5 bits at a time. The potential drawback is that
96 * a table of 2**5 intermediate results is computed.
97 */
98#define FIVEARY_CUTOFF 8
99
Mark Dickinsoncdd01d22010-05-10 21:37:34 +0000100#define SIGCHECK(PyTryBlock) \
101 do { \
102 if (PyErr_CheckSignals()) PyTryBlock \
103 } while(0)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000104
Serhiy Storchaka95949422013-08-27 19:40:23 +0300105/* Normalize (remove leading zeros from) an int object.
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000106 Doesn't attempt to free the storage--in most cases, due to the nature
107 of the algorithms used, this could save at most be one word anyway. */
108
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000109static PyLongObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200110long_normalize(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000111{
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200112 Py_ssize_t j = Py_ABS(Py_SIZE(v));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 Py_ssize_t i = j;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 while (i > 0 && v->ob_digit[i-1] == 0)
116 --i;
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100117 if (i != j) {
118 Py_SET_SIZE(v, (Py_SIZE(v) < 0) ? -(i) : i);
119 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 return v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000121}
122
Serhiy Storchaka95949422013-08-27 19:40:23 +0300123/* Allocate a new int object with size digits.
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000124 Return NULL and set exception if we run out of memory. */
125
Mark Dickinson5a74bf62009-02-15 11:04:38 +0000126#define MAX_LONG_DIGITS \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 ((PY_SSIZE_T_MAX - offsetof(PyLongObject, ob_digit))/sizeof(digit))
Mark Dickinson5a74bf62009-02-15 11:04:38 +0000128
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129PyLongObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000130_PyLong_New(Py_ssize_t size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000131{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 PyLongObject *result;
133 /* Number of bytes needed is: offsetof(PyLongObject, ob_digit) +
134 sizeof(digit)*size. Previous incarnations of this code used
135 sizeof(PyVarObject) instead of the offsetof, but this risks being
136 incorrect in the presence of padding between the PyVarObject header
137 and the digits. */
138 if (size > (Py_ssize_t)MAX_LONG_DIGITS) {
139 PyErr_SetString(PyExc_OverflowError,
140 "too many digits in integer");
141 return NULL;
142 }
143 result = PyObject_MALLOC(offsetof(PyLongObject, ob_digit) +
144 size*sizeof(digit));
145 if (!result) {
146 PyErr_NoMemory();
147 return NULL;
148 }
Victor Stinnerb509d522018-11-23 14:27:38 +0100149 return (PyLongObject*)PyObject_INIT_VAR(result, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000150}
151
Tim Peters64b5ce32001-09-10 20:52:51 +0000152PyObject *
153_PyLong_Copy(PyLongObject *src)
154{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 PyLongObject *result;
156 Py_ssize_t i;
Tim Peters64b5ce32001-09-10 20:52:51 +0000157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 assert(src != NULL);
159 i = Py_SIZE(src);
160 if (i < 0)
161 i = -(i);
162 if (i < 2) {
Mark Dickinsonbcc17ee2012-04-20 21:42:49 +0100163 sdigit ival = MEDIUM_VALUE(src);
animalize6b519982019-09-06 14:00:56 +0800164 if (IS_SMALL_INT(ival)) {
Greg Price5e63ab02019-08-24 10:19:37 -0700165 return get_small_int(ival);
166 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 }
168 result = _PyLong_New(i);
169 if (result != NULL) {
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100170 Py_SET_SIZE(result, Py_SIZE(src));
171 while (--i >= 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 result->ob_digit[i] = src->ob_digit[i];
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100173 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 }
175 return (PyObject *)result;
Tim Peters64b5ce32001-09-10 20:52:51 +0000176}
177
Serhiy Storchaka95949422013-08-27 19:40:23 +0300178/* Create a new int object from a C long int */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000179
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000181PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 PyLongObject *v;
184 unsigned long abs_ival;
185 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
186 int ndigits = 0;
Mark Dickinson36820dd2016-09-10 20:17:36 +0100187 int sign;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000188
animalize6b519982019-09-06 14:00:56 +0800189 if (IS_SMALL_INT(ival)) {
Greg Price5e63ab02019-08-24 10:19:37 -0700190 return get_small_int((sdigit)ival);
191 }
Tim Petersce9de2f2001-06-14 04:56:19 +0000192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 if (ival < 0) {
194 /* negate: can't write this as abs_ival = -ival since that
195 invokes undefined behaviour when ival is LONG_MIN */
196 abs_ival = 0U-(unsigned long)ival;
197 sign = -1;
198 }
199 else {
200 abs_ival = (unsigned long)ival;
Mark Dickinson36820dd2016-09-10 20:17:36 +0100201 sign = ival == 0 ? 0 : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 }
Tim Petersce9de2f2001-06-14 04:56:19 +0000203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 /* Fast path for single-digit ints */
205 if (!(abs_ival >> PyLong_SHIFT)) {
206 v = _PyLong_New(1);
207 if (v) {
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100208 Py_SET_SIZE(v, sign);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 v->ob_digit[0] = Py_SAFE_DOWNCAST(
210 abs_ival, unsigned long, digit);
211 }
212 return (PyObject*)v;
213 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000214
Mark Dickinson249b8982009-04-27 19:41:00 +0000215#if PyLong_SHIFT==15
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 /* 2 digits */
217 if (!(abs_ival >> 2*PyLong_SHIFT)) {
218 v = _PyLong_New(2);
219 if (v) {
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100220 Py_SET_SIZE(v, 2 * sign);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 v->ob_digit[0] = Py_SAFE_DOWNCAST(
222 abs_ival & PyLong_MASK, unsigned long, digit);
223 v->ob_digit[1] = Py_SAFE_DOWNCAST(
224 abs_ival >> PyLong_SHIFT, unsigned long, digit);
225 }
226 return (PyObject*)v;
227 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000228#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +0000229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 /* Larger numbers: loop to determine number of digits */
231 t = abs_ival;
232 while (t) {
233 ++ndigits;
234 t >>= PyLong_SHIFT;
235 }
236 v = _PyLong_New(ndigits);
237 if (v != NULL) {
238 digit *p = v->ob_digit;
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100239 Py_SET_SIZE(v, ndigits * sign);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 t = abs_ival;
241 while (t) {
242 *p++ = Py_SAFE_DOWNCAST(
243 t & PyLong_MASK, unsigned long, digit);
244 t >>= PyLong_SHIFT;
245 }
246 }
247 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000248}
249
Sergey Fedoseevc6734ee2019-09-12 19:41:14 +0500250#define PYLONG_FROM_UINT(INT_TYPE, ival) \
251 do { \
252 if (IS_SMALL_UINT(ival)) { \
Victor Stinner6314abc2019-10-01 13:29:53 +0200253 return get_small_int((sdigit)(ival)); \
Sergey Fedoseevc6734ee2019-09-12 19:41:14 +0500254 } \
255 /* Count the number of Python digits. */ \
256 Py_ssize_t ndigits = 0; \
257 INT_TYPE t = (ival); \
258 while (t) { \
259 ++ndigits; \
260 t >>= PyLong_SHIFT; \
261 } \
262 PyLongObject *v = _PyLong_New(ndigits); \
263 if (v == NULL) { \
264 return NULL; \
265 } \
266 digit *p = v->ob_digit; \
267 while ((ival)) { \
268 *p++ = (digit)((ival) & PyLong_MASK); \
269 (ival) >>= PyLong_SHIFT; \
270 } \
271 return (PyObject *)v; \
272 } while(0)
273
Serhiy Storchaka95949422013-08-27 19:40:23 +0300274/* Create a new int object from a C unsigned long int */
Guido van Rossum53756b11997-01-03 17:14:46 +0000275
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000276PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000277PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000278{
Sergey Fedoseevc6734ee2019-09-12 19:41:14 +0500279 PYLONG_FROM_UINT(unsigned long, ival);
280}
Tim Petersce9de2f2001-06-14 04:56:19 +0000281
Sergey Fedoseevc6734ee2019-09-12 19:41:14 +0500282/* Create a new int object from a C unsigned long long int. */
283
284PyObject *
285PyLong_FromUnsignedLongLong(unsigned long long ival)
286{
287 PYLONG_FROM_UINT(unsigned long long, ival);
288}
289
290/* Create a new int object from a C size_t. */
291
292PyObject *
293PyLong_FromSize_t(size_t ival)
294{
295 PYLONG_FROM_UINT(size_t, ival);
Guido van Rossum53756b11997-01-03 17:14:46 +0000296}
297
Serhiy Storchaka95949422013-08-27 19:40:23 +0300298/* Create a new int object from a C double */
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000299
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000300PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000302{
Sergey Fedoseev86a93fd2020-05-10 14:15:57 +0500303 /* Try to get out cheap if this fits in a long. When a finite value of real
304 * floating type is converted to an integer type, the value is truncated
305 * toward zero. If the value of the integral part cannot be represented by
306 * the integer type, the behavior is undefined. Thus, we must check that
307 * value is in range (LONG_MIN - 1, LONG_MAX + 1). If a long has more bits
308 * of precision than a double, casting LONG_MIN - 1 to double may yield an
309 * approximation, but LONG_MAX + 1 is a power of two and can be represented
310 * as double exactly (assuming FLT_RADIX is 2 or 16), so for simplicity
311 * check against [-(LONG_MAX + 1), LONG_MAX + 1).
312 */
313 const double int_max = (unsigned long)LONG_MAX + 1;
314 if (-int_max < dval && dval < int_max) {
315 return PyLong_FromLong((long)dval);
316 }
317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 PyLongObject *v;
319 double frac;
320 int i, ndig, expo, neg;
321 neg = 0;
322 if (Py_IS_INFINITY(dval)) {
323 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson22b20182010-05-10 21:27:53 +0000324 "cannot convert float infinity to integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 return NULL;
326 }
327 if (Py_IS_NAN(dval)) {
328 PyErr_SetString(PyExc_ValueError,
Mark Dickinson22b20182010-05-10 21:27:53 +0000329 "cannot convert float NaN to integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 return NULL;
331 }
332 if (dval < 0.0) {
333 neg = 1;
334 dval = -dval;
335 }
336 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
Sergey Fedoseev86a93fd2020-05-10 14:15:57 +0500337 assert(expo > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 ndig = (expo-1) / PyLong_SHIFT + 1; /* Number of 'digits' in result */
339 v = _PyLong_New(ndig);
340 if (v == NULL)
341 return NULL;
342 frac = ldexp(frac, (expo-1) % PyLong_SHIFT + 1);
343 for (i = ndig; --i >= 0; ) {
344 digit bits = (digit)frac;
345 v->ob_digit[i] = bits;
346 frac = frac - (double)bits;
347 frac = ldexp(frac, PyLong_SHIFT);
348 }
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100349 if (neg) {
350 Py_SET_SIZE(v, -(Py_SIZE(v)));
351 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000353}
354
Thomas Wouters89f507f2006-12-13 04:49:30 +0000355/* Checking for overflow in PyLong_AsLong is a PITA since C doesn't define
356 * anything about what happens when a signed integer operation overflows,
357 * and some compilers think they're doing you a favor by being "clever"
Raymond Hettinger15f44ab2016-08-30 10:47:49 -0700358 * then. The bit pattern for the largest positive signed long is
Thomas Wouters89f507f2006-12-13 04:49:30 +0000359 * (unsigned long)LONG_MAX, and for the smallest negative signed long
360 * it is abs(LONG_MIN), which we could write -(unsigned long)LONG_MIN.
361 * However, some other compilers warn about applying unary minus to an
362 * unsigned operand. Hence the weird "0-".
363 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364#define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN)
365#define PY_ABS_SSIZE_T_MIN (0-(size_t)PY_SSIZE_T_MIN)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000366
Mark Dickinson20941de2020-05-27 13:43:17 +0100367/* Get a C long int from an int object or any object that has an __index__
Mark Dickinson8d48b432011-10-23 20:47:14 +0100368 method.
369
370 On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
371 the result. Otherwise *overflow is 0.
372
373 For other errors (e.g., TypeError), return -1 and set an error condition.
374 In this case *overflow will be 0.
375*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000376
377long
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000378PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 /* This version by Tim Peters */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200381 PyLongObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 unsigned long x, prev;
383 long res;
384 Py_ssize_t i;
385 int sign;
Mark Dickinson20941de2020-05-27 13:43:17 +0100386 int do_decref = 0; /* if PyNumber_Index was called */
Guido van Rossumf7531811998-05-26 14:33:37 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 *overflow = 0;
389 if (vv == NULL) {
390 PyErr_BadInternalCall();
391 return -1;
392 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000393
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200394 if (PyLong_Check(vv)) {
395 v = (PyLongObject *)vv;
396 }
397 else {
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +0300398 v = (PyLongObject *)_PyNumber_Index(vv);
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200399 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 return -1;
401 do_decref = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 res = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 i = Py_SIZE(v);
Guido van Rossumf7531811998-05-26 14:33:37 +0000406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 switch (i) {
408 case -1:
409 res = -(sdigit)v->ob_digit[0];
410 break;
411 case 0:
412 res = 0;
413 break;
414 case 1:
415 res = v->ob_digit[0];
416 break;
417 default:
418 sign = 1;
419 x = 0;
420 if (i < 0) {
421 sign = -1;
422 i = -(i);
423 }
424 while (--i >= 0) {
425 prev = x;
426 x = (x << PyLong_SHIFT) | v->ob_digit[i];
427 if ((x >> PyLong_SHIFT) != prev) {
428 *overflow = sign;
429 goto exit;
430 }
431 }
432 /* Haven't lost any bits, but casting to long requires extra
433 * care (see comment above).
434 */
435 if (x <= (unsigned long)LONG_MAX) {
436 res = (long)x * sign;
437 }
438 else if (sign < 0 && x == PY_ABS_LONG_MIN) {
439 res = LONG_MIN;
440 }
441 else {
442 *overflow = sign;
443 /* res is already set to -1 */
444 }
445 }
Mark Dickinson22b20182010-05-10 21:27:53 +0000446 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 if (do_decref) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200448 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 }
450 return res;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000451}
452
Mark Dickinson20941de2020-05-27 13:43:17 +0100453/* Get a C long int from an int object or any object that has an __index__
Mark Dickinson8d48b432011-10-23 20:47:14 +0100454 method. Return -1 and set an error if overflow occurs. */
455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456long
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000457PyLong_AsLong(PyObject *obj)
458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 int overflow;
460 long result = PyLong_AsLongAndOverflow(obj, &overflow);
461 if (overflow) {
462 /* XXX: could be cute and give a different
463 message for overflow == -1 */
464 PyErr_SetString(PyExc_OverflowError,
465 "Python int too large to convert to C long");
466 }
467 return result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000468}
469
Mark Dickinson20941de2020-05-27 13:43:17 +0100470/* Get a C int from an int object or any object that has an __index__
Serhiy Storchaka78980432013-01-15 01:12:17 +0200471 method. Return -1 and set an error if overflow occurs. */
472
473int
474_PyLong_AsInt(PyObject *obj)
475{
476 int overflow;
477 long result = PyLong_AsLongAndOverflow(obj, &overflow);
478 if (overflow || result > INT_MAX || result < INT_MIN) {
479 /* XXX: could be cute and give a different
480 message for overflow == -1 */
481 PyErr_SetString(PyExc_OverflowError,
482 "Python int too large to convert to C int");
483 return -1;
484 }
485 return (int)result;
486}
487
Serhiy Storchaka95949422013-08-27 19:40:23 +0300488/* Get a Py_ssize_t from an int object.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000489 Returns -1 and sets an error condition if overflow occurs. */
490
491Py_ssize_t
Guido van Rossumddefaf32007-01-14 03:31:43 +0000492PyLong_AsSsize_t(PyObject *vv) {
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200493 PyLongObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 size_t x, prev;
495 Py_ssize_t i;
496 int sign;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 if (vv == NULL) {
499 PyErr_BadInternalCall();
500 return -1;
501 }
502 if (!PyLong_Check(vv)) {
503 PyErr_SetString(PyExc_TypeError, "an integer is required");
504 return -1;
505 }
Mark Dickinsond59b4162010-03-13 11:34:40 +0000506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 v = (PyLongObject *)vv;
508 i = Py_SIZE(v);
509 switch (i) {
510 case -1: return -(sdigit)v->ob_digit[0];
511 case 0: return 0;
512 case 1: return v->ob_digit[0];
513 }
514 sign = 1;
515 x = 0;
516 if (i < 0) {
517 sign = -1;
518 i = -(i);
519 }
520 while (--i >= 0) {
521 prev = x;
522 x = (x << PyLong_SHIFT) | v->ob_digit[i];
523 if ((x >> PyLong_SHIFT) != prev)
524 goto overflow;
525 }
526 /* Haven't lost any bits, but casting to a signed type requires
527 * extra care (see comment above).
528 */
529 if (x <= (size_t)PY_SSIZE_T_MAX) {
530 return (Py_ssize_t)x * sign;
531 }
532 else if (sign < 0 && x == PY_ABS_SSIZE_T_MIN) {
533 return PY_SSIZE_T_MIN;
534 }
535 /* else overflow */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000536
Mark Dickinson22b20182010-05-10 21:27:53 +0000537 overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 PyErr_SetString(PyExc_OverflowError,
539 "Python int too large to convert to C ssize_t");
540 return -1;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000541}
542
Serhiy Storchaka95949422013-08-27 19:40:23 +0300543/* Get a C unsigned long int from an int object.
Guido van Rossum53756b11997-01-03 17:14:46 +0000544 Returns -1 and sets an error condition if overflow occurs. */
545
546unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000547PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000548{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200549 PyLongObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 unsigned long x, prev;
551 Py_ssize_t i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 if (vv == NULL) {
554 PyErr_BadInternalCall();
555 return (unsigned long)-1;
556 }
557 if (!PyLong_Check(vv)) {
558 PyErr_SetString(PyExc_TypeError, "an integer is required");
559 return (unsigned long)-1;
560 }
Mark Dickinsond59b4162010-03-13 11:34:40 +0000561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 v = (PyLongObject *)vv;
563 i = Py_SIZE(v);
564 x = 0;
565 if (i < 0) {
566 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson22b20182010-05-10 21:27:53 +0000567 "can't convert negative value to unsigned int");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 return (unsigned long) -1;
569 }
570 switch (i) {
571 case 0: return 0;
572 case 1: return v->ob_digit[0];
573 }
574 while (--i >= 0) {
575 prev = x;
576 x = (x << PyLong_SHIFT) | v->ob_digit[i];
577 if ((x >> PyLong_SHIFT) != prev) {
578 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson02515f72013-08-03 12:08:22 +0100579 "Python int too large to convert "
Mark Dickinson22b20182010-05-10 21:27:53 +0000580 "to C unsigned long");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 return (unsigned long) -1;
582 }
583 }
584 return x;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000585}
586
Serhiy Storchaka95949422013-08-27 19:40:23 +0300587/* Get a C size_t from an int object. Returns (size_t)-1 and sets
Stefan Krahb77c6c62011-09-12 16:22:47 +0200588 an error condition if overflow occurs. */
Guido van Rossumddefaf32007-01-14 03:31:43 +0000589
590size_t
591PyLong_AsSize_t(PyObject *vv)
592{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200593 PyLongObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 size_t x, prev;
595 Py_ssize_t i;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 if (vv == NULL) {
598 PyErr_BadInternalCall();
599 return (size_t) -1;
600 }
601 if (!PyLong_Check(vv)) {
602 PyErr_SetString(PyExc_TypeError, "an integer is required");
603 return (size_t)-1;
604 }
Mark Dickinsond59b4162010-03-13 11:34:40 +0000605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 v = (PyLongObject *)vv;
607 i = Py_SIZE(v);
608 x = 0;
609 if (i < 0) {
610 PyErr_SetString(PyExc_OverflowError,
611 "can't convert negative value to size_t");
612 return (size_t) -1;
613 }
614 switch (i) {
615 case 0: return 0;
616 case 1: return v->ob_digit[0];
617 }
618 while (--i >= 0) {
619 prev = x;
620 x = (x << PyLong_SHIFT) | v->ob_digit[i];
621 if ((x >> PyLong_SHIFT) != prev) {
622 PyErr_SetString(PyExc_OverflowError,
623 "Python int too large to convert to C size_t");
Stefan Krahb77c6c62011-09-12 16:22:47 +0200624 return (size_t) -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 }
626 }
627 return x;
Guido van Rossum53756b11997-01-03 17:14:46 +0000628}
629
Serhiy Storchaka95949422013-08-27 19:40:23 +0300630/* Get a C unsigned long int from an int object, ignoring the high bits.
Thomas Hellera4ea6032003-04-17 18:55:45 +0000631 Returns -1 and sets an error condition if an error occurs. */
632
Guido van Rossumddefaf32007-01-14 03:31:43 +0000633static unsigned long
634_PyLong_AsUnsignedLongMask(PyObject *vv)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000635{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200636 PyLongObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 unsigned long x;
638 Py_ssize_t i;
639 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 if (vv == NULL || !PyLong_Check(vv)) {
642 PyErr_BadInternalCall();
643 return (unsigned long) -1;
644 }
645 v = (PyLongObject *)vv;
646 i = Py_SIZE(v);
647 switch (i) {
648 case 0: return 0;
649 case 1: return v->ob_digit[0];
650 }
651 sign = 1;
652 x = 0;
653 if (i < 0) {
654 sign = -1;
655 i = -i;
656 }
657 while (--i >= 0) {
658 x = (x << PyLong_SHIFT) | v->ob_digit[i];
659 }
660 return x * sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000661}
662
Guido van Rossumddefaf32007-01-14 03:31:43 +0000663unsigned long
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200664PyLong_AsUnsignedLongMask(PyObject *op)
Guido van Rossumddefaf32007-01-14 03:31:43 +0000665{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 PyLongObject *lo;
667 unsigned long val;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000668
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200669 if (op == NULL) {
670 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 return (unsigned long)-1;
672 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000673
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200674 if (PyLong_Check(op)) {
675 return _PyLong_AsUnsignedLongMask(op);
676 }
677
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +0300678 lo = (PyLongObject *)_PyNumber_Index(op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 if (lo == NULL)
680 return (unsigned long)-1;
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200681
682 val = _PyLong_AsUnsignedLongMask((PyObject *)lo);
683 Py_DECREF(lo);
684 return val;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000685}
686
Tim Peters5b8132f2003-01-31 15:52:05 +0000687int
688_PyLong_Sign(PyObject *vv)
689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 assert(v != NULL);
693 assert(PyLong_Check(v));
Tim Peters5b8132f2003-01-31 15:52:05 +0000694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1);
Tim Peters5b8132f2003-01-31 15:52:05 +0000696}
697
Tim Petersbaefd9e2003-01-28 20:37:45 +0000698size_t
699_PyLong_NumBits(PyObject *vv)
700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 PyLongObject *v = (PyLongObject *)vv;
702 size_t result = 0;
703 Py_ssize_t ndigits;
Serhiy Storchakab2e64f92016-11-08 20:34:22 +0200704 int msd_bits;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 assert(v != NULL);
707 assert(PyLong_Check(v));
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200708 ndigits = Py_ABS(Py_SIZE(v));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
710 if (ndigits > 0) {
711 digit msd = v->ob_digit[ndigits - 1];
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -0700712 if ((size_t)(ndigits - 1) > SIZE_MAX / (size_t)PyLong_SHIFT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 goto Overflow;
Mark Dickinsonfc9adb62012-10-06 18:50:02 +0100714 result = (size_t)(ndigits - 1) * (size_t)PyLong_SHIFT;
Niklas Fiekasc5b79002020-01-16 15:09:19 +0100715 msd_bits = _Py_bit_length(msd);
Serhiy Storchakab2e64f92016-11-08 20:34:22 +0200716 if (SIZE_MAX - msd_bits < result)
717 goto Overflow;
718 result += msd_bits;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 }
720 return result;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000721
Mark Dickinson22b20182010-05-10 21:27:53 +0000722 Overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 PyErr_SetString(PyExc_OverflowError, "int has too many bits "
724 "to express in a platform size_t");
725 return (size_t)-1;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000726}
727
Tim Peters2a9b3672001-06-11 21:23:58 +0000728PyObject *
729_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 int little_endian, int is_signed)
Tim Peters2a9b3672001-06-11 21:23:58 +0000731{
Mark Dickinson22b20182010-05-10 21:27:53 +0000732 const unsigned char* pstartbyte; /* LSB of bytes */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 int incr; /* direction to move pstartbyte */
734 const unsigned char* pendbyte; /* MSB of bytes */
735 size_t numsignificantbytes; /* number of bytes that matter */
Serhiy Storchaka95949422013-08-27 19:40:23 +0300736 Py_ssize_t ndigits; /* number of Python int digits */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 PyLongObject* v; /* result */
738 Py_ssize_t idigit = 0; /* next free index in v->ob_digit */
Tim Peters2a9b3672001-06-11 21:23:58 +0000739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 if (n == 0)
741 return PyLong_FromLong(0L);
Tim Peters2a9b3672001-06-11 21:23:58 +0000742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 if (little_endian) {
744 pstartbyte = bytes;
745 pendbyte = bytes + n - 1;
746 incr = 1;
747 }
748 else {
749 pstartbyte = bytes + n - 1;
750 pendbyte = bytes;
751 incr = -1;
752 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 if (is_signed)
755 is_signed = *pendbyte >= 0x80;
Tim Peters2a9b3672001-06-11 21:23:58 +0000756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 /* Compute numsignificantbytes. This consists of finding the most
Ezio Melotti13925002011-03-16 11:05:33 +0200758 significant byte. Leading 0 bytes are insignificant if the number
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 is positive, and leading 0xff bytes if negative. */
760 {
761 size_t i;
762 const unsigned char* p = pendbyte;
763 const int pincr = -incr; /* search MSB to LSB */
Martin Pantereb995702016-07-28 01:11:04 +0000764 const unsigned char insignificant = is_signed ? 0xff : 0x00;
Tim Peters2a9b3672001-06-11 21:23:58 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 for (i = 0; i < n; ++i, p += pincr) {
Martin Pantereb995702016-07-28 01:11:04 +0000767 if (*p != insignificant)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 break;
769 }
770 numsignificantbytes = n - i;
771 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
772 actually has 2 significant bytes. OTOH, 0xff0001 ==
773 -0x00ffff, so we wouldn't *need* to bump it there; but we
774 do for 0xffff = -0x0001. To be safe without bothering to
775 check every case, bump it regardless. */
776 if (is_signed && numsignificantbytes < n)
777 ++numsignificantbytes;
778 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000779
Serhiy Storchaka95949422013-08-27 19:40:23 +0300780 /* How many Python int digits do we need? We have
781 8*numsignificantbytes bits, and each Python int digit has
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 PyLong_SHIFT bits, so it's the ceiling of the quotient. */
783 /* catch overflow before it happens */
784 if (numsignificantbytes > (PY_SSIZE_T_MAX - PyLong_SHIFT) / 8) {
785 PyErr_SetString(PyExc_OverflowError,
786 "byte array too long to convert to int");
787 return NULL;
788 }
789 ndigits = (numsignificantbytes * 8 + PyLong_SHIFT - 1) / PyLong_SHIFT;
790 v = _PyLong_New(ndigits);
791 if (v == NULL)
792 return NULL;
Tim Peters2a9b3672001-06-11 21:23:58 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 /* Copy the bits over. The tricky parts are computing 2's-comp on
795 the fly for signed numbers, and dealing with the mismatch between
796 8-bit bytes and (probably) 15-bit Python digits.*/
797 {
798 size_t i;
799 twodigits carry = 1; /* for 2's-comp calculation */
800 twodigits accum = 0; /* sliding register */
801 unsigned int accumbits = 0; /* number of bits in accum */
802 const unsigned char* p = pstartbyte;
Tim Peters2a9b3672001-06-11 21:23:58 +0000803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
805 twodigits thisbyte = *p;
806 /* Compute correction for 2's comp, if needed. */
807 if (is_signed) {
808 thisbyte = (0xff ^ thisbyte) + carry;
809 carry = thisbyte >> 8;
810 thisbyte &= 0xff;
811 }
812 /* Because we're going LSB to MSB, thisbyte is
813 more significant than what's already in accum,
814 so needs to be prepended to accum. */
orenmn86aa2692017-03-06 10:42:47 +0200815 accum |= thisbyte << accumbits;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 accumbits += 8;
817 if (accumbits >= PyLong_SHIFT) {
818 /* There's enough to fill a Python digit. */
819 assert(idigit < ndigits);
Mark Dickinson22b20182010-05-10 21:27:53 +0000820 v->ob_digit[idigit] = (digit)(accum & PyLong_MASK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 ++idigit;
822 accum >>= PyLong_SHIFT;
823 accumbits -= PyLong_SHIFT;
824 assert(accumbits < PyLong_SHIFT);
825 }
826 }
827 assert(accumbits < PyLong_SHIFT);
828 if (accumbits) {
829 assert(idigit < ndigits);
830 v->ob_digit[idigit] = (digit)accum;
831 ++idigit;
832 }
833 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000834
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100835 Py_SET_SIZE(v, is_signed ? -idigit : idigit);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 return (PyObject *)long_normalize(v);
Tim Peters2a9b3672001-06-11 21:23:58 +0000837}
838
839int
840_PyLong_AsByteArray(PyLongObject* v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 unsigned char* bytes, size_t n,
842 int little_endian, int is_signed)
Tim Peters2a9b3672001-06-11 21:23:58 +0000843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 Py_ssize_t i; /* index into v->ob_digit */
Mark Dickinson22b20182010-05-10 21:27:53 +0000845 Py_ssize_t ndigits; /* |v->ob_size| */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 twodigits accum; /* sliding register */
Mark Dickinson22b20182010-05-10 21:27:53 +0000847 unsigned int accumbits; /* # bits in accum */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
849 digit carry; /* for computing 2's-comp */
850 size_t j; /* # bytes filled */
851 unsigned char* p; /* pointer to next byte in bytes */
852 int pincr; /* direction to move p */
Tim Peters2a9b3672001-06-11 21:23:58 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 assert(v != NULL && PyLong_Check(v));
Tim Peters2a9b3672001-06-11 21:23:58 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 if (Py_SIZE(v) < 0) {
857 ndigits = -(Py_SIZE(v));
858 if (!is_signed) {
859 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson22b20182010-05-10 21:27:53 +0000860 "can't convert negative int to unsigned");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 return -1;
862 }
863 do_twos_comp = 1;
864 }
865 else {
866 ndigits = Py_SIZE(v);
867 do_twos_comp = 0;
868 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 if (little_endian) {
871 p = bytes;
872 pincr = 1;
873 }
874 else {
875 p = bytes + n - 1;
876 pincr = -1;
877 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 /* Copy over all the Python digits.
880 It's crucial that every Python digit except for the MSD contribute
Serhiy Storchaka95949422013-08-27 19:40:23 +0300881 exactly PyLong_SHIFT bits to the total, so first assert that the int is
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 normalized. */
883 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
884 j = 0;
885 accum = 0;
886 accumbits = 0;
887 carry = do_twos_comp ? 1 : 0;
888 for (i = 0; i < ndigits; ++i) {
889 digit thisdigit = v->ob_digit[i];
890 if (do_twos_comp) {
891 thisdigit = (thisdigit ^ PyLong_MASK) + carry;
892 carry = thisdigit >> PyLong_SHIFT;
893 thisdigit &= PyLong_MASK;
894 }
895 /* Because we're going LSB to MSB, thisdigit is more
896 significant than what's already in accum, so needs to be
897 prepended to accum. */
898 accum |= (twodigits)thisdigit << accumbits;
Tim Peters8bc84b42001-06-12 19:17:03 +0000899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 /* The most-significant digit may be (probably is) at least
901 partly empty. */
902 if (i == ndigits - 1) {
903 /* Count # of sign bits -- they needn't be stored,
904 * although for signed conversion we need later to
905 * make sure at least one sign bit gets stored. */
Mark Dickinson22b20182010-05-10 21:27:53 +0000906 digit s = do_twos_comp ? thisdigit ^ PyLong_MASK : thisdigit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 while (s != 0) {
908 s >>= 1;
909 accumbits++;
910 }
911 }
912 else
913 accumbits += PyLong_SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 /* Store as many bytes as possible. */
916 while (accumbits >= 8) {
917 if (j >= n)
918 goto Overflow;
919 ++j;
920 *p = (unsigned char)(accum & 0xff);
921 p += pincr;
922 accumbits -= 8;
923 accum >>= 8;
924 }
925 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 /* Store the straggler (if any). */
928 assert(accumbits < 8);
929 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
930 if (accumbits > 0) {
931 if (j >= n)
932 goto Overflow;
933 ++j;
934 if (do_twos_comp) {
935 /* Fill leading bits of the byte with sign bits
Serhiy Storchaka95949422013-08-27 19:40:23 +0300936 (appropriately pretending that the int had an
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 infinite supply of sign bits). */
938 accum |= (~(twodigits)0) << accumbits;
939 }
940 *p = (unsigned char)(accum & 0xff);
941 p += pincr;
942 }
943 else if (j == n && n > 0 && is_signed) {
944 /* The main loop filled the byte array exactly, so the code
945 just above didn't get to ensure there's a sign bit, and the
946 loop below wouldn't add one either. Make sure a sign bit
947 exists. */
948 unsigned char msb = *(p - pincr);
949 int sign_bit_set = msb >= 0x80;
950 assert(accumbits == 0);
951 if (sign_bit_set == do_twos_comp)
952 return 0;
953 else
954 goto Overflow;
955 }
Tim Peters05607ad2001-06-13 21:01:27 +0000956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 /* Fill remaining bytes with copies of the sign bit. */
958 {
959 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
960 for ( ; j < n; ++j, p += pincr)
961 *p = signbyte;
962 }
Tim Peters05607ad2001-06-13 21:01:27 +0000963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 return 0;
Tim Peters2a9b3672001-06-11 21:23:58 +0000965
Mark Dickinson22b20182010-05-10 21:27:53 +0000966 Overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 PyErr_SetString(PyExc_OverflowError, "int too big to convert");
968 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000969
Tim Peters2a9b3672001-06-11 21:23:58 +0000970}
971
Serhiy Storchaka95949422013-08-27 19:40:23 +0300972/* Create a new int object from a C pointer */
Guido van Rossum78694d91998-09-18 14:14:13 +0000973
974PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000975PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000976{
Mark Dickinson91044792012-10-18 19:21:43 +0100977#if SIZEOF_VOID_P <= SIZEOF_LONG
Benjamin Petersonca470632016-09-06 13:47:26 -0700978 return PyLong_FromUnsignedLong((unsigned long)(uintptr_t)p);
Mark Dickinson91044792012-10-18 19:21:43 +0100979#else
980
Tim Peters70128a12001-06-16 08:48:40 +0000981#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700982# error "PyLong_FromVoidPtr: sizeof(long long) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000983#endif
Benjamin Petersonca470632016-09-06 13:47:26 -0700984 return PyLong_FromUnsignedLongLong((unsigned long long)(uintptr_t)p);
Mark Dickinson91044792012-10-18 19:21:43 +0100985#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Tim Peters70128a12001-06-16 08:48:40 +0000986
Guido van Rossum78694d91998-09-18 14:14:13 +0000987}
988
Serhiy Storchaka95949422013-08-27 19:40:23 +0300989/* Get a C pointer from an int object. */
Guido van Rossum78694d91998-09-18 14:14:13 +0000990
991void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000992PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000993{
Tim Peters70128a12001-06-16 08:48:40 +0000994#if SIZEOF_VOID_P <= SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 long x;
Guido van Rossum78694d91998-09-18 14:14:13 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
998 x = PyLong_AsLong(vv);
999 else
1000 x = PyLong_AsUnsignedLong(vv);
Guido van Rossum78694d91998-09-18 14:14:13 +00001001#else
Tim Peters70128a12001-06-16 08:48:40 +00001002
Tim Peters70128a12001-06-16 08:48:40 +00001003#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001004# error "PyLong_AsVoidPtr: sizeof(long long) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +00001005#endif
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001006 long long x;
Guido van Rossum78694d91998-09-18 14:14:13 +00001007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
1009 x = PyLong_AsLongLong(vv);
1010 else
1011 x = PyLong_AsUnsignedLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +00001012
1013#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +00001014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 if (x == -1 && PyErr_Occurred())
1016 return NULL;
1017 return (void *)x;
Guido van Rossum78694d91998-09-18 14:14:13 +00001018}
1019
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001020/* Initial long long support by Chris Herborth (chrish@qnx.com), later
Tim Petersd1a7da62001-06-13 00:35:57 +00001021 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001022 */
1023
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05001024#define PY_ABS_LLONG_MIN (0-(unsigned long long)LLONG_MIN)
Tim Petersd1a7da62001-06-13 00:35:57 +00001025
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001026/* Create a new int object from a C long long int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001027
1028PyObject *
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001029PyLong_FromLongLong(long long ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 PyLongObject *v;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001032 unsigned long long abs_ival;
1033 unsigned long long t; /* unsigned so >> doesn't propagate sign bit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 int ndigits = 0;
1035 int negative = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001036
animalize6b519982019-09-06 14:00:56 +08001037 if (IS_SMALL_INT(ival)) {
Greg Price5e63ab02019-08-24 10:19:37 -07001038 return get_small_int((sdigit)ival);
1039 }
1040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 if (ival < 0) {
1042 /* avoid signed overflow on negation; see comments
1043 in PyLong_FromLong above. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001044 abs_ival = (unsigned long long)(-1-ival) + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 negative = 1;
1046 }
1047 else {
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001048 abs_ival = (unsigned long long)ival;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 /* Count the number of Python digits.
1052 We used to pick 5 ("big enough for anything"), but that's a
1053 waste of time and space given that 5*15 = 75 bits are rarely
1054 needed. */
1055 t = abs_ival;
1056 while (t) {
1057 ++ndigits;
1058 t >>= PyLong_SHIFT;
1059 }
1060 v = _PyLong_New(ndigits);
1061 if (v != NULL) {
1062 digit *p = v->ob_digit;
Victor Stinner60ac6ed2020-02-07 23:18:08 +01001063 Py_SET_SIZE(v, negative ? -ndigits : ndigits);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 t = abs_ival;
1065 while (t) {
1066 *p++ = (digit)(t & PyLong_MASK);
1067 t >>= PyLong_SHIFT;
1068 }
1069 }
1070 return (PyObject *)v;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001071}
1072
Serhiy Storchaka95949422013-08-27 19:40:23 +03001073/* Create a new int object from a C Py_ssize_t. */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001074
1075PyObject *
Guido van Rossumddefaf32007-01-14 03:31:43 +00001076PyLong_FromSsize_t(Py_ssize_t ival)
Martin v. Löwis18e16552006-02-15 17:27:45 +00001077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 PyLongObject *v;
1079 size_t abs_ival;
1080 size_t t; /* unsigned so >> doesn't propagate sign bit */
1081 int ndigits = 0;
1082 int negative = 0;
Mark Dickinson7ab6be22008-04-15 21:42:42 +00001083
animalize6b519982019-09-06 14:00:56 +08001084 if (IS_SMALL_INT(ival)) {
Greg Price5e63ab02019-08-24 10:19:37 -07001085 return get_small_int((sdigit)ival);
1086 }
1087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 if (ival < 0) {
1089 /* avoid signed overflow when ival = SIZE_T_MIN */
1090 abs_ival = (size_t)(-1-ival)+1;
1091 negative = 1;
1092 }
1093 else {
1094 abs_ival = (size_t)ival;
1095 }
Mark Dickinson7ab6be22008-04-15 21:42:42 +00001096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 /* Count the number of Python digits. */
1098 t = abs_ival;
1099 while (t) {
1100 ++ndigits;
1101 t >>= PyLong_SHIFT;
1102 }
1103 v = _PyLong_New(ndigits);
1104 if (v != NULL) {
1105 digit *p = v->ob_digit;
Victor Stinner60ac6ed2020-02-07 23:18:08 +01001106 Py_SET_SIZE(v, negative ? -ndigits : ndigits);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 t = abs_ival;
1108 while (t) {
1109 *p++ = (digit)(t & PyLong_MASK);
1110 t >>= PyLong_SHIFT;
1111 }
1112 }
1113 return (PyObject *)v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001114}
1115
Serhiy Storchaka95949422013-08-27 19:40:23 +03001116/* Get a C long long int from an int object or any object that has an
Mark Dickinson20941de2020-05-27 13:43:17 +01001117 __index__ method. Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001118
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001119long long
Tim Peters9f688bf2000-07-07 15:53:28 +00001120PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 PyLongObject *v;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001123 long long bytes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 int res;
Mark Dickinson20941de2020-05-27 13:43:17 +01001125 int do_decref = 0; /* if PyNumber_Index was called */
Tim Petersd1a7da62001-06-13 00:35:57 +00001126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 if (vv == NULL) {
1128 PyErr_BadInternalCall();
1129 return -1;
1130 }
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001131
1132 if (PyLong_Check(vv)) {
1133 v = (PyLongObject *)vv;
1134 }
1135 else {
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001136 v = (PyLongObject *)_PyNumber_Index(vv);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001137 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 return -1;
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001139 do_decref = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001141
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001142 res = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 switch(Py_SIZE(v)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001144 case -1:
1145 bytes = -(sdigit)v->ob_digit[0];
1146 break;
1147 case 0:
1148 bytes = 0;
1149 break;
1150 case 1:
1151 bytes = v->ob_digit[0];
1152 break;
1153 default:
1154 res = _PyLong_AsByteArray((PyLongObject *)v, (unsigned char *)&bytes,
Serhiy Storchakac4f32122013-12-11 21:26:36 +02001155 SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 }
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001157 if (do_decref) {
1158 Py_DECREF(v);
1159 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001160
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001161 /* Plan 9 can't handle long long in ? : expressions */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 if (res < 0)
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001163 return (long long)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 else
1165 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001166}
1167
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001168/* Get a C unsigned long long int from an int object.
Tim Petersd1a7da62001-06-13 00:35:57 +00001169 Return -1 and set an error if overflow occurs. */
1170
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001171unsigned long long
Tim Peters9f688bf2000-07-07 15:53:28 +00001172PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 PyLongObject *v;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001175 unsigned long long bytes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 int res;
Tim Petersd1a7da62001-06-13 00:35:57 +00001177
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02001178 if (vv == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 PyErr_BadInternalCall();
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001180 return (unsigned long long)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 }
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02001182 if (!PyLong_Check(vv)) {
1183 PyErr_SetString(PyExc_TypeError, "an integer is required");
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001184 return (unsigned long long)-1;
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02001185 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 v = (PyLongObject*)vv;
1188 switch(Py_SIZE(v)) {
1189 case 0: return 0;
1190 case 1: return v->ob_digit[0];
1191 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00001192
Mark Dickinson22b20182010-05-10 21:27:53 +00001193 res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes,
Christian Heimes743e0cd2012-10-17 23:52:17 +02001194 SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001195
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001196 /* Plan 9 can't handle long long in ? : expressions */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 if (res < 0)
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001198 return (unsigned long long)res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 else
1200 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001201}
Tim Petersd1a7da62001-06-13 00:35:57 +00001202
Serhiy Storchaka95949422013-08-27 19:40:23 +03001203/* Get a C unsigned long int from an int object, ignoring the high bits.
Thomas Hellera4ea6032003-04-17 18:55:45 +00001204 Returns -1 and sets an error condition if an error occurs. */
1205
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001206static unsigned long long
Guido van Rossumddefaf32007-01-14 03:31:43 +00001207_PyLong_AsUnsignedLongLongMask(PyObject *vv)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001208{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001209 PyLongObject *v;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001210 unsigned long long x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 Py_ssize_t i;
1212 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 if (vv == NULL || !PyLong_Check(vv)) {
1215 PyErr_BadInternalCall();
Zackery Spytzdc247652019-06-06 14:39:23 -06001216 return (unsigned long long) -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 }
1218 v = (PyLongObject *)vv;
1219 switch(Py_SIZE(v)) {
1220 case 0: return 0;
1221 case 1: return v->ob_digit[0];
1222 }
1223 i = Py_SIZE(v);
1224 sign = 1;
1225 x = 0;
1226 if (i < 0) {
1227 sign = -1;
1228 i = -i;
1229 }
1230 while (--i >= 0) {
1231 x = (x << PyLong_SHIFT) | v->ob_digit[i];
1232 }
1233 return x * sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001234}
Guido van Rossumddefaf32007-01-14 03:31:43 +00001235
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001236unsigned long long
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001237PyLong_AsUnsignedLongLongMask(PyObject *op)
Guido van Rossumddefaf32007-01-14 03:31:43 +00001238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 PyLongObject *lo;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001240 unsigned long long val;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001241
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001242 if (op == NULL) {
1243 PyErr_BadInternalCall();
Zackery Spytzdc247652019-06-06 14:39:23 -06001244 return (unsigned long long)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00001246
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001247 if (PyLong_Check(op)) {
1248 return _PyLong_AsUnsignedLongLongMask(op);
1249 }
1250
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001251 lo = (PyLongObject *)_PyNumber_Index(op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 if (lo == NULL)
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001253 return (unsigned long long)-1;
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001254
1255 val = _PyLong_AsUnsignedLongLongMask((PyObject *)lo);
1256 Py_DECREF(lo);
1257 return val;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001258}
Tim Petersd1a7da62001-06-13 00:35:57 +00001259
Serhiy Storchaka95949422013-08-27 19:40:23 +03001260/* Get a C long long int from an int object or any object that has an
Mark Dickinson20941de2020-05-27 13:43:17 +01001261 __index__ method.
Mark Dickinson93f562c2010-01-30 10:30:15 +00001262
Mark Dickinson8d48b432011-10-23 20:47:14 +01001263 On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
1264 the result. Otherwise *overflow is 0.
1265
1266 For other errors (e.g., TypeError), return -1 and set an error condition.
1267 In this case *overflow will be 0.
Mark Dickinson93f562c2010-01-30 10:30:15 +00001268*/
1269
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001270long long
Mark Dickinson93f562c2010-01-30 10:30:15 +00001271PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
1272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 /* This version by Tim Peters */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001274 PyLongObject *v;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001275 unsigned long long x, prev;
1276 long long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 Py_ssize_t i;
1278 int sign;
Mark Dickinson20941de2020-05-27 13:43:17 +01001279 int do_decref = 0; /* if PyNumber_Index was called */
Mark Dickinson93f562c2010-01-30 10:30:15 +00001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 *overflow = 0;
1282 if (vv == NULL) {
1283 PyErr_BadInternalCall();
1284 return -1;
1285 }
Mark Dickinson93f562c2010-01-30 10:30:15 +00001286
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001287 if (PyLong_Check(vv)) {
1288 v = (PyLongObject *)vv;
1289 }
1290 else {
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001291 v = (PyLongObject *)_PyNumber_Index(vv);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001292 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 return -1;
1294 do_decref = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 }
Mark Dickinson93f562c2010-01-30 10:30:15 +00001296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 res = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 i = Py_SIZE(v);
Mark Dickinson93f562c2010-01-30 10:30:15 +00001299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 switch (i) {
1301 case -1:
1302 res = -(sdigit)v->ob_digit[0];
1303 break;
1304 case 0:
1305 res = 0;
1306 break;
1307 case 1:
1308 res = v->ob_digit[0];
1309 break;
1310 default:
1311 sign = 1;
1312 x = 0;
1313 if (i < 0) {
1314 sign = -1;
1315 i = -(i);
1316 }
1317 while (--i >= 0) {
1318 prev = x;
1319 x = (x << PyLong_SHIFT) + v->ob_digit[i];
1320 if ((x >> PyLong_SHIFT) != prev) {
1321 *overflow = sign;
1322 goto exit;
1323 }
1324 }
1325 /* Haven't lost any bits, but casting to long requires extra
1326 * care (see comment above).
1327 */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05001328 if (x <= (unsigned long long)LLONG_MAX) {
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001329 res = (long long)x * sign;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 }
1331 else if (sign < 0 && x == PY_ABS_LLONG_MIN) {
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05001332 res = LLONG_MIN;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 }
1334 else {
1335 *overflow = sign;
1336 /* res is already set to -1 */
1337 }
1338 }
Mark Dickinson22b20182010-05-10 21:27:53 +00001339 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 if (do_decref) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001341 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 }
1343 return res;
Mark Dickinson93f562c2010-01-30 10:30:15 +00001344}
1345
Serhiy Storchaka7cb7bcf2018-07-26 13:22:16 +03001346int
1347_PyLong_UnsignedShort_Converter(PyObject *obj, void *ptr)
1348{
1349 unsigned long uval;
1350
1351 if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
1352 PyErr_SetString(PyExc_ValueError, "value must be positive");
1353 return 0;
1354 }
1355 uval = PyLong_AsUnsignedLong(obj);
1356 if (uval == (unsigned long)-1 && PyErr_Occurred())
1357 return 0;
1358 if (uval > USHRT_MAX) {
1359 PyErr_SetString(PyExc_OverflowError,
1360 "Python int too large for C unsigned short");
1361 return 0;
1362 }
1363
1364 *(unsigned short *)ptr = Py_SAFE_DOWNCAST(uval, unsigned long, unsigned short);
1365 return 1;
1366}
1367
1368int
1369_PyLong_UnsignedInt_Converter(PyObject *obj, void *ptr)
1370{
1371 unsigned long uval;
1372
1373 if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
1374 PyErr_SetString(PyExc_ValueError, "value must be positive");
1375 return 0;
1376 }
1377 uval = PyLong_AsUnsignedLong(obj);
1378 if (uval == (unsigned long)-1 && PyErr_Occurred())
1379 return 0;
1380 if (uval > UINT_MAX) {
1381 PyErr_SetString(PyExc_OverflowError,
1382 "Python int too large for C unsigned int");
1383 return 0;
1384 }
1385
1386 *(unsigned int *)ptr = Py_SAFE_DOWNCAST(uval, unsigned long, unsigned int);
1387 return 1;
1388}
1389
1390int
1391_PyLong_UnsignedLong_Converter(PyObject *obj, void *ptr)
1392{
1393 unsigned long uval;
1394
1395 if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
1396 PyErr_SetString(PyExc_ValueError, "value must be positive");
1397 return 0;
1398 }
1399 uval = PyLong_AsUnsignedLong(obj);
1400 if (uval == (unsigned long)-1 && PyErr_Occurred())
1401 return 0;
1402
1403 *(unsigned long *)ptr = uval;
1404 return 1;
1405}
1406
1407int
1408_PyLong_UnsignedLongLong_Converter(PyObject *obj, void *ptr)
1409{
1410 unsigned long long uval;
1411
1412 if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
1413 PyErr_SetString(PyExc_ValueError, "value must be positive");
1414 return 0;
1415 }
1416 uval = PyLong_AsUnsignedLongLong(obj);
1417 if (uval == (unsigned long long)-1 && PyErr_Occurred())
1418 return 0;
1419
1420 *(unsigned long long *)ptr = uval;
1421 return 1;
1422}
1423
1424int
1425_PyLong_Size_t_Converter(PyObject *obj, void *ptr)
1426{
1427 size_t uval;
1428
1429 if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
1430 PyErr_SetString(PyExc_ValueError, "value must be positive");
1431 return 0;
1432 }
1433 uval = PyLong_AsSize_t(obj);
1434 if (uval == (size_t)-1 && PyErr_Occurred())
1435 return 0;
1436
1437 *(size_t *)ptr = uval;
1438 return 1;
1439}
1440
1441
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00001442#define CHECK_BINOP(v,w) \
1443 do { \
Brian Curtindfc80e32011-08-10 20:28:54 -05001444 if (!PyLong_Check(v) || !PyLong_Check(w)) \
1445 Py_RETURN_NOTIMPLEMENTED; \
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00001446 } while(0)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001447
Tim Peters877a2122002-08-12 05:09:36 +00001448/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
1449 * is modified in place, by adding y to it. Carries are propagated as far as
1450 * x[m-1], and the remaining carry (0 or 1) is returned.
1451 */
1452static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001453v_iadd(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
Tim Peters877a2122002-08-12 05:09:36 +00001454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 Py_ssize_t i;
1456 digit carry = 0;
Tim Peters877a2122002-08-12 05:09:36 +00001457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 assert(m >= n);
1459 for (i = 0; i < n; ++i) {
1460 carry += x[i] + y[i];
1461 x[i] = carry & PyLong_MASK;
1462 carry >>= PyLong_SHIFT;
1463 assert((carry & 1) == carry);
1464 }
1465 for (; carry && i < m; ++i) {
1466 carry += x[i];
1467 x[i] = carry & PyLong_MASK;
1468 carry >>= PyLong_SHIFT;
1469 assert((carry & 1) == carry);
1470 }
1471 return carry;
Tim Peters877a2122002-08-12 05:09:36 +00001472}
1473
1474/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
1475 * is modified in place, by subtracting y from it. Borrows are propagated as
1476 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
1477 */
1478static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001479v_isub(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
Tim Peters877a2122002-08-12 05:09:36 +00001480{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 Py_ssize_t i;
1482 digit borrow = 0;
Tim Peters877a2122002-08-12 05:09:36 +00001483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 assert(m >= n);
1485 for (i = 0; i < n; ++i) {
1486 borrow = x[i] - y[i] - borrow;
1487 x[i] = borrow & PyLong_MASK;
1488 borrow >>= PyLong_SHIFT;
1489 borrow &= 1; /* keep only 1 sign bit */
1490 }
1491 for (; borrow && i < m; ++i) {
1492 borrow = x[i] - borrow;
1493 x[i] = borrow & PyLong_MASK;
1494 borrow >>= PyLong_SHIFT;
1495 borrow &= 1;
1496 }
1497 return borrow;
Tim Peters877a2122002-08-12 05:09:36 +00001498}
Neil Schemenauerba872e22001-01-04 01:46:03 +00001499
Mark Dickinson17e4fdd2009-03-23 18:44:57 +00001500/* Shift digit vector a[0:m] d bits left, with 0 <= d < PyLong_SHIFT. Put
1501 * result in z[0:m], and return the d bits shifted out of the top.
1502 */
1503static digit
1504v_lshift(digit *z, digit *a, Py_ssize_t m, int d)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001505{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 Py_ssize_t i;
1507 digit carry = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 assert(0 <= d && d < PyLong_SHIFT);
1510 for (i=0; i < m; i++) {
1511 twodigits acc = (twodigits)a[i] << d | carry;
1512 z[i] = (digit)acc & PyLong_MASK;
1513 carry = (digit)(acc >> PyLong_SHIFT);
1514 }
1515 return carry;
Mark Dickinson17e4fdd2009-03-23 18:44:57 +00001516}
1517
1518/* Shift digit vector a[0:m] d bits right, with 0 <= d < PyLong_SHIFT. Put
1519 * result in z[0:m], and return the d bits shifted out of the bottom.
1520 */
1521static digit
1522v_rshift(digit *z, digit *a, Py_ssize_t m, int d)
1523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 Py_ssize_t i;
1525 digit carry = 0;
1526 digit mask = ((digit)1 << d) - 1U;
Mark Dickinson17e4fdd2009-03-23 18:44:57 +00001527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 assert(0 <= d && d < PyLong_SHIFT);
1529 for (i=m; i-- > 0;) {
1530 twodigits acc = (twodigits)carry << PyLong_SHIFT | a[i];
1531 carry = (digit)acc & mask;
1532 z[i] = (digit)(acc >> d);
1533 }
1534 return carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001535}
1536
Tim Peters212e6142001-07-14 12:23:19 +00001537/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
1538 in pout, and returning the remainder. pin and pout point at the LSD.
1539 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
Serhiy Storchaka95949422013-08-27 19:40:23 +03001540 _PyLong_Format, but that should be done with great care since ints are
Tim Peters212e6142001-07-14 12:23:19 +00001541 immutable. */
1542
1543static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001544inplace_divrem1(digit *pout, digit *pin, Py_ssize_t size, digit n)
Tim Peters212e6142001-07-14 12:23:19 +00001545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 twodigits rem = 0;
Tim Peters212e6142001-07-14 12:23:19 +00001547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 assert(n > 0 && n <= PyLong_MASK);
1549 pin += size;
1550 pout += size;
1551 while (--size >= 0) {
1552 digit hi;
1553 rem = (rem << PyLong_SHIFT) | *--pin;
1554 *--pout = hi = (digit)(rem / n);
1555 rem -= (twodigits)hi * n;
1556 }
1557 return (digit)rem;
Tim Peters212e6142001-07-14 12:23:19 +00001558}
1559
Serhiy Storchaka95949422013-08-27 19:40:23 +03001560/* Divide an integer by a digit, returning both the quotient
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001561 (as function result) and the remainder (through *prem).
1562 The sign of a is ignored; n should not be zero. */
1563
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001564static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +00001565divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001566{
Victor Stinner45e8e2f2014-05-14 17:24:35 +02001567 const Py_ssize_t size = Py_ABS(Py_SIZE(a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 assert(n > 0 && n <= PyLong_MASK);
1571 z = _PyLong_New(size);
1572 if (z == NULL)
1573 return NULL;
1574 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
1575 return long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001576}
1577
Serhiy Storchaka95949422013-08-27 19:40:23 +03001578/* Convert an integer to a base 10 string. Returns a new non-shared
Mark Dickinson0a1efd02009-09-16 21:23:34 +00001579 string. (Return value is non-shared so that callers can modify the
1580 returned value if necessary.) */
1581
Victor Stinnerd3f08822012-05-29 12:57:52 +02001582static int
1583long_to_decimal_string_internal(PyObject *aa,
1584 PyObject **p_output,
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001585 _PyUnicodeWriter *writer,
1586 _PyBytesWriter *bytes_writer,
1587 char **bytes_str)
Mark Dickinson0a1efd02009-09-16 21:23:34 +00001588{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 PyLongObject *scratch, *a;
Victor Stinner1285e5c2015-10-14 12:10:20 +02001590 PyObject *str = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 Py_ssize_t size, strlen, size_a, i, j;
1592 digit *pout, *pin, rem, tenpow;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 int negative;
Mark Dickinson4e1de162016-08-29 17:26:43 +01001594 int d;
Victor Stinnerd3f08822012-05-29 12:57:52 +02001595 enum PyUnicode_Kind kind;
Mark Dickinson0a1efd02009-09-16 21:23:34 +00001596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 a = (PyLongObject *)aa;
1598 if (a == NULL || !PyLong_Check(a)) {
1599 PyErr_BadInternalCall();
Victor Stinnerd3f08822012-05-29 12:57:52 +02001600 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 }
Victor Stinner45e8e2f2014-05-14 17:24:35 +02001602 size_a = Py_ABS(Py_SIZE(a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 negative = Py_SIZE(a) < 0;
Mark Dickinson0a1efd02009-09-16 21:23:34 +00001604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 /* quick and dirty upper bound for the number of digits
1606 required to express a in base _PyLong_DECIMAL_BASE:
Mark Dickinson0a1efd02009-09-16 21:23:34 +00001607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 #digits = 1 + floor(log2(a) / log2(_PyLong_DECIMAL_BASE))
Mark Dickinson0a1efd02009-09-16 21:23:34 +00001609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 But log2(a) < size_a * PyLong_SHIFT, and
1611 log2(_PyLong_DECIMAL_BASE) = log2(10) * _PyLong_DECIMAL_SHIFT
Mark Dickinson4e1de162016-08-29 17:26:43 +01001612 > 3.3 * _PyLong_DECIMAL_SHIFT
1613
1614 size_a * PyLong_SHIFT / (3.3 * _PyLong_DECIMAL_SHIFT) =
1615 size_a + size_a / d < size_a + size_a / floor(d),
1616 where d = (3.3 * _PyLong_DECIMAL_SHIFT) /
1617 (PyLong_SHIFT - 3.3 * _PyLong_DECIMAL_SHIFT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 */
Mark Dickinson4e1de162016-08-29 17:26:43 +01001619 d = (33 * _PyLong_DECIMAL_SHIFT) /
1620 (10 * PyLong_SHIFT - 33 * _PyLong_DECIMAL_SHIFT);
1621 assert(size_a < PY_SSIZE_T_MAX/2);
1622 size = 1 + size_a + size_a / d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 scratch = _PyLong_New(size);
1624 if (scratch == NULL)
Victor Stinnerd3f08822012-05-29 12:57:52 +02001625 return -1;
Mark Dickinson0a1efd02009-09-16 21:23:34 +00001626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 /* convert array of base _PyLong_BASE digits in pin to an array of
1628 base _PyLong_DECIMAL_BASE digits in pout, following Knuth (TAOCP,
1629 Volume 2 (3rd edn), section 4.4, Method 1b). */
1630 pin = a->ob_digit;
1631 pout = scratch->ob_digit;
1632 size = 0;
1633 for (i = size_a; --i >= 0; ) {
1634 digit hi = pin[i];
1635 for (j = 0; j < size; j++) {
1636 twodigits z = (twodigits)pout[j] << PyLong_SHIFT | hi;
1637 hi = (digit)(z / _PyLong_DECIMAL_BASE);
1638 pout[j] = (digit)(z - (twodigits)hi *
1639 _PyLong_DECIMAL_BASE);
1640 }
1641 while (hi) {
1642 pout[size++] = hi % _PyLong_DECIMAL_BASE;
1643 hi /= _PyLong_DECIMAL_BASE;
1644 }
1645 /* check for keyboard interrupt */
1646 SIGCHECK({
Mark Dickinson22b20182010-05-10 21:27:53 +00001647 Py_DECREF(scratch);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001648 return -1;
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00001649 });
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 }
1651 /* pout should have at least one digit, so that the case when a = 0
1652 works correctly */
1653 if (size == 0)
1654 pout[size++] = 0;
Mark Dickinson0a1efd02009-09-16 21:23:34 +00001655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 /* calculate exact length of output string, and allocate */
1657 strlen = negative + 1 + (size - 1) * _PyLong_DECIMAL_SHIFT;
1658 tenpow = 10;
1659 rem = pout[size-1];
1660 while (rem >= tenpow) {
1661 tenpow *= 10;
1662 strlen++;
1663 }
Victor Stinnerd3f08822012-05-29 12:57:52 +02001664 if (writer) {
Christian Heimes110ac162012-09-10 02:51:27 +02001665 if (_PyUnicodeWriter_Prepare(writer, strlen, '9') == -1) {
1666 Py_DECREF(scratch);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001667 return -1;
Christian Heimes110ac162012-09-10 02:51:27 +02001668 }
Victor Stinnerd3f08822012-05-29 12:57:52 +02001669 kind = writer->kind;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 }
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001671 else if (bytes_writer) {
1672 *bytes_str = _PyBytesWriter_Prepare(bytes_writer, *bytes_str, strlen);
1673 if (*bytes_str == NULL) {
1674 Py_DECREF(scratch);
1675 return -1;
1676 }
1677 }
Victor Stinnerd3f08822012-05-29 12:57:52 +02001678 else {
1679 str = PyUnicode_New(strlen, '9');
1680 if (str == NULL) {
1681 Py_DECREF(scratch);
1682 return -1;
1683 }
1684 kind = PyUnicode_KIND(str);
1685 }
1686
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001687#define WRITE_DIGITS(p) \
Victor Stinnerd3f08822012-05-29 12:57:52 +02001688 do { \
Victor Stinnerd3f08822012-05-29 12:57:52 +02001689 /* pout[0] through pout[size-2] contribute exactly \
1690 _PyLong_DECIMAL_SHIFT digits each */ \
1691 for (i=0; i < size - 1; i++) { \
1692 rem = pout[i]; \
1693 for (j = 0; j < _PyLong_DECIMAL_SHIFT; j++) { \
1694 *--p = '0' + rem % 10; \
1695 rem /= 10; \
1696 } \
1697 } \
1698 /* pout[size-1]: always produce at least one decimal digit */ \
1699 rem = pout[i]; \
1700 do { \
1701 *--p = '0' + rem % 10; \
1702 rem /= 10; \
1703 } while (rem != 0); \
1704 \
1705 /* and sign */ \
1706 if (negative) \
1707 *--p = '-'; \
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001708 } while (0)
1709
1710#define WRITE_UNICODE_DIGITS(TYPE) \
1711 do { \
1712 if (writer) \
1713 p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + strlen; \
1714 else \
1715 p = (TYPE*)PyUnicode_DATA(str) + strlen; \
1716 \
1717 WRITE_DIGITS(p); \
Victor Stinnerd3f08822012-05-29 12:57:52 +02001718 \
1719 /* check we've counted correctly */ \
1720 if (writer) \
1721 assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \
1722 else \
1723 assert(p == (TYPE*)PyUnicode_DATA(str)); \
1724 } while (0)
Mark Dickinson0a1efd02009-09-16 21:23:34 +00001725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 /* fill the string right-to-left */
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001727 if (bytes_writer) {
1728 char *p = *bytes_str + strlen;
1729 WRITE_DIGITS(p);
1730 assert(p == *bytes_str);
1731 }
1732 else if (kind == PyUnicode_1BYTE_KIND) {
Victor Stinnerd3f08822012-05-29 12:57:52 +02001733 Py_UCS1 *p;
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001734 WRITE_UNICODE_DIGITS(Py_UCS1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 }
Victor Stinnerd3f08822012-05-29 12:57:52 +02001736 else if (kind == PyUnicode_2BYTE_KIND) {
1737 Py_UCS2 *p;
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001738 WRITE_UNICODE_DIGITS(Py_UCS2);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001739 }
1740 else {
Victor Stinnerd3f08822012-05-29 12:57:52 +02001741 Py_UCS4 *p;
Victor Stinnere577ab32012-05-29 18:51:10 +02001742 assert (kind == PyUnicode_4BYTE_KIND);
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001743 WRITE_UNICODE_DIGITS(Py_UCS4);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001744 }
1745#undef WRITE_DIGITS
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001746#undef WRITE_UNICODE_DIGITS
Mark Dickinson0a1efd02009-09-16 21:23:34 +00001747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 Py_DECREF(scratch);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001749 if (writer) {
1750 writer->pos += strlen;
1751 }
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001752 else if (bytes_writer) {
1753 (*bytes_str) += strlen;
1754 }
Victor Stinnerd3f08822012-05-29 12:57:52 +02001755 else {
1756 assert(_PyUnicode_CheckConsistency(str, 1));
1757 *p_output = (PyObject *)str;
1758 }
1759 return 0;
1760}
1761
1762static PyObject *
1763long_to_decimal_string(PyObject *aa)
1764{
1765 PyObject *v;
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001766 if (long_to_decimal_string_internal(aa, &v, NULL, NULL, NULL) == -1)
Victor Stinnerd3f08822012-05-29 12:57:52 +02001767 return NULL;
1768 return v;
Mark Dickinson0a1efd02009-09-16 21:23:34 +00001769}
1770
Serhiy Storchaka95949422013-08-27 19:40:23 +03001771/* Convert an int object to a string, using a given conversion base,
Victor Stinnerd3f08822012-05-29 12:57:52 +02001772 which should be one of 2, 8 or 16. Return a string object.
1773 If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'
1774 if alternate is nonzero. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001775
Victor Stinnerd3f08822012-05-29 12:57:52 +02001776static int
1777long_format_binary(PyObject *aa, int base, int alternate,
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001778 PyObject **p_output, _PyUnicodeWriter *writer,
1779 _PyBytesWriter *bytes_writer, char **bytes_str)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001780{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001781 PyLongObject *a = (PyLongObject *)aa;
Victor Stinner1285e5c2015-10-14 12:10:20 +02001782 PyObject *v = NULL;
Mark Dickinsone2846542012-04-20 21:21:24 +01001783 Py_ssize_t sz;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 Py_ssize_t size_a;
Victor Stinnerd3f08822012-05-29 12:57:52 +02001785 enum PyUnicode_Kind kind;
Mark Dickinsone2846542012-04-20 21:21:24 +01001786 int negative;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 int bits;
Guido van Rossume32e0141992-01-19 16:31:05 +00001788
Victor Stinnerd3f08822012-05-29 12:57:52 +02001789 assert(base == 2 || base == 8 || base == 16);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 if (a == NULL || !PyLong_Check(a)) {
1791 PyErr_BadInternalCall();
Victor Stinnerd3f08822012-05-29 12:57:52 +02001792 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 }
Victor Stinner45e8e2f2014-05-14 17:24:35 +02001794 size_a = Py_ABS(Py_SIZE(a));
Mark Dickinsone2846542012-04-20 21:21:24 +01001795 negative = Py_SIZE(a) < 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 /* Compute a rough upper bound for the length of the string */
1798 switch (base) {
1799 case 16:
1800 bits = 4;
1801 break;
1802 case 8:
1803 bits = 3;
1804 break;
1805 case 2:
1806 bits = 1;
1807 break;
1808 default:
Barry Warsawb2e57942017-09-14 18:13:16 -07001809 Py_UNREACHABLE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001811
Mark Dickinsone2846542012-04-20 21:21:24 +01001812 /* Compute exact length 'sz' of output string. */
1813 if (size_a == 0) {
Victor Stinnerd3f08822012-05-29 12:57:52 +02001814 sz = 1;
Mark Dickinsone2846542012-04-20 21:21:24 +01001815 }
1816 else {
1817 Py_ssize_t size_a_in_bits;
1818 /* Ensure overflow doesn't occur during computation of sz. */
1819 if (size_a > (PY_SSIZE_T_MAX - 3) / PyLong_SHIFT) {
1820 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson02515f72013-08-03 12:08:22 +01001821 "int too large to format");
Victor Stinnerd3f08822012-05-29 12:57:52 +02001822 return -1;
Mark Dickinsone2846542012-04-20 21:21:24 +01001823 }
1824 size_a_in_bits = (size_a - 1) * PyLong_SHIFT +
Niklas Fiekasc5b79002020-01-16 15:09:19 +01001825 _Py_bit_length(a->ob_digit[size_a - 1]);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001826 /* Allow 1 character for a '-' sign. */
1827 sz = negative + (size_a_in_bits + (bits - 1)) / bits;
1828 }
1829 if (alternate) {
1830 /* 2 characters for prefix */
1831 sz += 2;
Mark Dickinsone2846542012-04-20 21:21:24 +01001832 }
1833
Victor Stinnerd3f08822012-05-29 12:57:52 +02001834 if (writer) {
1835 if (_PyUnicodeWriter_Prepare(writer, sz, 'x') == -1)
1836 return -1;
1837 kind = writer->kind;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 }
Victor Stinner199c9a62015-10-14 09:47:23 +02001839 else if (bytes_writer) {
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001840 *bytes_str = _PyBytesWriter_Prepare(bytes_writer, *bytes_str, sz);
1841 if (*bytes_str == NULL)
1842 return -1;
1843 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 else {
Victor Stinnerd3f08822012-05-29 12:57:52 +02001845 v = PyUnicode_New(sz, 'x');
1846 if (v == NULL)
1847 return -1;
1848 kind = PyUnicode_KIND(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 }
Mark Dickinson8accd6b2009-09-17 19:39:12 +00001850
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001851#define WRITE_DIGITS(p) \
Victor Stinnerd3f08822012-05-29 12:57:52 +02001852 do { \
Victor Stinnerd3f08822012-05-29 12:57:52 +02001853 if (size_a == 0) { \
1854 *--p = '0'; \
1855 } \
1856 else { \
1857 /* JRH: special case for power-of-2 bases */ \
1858 twodigits accum = 0; \
1859 int accumbits = 0; /* # of bits in accum */ \
1860 Py_ssize_t i; \
1861 for (i = 0; i < size_a; ++i) { \
1862 accum |= (twodigits)a->ob_digit[i] << accumbits; \
1863 accumbits += PyLong_SHIFT; \
1864 assert(accumbits >= bits); \
1865 do { \
1866 char cdigit; \
1867 cdigit = (char)(accum & (base - 1)); \
1868 cdigit += (cdigit < 10) ? '0' : 'a'-10; \
1869 *--p = cdigit; \
1870 accumbits -= bits; \
1871 accum >>= bits; \
1872 } while (i < size_a-1 ? accumbits >= bits : accum > 0); \
1873 } \
1874 } \
1875 \
1876 if (alternate) { \
1877 if (base == 16) \
1878 *--p = 'x'; \
1879 else if (base == 8) \
1880 *--p = 'o'; \
1881 else /* (base == 2) */ \
1882 *--p = 'b'; \
1883 *--p = '0'; \
1884 } \
1885 if (negative) \
1886 *--p = '-'; \
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001887 } while (0)
1888
1889#define WRITE_UNICODE_DIGITS(TYPE) \
1890 do { \
1891 if (writer) \
1892 p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + sz; \
1893 else \
1894 p = (TYPE*)PyUnicode_DATA(v) + sz; \
1895 \
1896 WRITE_DIGITS(p); \
1897 \
Victor Stinnerd3f08822012-05-29 12:57:52 +02001898 if (writer) \
1899 assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \
1900 else \
1901 assert(p == (TYPE*)PyUnicode_DATA(v)); \
1902 } while (0)
1903
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001904 if (bytes_writer) {
1905 char *p = *bytes_str + sz;
1906 WRITE_DIGITS(p);
1907 assert(p == *bytes_str);
1908 }
1909 else if (kind == PyUnicode_1BYTE_KIND) {
Victor Stinnerd3f08822012-05-29 12:57:52 +02001910 Py_UCS1 *p;
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001911 WRITE_UNICODE_DIGITS(Py_UCS1);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001912 }
1913 else if (kind == PyUnicode_2BYTE_KIND) {
1914 Py_UCS2 *p;
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001915 WRITE_UNICODE_DIGITS(Py_UCS2);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001916 }
1917 else {
Victor Stinnerd3f08822012-05-29 12:57:52 +02001918 Py_UCS4 *p;
Victor Stinnere577ab32012-05-29 18:51:10 +02001919 assert (kind == PyUnicode_4BYTE_KIND);
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001920 WRITE_UNICODE_DIGITS(Py_UCS4);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001921 }
1922#undef WRITE_DIGITS
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001923#undef WRITE_UNICODE_DIGITS
Victor Stinnerd3f08822012-05-29 12:57:52 +02001924
1925 if (writer) {
1926 writer->pos += sz;
1927 }
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001928 else if (bytes_writer) {
1929 (*bytes_str) += sz;
1930 }
Victor Stinnerd3f08822012-05-29 12:57:52 +02001931 else {
1932 assert(_PyUnicode_CheckConsistency(v, 1));
1933 *p_output = v;
1934 }
1935 return 0;
1936}
1937
1938PyObject *
1939_PyLong_Format(PyObject *obj, int base)
1940{
1941 PyObject *str;
1942 int err;
1943 if (base == 10)
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001944 err = long_to_decimal_string_internal(obj, &str, NULL, NULL, NULL);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001945 else
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001946 err = long_format_binary(obj, base, 1, &str, NULL, NULL, NULL);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001947 if (err == -1)
1948 return NULL;
1949 return str;
1950}
1951
1952int
1953_PyLong_FormatWriter(_PyUnicodeWriter *writer,
1954 PyObject *obj,
1955 int base, int alternate)
1956{
1957 if (base == 10)
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001958 return long_to_decimal_string_internal(obj, NULL, writer,
1959 NULL, NULL);
Victor Stinnerd3f08822012-05-29 12:57:52 +02001960 else
Victor Stinnerbe75b8c2015-10-09 22:43:24 +02001961 return long_format_binary(obj, base, alternate, NULL, writer,
1962 NULL, NULL);
1963}
1964
1965char*
1966_PyLong_FormatBytesWriter(_PyBytesWriter *writer, char *str,
1967 PyObject *obj,
1968 int base, int alternate)
1969{
1970 char *str2;
1971 int res;
1972 str2 = str;
1973 if (base == 10)
1974 res = long_to_decimal_string_internal(obj, NULL, NULL,
1975 writer, &str2);
1976 else
1977 res = long_format_binary(obj, base, alternate, NULL, NULL,
1978 writer, &str2);
1979 if (res < 0)
1980 return NULL;
1981 assert(str2 != NULL);
1982 return str2;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001983}
1984
Thomas Wouters477c8d52006-05-27 19:21:47 +00001985/* Table of digit values for 8-bit string -> integer conversion.
1986 * '0' maps to 0, ..., '9' maps to 9.
1987 * 'a' and 'A' map to 10, ..., 'z' and 'Z' map to 35.
1988 * All other indices map to 37.
1989 * Note that when converting a base B string, a char c is a legitimate
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001990 * base B digit iff _PyLong_DigitValue[Py_CHARPyLong_MASK(c)] < B.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001991 */
Raymond Hettinger35631532009-01-09 03:58:09 +00001992unsigned char _PyLong_DigitValue[256] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1994 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1995 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1996 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 37, 37, 37, 37, 37, 37,
1997 37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1998 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
1999 37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2000 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
2001 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2002 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2003 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2004 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2005 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2006 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2007 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
2008 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002009};
2010
2011/* *str points to the first digit in a string of base `base` digits. base
Tim Petersbf2674b2003-02-02 07:51:32 +00002012 * is a power of 2 (2, 4, 8, 16, or 32). *str is set to point to the first
Serhiy Storchaka95949422013-08-27 19:40:23 +03002013 * non-digit (which may be *str!). A normalized int is returned.
Tim Petersbf2674b2003-02-02 07:51:32 +00002014 * The point to this routine is that it takes time linear in the number of
2015 * string characters.
Brett Cannona721aba2016-09-09 14:57:09 -07002016 *
2017 * Return values:
2018 * -1 on syntax error (exception needs to be set, *res is untouched)
2019 * 0 else (exception may be set, in that case *res is set to NULL)
Tim Petersbf2674b2003-02-02 07:51:32 +00002020 */
Brett Cannona721aba2016-09-09 14:57:09 -07002021static int
2022long_from_binary_base(const char **str, int base, PyLongObject **res)
Tim Petersbf2674b2003-02-02 07:51:32 +00002023{
Serhiy Storchakac6792272013-10-19 21:03:34 +03002024 const char *p = *str;
2025 const char *start = p;
Brett Cannona721aba2016-09-09 14:57:09 -07002026 char prev = 0;
Serhiy Storchaka29ba6882017-12-03 22:16:21 +02002027 Py_ssize_t digits = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 int bits_per_char;
2029 Py_ssize_t n;
2030 PyLongObject *z;
2031 twodigits accum;
2032 int bits_in_accum;
2033 digit *pdigit;
Tim Petersbf2674b2003-02-02 07:51:32 +00002034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
2036 n = base;
Brett Cannona721aba2016-09-09 14:57:09 -07002037 for (bits_per_char = -1; n; ++bits_per_char) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 n >>= 1;
Brett Cannona721aba2016-09-09 14:57:09 -07002039 }
2040 /* count digits and set p to end-of-string */
2041 while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base || *p == '_') {
2042 if (*p == '_') {
2043 if (prev == '_') {
2044 *str = p - 1;
2045 return -1;
2046 }
2047 } else {
2048 ++digits;
2049 }
2050 prev = *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 ++p;
Brett Cannona721aba2016-09-09 14:57:09 -07002052 }
2053 if (prev == '_') {
2054 /* Trailing underscore not allowed. */
2055 *str = p - 1;
2056 return -1;
2057 }
2058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 *str = p;
Serhiy Storchaka85c0b892017-10-03 14:13:44 +03002060 /* n <- the number of Python digits needed,
2061 = ceiling((digits * bits_per_char) / PyLong_SHIFT). */
2062 if (digits > (PY_SSIZE_T_MAX - (PyLong_SHIFT - 1)) / bits_per_char) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 PyErr_SetString(PyExc_ValueError,
2064 "int string too large to convert");
Brett Cannona721aba2016-09-09 14:57:09 -07002065 *res = NULL;
2066 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 }
Serhiy Storchaka85c0b892017-10-03 14:13:44 +03002068 n = (digits * bits_per_char + PyLong_SHIFT - 1) / PyLong_SHIFT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 z = _PyLong_New(n);
Brett Cannona721aba2016-09-09 14:57:09 -07002070 if (z == NULL) {
2071 *res = NULL;
2072 return 0;
2073 }
Serhiy Storchaka95949422013-08-27 19:40:23 +03002074 /* Read string from right, and fill in int from left; i.e.,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 * from least to most significant in both.
2076 */
2077 accum = 0;
2078 bits_in_accum = 0;
2079 pdigit = z->ob_digit;
2080 while (--p >= start) {
Brett Cannona721aba2016-09-09 14:57:09 -07002081 int k;
2082 if (*p == '_') {
2083 continue;
2084 }
2085 k = (int)_PyLong_DigitValue[Py_CHARMASK(*p)];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 assert(k >= 0 && k < base);
2087 accum |= (twodigits)k << bits_in_accum;
2088 bits_in_accum += bits_per_char;
2089 if (bits_in_accum >= PyLong_SHIFT) {
2090 *pdigit++ = (digit)(accum & PyLong_MASK);
2091 assert(pdigit - z->ob_digit <= n);
2092 accum >>= PyLong_SHIFT;
2093 bits_in_accum -= PyLong_SHIFT;
2094 assert(bits_in_accum < PyLong_SHIFT);
2095 }
2096 }
2097 if (bits_in_accum) {
2098 assert(bits_in_accum <= PyLong_SHIFT);
2099 *pdigit++ = (digit)accum;
2100 assert(pdigit - z->ob_digit <= n);
2101 }
2102 while (pdigit - z->ob_digit < n)
2103 *pdigit++ = 0;
Brett Cannona721aba2016-09-09 14:57:09 -07002104 *res = long_normalize(z);
2105 return 0;
Tim Petersbf2674b2003-02-02 07:51:32 +00002106}
2107
Serhiy Storchaka95949422013-08-27 19:40:23 +03002108/* Parses an int from a bytestring. Leading and trailing whitespace will be
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002109 * ignored.
2110 *
2111 * If successful, a PyLong object will be returned and 'pend' will be pointing
2112 * to the first unused byte unless it's NULL.
2113 *
2114 * If unsuccessful, NULL will be returned.
2115 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002116PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03002117PyLong_FromString(const char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 int sign = 1, error_if_nonzero = 0;
Serhiy Storchakac6792272013-10-19 21:03:34 +03002120 const char *start, *orig_str = str;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 PyLongObject *z = NULL;
2122 PyObject *strobj;
2123 Py_ssize_t slen;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 if ((base != 0 && base < 2) || base > 36) {
2126 PyErr_SetString(PyExc_ValueError,
2127 "int() arg 2 must be >= 2 and <= 36");
2128 return NULL;
2129 }
Jordon Xu2ec70102019-09-11 00:04:08 +08002130 while (*str != '\0' && Py_ISSPACE(*str)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 str++;
Brett Cannona721aba2016-09-09 14:57:09 -07002132 }
2133 if (*str == '+') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 ++str;
Brett Cannona721aba2016-09-09 14:57:09 -07002135 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 else if (*str == '-') {
2137 ++str;
2138 sign = -1;
2139 }
2140 if (base == 0) {
Brett Cannona721aba2016-09-09 14:57:09 -07002141 if (str[0] != '0') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 base = 10;
Brett Cannona721aba2016-09-09 14:57:09 -07002143 }
2144 else if (str[1] == 'x' || str[1] == 'X') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 base = 16;
Brett Cannona721aba2016-09-09 14:57:09 -07002146 }
2147 else if (str[1] == 'o' || str[1] == 'O') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 base = 8;
Brett Cannona721aba2016-09-09 14:57:09 -07002149 }
2150 else if (str[1] == 'b' || str[1] == 'B') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 base = 2;
Brett Cannona721aba2016-09-09 14:57:09 -07002152 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 else {
2154 /* "old" (C-style) octal literal, now invalid.
2155 it might still be zero though */
2156 error_if_nonzero = 1;
2157 base = 10;
2158 }
2159 }
2160 if (str[0] == '0' &&
2161 ((base == 16 && (str[1] == 'x' || str[1] == 'X')) ||
2162 (base == 8 && (str[1] == 'o' || str[1] == 'O')) ||
Brett Cannona721aba2016-09-09 14:57:09 -07002163 (base == 2 && (str[1] == 'b' || str[1] == 'B')))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 str += 2;
Brett Cannona721aba2016-09-09 14:57:09 -07002165 /* One underscore allowed here. */
2166 if (*str == '_') {
2167 ++str;
2168 }
2169 }
2170 if (str[0] == '_') {
Barry Warsawb2e57942017-09-14 18:13:16 -07002171 /* May not start with underscores. */
2172 goto onError;
Brett Cannona721aba2016-09-09 14:57:09 -07002173 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 start = str;
Brett Cannona721aba2016-09-09 14:57:09 -07002176 if ((base & (base - 1)) == 0) {
2177 int res = long_from_binary_base(&str, base, &z);
2178 if (res < 0) {
2179 /* Syntax error. */
2180 goto onError;
2181 }
2182 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002184/***
2185Binary bases can be converted in time linear in the number of digits, because
2186Python's representation base is binary. Other bases (including decimal!) use
2187the simple quadratic-time algorithm below, complicated by some speed tricks.
Tim Peters5af4e6c2002-08-12 02:31:19 +00002188
Thomas Wouters477c8d52006-05-27 19:21:47 +00002189First some math: the largest integer that can be expressed in N base-B digits
2190is B**N-1. Consequently, if we have an N-digit input in base B, the worst-
2191case number of Python digits needed to hold it is the smallest integer n s.t.
2192
2193 BASE**n-1 >= B**N-1 [or, adding 1 to both sides]
2194 BASE**n >= B**N [taking logs to base BASE]
2195 n >= log(B**N)/log(BASE) = N * log(B)/log(BASE)
2196
2197The static array log_base_BASE[base] == log(base)/log(BASE) so we can compute
Serhiy Storchaka95949422013-08-27 19:40:23 +03002198this quickly. A Python int with that much space is reserved near the start,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002199and the result is computed into it.
2200
2201The input string is actually treated as being in base base**i (i.e., i digits
2202are processed at a time), where two more static arrays hold:
2203
2204 convwidth_base[base] = the largest integer i such that base**i <= BASE
2205 convmultmax_base[base] = base ** convwidth_base[base]
2206
2207The first of these is the largest i such that i consecutive input digits
2208must fit in a single Python digit. The second is effectively the input
2209base we're really using.
2210
2211Viewing the input as a sequence <c0, c1, ..., c_n-1> of digits in base
2212convmultmax_base[base], the result is "simply"
2213
2214 (((c0*B + c1)*B + c2)*B + c3)*B + ... ))) + c_n-1
2215
2216where B = convmultmax_base[base].
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002217
2218Error analysis: as above, the number of Python digits `n` needed is worst-
2219case
2220
2221 n >= N * log(B)/log(BASE)
2222
2223where `N` is the number of input digits in base `B`. This is computed via
2224
2225 size_z = (Py_ssize_t)((scan - str) * log_base_BASE[base]) + 1;
2226
2227below. Two numeric concerns are how much space this can waste, and whether
2228the computed result can be too small. To be concrete, assume BASE = 2**15,
2229which is the default (and it's unlikely anyone changes that).
2230
2231Waste isn't a problem: provided the first input digit isn't 0, the difference
2232between the worst-case input with N digits and the smallest input with N
2233digits is about a factor of B, but B is small compared to BASE so at most
2234one allocated Python digit can remain unused on that count. If
2235N*log(B)/log(BASE) is mathematically an exact integer, then truncating that
2236and adding 1 returns a result 1 larger than necessary. However, that can't
2237happen: whenever B is a power of 2, long_from_binary_base() is called
2238instead, and it's impossible for B**i to be an integer power of 2**15 when
2239B is not a power of 2 (i.e., it's impossible for N*log(B)/log(BASE) to be
2240an exact integer when B is not a power of 2, since B**i has a prime factor
2241other than 2 in that case, but (2**15)**j's only prime factor is 2).
2242
2243The computed result can be too small if the true value of N*log(B)/log(BASE)
2244is a little bit larger than an exact integer, but due to roundoff errors (in
2245computing log(B), log(BASE), their quotient, and/or multiplying that by N)
2246yields a numeric result a little less than that integer. Unfortunately, "how
2247close can a transcendental function get to an integer over some range?"
2248questions are generally theoretically intractable. Computer analysis via
2249continued fractions is practical: expand log(B)/log(BASE) via continued
2250fractions, giving a sequence i/j of "the best" rational approximations. Then
2251j*log(B)/log(BASE) is approximately equal to (the integer) i. This shows that
2252we can get very close to being in trouble, but very rarely. For example,
225376573 is a denominator in one of the continued-fraction approximations to
2254log(10)/log(2**15), and indeed:
2255
2256 >>> log(10)/log(2**15)*76573
2257 16958.000000654003
2258
2259is very close to an integer. If we were working with IEEE single-precision,
2260rounding errors could kill us. Finding worst cases in IEEE double-precision
2261requires better-than-double-precision log() functions, and Tim didn't bother.
2262Instead the code checks to see whether the allocated space is enough as each
Serhiy Storchaka95949422013-08-27 19:40:23 +03002263new Python digit is added, and copies the whole thing to a larger int if not.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002264This should happen extremely rarely, and in fact I don't have a test case
2265that triggers it(!). Instead the code was tested by artificially allocating
2266just 1 digit at the start, so that the copying code was exercised for every
2267digit beyond the first.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002268***/
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02002269 twodigits c; /* current input character */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 Py_ssize_t size_z;
Serhiy Storchaka29ba6882017-12-03 22:16:21 +02002271 Py_ssize_t digits = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 int i;
2273 int convwidth;
2274 twodigits convmultmax, convmult;
2275 digit *pz, *pzstop;
Brett Cannona721aba2016-09-09 14:57:09 -07002276 const char *scan, *lastdigit;
2277 char prev = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 static double log_base_BASE[37] = {0.0e0,};
2280 static int convwidth_base[37] = {0,};
2281 static twodigits convmultmax_base[37] = {0,};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 if (log_base_BASE[base] == 0.0) {
2284 twodigits convmax = base;
2285 int i = 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002286
Mark Dickinson22b20182010-05-10 21:27:53 +00002287 log_base_BASE[base] = (log((double)base) /
2288 log((double)PyLong_BASE));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 for (;;) {
2290 twodigits next = convmax * base;
Brett Cannona721aba2016-09-09 14:57:09 -07002291 if (next > PyLong_BASE) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 break;
Brett Cannona721aba2016-09-09 14:57:09 -07002293 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 convmax = next;
2295 ++i;
2296 }
2297 convmultmax_base[base] = convmax;
2298 assert(i > 0);
2299 convwidth_base[base] = i;
2300 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 /* Find length of the string of numeric characters. */
2303 scan = str;
Brett Cannona721aba2016-09-09 14:57:09 -07002304 lastdigit = str;
2305
2306 while (_PyLong_DigitValue[Py_CHARMASK(*scan)] < base || *scan == '_') {
2307 if (*scan == '_') {
2308 if (prev == '_') {
2309 /* Only one underscore allowed. */
2310 str = lastdigit + 1;
2311 goto onError;
2312 }
2313 }
2314 else {
2315 ++digits;
2316 lastdigit = scan;
2317 }
2318 prev = *scan;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 ++scan;
Brett Cannona721aba2016-09-09 14:57:09 -07002320 }
2321 if (prev == '_') {
2322 /* Trailing underscore not allowed. */
2323 /* Set error pointer to first underscore. */
2324 str = lastdigit + 1;
2325 goto onError;
2326 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002327
Serhiy Storchaka95949422013-08-27 19:40:23 +03002328 /* Create an int object that can contain the largest possible
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 * integer with this base and length. Note that there's no
2330 * need to initialize z->ob_digit -- no slot is read up before
2331 * being stored into.
2332 */
Victor Stinnerdd431b32017-12-08 00:06:55 +01002333 double fsize_z = (double)digits * log_base_BASE[base] + 1.0;
2334 if (fsize_z > (double)MAX_LONG_DIGITS) {
Serhiy Storchaka29ba6882017-12-03 22:16:21 +02002335 /* The same exception as in _PyLong_New(). */
2336 PyErr_SetString(PyExc_OverflowError,
2337 "too many digits in integer");
2338 return NULL;
2339 }
2340 size_z = (Py_ssize_t)fsize_z;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 /* Uncomment next line to test exceedingly rare copy code */
2342 /* size_z = 1; */
2343 assert(size_z > 0);
2344 z = _PyLong_New(size_z);
Brett Cannona721aba2016-09-09 14:57:09 -07002345 if (z == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 return NULL;
Brett Cannona721aba2016-09-09 14:57:09 -07002347 }
Victor Stinner60ac6ed2020-02-07 23:18:08 +01002348 Py_SET_SIZE(z, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 /* `convwidth` consecutive input digits are treated as a single
2351 * digit in base `convmultmax`.
2352 */
2353 convwidth = convwidth_base[base];
2354 convmultmax = convmultmax_base[base];
Thomas Wouters477c8d52006-05-27 19:21:47 +00002355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 /* Work ;-) */
2357 while (str < scan) {
Brett Cannona721aba2016-09-09 14:57:09 -07002358 if (*str == '_') {
2359 str++;
2360 continue;
2361 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 /* grab up to convwidth digits from the input string */
2363 c = (digit)_PyLong_DigitValue[Py_CHARMASK(*str++)];
Brett Cannona721aba2016-09-09 14:57:09 -07002364 for (i = 1; i < convwidth && str != scan; ++str) {
2365 if (*str == '_') {
2366 continue;
2367 }
2368 i++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 c = (twodigits)(c * base +
Mark Dickinson22b20182010-05-10 21:27:53 +00002370 (int)_PyLong_DigitValue[Py_CHARMASK(*str)]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 assert(c < PyLong_BASE);
2372 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 convmult = convmultmax;
2375 /* Calculate the shift only if we couldn't get
2376 * convwidth digits.
2377 */
2378 if (i != convwidth) {
2379 convmult = base;
Brett Cannona721aba2016-09-09 14:57:09 -07002380 for ( ; i > 1; --i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 convmult *= base;
Brett Cannona721aba2016-09-09 14:57:09 -07002382 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 /* Multiply z by convmult, and add c. */
2386 pz = z->ob_digit;
2387 pzstop = pz + Py_SIZE(z);
2388 for (; pz < pzstop; ++pz) {
2389 c += (twodigits)*pz * convmult;
2390 *pz = (digit)(c & PyLong_MASK);
2391 c >>= PyLong_SHIFT;
2392 }
2393 /* carry off the current end? */
2394 if (c) {
2395 assert(c < PyLong_BASE);
2396 if (Py_SIZE(z) < size_z) {
2397 *pz = (digit)c;
Victor Stinner60ac6ed2020-02-07 23:18:08 +01002398 Py_SET_SIZE(z, Py_SIZE(z) + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 }
2400 else {
2401 PyLongObject *tmp;
2402 /* Extremely rare. Get more space. */
2403 assert(Py_SIZE(z) == size_z);
2404 tmp = _PyLong_New(size_z + 1);
2405 if (tmp == NULL) {
2406 Py_DECREF(z);
2407 return NULL;
2408 }
2409 memcpy(tmp->ob_digit,
2410 z->ob_digit,
2411 sizeof(digit) * size_z);
2412 Py_DECREF(z);
2413 z = tmp;
2414 z->ob_digit[size_z] = (digit)c;
2415 ++size_z;
2416 }
2417 }
2418 }
2419 }
Brett Cannona721aba2016-09-09 14:57:09 -07002420 if (z == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 return NULL;
Brett Cannona721aba2016-09-09 14:57:09 -07002422 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 if (error_if_nonzero) {
2424 /* reset the base to 0, else the exception message
2425 doesn't make too much sense */
2426 base = 0;
Brett Cannona721aba2016-09-09 14:57:09 -07002427 if (Py_SIZE(z) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 goto onError;
Brett Cannona721aba2016-09-09 14:57:09 -07002429 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 /* there might still be other problems, therefore base
2431 remains zero here for the same reason */
2432 }
Brett Cannona721aba2016-09-09 14:57:09 -07002433 if (str == start) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 goto onError;
Brett Cannona721aba2016-09-09 14:57:09 -07002435 }
2436 if (sign < 0) {
Victor Stinner60ac6ed2020-02-07 23:18:08 +01002437 Py_SET_SIZE(z, -(Py_SIZE(z)));
Brett Cannona721aba2016-09-09 14:57:09 -07002438 }
Jordon Xu2ec70102019-09-11 00:04:08 +08002439 while (*str && Py_ISSPACE(*str)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 str++;
Brett Cannona721aba2016-09-09 14:57:09 -07002441 }
2442 if (*str != '\0') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 goto onError;
Brett Cannona721aba2016-09-09 14:57:09 -07002444 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 long_normalize(z);
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002446 z = maybe_small_long(z);
Brett Cannona721aba2016-09-09 14:57:09 -07002447 if (z == NULL) {
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002448 return NULL;
Brett Cannona721aba2016-09-09 14:57:09 -07002449 }
2450 if (pend != NULL) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03002451 *pend = (char *)str;
Brett Cannona721aba2016-09-09 14:57:09 -07002452 }
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002453 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00002454
Mark Dickinson22b20182010-05-10 21:27:53 +00002455 onError:
Brett Cannona721aba2016-09-09 14:57:09 -07002456 if (pend != NULL) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03002457 *pend = (char *)str;
Brett Cannona721aba2016-09-09 14:57:09 -07002458 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 Py_XDECREF(z);
2460 slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200;
2461 strobj = PyUnicode_FromStringAndSize(orig_str, slen);
Brett Cannona721aba2016-09-09 14:57:09 -07002462 if (strobj == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 return NULL;
Brett Cannona721aba2016-09-09 14:57:09 -07002464 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 PyErr_Format(PyExc_ValueError,
Serhiy Storchaka579ddc22013-08-03 21:14:05 +03002466 "invalid literal for int() with base %d: %.200R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 base, strobj);
2468 Py_DECREF(strobj);
2469 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00002470}
2471
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002472/* Since PyLong_FromString doesn't have a length parameter,
2473 * check here for possible NULs in the string.
2474 *
2475 * Reports an invalid literal as a bytes object.
2476 */
2477PyObject *
2478_PyLong_FromBytes(const char *s, Py_ssize_t len, int base)
2479{
2480 PyObject *result, *strobj;
2481 char *end = NULL;
2482
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002483 result = PyLong_FromString(s, &end, base);
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002484 if (end == NULL || (result != NULL && end == s + len))
2485 return result;
2486 Py_XDECREF(result);
2487 strobj = PyBytes_FromStringAndSize(s, Py_MIN(len, 200));
2488 if (strobj != NULL) {
2489 PyErr_Format(PyExc_ValueError,
Serhiy Storchaka579ddc22013-08-03 21:14:05 +03002490 "invalid literal for int() with base %d: %.200R",
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002491 base, strobj);
2492 Py_DECREF(strobj);
2493 }
2494 return NULL;
2495}
2496
Guido van Rossum9e896b32000-04-05 20:11:21 +00002497PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00002498PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00002499{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02002500 PyObject *v, *unicode = PyUnicode_FromWideChar(u, length);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002501 if (unicode == NULL)
2502 return NULL;
2503 v = PyLong_FromUnicodeObject(unicode, base);
2504 Py_DECREF(unicode);
2505 return v;
2506}
2507
2508PyObject *
2509PyLong_FromUnicodeObject(PyObject *u, int base)
2510{
Serhiy Storchaka579ddc22013-08-03 21:14:05 +03002511 PyObject *result, *asciidig;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02002512 const char *buffer;
2513 char *end = NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002514 Py_ssize_t buflen;
Guido van Rossum9e896b32000-04-05 20:11:21 +00002515
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002516 asciidig = _PyUnicode_TransformDecimalAndSpaceToASCII(u);
Alexander Belopolsky942af5a2010-12-04 03:38:46 +00002517 if (asciidig == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 return NULL;
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +02002519 assert(PyUnicode_IS_ASCII(asciidig));
2520 /* Simply get a pointer to existing ASCII characters. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002521 buffer = PyUnicode_AsUTF8AndSize(asciidig, &buflen);
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +02002522 assert(buffer != NULL);
2523
2524 result = PyLong_FromString(buffer, &end, base);
2525 if (end == NULL || (result != NULL && end == buffer + buflen)) {
Alexander Belopolsky942af5a2010-12-04 03:38:46 +00002526 Py_DECREF(asciidig);
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +02002527 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 }
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +02002529 Py_DECREF(asciidig);
2530 Py_XDECREF(result);
Serhiy Storchaka579ddc22013-08-03 21:14:05 +03002531 PyErr_Format(PyExc_ValueError,
2532 "invalid literal for int() with base %d: %.200R",
2533 base, u);
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002534 return NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002535}
2536
Tim Peters9f688bf2000-07-07 15:53:28 +00002537/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002538static PyLongObject *x_divrem
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 (PyLongObject *, PyLongObject *, PyLongObject **);
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03002540static PyObject *long_long(PyObject *v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002541
Serhiy Storchaka95949422013-08-27 19:40:23 +03002542/* Int division with remainder, top-level routine */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002543
Guido van Rossume32e0141992-01-19 16:31:05 +00002544static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002545long_divrem(PyLongObject *a, PyLongObject *b,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002547{
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002548 Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 if (size_b == 0) {
2552 PyErr_SetString(PyExc_ZeroDivisionError,
2553 "integer division or modulo by zero");
2554 return -1;
2555 }
2556 if (size_a < size_b ||
2557 (size_a == size_b &&
2558 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
2559 /* |a| < |b|. */
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03002560 *prem = (PyLongObject *)long_long((PyObject *)a);
Mark Dickinsonb820d7f2016-08-22 12:24:46 +01002561 if (*prem == NULL) {
Mark Dickinsonb820d7f2016-08-22 12:24:46 +01002562 return -1;
2563 }
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002564 Py_INCREF(_PyLong_Zero);
2565 *pdiv = (PyLongObject*)_PyLong_Zero;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 return 0;
2567 }
2568 if (size_b == 1) {
2569 digit rem = 0;
2570 z = divrem1(a, b->ob_digit[0], &rem);
2571 if (z == NULL)
2572 return -1;
2573 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
2574 if (*prem == NULL) {
2575 Py_DECREF(z);
2576 return -1;
2577 }
2578 }
2579 else {
2580 z = x_divrem(a, b, prem);
2581 if (z == NULL)
2582 return -1;
2583 }
2584 /* Set the signs.
2585 The quotient z has the sign of a*b;
2586 the remainder r has the sign of a,
2587 so a = b*z + r. */
Victor Stinner8aed6f12013-07-17 22:31:17 +02002588 if ((Py_SIZE(a) < 0) != (Py_SIZE(b) < 0)) {
2589 _PyLong_Negate(&z);
2590 if (z == NULL) {
2591 Py_CLEAR(*prem);
2592 return -1;
2593 }
2594 }
2595 if (Py_SIZE(a) < 0 && Py_SIZE(*prem) != 0) {
2596 _PyLong_Negate(prem);
2597 if (*prem == NULL) {
2598 Py_DECREF(z);
2599 Py_CLEAR(*prem);
2600 return -1;
2601 }
2602 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 *pdiv = maybe_small_long(z);
2604 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002605}
2606
Serhiy Storchaka95949422013-08-27 19:40:23 +03002607/* Unsigned int division with remainder -- the algorithm. The arguments v1
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002608 and w1 should satisfy 2 <= Py_ABS(Py_SIZE(w1)) <= Py_ABS(Py_SIZE(v1)). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002609
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002610static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002611x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 PyLongObject *v, *w, *a;
2614 Py_ssize_t i, k, size_v, size_w;
2615 int d;
2616 digit wm1, wm2, carry, q, r, vtop, *v0, *vk, *w0, *ak;
2617 twodigits vv;
2618 sdigit zhi;
2619 stwodigits z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 /* We follow Knuth [The Art of Computer Programming, Vol. 2 (3rd
2622 edn.), section 4.3.1, Algorithm D], except that we don't explicitly
2623 handle the special case when the initial estimate q for a quotient
2624 digit is >= PyLong_BASE: the max value for q is PyLong_BASE+1, and
2625 that won't overflow a digit. */
Mark Dickinson17e4fdd2009-03-23 18:44:57 +00002626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 /* allocate space; w will also be used to hold the final remainder */
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002628 size_v = Py_ABS(Py_SIZE(v1));
2629 size_w = Py_ABS(Py_SIZE(w1));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 assert(size_v >= size_w && size_w >= 2); /* Assert checks by div() */
2631 v = _PyLong_New(size_v+1);
2632 if (v == NULL) {
2633 *prem = NULL;
2634 return NULL;
2635 }
2636 w = _PyLong_New(size_w);
2637 if (w == NULL) {
2638 Py_DECREF(v);
2639 *prem = NULL;
2640 return NULL;
2641 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 /* normalize: shift w1 left so that its top digit is >= PyLong_BASE/2.
2644 shift v1 left by the same amount. Results go into w and v. */
Niklas Fiekasc5b79002020-01-16 15:09:19 +01002645 d = PyLong_SHIFT - _Py_bit_length(w1->ob_digit[size_w-1]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 carry = v_lshift(w->ob_digit, w1->ob_digit, size_w, d);
2647 assert(carry == 0);
2648 carry = v_lshift(v->ob_digit, v1->ob_digit, size_v, d);
2649 if (carry != 0 || v->ob_digit[size_v-1] >= w->ob_digit[size_w-1]) {
2650 v->ob_digit[size_v] = carry;
2651 size_v++;
2652 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 /* Now v->ob_digit[size_v-1] < w->ob_digit[size_w-1], so quotient has
2655 at most (and usually exactly) k = size_v - size_w digits. */
2656 k = size_v - size_w;
2657 assert(k >= 0);
2658 a = _PyLong_New(k);
2659 if (a == NULL) {
2660 Py_DECREF(w);
2661 Py_DECREF(v);
2662 *prem = NULL;
2663 return NULL;
2664 }
2665 v0 = v->ob_digit;
2666 w0 = w->ob_digit;
2667 wm1 = w0[size_w-1];
2668 wm2 = w0[size_w-2];
2669 for (vk = v0+k, ak = a->ob_digit + k; vk-- > v0;) {
2670 /* inner loop: divide vk[0:size_w+1] by w0[0:size_w], giving
2671 single-digit quotient q, remainder in vk[0:size_w]. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 SIGCHECK({
Mark Dickinson22b20182010-05-10 21:27:53 +00002674 Py_DECREF(a);
2675 Py_DECREF(w);
2676 Py_DECREF(v);
2677 *prem = NULL;
2678 return NULL;
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00002679 });
Tim Peters5af4e6c2002-08-12 02:31:19 +00002680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 /* estimate quotient digit q; may overestimate by 1 (rare) */
2682 vtop = vk[size_w];
2683 assert(vtop <= wm1);
2684 vv = ((twodigits)vtop << PyLong_SHIFT) | vk[size_w-1];
2685 q = (digit)(vv / wm1);
2686 r = (digit)(vv - (twodigits)wm1 * q); /* r = vv % wm1 */
2687 while ((twodigits)wm2 * q > (((twodigits)r << PyLong_SHIFT)
2688 | vk[size_w-2])) {
2689 --q;
2690 r += wm1;
2691 if (r >= PyLong_BASE)
2692 break;
2693 }
2694 assert(q <= PyLong_BASE);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 /* subtract q*w0[0:size_w] from vk[0:size_w+1] */
2697 zhi = 0;
2698 for (i = 0; i < size_w; ++i) {
2699 /* invariants: -PyLong_BASE <= -q <= zhi <= 0;
2700 -PyLong_BASE * q <= z < PyLong_BASE */
2701 z = (sdigit)vk[i] + zhi -
2702 (stwodigits)q * (stwodigits)w0[i];
2703 vk[i] = (digit)z & PyLong_MASK;
2704 zhi = (sdigit)Py_ARITHMETIC_RIGHT_SHIFT(stwodigits,
Mark Dickinson22b20182010-05-10 21:27:53 +00002705 z, PyLong_SHIFT);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 /* add w back if q was too large (this branch taken rarely) */
2709 assert((sdigit)vtop + zhi == -1 || (sdigit)vtop + zhi == 0);
2710 if ((sdigit)vtop + zhi < 0) {
2711 carry = 0;
2712 for (i = 0; i < size_w; ++i) {
2713 carry += vk[i] + w0[i];
2714 vk[i] = carry & PyLong_MASK;
2715 carry >>= PyLong_SHIFT;
2716 }
2717 --q;
2718 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 /* store quotient digit */
2721 assert(q < PyLong_BASE);
2722 *--ak = q;
2723 }
Mark Dickinson17e4fdd2009-03-23 18:44:57 +00002724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 /* unshift remainder; we reuse w to store the result */
2726 carry = v_rshift(w0, v0, size_w, d);
2727 assert(carry==0);
2728 Py_DECREF(v);
Mark Dickinson17e4fdd2009-03-23 18:44:57 +00002729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 *prem = long_normalize(w);
2731 return long_normalize(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002732}
2733
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002734/* For a nonzero PyLong a, express a in the form x * 2**e, with 0.5 <=
2735 abs(x) < 1.0 and e >= 0; return x and put e in *e. Here x is
2736 rounded to DBL_MANT_DIG significant bits using round-half-to-even.
2737 If a == 0, return 0.0 and set *e = 0. If the resulting exponent
2738 e is larger than PY_SSIZE_T_MAX, raise OverflowError and return
2739 -1.0. */
2740
2741/* attempt to define 2.0**DBL_MANT_DIG as a compile-time constant */
2742#if DBL_MANT_DIG == 53
2743#define EXP2_DBL_MANT_DIG 9007199254740992.0
2744#else
2745#define EXP2_DBL_MANT_DIG (ldexp(1.0, DBL_MANT_DIG))
2746#endif
2747
2748double
2749_PyLong_Frexp(PyLongObject *a, Py_ssize_t *e)
2750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 Py_ssize_t a_size, a_bits, shift_digits, shift_bits, x_size;
2752 /* See below for why x_digits is always large enough. */
Dong-hee Nab88cd582020-05-04 22:32:42 +09002753 digit rem;
2754 digit x_digits[2 + (DBL_MANT_DIG + 1) / PyLong_SHIFT] = {0,};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 double dx;
2756 /* Correction term for round-half-to-even rounding. For a digit x,
2757 "x + half_even_correction[x & 7]" gives x rounded to the nearest
2758 multiple of 4, rounding ties to a multiple of 8. */
2759 static const int half_even_correction[8] = {0, -1, -2, 1, 0, -1, 2, 1};
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002760
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002761 a_size = Py_ABS(Py_SIZE(a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 if (a_size == 0) {
2763 /* Special case for 0: significand 0.0, exponent 0. */
2764 *e = 0;
2765 return 0.0;
2766 }
Niklas Fiekasc5b79002020-01-16 15:09:19 +01002767 a_bits = _Py_bit_length(a->ob_digit[a_size-1]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 /* The following is an overflow-free version of the check
2769 "if ((a_size - 1) * PyLong_SHIFT + a_bits > PY_SSIZE_T_MAX) ..." */
2770 if (a_size >= (PY_SSIZE_T_MAX - 1) / PyLong_SHIFT + 1 &&
2771 (a_size > (PY_SSIZE_T_MAX - 1) / PyLong_SHIFT + 1 ||
2772 a_bits > (PY_SSIZE_T_MAX - 1) % PyLong_SHIFT + 1))
Mark Dickinson22b20182010-05-10 21:27:53 +00002773 goto overflow;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 a_bits = (a_size - 1) * PyLong_SHIFT + a_bits;
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002776 /* Shift the first DBL_MANT_DIG + 2 bits of a into x_digits[0:x_size]
2777 (shifting left if a_bits <= DBL_MANT_DIG + 2).
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 Number of digits needed for result: write // for floor division.
2780 Then if shifting left, we end up using
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 1 + a_size + (DBL_MANT_DIG + 2 - a_bits) // PyLong_SHIFT
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 digits. If shifting right, we use
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 a_size - (a_bits - DBL_MANT_DIG - 2) // PyLong_SHIFT
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 digits. Using a_size = 1 + (a_bits - 1) // PyLong_SHIFT along with
2789 the inequalities
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 m // PyLong_SHIFT + n // PyLong_SHIFT <= (m + n) // PyLong_SHIFT
2792 m // PyLong_SHIFT - n // PyLong_SHIFT <=
2793 1 + (m - n - 1) // PyLong_SHIFT,
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 valid for any integers m and n, we find that x_size satisfies
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 x_size <= 2 + (DBL_MANT_DIG + 1) // PyLong_SHIFT
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 in both cases.
2800 */
2801 if (a_bits <= DBL_MANT_DIG + 2) {
2802 shift_digits = (DBL_MANT_DIG + 2 - a_bits) / PyLong_SHIFT;
2803 shift_bits = (DBL_MANT_DIG + 2 - a_bits) % PyLong_SHIFT;
Dong-hee Nab88cd582020-05-04 22:32:42 +09002804 x_size = shift_digits;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 rem = v_lshift(x_digits + x_size, a->ob_digit, a_size,
2806 (int)shift_bits);
2807 x_size += a_size;
2808 x_digits[x_size++] = rem;
2809 }
2810 else {
2811 shift_digits = (a_bits - DBL_MANT_DIG - 2) / PyLong_SHIFT;
2812 shift_bits = (a_bits - DBL_MANT_DIG - 2) % PyLong_SHIFT;
2813 rem = v_rshift(x_digits, a->ob_digit + shift_digits,
2814 a_size - shift_digits, (int)shift_bits);
2815 x_size = a_size - shift_digits;
2816 /* For correct rounding below, we need the least significant
2817 bit of x to be 'sticky' for this shift: if any of the bits
2818 shifted out was nonzero, we set the least significant bit
2819 of x. */
2820 if (rem)
2821 x_digits[0] |= 1;
2822 else
2823 while (shift_digits > 0)
2824 if (a->ob_digit[--shift_digits]) {
2825 x_digits[0] |= 1;
2826 break;
2827 }
2828 }
Victor Stinner63941882011-09-29 00:42:28 +02002829 assert(1 <= x_size && x_size <= (Py_ssize_t)Py_ARRAY_LENGTH(x_digits));
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 /* Round, and convert to double. */
2832 x_digits[0] += half_even_correction[x_digits[0] & 7];
2833 dx = x_digits[--x_size];
2834 while (x_size > 0)
2835 dx = dx * PyLong_BASE + x_digits[--x_size];
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 /* Rescale; make correction if result is 1.0. */
2838 dx /= 4.0 * EXP2_DBL_MANT_DIG;
2839 if (dx == 1.0) {
2840 if (a_bits == PY_SSIZE_T_MAX)
2841 goto overflow;
2842 dx = 0.5;
2843 a_bits += 1;
2844 }
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 *e = a_bits;
2847 return Py_SIZE(a) < 0 ? -dx : dx;
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002848
2849 overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 /* exponent > PY_SSIZE_T_MAX */
2851 PyErr_SetString(PyExc_OverflowError,
2852 "huge integer: number of bits overflows a Py_ssize_t");
2853 *e = 0;
2854 return -1.0;
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002855}
2856
Serhiy Storchaka95949422013-08-27 19:40:23 +03002857/* Get a C double from an int object. Rounds to the nearest double,
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002858 using the round-half-to-even rule in the case of a tie. */
2859
2860double
2861PyLong_AsDouble(PyObject *v)
2862{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002863 Py_ssize_t exponent;
2864 double x;
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002865
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02002866 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 PyErr_BadInternalCall();
2868 return -1.0;
2869 }
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02002870 if (!PyLong_Check(v)) {
2871 PyErr_SetString(PyExc_TypeError, "an integer is required");
2872 return -1.0;
2873 }
Yury Selivanov186c30b2016-02-05 19:40:01 -05002874 if (Py_ABS(Py_SIZE(v)) <= 1) {
Yury Selivanova0fcaca2016-02-06 12:21:33 -05002875 /* Fast path; single digit long (31 bits) will cast safely
Mark Dickinson1dc3c892016-08-21 10:33:36 +01002876 to double. This improves performance of FP/long operations
2877 by 20%.
Yury Selivanov186c30b2016-02-05 19:40:01 -05002878 */
2879 return (double)MEDIUM_VALUE((PyLongObject *)v);
2880 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 x = _PyLong_Frexp((PyLongObject *)v, &exponent);
2882 if ((x == -1.0 && PyErr_Occurred()) || exponent > DBL_MAX_EXP) {
2883 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson02515f72013-08-03 12:08:22 +01002884 "int too large to convert to float");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 return -1.0;
2886 }
2887 return ldexp(x, (int)exponent);
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002888}
2889
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002890/* Methods */
2891
HongWeipeng42acb7b2019-09-18 23:10:15 +08002892/* if a < b, return a negative number
2893 if a == b, return 0
2894 if a > b, return a positive number */
2895
2896static Py_ssize_t
Tim Peters9f688bf2000-07-07 15:53:28 +00002897long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002898{
HongWeipeng42acb7b2019-09-18 23:10:15 +08002899 Py_ssize_t sign = Py_SIZE(a) - Py_SIZE(b);
2900 if (sign == 0) {
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002901 Py_ssize_t i = Py_ABS(Py_SIZE(a));
HongWeipeng42acb7b2019-09-18 23:10:15 +08002902 sdigit diff = 0;
2903 while (--i >= 0) {
2904 diff = (sdigit) a->ob_digit[i] - (sdigit) b->ob_digit[i];
2905 if (diff) {
2906 break;
2907 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 }
HongWeipeng42acb7b2019-09-18 23:10:15 +08002909 sign = Py_SIZE(a) < 0 ? -diff : diff;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 }
HongWeipeng42acb7b2019-09-18 23:10:15 +08002911 return sign;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002912}
2913
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002914static PyObject *
2915long_richcompare(PyObject *self, PyObject *other, int op)
2916{
HongWeipeng42acb7b2019-09-18 23:10:15 +08002917 Py_ssize_t result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 CHECK_BINOP(self, other);
2919 if (self == other)
2920 result = 0;
2921 else
2922 result = long_compare((PyLongObject*)self, (PyLongObject*)other);
stratakise8b19652017-11-02 11:32:54 +01002923 Py_RETURN_RICHCOMPARE(result, 0, op);
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002924}
2925
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002926static Py_hash_t
Tim Peters9f688bf2000-07-07 15:53:28 +00002927long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002928{
Benjamin Peterson8035bc52010-10-23 16:20:50 +00002929 Py_uhash_t x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 Py_ssize_t i;
2931 int sign;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002933 i = Py_SIZE(v);
2934 switch(i) {
2935 case -1: return v->ob_digit[0]==1 ? -2 : -(sdigit)v->ob_digit[0];
2936 case 0: return 0;
2937 case 1: return v->ob_digit[0];
2938 }
2939 sign = 1;
2940 x = 0;
2941 if (i < 0) {
2942 sign = -1;
2943 i = -(i);
2944 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 while (--i >= 0) {
Mark Dickinsondc787d22010-05-23 13:33:13 +00002946 /* Here x is a quantity in the range [0, _PyHASH_MODULUS); we
2947 want to compute x * 2**PyLong_SHIFT + v->ob_digit[i] modulo
2948 _PyHASH_MODULUS.
2949
2950 The computation of x * 2**PyLong_SHIFT % _PyHASH_MODULUS
2951 amounts to a rotation of the bits of x. To see this, write
2952
2953 x * 2**PyLong_SHIFT = y * 2**_PyHASH_BITS + z
2954
2955 where y = x >> (_PyHASH_BITS - PyLong_SHIFT) gives the top
2956 PyLong_SHIFT bits of x (those that are shifted out of the
2957 original _PyHASH_BITS bits, and z = (x << PyLong_SHIFT) &
2958 _PyHASH_MODULUS gives the bottom _PyHASH_BITS - PyLong_SHIFT
2959 bits of x, shifted up. Then since 2**_PyHASH_BITS is
2960 congruent to 1 modulo _PyHASH_MODULUS, y*2**_PyHASH_BITS is
2961 congruent to y modulo _PyHASH_MODULUS. So
2962
2963 x * 2**PyLong_SHIFT = y + z (mod _PyHASH_MODULUS).
2964
2965 The right-hand side is just the result of rotating the
2966 _PyHASH_BITS bits of x left by PyLong_SHIFT places; since
2967 not all _PyHASH_BITS bits of x are 1s, the same is true
2968 after rotation, so 0 <= y+z < _PyHASH_MODULUS and y + z is
2969 the reduction of x*2**PyLong_SHIFT modulo
2970 _PyHASH_MODULUS. */
2971 x = ((x << PyLong_SHIFT) & _PyHASH_MODULUS) |
2972 (x >> (_PyHASH_BITS - PyLong_SHIFT));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973 x += v->ob_digit[i];
Mark Dickinsondc787d22010-05-23 13:33:13 +00002974 if (x >= _PyHASH_MODULUS)
2975 x -= _PyHASH_MODULUS;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 }
2977 x = x * sign;
Benjamin Peterson8035bc52010-10-23 16:20:50 +00002978 if (x == (Py_uhash_t)-1)
2979 x = (Py_uhash_t)-2;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002980 return (Py_hash_t)x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002981}
2982
2983
Serhiy Storchaka95949422013-08-27 19:40:23 +03002984/* Add the absolute values of two integers. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002985
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002986static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002987x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002988{
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002989 Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 PyLongObject *z;
2991 Py_ssize_t i;
2992 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00002993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 /* Ensure a is the larger of the two: */
2995 if (size_a < size_b) {
2996 { PyLongObject *temp = a; a = b; b = temp; }
2997 { Py_ssize_t size_temp = size_a;
Mark Dickinson22b20182010-05-10 21:27:53 +00002998 size_a = size_b;
2999 size_b = size_temp; }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003000 }
3001 z = _PyLong_New(size_a+1);
3002 if (z == NULL)
3003 return NULL;
3004 for (i = 0; i < size_b; ++i) {
3005 carry += a->ob_digit[i] + b->ob_digit[i];
3006 z->ob_digit[i] = carry & PyLong_MASK;
3007 carry >>= PyLong_SHIFT;
3008 }
3009 for (; i < size_a; ++i) {
3010 carry += a->ob_digit[i];
3011 z->ob_digit[i] = carry & PyLong_MASK;
3012 carry >>= PyLong_SHIFT;
3013 }
3014 z->ob_digit[i] = carry;
3015 return long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003016}
3017
3018/* Subtract the absolute values of two integers. */
3019
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003020static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003021x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003022{
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003023 Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003024 PyLongObject *z;
3025 Py_ssize_t i;
3026 int sign = 1;
3027 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00003028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003029 /* Ensure a is the larger of the two: */
3030 if (size_a < size_b) {
3031 sign = -1;
3032 { PyLongObject *temp = a; a = b; b = temp; }
3033 { Py_ssize_t size_temp = size_a;
Mark Dickinson22b20182010-05-10 21:27:53 +00003034 size_a = size_b;
3035 size_b = size_temp; }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 }
3037 else if (size_a == size_b) {
3038 /* Find highest digit where a and b differ: */
3039 i = size_a;
3040 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
3041 ;
3042 if (i < 0)
3043 return (PyLongObject *)PyLong_FromLong(0);
3044 if (a->ob_digit[i] < b->ob_digit[i]) {
3045 sign = -1;
3046 { PyLongObject *temp = a; a = b; b = temp; }
3047 }
3048 size_a = size_b = i+1;
3049 }
3050 z = _PyLong_New(size_a);
3051 if (z == NULL)
3052 return NULL;
3053 for (i = 0; i < size_b; ++i) {
3054 /* The following assumes unsigned arithmetic
3055 works module 2**N for some N>PyLong_SHIFT. */
3056 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
3057 z->ob_digit[i] = borrow & PyLong_MASK;
3058 borrow >>= PyLong_SHIFT;
3059 borrow &= 1; /* Keep only one sign bit */
3060 }
3061 for (; i < size_a; ++i) {
3062 borrow = a->ob_digit[i] - borrow;
3063 z->ob_digit[i] = borrow & PyLong_MASK;
3064 borrow >>= PyLong_SHIFT;
3065 borrow &= 1; /* Keep only one sign bit */
3066 }
3067 assert(borrow == 0);
Victor Stinner8aed6f12013-07-17 22:31:17 +02003068 if (sign < 0) {
Victor Stinner60ac6ed2020-02-07 23:18:08 +01003069 Py_SET_SIZE(z, -Py_SIZE(z));
Victor Stinner8aed6f12013-07-17 22:31:17 +02003070 }
HongWeipeng036fe852019-11-26 15:54:49 +08003071 return maybe_small_long(long_normalize(z));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003072}
3073
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003074static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003075long_add(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00003078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079 CHECK_BINOP(a, b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003080
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003081 if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
Mark Dickinsonc1c4a642016-09-17 20:01:56 +01003082 return PyLong_FromLong(MEDIUM_VALUE(a) + MEDIUM_VALUE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003083 }
3084 if (Py_SIZE(a) < 0) {
3085 if (Py_SIZE(b) < 0) {
3086 z = x_add(a, b);
Serhiy Storchakae63e5d62016-06-04 00:06:45 +03003087 if (z != NULL) {
3088 /* x_add received at least one multiple-digit int,
3089 and thus z must be a multiple-digit int.
3090 That also means z is not an element of
3091 small_ints, so negating it in-place is safe. */
3092 assert(Py_REFCNT(z) == 1);
Victor Stinner60ac6ed2020-02-07 23:18:08 +01003093 Py_SET_SIZE(z, -(Py_SIZE(z)));
Serhiy Storchakae63e5d62016-06-04 00:06:45 +03003094 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 }
3096 else
3097 z = x_sub(b, a);
3098 }
3099 else {
3100 if (Py_SIZE(b) < 0)
3101 z = x_sub(a, b);
3102 else
3103 z = x_add(a, b);
3104 }
3105 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003106}
3107
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003108static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003109long_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003113 CHECK_BINOP(a, b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003114
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003115 if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
Mark Dickinsonc1c4a642016-09-17 20:01:56 +01003116 return PyLong_FromLong(MEDIUM_VALUE(a) - MEDIUM_VALUE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003117 }
3118 if (Py_SIZE(a) < 0) {
HongWeipeng036fe852019-11-26 15:54:49 +08003119 if (Py_SIZE(b) < 0) {
3120 z = x_sub(b, a);
3121 }
3122 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003123 z = x_add(a, b);
HongWeipeng036fe852019-11-26 15:54:49 +08003124 if (z != NULL) {
3125 assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1);
Victor Stinner60ac6ed2020-02-07 23:18:08 +01003126 Py_SET_SIZE(z, -(Py_SIZE(z)));
HongWeipeng036fe852019-11-26 15:54:49 +08003127 }
Serhiy Storchakae63e5d62016-06-04 00:06:45 +03003128 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003129 }
3130 else {
3131 if (Py_SIZE(b) < 0)
3132 z = x_add(a, b);
3133 else
3134 z = x_sub(a, b);
3135 }
3136 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003137}
3138
Tim Peters5af4e6c2002-08-12 02:31:19 +00003139/* Grade school multiplication, ignoring the signs.
3140 * Returns the absolute value of the product, or NULL if error.
3141 */
3142static PyLongObject *
3143x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00003144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 PyLongObject *z;
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003146 Py_ssize_t size_a = Py_ABS(Py_SIZE(a));
3147 Py_ssize_t size_b = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 Py_ssize_t i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003150 z = _PyLong_New(size_a + size_b);
3151 if (z == NULL)
3152 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 memset(z->ob_digit, 0, Py_SIZE(z) * sizeof(digit));
3155 if (a == b) {
3156 /* Efficient squaring per HAC, Algorithm 14.16:
3157 * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
3158 * Gives slightly less than a 2x speedup when a == b,
3159 * via exploiting that each entry in the multiplication
3160 * pyramid appears twice (except for the size_a squares).
3161 */
3162 for (i = 0; i < size_a; ++i) {
3163 twodigits carry;
3164 twodigits f = a->ob_digit[i];
3165 digit *pz = z->ob_digit + (i << 1);
3166 digit *pa = a->ob_digit + i + 1;
3167 digit *paend = a->ob_digit + size_a;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 SIGCHECK({
Mark Dickinson22b20182010-05-10 21:27:53 +00003170 Py_DECREF(z);
3171 return NULL;
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00003172 });
Tim Peters0973b992004-08-29 22:16:50 +00003173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 carry = *pz + f * f;
3175 *pz++ = (digit)(carry & PyLong_MASK);
3176 carry >>= PyLong_SHIFT;
3177 assert(carry <= PyLong_MASK);
Tim Peters0973b992004-08-29 22:16:50 +00003178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 /* Now f is added in twice in each column of the
3180 * pyramid it appears. Same as adding f<<1 once.
3181 */
3182 f <<= 1;
3183 while (pa < paend) {
3184 carry += *pz + *pa++ * f;
3185 *pz++ = (digit)(carry & PyLong_MASK);
3186 carry >>= PyLong_SHIFT;
3187 assert(carry <= (PyLong_MASK << 1));
3188 }
3189 if (carry) {
3190 carry += *pz;
3191 *pz++ = (digit)(carry & PyLong_MASK);
3192 carry >>= PyLong_SHIFT;
3193 }
3194 if (carry)
3195 *pz += (digit)(carry & PyLong_MASK);
3196 assert((carry >> PyLong_SHIFT) == 0);
3197 }
3198 }
Serhiy Storchaka95949422013-08-27 19:40:23 +03003199 else { /* a is not the same as b -- gradeschool int mult */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 for (i = 0; i < size_a; ++i) {
3201 twodigits carry = 0;
3202 twodigits f = a->ob_digit[i];
3203 digit *pz = z->ob_digit + i;
3204 digit *pb = b->ob_digit;
3205 digit *pbend = b->ob_digit + size_b;
Tim Peters0973b992004-08-29 22:16:50 +00003206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003207 SIGCHECK({
Mark Dickinson22b20182010-05-10 21:27:53 +00003208 Py_DECREF(z);
3209 return NULL;
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00003210 });
Tim Peters0973b992004-08-29 22:16:50 +00003211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 while (pb < pbend) {
3213 carry += *pz + *pb++ * f;
3214 *pz++ = (digit)(carry & PyLong_MASK);
3215 carry >>= PyLong_SHIFT;
3216 assert(carry <= PyLong_MASK);
3217 }
3218 if (carry)
3219 *pz += (digit)(carry & PyLong_MASK);
3220 assert((carry >> PyLong_SHIFT) == 0);
3221 }
3222 }
3223 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00003224}
3225
3226/* A helper for Karatsuba multiplication (k_mul).
Serhiy Storchaka95949422013-08-27 19:40:23 +03003227 Takes an int "n" and an integer "size" representing the place to
Tim Peters5af4e6c2002-08-12 02:31:19 +00003228 split, and sets low and high such that abs(n) == (high << size) + low,
3229 viewing the shift as being by digits. The sign bit is ignored, and
3230 the return values are >= 0.
3231 Returns 0 on success, -1 on failure.
3232*/
3233static int
Mark Dickinson22b20182010-05-10 21:27:53 +00003234kmul_split(PyLongObject *n,
3235 Py_ssize_t size,
3236 PyLongObject **high,
3237 PyLongObject **low)
Tim Peters5af4e6c2002-08-12 02:31:19 +00003238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 PyLongObject *hi, *lo;
3240 Py_ssize_t size_lo, size_hi;
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003241 const Py_ssize_t size_n = Py_ABS(Py_SIZE(n));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003242
Victor Stinner640c35c2013-06-04 23:14:37 +02003243 size_lo = Py_MIN(size_n, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 size_hi = size_n - size_lo;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 if ((hi = _PyLong_New(size_hi)) == NULL)
3247 return -1;
3248 if ((lo = _PyLong_New(size_lo)) == NULL) {
3249 Py_DECREF(hi);
3250 return -1;
3251 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
3254 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003256 *high = long_normalize(hi);
3257 *low = long_normalize(lo);
3258 return 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003259}
3260
Tim Peters60004642002-08-12 22:01:34 +00003261static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
3262
Tim Peters5af4e6c2002-08-12 02:31:19 +00003263/* Karatsuba multiplication. Ignores the input signs, and returns the
3264 * absolute value of the product (or NULL if error).
3265 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
3266 */
3267static PyLongObject *
3268k_mul(PyLongObject *a, PyLongObject *b)
3269{
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003270 Py_ssize_t asize = Py_ABS(Py_SIZE(a));
3271 Py_ssize_t bsize = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003272 PyLongObject *ah = NULL;
3273 PyLongObject *al = NULL;
3274 PyLongObject *bh = NULL;
3275 PyLongObject *bl = NULL;
3276 PyLongObject *ret = NULL;
3277 PyLongObject *t1, *t2, *t3;
3278 Py_ssize_t shift; /* the number of digits we split off */
3279 Py_ssize_t i;
Tim Peters738eda72002-08-12 15:08:20 +00003280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
3282 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
3283 * Then the original product is
3284 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
3285 * By picking X to be a power of 2, "*X" is just shifting, and it's
3286 * been reduced to 3 multiplies on numbers half the size.
3287 */
Tim Peters5af4e6c2002-08-12 02:31:19 +00003288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 /* We want to split based on the larger number; fiddle so that b
3290 * is largest.
3291 */
3292 if (asize > bsize) {
3293 t1 = a;
3294 a = b;
3295 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00003296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 i = asize;
3298 asize = bsize;
3299 bsize = i;
3300 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 /* Use gradeschool math when either number is too small. */
3303 i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF;
3304 if (asize <= i) {
3305 if (asize == 0)
3306 return (PyLongObject *)PyLong_FromLong(0);
3307 else
3308 return x_mul(a, b);
3309 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 /* If a is small compared to b, splitting on b gives a degenerate
3312 * case with ah==0, and Karatsuba may be (even much) less efficient
3313 * than "grade school" then. However, we can still win, by viewing
3314 * b as a string of "big digits", each of width a->ob_size. That
3315 * leads to a sequence of balanced calls to k_mul.
3316 */
3317 if (2 * asize <= bsize)
3318 return k_lopsided_mul(a, b);
Tim Peters60004642002-08-12 22:01:34 +00003319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 /* Split a & b into hi & lo pieces. */
3321 shift = bsize >> 1;
3322 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
3323 assert(Py_SIZE(ah) > 0); /* the split isn't degenerate */
Tim Petersd6974a52002-08-13 20:37:51 +00003324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 if (a == b) {
3326 bh = ah;
3327 bl = al;
3328 Py_INCREF(bh);
3329 Py_INCREF(bl);
3330 }
3331 else if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 /* The plan:
3334 * 1. Allocate result space (asize + bsize digits: that's always
3335 * enough).
3336 * 2. Compute ah*bh, and copy into result at 2*shift.
3337 * 3. Compute al*bl, and copy into result at 0. Note that this
3338 * can't overlap with #2.
3339 * 4. Subtract al*bl from the result, starting at shift. This may
3340 * underflow (borrow out of the high digit), but we don't care:
3341 * we're effectively doing unsigned arithmetic mod
3342 * BASE**(sizea + sizeb), and so long as the *final* result fits,
3343 * borrows and carries out of the high digit can be ignored.
3344 * 5. Subtract ah*bh from the result, starting at shift.
3345 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
3346 * at shift.
3347 */
Tim Petersd64c1de2002-08-12 17:36:03 +00003348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 /* 1. Allocate result space. */
3350 ret = _PyLong_New(asize + bsize);
3351 if (ret == NULL) goto fail;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003352#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 /* Fill with trash, to catch reference to uninitialized digits. */
3354 memset(ret->ob_digit, 0xDF, Py_SIZE(ret) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003355#endif
Tim Peters44121a62002-08-12 06:17:58 +00003356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 /* 2. t1 <- ah*bh, and copy into high digits of result. */
3358 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
3359 assert(Py_SIZE(t1) >= 0);
3360 assert(2*shift + Py_SIZE(t1) <= Py_SIZE(ret));
3361 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
3362 Py_SIZE(t1) * sizeof(digit));
Tim Peters738eda72002-08-12 15:08:20 +00003363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 /* Zero-out the digits higher than the ah*bh copy. */
3365 i = Py_SIZE(ret) - 2*shift - Py_SIZE(t1);
3366 if (i)
3367 memset(ret->ob_digit + 2*shift + Py_SIZE(t1), 0,
3368 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 /* 3. t2 <- al*bl, and copy into the low digits. */
3371 if ((t2 = k_mul(al, bl)) == NULL) {
3372 Py_DECREF(t1);
3373 goto fail;
3374 }
3375 assert(Py_SIZE(t2) >= 0);
3376 assert(Py_SIZE(t2) <= 2*shift); /* no overlap with high digits */
3377 memcpy(ret->ob_digit, t2->ob_digit, Py_SIZE(t2) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 /* Zero out remaining digits. */
3380 i = 2*shift - Py_SIZE(t2); /* number of uninitialized digits */
3381 if (i)
3382 memset(ret->ob_digit + Py_SIZE(t2), 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
3385 * because it's fresher in cache.
3386 */
3387 i = Py_SIZE(ret) - shift; /* # digits after shift */
3388 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, Py_SIZE(t2));
3389 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00003390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, Py_SIZE(t1));
3392 Py_DECREF(t1);
Tim Peters738eda72002-08-12 15:08:20 +00003393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
3395 if ((t1 = x_add(ah, al)) == NULL) goto fail;
3396 Py_DECREF(ah);
3397 Py_DECREF(al);
3398 ah = al = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 if (a == b) {
3401 t2 = t1;
3402 Py_INCREF(t2);
3403 }
3404 else if ((t2 = x_add(bh, bl)) == NULL) {
3405 Py_DECREF(t1);
3406 goto fail;
3407 }
3408 Py_DECREF(bh);
3409 Py_DECREF(bl);
3410 bh = bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412 t3 = k_mul(t1, t2);
3413 Py_DECREF(t1);
3414 Py_DECREF(t2);
3415 if (t3 == NULL) goto fail;
3416 assert(Py_SIZE(t3) >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00003417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003418 /* Add t3. It's not obvious why we can't run out of room here.
3419 * See the (*) comment after this function.
3420 */
3421 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, Py_SIZE(t3));
3422 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00003423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 return long_normalize(ret);
Tim Peters5af4e6c2002-08-12 02:31:19 +00003425
Mark Dickinson22b20182010-05-10 21:27:53 +00003426 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427 Py_XDECREF(ret);
3428 Py_XDECREF(ah);
3429 Py_XDECREF(al);
3430 Py_XDECREF(bh);
3431 Py_XDECREF(bl);
3432 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003433}
3434
Tim Petersd6974a52002-08-13 20:37:51 +00003435/* (*) Why adding t3 can't "run out of room" above.
3436
Tim Petersab86c2b2002-08-15 20:06:00 +00003437Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
3438to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00003439
Tim Petersab86c2b2002-08-15 20:06:00 +000034401. For any integer i, i = c(i/2) + f(i/2). In particular,
3441 bsize = c(bsize/2) + f(bsize/2).
34422. shift = f(bsize/2)
34433. asize <= bsize
34444. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
3445 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00003446
Tim Petersab86c2b2002-08-15 20:06:00 +00003447We allocated asize + bsize result digits, and add t3 into them at an offset
3448of shift. This leaves asize+bsize-shift allocated digit positions for t3
3449to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
3450asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00003451
Tim Petersab86c2b2002-08-15 20:06:00 +00003452bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
3453at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00003454
Tim Petersab86c2b2002-08-15 20:06:00 +00003455If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
3456digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
3457most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00003458
Tim Petersab86c2b2002-08-15 20:06:00 +00003459The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00003460
Tim Petersab86c2b2002-08-15 20:06:00 +00003461 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00003462
Tim Petersab86c2b2002-08-15 20:06:00 +00003463and we have asize + c(bsize/2) available digit positions. We need to show
3464this is always enough. An instance of c(bsize/2) cancels out in both, so
3465the question reduces to whether asize digits is enough to hold
3466(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
3467then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
3468asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003469digit is enough to hold 2 bits. This is so since PyLong_SHIFT=15 >= 2. If
Tim Petersab86c2b2002-08-15 20:06:00 +00003470asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00003471c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
3472is enough to hold 2 bits. This is so if bsize >= 2, which holds because
3473bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00003474
Tim Peters48d52c02002-08-14 17:07:32 +00003475Note that since there's always enough room for (ah+al)*(bh+bl), and that's
3476clearly >= each of ah*bh and al*bl, there's always enough room to subtract
3477ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00003478*/
3479
Tim Peters60004642002-08-12 22:01:34 +00003480/* b has at least twice the digits of a, and a is big enough that Karatsuba
3481 * would pay off *if* the inputs had balanced sizes. View b as a sequence
3482 * of slices, each with a->ob_size digits, and multiply the slices by a,
3483 * one at a time. This gives k_mul balanced inputs to work with, and is
3484 * also cache-friendly (we compute one double-width slice of the result
Ezio Melotti42da6632011-03-15 05:18:48 +02003485 * at a time, then move on, never backtracking except for the helpful
Tim Peters60004642002-08-12 22:01:34 +00003486 * single-width slice overlap between successive partial sums).
3487 */
3488static PyLongObject *
3489k_lopsided_mul(PyLongObject *a, PyLongObject *b)
3490{
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003491 const Py_ssize_t asize = Py_ABS(Py_SIZE(a));
3492 Py_ssize_t bsize = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 Py_ssize_t nbdone; /* # of b digits already multiplied */
3494 PyLongObject *ret;
3495 PyLongObject *bslice = NULL;
Tim Peters60004642002-08-12 22:01:34 +00003496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 assert(asize > KARATSUBA_CUTOFF);
3498 assert(2 * asize <= bsize);
Tim Peters60004642002-08-12 22:01:34 +00003499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003500 /* Allocate result space, and zero it out. */
3501 ret = _PyLong_New(asize + bsize);
3502 if (ret == NULL)
3503 return NULL;
3504 memset(ret->ob_digit, 0, Py_SIZE(ret) * sizeof(digit));
Tim Peters60004642002-08-12 22:01:34 +00003505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003506 /* Successive slices of b are copied into bslice. */
3507 bslice = _PyLong_New(asize);
3508 if (bslice == NULL)
3509 goto fail;
Tim Peters60004642002-08-12 22:01:34 +00003510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003511 nbdone = 0;
3512 while (bsize > 0) {
3513 PyLongObject *product;
Victor Stinner640c35c2013-06-04 23:14:37 +02003514 const Py_ssize_t nbtouse = Py_MIN(bsize, asize);
Tim Peters60004642002-08-12 22:01:34 +00003515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 /* Multiply the next slice of b by a. */
3517 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
3518 nbtouse * sizeof(digit));
Victor Stinner60ac6ed2020-02-07 23:18:08 +01003519 Py_SET_SIZE(bslice, nbtouse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003520 product = k_mul(a, bslice);
3521 if (product == NULL)
3522 goto fail;
Tim Peters60004642002-08-12 22:01:34 +00003523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003524 /* Add into result. */
3525 (void)v_iadd(ret->ob_digit + nbdone, Py_SIZE(ret) - nbdone,
3526 product->ob_digit, Py_SIZE(product));
3527 Py_DECREF(product);
Tim Peters60004642002-08-12 22:01:34 +00003528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003529 bsize -= nbtouse;
3530 nbdone += nbtouse;
3531 }
Tim Peters60004642002-08-12 22:01:34 +00003532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003533 Py_DECREF(bslice);
3534 return long_normalize(ret);
Tim Peters60004642002-08-12 22:01:34 +00003535
Mark Dickinson22b20182010-05-10 21:27:53 +00003536 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003537 Py_DECREF(ret);
3538 Py_XDECREF(bslice);
3539 return NULL;
Tim Peters60004642002-08-12 22:01:34 +00003540}
Tim Peters5af4e6c2002-08-12 02:31:19 +00003541
3542static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003543long_mul(PyLongObject *a, PyLongObject *b)
Tim Peters5af4e6c2002-08-12 02:31:19 +00003544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003547 CHECK_BINOP(a, b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00003548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003549 /* fast path for single-digit multiplication */
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003550 if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 stwodigits v = (stwodigits)(MEDIUM_VALUE(a)) * MEDIUM_VALUE(b);
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003552 return PyLong_FromLongLong((long long)v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00003554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 z = k_mul(a, b);
3556 /* Negate if exactly one of the inputs is negative. */
Victor Stinner8aed6f12013-07-17 22:31:17 +02003557 if (((Py_SIZE(a) ^ Py_SIZE(b)) < 0) && z) {
3558 _PyLong_Negate(&z);
3559 if (z == NULL)
3560 return NULL;
3561 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003562 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003563}
3564
Yury Selivanove0b23092016-02-11 10:26:27 -05003565/* Fast modulo division for single-digit longs. */
3566static PyObject *
3567fast_mod(PyLongObject *a, PyLongObject *b)
3568{
3569 sdigit left = a->ob_digit[0];
3570 sdigit right = b->ob_digit[0];
3571 sdigit mod;
3572
3573 assert(Py_ABS(Py_SIZE(a)) == 1);
3574 assert(Py_ABS(Py_SIZE(b)) == 1);
3575
3576 if (Py_SIZE(a) == Py_SIZE(b)) {
3577 /* 'a' and 'b' have the same sign. */
3578 mod = left % right;
3579 }
3580 else {
3581 /* Either 'a' or 'b' is negative. */
3582 mod = right - 1 - (left - 1) % right;
3583 }
3584
Victor Stinnerf963c132016-03-23 18:36:54 +01003585 return PyLong_FromLong(mod * (sdigit)Py_SIZE(b));
Yury Selivanove0b23092016-02-11 10:26:27 -05003586}
3587
3588/* Fast floor division for single-digit longs. */
3589static PyObject *
3590fast_floor_div(PyLongObject *a, PyLongObject *b)
3591{
3592 sdigit left = a->ob_digit[0];
3593 sdigit right = b->ob_digit[0];
3594 sdigit div;
3595
3596 assert(Py_ABS(Py_SIZE(a)) == 1);
3597 assert(Py_ABS(Py_SIZE(b)) == 1);
3598
3599 if (Py_SIZE(a) == Py_SIZE(b)) {
3600 /* 'a' and 'b' have the same sign. */
3601 div = left / right;
3602 }
3603 else {
3604 /* Either 'a' or 'b' is negative. */
3605 div = -1 - (left - 1) / right;
3606 }
3607
3608 return PyLong_FromLong(div);
3609}
3610
Guido van Rossume32e0141992-01-19 16:31:05 +00003611/* The / and % operators are now defined in terms of divmod().
3612 The expression a mod b has the value a - b*floor(a/b).
3613 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003614 |a| by |b|, with the sign of a. This is also expressed
3615 as a - b*trunc(a/b), if trunc truncates towards zero.
3616 Some examples:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003617 a b a rem b a mod b
3618 13 10 3 3
3619 -13 10 -3 7
3620 13 -10 3 -7
3621 -13 -10 -3 -3
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003622 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00003623 have different signs. We then subtract one from the 'div'
3624 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003625
Tim Peters47e52ee2004-08-30 02:44:38 +00003626/* Compute
3627 * *pdiv, *pmod = divmod(v, w)
3628 * NULL can be passed for pdiv or pmod, in which case that part of
3629 * the result is simply thrown away. The caller owns a reference to
3630 * each of these it requests (does not pass NULL for).
3631 */
Guido van Rossume32e0141992-01-19 16:31:05 +00003632static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00003633l_divmod(PyLongObject *v, PyLongObject *w,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003634 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00003635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003636 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003637
Yury Selivanove0b23092016-02-11 10:26:27 -05003638 if (Py_ABS(Py_SIZE(v)) == 1 && Py_ABS(Py_SIZE(w)) == 1) {
3639 /* Fast path for single-digit longs */
3640 div = NULL;
3641 if (pdiv != NULL) {
3642 div = (PyLongObject *)fast_floor_div(v, w);
3643 if (div == NULL) {
3644 return -1;
3645 }
3646 }
3647 if (pmod != NULL) {
3648 mod = (PyLongObject *)fast_mod(v, w);
3649 if (mod == NULL) {
3650 Py_XDECREF(div);
3651 return -1;
3652 }
3653 *pmod = mod;
3654 }
3655 if (pdiv != NULL) {
3656 /* We only want to set `*pdiv` when `*pmod` is
3657 set successfully. */
3658 *pdiv = div;
3659 }
3660 return 0;
3661 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003662 if (long_divrem(v, w, &div, &mod) < 0)
3663 return -1;
3664 if ((Py_SIZE(mod) < 0 && Py_SIZE(w) > 0) ||
3665 (Py_SIZE(mod) > 0 && Py_SIZE(w) < 0)) {
3666 PyLongObject *temp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003667 temp = (PyLongObject *) long_add(mod, w);
3668 Py_DECREF(mod);
3669 mod = temp;
3670 if (mod == NULL) {
3671 Py_DECREF(div);
3672 return -1;
3673 }
Serhiy Storchakaba85d692017-03-30 09:09:41 +03003674 temp = (PyLongObject *) long_sub(div, (PyLongObject *)_PyLong_One);
3675 if (temp == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 Py_DECREF(mod);
3677 Py_DECREF(div);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003678 return -1;
3679 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 Py_DECREF(div);
3681 div = temp;
3682 }
3683 if (pdiv != NULL)
3684 *pdiv = div;
3685 else
3686 Py_DECREF(div);
Tim Peters47e52ee2004-08-30 02:44:38 +00003687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003688 if (pmod != NULL)
3689 *pmod = mod;
3690 else
3691 Py_DECREF(mod);
Tim Peters47e52ee2004-08-30 02:44:38 +00003692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003693 return 0;
Guido van Rossume32e0141992-01-19 16:31:05 +00003694}
3695
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003696static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003697long_div(PyObject *a, PyObject *b)
Guido van Rossume32e0141992-01-19 16:31:05 +00003698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003699 PyLongObject *div;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003701 CHECK_BINOP(a, b);
Yury Selivanove0b23092016-02-11 10:26:27 -05003702
3703 if (Py_ABS(Py_SIZE(a)) == 1 && Py_ABS(Py_SIZE(b)) == 1) {
3704 return fast_floor_div((PyLongObject*)a, (PyLongObject*)b);
3705 }
3706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003707 if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, NULL) < 0)
3708 div = NULL;
3709 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00003710}
3711
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003712/* PyLong/PyLong -> float, with correctly rounded result. */
3713
3714#define MANT_DIG_DIGITS (DBL_MANT_DIG / PyLong_SHIFT)
3715#define MANT_DIG_BITS (DBL_MANT_DIG % PyLong_SHIFT)
3716
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003717static PyObject *
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003718long_true_divide(PyObject *v, PyObject *w)
Tim Peters20dab9f2001-09-04 05:31:47 +00003719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003720 PyLongObject *a, *b, *x;
3721 Py_ssize_t a_size, b_size, shift, extra_bits, diff, x_size, x_bits;
3722 digit mask, low;
3723 int inexact, negate, a_is_small, b_is_small;
3724 double dx, result;
Tim Peterse2a60002001-09-04 06:17:36 +00003725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003726 CHECK_BINOP(v, w);
3727 a = (PyLongObject *)v;
3728 b = (PyLongObject *)w;
Tim Peterse2a60002001-09-04 06:17:36 +00003729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003730 /*
3731 Method in a nutshell:
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003733 0. reduce to case a, b > 0; filter out obvious underflow/overflow
3734 1. choose a suitable integer 'shift'
3735 2. use integer arithmetic to compute x = floor(2**-shift*a/b)
3736 3. adjust x for correct rounding
3737 4. convert x to a double dx with the same value
3738 5. return ldexp(dx, shift).
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 In more detail:
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 0. For any a, a/0 raises ZeroDivisionError; for nonzero b, 0/b
3743 returns either 0.0 or -0.0, depending on the sign of b. For a and
3744 b both nonzero, ignore signs of a and b, and add the sign back in
3745 at the end. Now write a_bits and b_bits for the bit lengths of a
3746 and b respectively (that is, a_bits = 1 + floor(log_2(a)); likewise
3747 for b). Then
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 2**(a_bits - b_bits - 1) < a/b < 2**(a_bits - b_bits + 1).
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003751 So if a_bits - b_bits > DBL_MAX_EXP then a/b > 2**DBL_MAX_EXP and
3752 so overflows. Similarly, if a_bits - b_bits < DBL_MIN_EXP -
3753 DBL_MANT_DIG - 1 then a/b underflows to 0. With these cases out of
3754 the way, we can assume that
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003756 DBL_MIN_EXP - DBL_MANT_DIG - 1 <= a_bits - b_bits <= DBL_MAX_EXP.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 1. The integer 'shift' is chosen so that x has the right number of
3759 bits for a double, plus two or three extra bits that will be used
3760 in the rounding decisions. Writing a_bits and b_bits for the
3761 number of significant bits in a and b respectively, a
3762 straightforward formula for shift is:
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003764 shift = a_bits - b_bits - DBL_MANT_DIG - 2
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 This is fine in the usual case, but if a/b is smaller than the
3767 smallest normal float then it can lead to double rounding on an
3768 IEEE 754 platform, giving incorrectly rounded results. So we
3769 adjust the formula slightly. The actual formula used is:
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003771 shift = MAX(a_bits - b_bits, DBL_MIN_EXP) - DBL_MANT_DIG - 2
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003773 2. The quantity x is computed by first shifting a (left -shift bits
3774 if shift <= 0, right shift bits if shift > 0) and then dividing by
3775 b. For both the shift and the division, we keep track of whether
3776 the result is inexact, in a flag 'inexact'; this information is
3777 needed at the rounding stage.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003779 With the choice of shift above, together with our assumption that
3780 a_bits - b_bits >= DBL_MIN_EXP - DBL_MANT_DIG - 1, it follows
3781 that x >= 1.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003783 3. Now x * 2**shift <= a/b < (x+1) * 2**shift. We want to replace
3784 this with an exactly representable float of the form
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 round(x/2**extra_bits) * 2**(extra_bits+shift).
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003788 For float representability, we need x/2**extra_bits <
3789 2**DBL_MANT_DIG and extra_bits + shift >= DBL_MIN_EXP -
3790 DBL_MANT_DIG. This translates to the condition:
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003792 extra_bits >= MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003794 To round, we just modify the bottom digit of x in-place; this can
3795 end up giving a digit with value > PyLONG_MASK, but that's not a
3796 problem since digits can hold values up to 2*PyLONG_MASK+1.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003798 With the original choices for shift above, extra_bits will always
3799 be 2 or 3. Then rounding under the round-half-to-even rule, we
3800 round up iff the most significant of the extra bits is 1, and
3801 either: (a) the computation of x in step 2 had an inexact result,
3802 or (b) at least one other of the extra bits is 1, or (c) the least
3803 significant bit of x (above those to be rounded) is 1.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 4. Conversion to a double is straightforward; all floating-point
3806 operations involved in the conversion are exact, so there's no
3807 danger of rounding errors.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003809 5. Use ldexp(x, shift) to compute x*2**shift, the final result.
3810 The result will always be exactly representable as a double, except
3811 in the case that it overflows. To avoid dependence on the exact
3812 behaviour of ldexp on overflow, we check for overflow before
3813 applying ldexp. The result of ldexp is adjusted for sign before
3814 returning.
3815 */
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003817 /* Reduce to case where a and b are both positive. */
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003818 a_size = Py_ABS(Py_SIZE(a));
3819 b_size = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003820 negate = (Py_SIZE(a) < 0) ^ (Py_SIZE(b) < 0);
3821 if (b_size == 0) {
3822 PyErr_SetString(PyExc_ZeroDivisionError,
3823 "division by zero");
3824 goto error;
3825 }
3826 if (a_size == 0)
3827 goto underflow_or_zero;
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003829 /* Fast path for a and b small (exactly representable in a double).
3830 Relies on floating-point division being correctly rounded; results
3831 may be subject to double rounding on x86 machines that operate with
3832 the x87 FPU set to 64-bit precision. */
3833 a_is_small = a_size <= MANT_DIG_DIGITS ||
3834 (a_size == MANT_DIG_DIGITS+1 &&
3835 a->ob_digit[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0);
3836 b_is_small = b_size <= MANT_DIG_DIGITS ||
3837 (b_size == MANT_DIG_DIGITS+1 &&
3838 b->ob_digit[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0);
3839 if (a_is_small && b_is_small) {
3840 double da, db;
3841 da = a->ob_digit[--a_size];
3842 while (a_size > 0)
3843 da = da * PyLong_BASE + a->ob_digit[--a_size];
3844 db = b->ob_digit[--b_size];
3845 while (b_size > 0)
3846 db = db * PyLong_BASE + b->ob_digit[--b_size];
3847 result = da / db;
3848 goto success;
3849 }
Tim Peterse2a60002001-09-04 06:17:36 +00003850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003851 /* Catch obvious cases of underflow and overflow */
3852 diff = a_size - b_size;
3853 if (diff > PY_SSIZE_T_MAX/PyLong_SHIFT - 1)
3854 /* Extreme overflow */
3855 goto overflow;
3856 else if (diff < 1 - PY_SSIZE_T_MAX/PyLong_SHIFT)
3857 /* Extreme underflow */
3858 goto underflow_or_zero;
3859 /* Next line is now safe from overflowing a Py_ssize_t */
Niklas Fiekasc5b79002020-01-16 15:09:19 +01003860 diff = diff * PyLong_SHIFT + _Py_bit_length(a->ob_digit[a_size - 1]) -
3861 _Py_bit_length(b->ob_digit[b_size - 1]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 /* Now diff = a_bits - b_bits. */
3863 if (diff > DBL_MAX_EXP)
3864 goto overflow;
3865 else if (diff < DBL_MIN_EXP - DBL_MANT_DIG - 1)
3866 goto underflow_or_zero;
Tim Peterse2a60002001-09-04 06:17:36 +00003867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 /* Choose value for shift; see comments for step 1 above. */
Victor Stinner640c35c2013-06-04 23:14:37 +02003869 shift = Py_MAX(diff, DBL_MIN_EXP) - DBL_MANT_DIG - 2;
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 inexact = 0;
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003873 /* x = abs(a * 2**-shift) */
3874 if (shift <= 0) {
3875 Py_ssize_t i, shift_digits = -shift / PyLong_SHIFT;
3876 digit rem;
3877 /* x = a << -shift */
3878 if (a_size >= PY_SSIZE_T_MAX - 1 - shift_digits) {
3879 /* In practice, it's probably impossible to end up
3880 here. Both a and b would have to be enormous,
3881 using close to SIZE_T_MAX bytes of memory each. */
3882 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson22b20182010-05-10 21:27:53 +00003883 "intermediate overflow during division");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003884 goto error;
3885 }
3886 x = _PyLong_New(a_size + shift_digits + 1);
3887 if (x == NULL)
3888 goto error;
3889 for (i = 0; i < shift_digits; i++)
3890 x->ob_digit[i] = 0;
3891 rem = v_lshift(x->ob_digit + shift_digits, a->ob_digit,
3892 a_size, -shift % PyLong_SHIFT);
3893 x->ob_digit[a_size + shift_digits] = rem;
3894 }
3895 else {
3896 Py_ssize_t shift_digits = shift / PyLong_SHIFT;
3897 digit rem;
3898 /* x = a >> shift */
3899 assert(a_size >= shift_digits);
3900 x = _PyLong_New(a_size - shift_digits);
3901 if (x == NULL)
3902 goto error;
3903 rem = v_rshift(x->ob_digit, a->ob_digit + shift_digits,
3904 a_size - shift_digits, shift % PyLong_SHIFT);
3905 /* set inexact if any of the bits shifted out is nonzero */
3906 if (rem)
3907 inexact = 1;
3908 while (!inexact && shift_digits > 0)
3909 if (a->ob_digit[--shift_digits])
3910 inexact = 1;
3911 }
3912 long_normalize(x);
3913 x_size = Py_SIZE(x);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003915 /* x //= b. If the remainder is nonzero, set inexact. We own the only
3916 reference to x, so it's safe to modify it in-place. */
3917 if (b_size == 1) {
3918 digit rem = inplace_divrem1(x->ob_digit, x->ob_digit, x_size,
3919 b->ob_digit[0]);
3920 long_normalize(x);
3921 if (rem)
3922 inexact = 1;
3923 }
3924 else {
3925 PyLongObject *div, *rem;
3926 div = x_divrem(x, b, &rem);
3927 Py_DECREF(x);
3928 x = div;
3929 if (x == NULL)
3930 goto error;
3931 if (Py_SIZE(rem))
3932 inexact = 1;
3933 Py_DECREF(rem);
3934 }
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003935 x_size = Py_ABS(Py_SIZE(x));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003936 assert(x_size > 0); /* result of division is never zero */
Niklas Fiekasc5b79002020-01-16 15:09:19 +01003937 x_bits = (x_size-1)*PyLong_SHIFT+_Py_bit_length(x->ob_digit[x_size-1]);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003939 /* The number of extra bits that have to be rounded away. */
Victor Stinner640c35c2013-06-04 23:14:37 +02003940 extra_bits = Py_MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003941 assert(extra_bits == 2 || extra_bits == 3);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003943 /* Round by directly modifying the low digit of x. */
3944 mask = (digit)1 << (extra_bits - 1);
3945 low = x->ob_digit[0] | inexact;
Mark Dickinsondc590a42016-08-21 10:23:23 +01003946 if ((low & mask) && (low & (3U*mask-1U)))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003947 low += mask;
Mark Dickinsondc590a42016-08-21 10:23:23 +01003948 x->ob_digit[0] = low & ~(2U*mask-1U);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 /* Convert x to a double dx; the conversion is exact. */
3951 dx = x->ob_digit[--x_size];
3952 while (x_size > 0)
3953 dx = dx * PyLong_BASE + x->ob_digit[--x_size];
3954 Py_DECREF(x);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 /* Check whether ldexp result will overflow a double. */
3957 if (shift + x_bits >= DBL_MAX_EXP &&
3958 (shift + x_bits > DBL_MAX_EXP || dx == ldexp(1.0, (int)x_bits)))
3959 goto overflow;
3960 result = ldexp(dx, (int)shift);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003961
3962 success:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003963 return PyFloat_FromDouble(negate ? -result : result);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003964
3965 underflow_or_zero:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003966 return PyFloat_FromDouble(negate ? -0.0 : 0.0);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003967
3968 overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003969 PyErr_SetString(PyExc_OverflowError,
3970 "integer division result too large for a float");
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003971 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003972 return NULL;
Tim Peters20dab9f2001-09-04 05:31:47 +00003973}
3974
3975static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003976long_mod(PyObject *a, PyObject *b)
Guido van Rossume32e0141992-01-19 16:31:05 +00003977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 PyLongObject *mod;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003980 CHECK_BINOP(a, b);
3981
Yury Selivanove0b23092016-02-11 10:26:27 -05003982 if (Py_ABS(Py_SIZE(a)) == 1 && Py_ABS(Py_SIZE(b)) == 1) {
3983 return fast_mod((PyLongObject*)a, (PyLongObject*)b);
3984 }
3985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003986 if (l_divmod((PyLongObject*)a, (PyLongObject*)b, NULL, &mod) < 0)
3987 mod = NULL;
3988 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00003989}
3990
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003991static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003992long_divmod(PyObject *a, PyObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003993{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003994 PyLongObject *div, *mod;
3995 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003997 CHECK_BINOP(a, b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003999 if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, &mod) < 0) {
4000 return NULL;
4001 }
4002 z = PyTuple_New(2);
4003 if (z != NULL) {
Sergey Fedoseevea6207d2019-02-21 15:01:11 +05004004 PyTuple_SET_ITEM(z, 0, (PyObject *) div);
4005 PyTuple_SET_ITEM(z, 1, (PyObject *) mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004006 }
4007 else {
4008 Py_DECREF(div);
4009 Py_DECREF(mod);
4010 }
4011 return z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004012}
4013
Mark Dickinsonc5299672019-06-02 10:24:06 +01004014
4015/* Compute an inverse to a modulo n, or raise ValueError if a is not
4016 invertible modulo n. Assumes n is positive. The inverse returned
4017 is whatever falls out of the extended Euclidean algorithm: it may
4018 be either positive or negative, but will be smaller than n in
4019 absolute value.
4020
4021 Pure Python equivalent for long_invmod:
4022
4023 def invmod(a, n):
4024 b, c = 1, 0
4025 while n:
4026 q, r = divmod(a, n)
4027 a, b, c, n = n, c, b - q*c, r
4028
4029 # at this point a is the gcd of the original inputs
4030 if a == 1:
4031 return b
4032 raise ValueError("Not invertible")
4033*/
4034
4035static PyLongObject *
4036long_invmod(PyLongObject *a, PyLongObject *n)
4037{
4038 PyLongObject *b, *c;
4039
4040 /* Should only ever be called for positive n */
4041 assert(Py_SIZE(n) > 0);
4042
4043 b = (PyLongObject *)PyLong_FromLong(1L);
4044 if (b == NULL) {
4045 return NULL;
4046 }
4047 c = (PyLongObject *)PyLong_FromLong(0L);
4048 if (c == NULL) {
4049 Py_DECREF(b);
4050 return NULL;
4051 }
4052 Py_INCREF(a);
4053 Py_INCREF(n);
4054
4055 /* references now owned: a, b, c, n */
4056 while (Py_SIZE(n) != 0) {
4057 PyLongObject *q, *r, *s, *t;
4058
4059 if (l_divmod(a, n, &q, &r) == -1) {
4060 goto Error;
4061 }
4062 Py_DECREF(a);
4063 a = n;
4064 n = r;
4065 t = (PyLongObject *)long_mul(q, c);
4066 Py_DECREF(q);
4067 if (t == NULL) {
4068 goto Error;
4069 }
4070 s = (PyLongObject *)long_sub(b, t);
4071 Py_DECREF(t);
4072 if (s == NULL) {
4073 goto Error;
4074 }
4075 Py_DECREF(b);
4076 b = c;
4077 c = s;
4078 }
4079 /* references now owned: a, b, c, n */
4080
4081 Py_DECREF(c);
4082 Py_DECREF(n);
Petr Viktorin1e375c62019-06-03 02:28:29 +02004083 if (long_compare(a, (PyLongObject *)_PyLong_One)) {
Mark Dickinsonc5299672019-06-02 10:24:06 +01004084 /* a != 1; we don't have an inverse. */
4085 Py_DECREF(a);
4086 Py_DECREF(b);
4087 PyErr_SetString(PyExc_ValueError,
4088 "base is not invertible for the given modulus");
4089 return NULL;
4090 }
4091 else {
4092 /* a == 1; b gives an inverse modulo n */
4093 Py_DECREF(a);
4094 return b;
4095 }
4096
4097 Error:
4098 Py_DECREF(a);
4099 Py_DECREF(b);
4100 Py_DECREF(c);
4101 Py_DECREF(n);
4102 return NULL;
4103}
4104
4105
Tim Peters47e52ee2004-08-30 02:44:38 +00004106/* pow(v, w, x) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004107static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00004108long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004110 PyLongObject *a, *b, *c; /* a,b,c = v,w,x */
4111 int negativeOutput = 0; /* if x<0 return negative output */
Neil Schemenauerba872e22001-01-04 01:46:03 +00004112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004113 PyLongObject *z = NULL; /* accumulated result */
4114 Py_ssize_t i, j, k; /* counters */
4115 PyLongObject *temp = NULL;
Tim Peters47e52ee2004-08-30 02:44:38 +00004116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004117 /* 5-ary values. If the exponent is large enough, table is
4118 * precomputed so that table[i] == a**i % c for i in range(32).
4119 */
4120 PyLongObject *table[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4121 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
Tim Peters47e52ee2004-08-30 02:44:38 +00004122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 /* a, b, c = v, w, x */
4124 CHECK_BINOP(v, w);
4125 a = (PyLongObject*)v; Py_INCREF(a);
4126 b = (PyLongObject*)w; Py_INCREF(b);
4127 if (PyLong_Check(x)) {
4128 c = (PyLongObject *)x;
4129 Py_INCREF(x);
4130 }
4131 else if (x == Py_None)
4132 c = NULL;
4133 else {
4134 Py_DECREF(a);
4135 Py_DECREF(b);
Brian Curtindfc80e32011-08-10 20:28:54 -05004136 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 }
Tim Peters4c483c42001-09-05 06:24:58 +00004138
Mark Dickinsonc5299672019-06-02 10:24:06 +01004139 if (Py_SIZE(b) < 0 && c == NULL) {
4140 /* if exponent is negative and there's no modulus:
4141 return a float. This works because we know
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004142 that this calls float_pow() which converts its
4143 arguments to double. */
Mark Dickinsonc5299672019-06-02 10:24:06 +01004144 Py_DECREF(a);
4145 Py_DECREF(b);
4146 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004147 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004149 if (c) {
4150 /* if modulus == 0:
4151 raise ValueError() */
4152 if (Py_SIZE(c) == 0) {
4153 PyErr_SetString(PyExc_ValueError,
4154 "pow() 3rd argument cannot be 0");
4155 goto Error;
4156 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004158 /* if modulus < 0:
4159 negativeOutput = True
4160 modulus = -modulus */
4161 if (Py_SIZE(c) < 0) {
4162 negativeOutput = 1;
4163 temp = (PyLongObject *)_PyLong_Copy(c);
4164 if (temp == NULL)
4165 goto Error;
4166 Py_DECREF(c);
4167 c = temp;
4168 temp = NULL;
Victor Stinner8aed6f12013-07-17 22:31:17 +02004169 _PyLong_Negate(&c);
4170 if (c == NULL)
4171 goto Error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004172 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 /* if modulus == 1:
4175 return 0 */
4176 if ((Py_SIZE(c) == 1) && (c->ob_digit[0] == 1)) {
4177 z = (PyLongObject *)PyLong_FromLong(0L);
4178 goto Done;
4179 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004180
Mark Dickinsonc5299672019-06-02 10:24:06 +01004181 /* if exponent is negative, negate the exponent and
4182 replace the base with a modular inverse */
4183 if (Py_SIZE(b) < 0) {
4184 temp = (PyLongObject *)_PyLong_Copy(b);
4185 if (temp == NULL)
4186 goto Error;
4187 Py_DECREF(b);
4188 b = temp;
4189 temp = NULL;
4190 _PyLong_Negate(&b);
4191 if (b == NULL)
4192 goto Error;
4193
4194 temp = long_invmod(a, c);
4195 if (temp == NULL)
4196 goto Error;
4197 Py_DECREF(a);
4198 a = temp;
4199 }
4200
Tim Peters81a93152013-10-05 16:53:52 -05004201 /* Reduce base by modulus in some cases:
4202 1. If base < 0. Forcing the base non-negative makes things easier.
4203 2. If base is obviously larger than the modulus. The "small
4204 exponent" case later can multiply directly by base repeatedly,
4205 while the "large exponent" case multiplies directly by base 31
4206 times. It can be unboundedly faster to multiply by
4207 base % modulus instead.
4208 We could _always_ do this reduction, but l_divmod() isn't cheap,
4209 so we only do it when it buys something. */
4210 if (Py_SIZE(a) < 0 || Py_SIZE(a) > Py_SIZE(c)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004211 if (l_divmod(a, c, NULL, &temp) < 0)
4212 goto Error;
4213 Py_DECREF(a);
4214 a = temp;
4215 temp = NULL;
4216 }
4217 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004219 /* At this point a, b, and c are guaranteed non-negative UNLESS
4220 c is NULL, in which case a may be negative. */
Tim Peters47e52ee2004-08-30 02:44:38 +00004221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 z = (PyLongObject *)PyLong_FromLong(1L);
4223 if (z == NULL)
4224 goto Error;
Tim Peters47e52ee2004-08-30 02:44:38 +00004225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004226 /* Perform a modular reduction, X = X % c, but leave X alone if c
4227 * is NULL.
4228 */
4229#define REDUCE(X) \
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004230 do { \
4231 if (c != NULL) { \
4232 if (l_divmod(X, c, NULL, &temp) < 0) \
4233 goto Error; \
4234 Py_XDECREF(X); \
4235 X = temp; \
4236 temp = NULL; \
4237 } \
4238 } while(0)
Tim Peters47e52ee2004-08-30 02:44:38 +00004239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004240 /* Multiply two values, then reduce the result:
4241 result = X*Y % c. If c is NULL, skip the mod. */
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004242#define MULT(X, Y, result) \
4243 do { \
4244 temp = (PyLongObject *)long_mul(X, Y); \
4245 if (temp == NULL) \
4246 goto Error; \
4247 Py_XDECREF(result); \
4248 result = temp; \
4249 temp = NULL; \
4250 REDUCE(result); \
4251 } while(0)
Tim Peters47e52ee2004-08-30 02:44:38 +00004252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004253 if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
4254 /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
4255 /* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf */
4256 for (i = Py_SIZE(b) - 1; i >= 0; --i) {
4257 digit bi = b->ob_digit[i];
Tim Peters47e52ee2004-08-30 02:44:38 +00004258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004259 for (j = (digit)1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004260 MULT(z, z, z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 if (bi & j)
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004262 MULT(z, a, z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004263 }
4264 }
4265 }
4266 else {
4267 /* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */
4268 Py_INCREF(z); /* still holds 1L */
4269 table[0] = z;
4270 for (i = 1; i < 32; ++i)
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004271 MULT(table[i-1], a, table[i]);
Tim Peters47e52ee2004-08-30 02:44:38 +00004272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004273 for (i = Py_SIZE(b) - 1; i >= 0; --i) {
4274 const digit bi = b->ob_digit[i];
Tim Peters47e52ee2004-08-30 02:44:38 +00004275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
4277 const int index = (bi >> j) & 0x1f;
4278 for (k = 0; k < 5; ++k)
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004279 MULT(z, z, z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004280 if (index)
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004281 MULT(z, table[index], z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004282 }
4283 }
4284 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004286 if (negativeOutput && (Py_SIZE(z) != 0)) {
4287 temp = (PyLongObject *)long_sub(z, c);
4288 if (temp == NULL)
4289 goto Error;
4290 Py_DECREF(z);
4291 z = temp;
4292 temp = NULL;
4293 }
4294 goto Done;
Tim Peters47e52ee2004-08-30 02:44:38 +00004295
Mark Dickinson22b20182010-05-10 21:27:53 +00004296 Error:
Victor Stinner8aed6f12013-07-17 22:31:17 +02004297 Py_CLEAR(z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 /* fall through */
Mark Dickinson22b20182010-05-10 21:27:53 +00004299 Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 if (Py_SIZE(b) > FIVEARY_CUTOFF) {
4301 for (i = 0; i < 32; ++i)
4302 Py_XDECREF(table[i]);
4303 }
4304 Py_DECREF(a);
4305 Py_DECREF(b);
4306 Py_XDECREF(c);
4307 Py_XDECREF(temp);
4308 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004309}
4310
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004311static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00004312long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 /* Implement ~x as -(x+1) */
4315 PyLongObject *x;
Victor Stinner45e8e2f2014-05-14 17:24:35 +02004316 if (Py_ABS(Py_SIZE(v)) <=1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 return PyLong_FromLong(-(MEDIUM_VALUE(v)+1));
Serhiy Storchakaba85d692017-03-30 09:09:41 +03004318 x = (PyLongObject *) long_add(v, (PyLongObject *)_PyLong_One);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 if (x == NULL)
4320 return NULL;
Mark Dickinson583c6e82016-08-29 16:40:29 +01004321 _PyLong_Negate(&x);
4322 /* No need for maybe_small_long here, since any small
4323 longs will have been caught in the Py_SIZE <= 1 fast path. */
4324 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004325}
4326
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004327static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00004328long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004330 PyLongObject *z;
Victor Stinner45e8e2f2014-05-14 17:24:35 +02004331 if (Py_ABS(Py_SIZE(v)) <= 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004332 return PyLong_FromLong(-MEDIUM_VALUE(v));
4333 z = (PyLongObject *)_PyLong_Copy(v);
4334 if (z != NULL)
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004335 Py_SET_SIZE(z, -(Py_SIZE(v)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00004337}
4338
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004339static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00004340long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004342 if (Py_SIZE(v) < 0)
4343 return long_neg(v);
4344 else
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03004345 return long_long((PyObject *)v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004346}
4347
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004348static int
Jack Diederich4dafcc42006-11-28 19:15:13 +00004349long_bool(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 return Py_SIZE(v) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00004352}
4353
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004354/* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
4355static int
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004356divmod_shift(PyObject *shiftby, Py_ssize_t *wordshift, digit *remshift)
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004357{
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004358 assert(PyLong_Check(shiftby));
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004359 assert(Py_SIZE(shiftby) >= 0);
4360 Py_ssize_t lshiftby = PyLong_AsSsize_t((PyObject *)shiftby);
4361 if (lshiftby >= 0) {
4362 *wordshift = lshiftby / PyLong_SHIFT;
4363 *remshift = lshiftby % PyLong_SHIFT;
4364 return 0;
4365 }
4366 /* PyLong_Check(shiftby) is true and Py_SIZE(shiftby) >= 0, so it must
4367 be that PyLong_AsSsize_t raised an OverflowError. */
4368 assert(PyErr_ExceptionMatches(PyExc_OverflowError));
4369 PyErr_Clear();
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004370 PyLongObject *wordshift_obj = divrem1((PyLongObject *)shiftby, PyLong_SHIFT, remshift);
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004371 if (wordshift_obj == NULL) {
4372 return -1;
4373 }
4374 *wordshift = PyLong_AsSsize_t((PyObject *)wordshift_obj);
4375 Py_DECREF(wordshift_obj);
4376 if (*wordshift >= 0 && *wordshift < PY_SSIZE_T_MAX / (Py_ssize_t)sizeof(digit)) {
4377 return 0;
4378 }
4379 PyErr_Clear();
4380 /* Clip the value. With such large wordshift the right shift
4381 returns 0 and the left shift raises an error in _PyLong_New(). */
4382 *wordshift = PY_SSIZE_T_MAX / sizeof(digit);
4383 *remshift = 0;
4384 return 0;
4385}
4386
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004387static PyObject *
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004388long_rshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004390 PyLongObject *z = NULL;
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004391 Py_ssize_t newsize, hishift, i, j;
4392 digit lomask, himask;
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004394 if (Py_SIZE(a) < 0) {
4395 /* Right shifting negative numbers is harder */
4396 PyLongObject *a1, *a2;
4397 a1 = (PyLongObject *) long_invert(a);
4398 if (a1 == NULL)
Mark Dickinson92ca5352016-09-17 17:50:50 +01004399 return NULL;
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004400 a2 = (PyLongObject *) long_rshift1(a1, wordshift, remshift);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 Py_DECREF(a1);
4402 if (a2 == NULL)
Mark Dickinson92ca5352016-09-17 17:50:50 +01004403 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 z = (PyLongObject *) long_invert(a2);
4405 Py_DECREF(a2);
4406 }
4407 else {
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004408 newsize = Py_SIZE(a) - wordshift;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004409 if (newsize <= 0)
4410 return PyLong_FromLong(0);
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004411 hishift = PyLong_SHIFT - remshift;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004412 lomask = ((digit)1 << hishift) - 1;
4413 himask = PyLong_MASK ^ lomask;
4414 z = _PyLong_New(newsize);
4415 if (z == NULL)
Mark Dickinson92ca5352016-09-17 17:50:50 +01004416 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 for (i = 0, j = wordshift; i < newsize; i++, j++) {
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004418 z->ob_digit[i] = (a->ob_digit[j] >> remshift) & lomask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004419 if (i+1 < newsize)
Mark Dickinson22b20182010-05-10 21:27:53 +00004420 z->ob_digit[i] |= (a->ob_digit[j+1] << hishift) & himask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004421 }
Mark Dickinson92ca5352016-09-17 17:50:50 +01004422 z = maybe_small_long(long_normalize(z));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 }
Mark Dickinson92ca5352016-09-17 17:50:50 +01004424 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00004425}
4426
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004427static PyObject *
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004428long_rshift(PyObject *a, PyObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004429{
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004430 Py_ssize_t wordshift;
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004431 digit remshift;
Tim Peters5af4e6c2002-08-12 02:31:19 +00004432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004433 CHECK_BINOP(a, b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00004434
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004435 if (Py_SIZE(b) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 PyErr_SetString(PyExc_ValueError, "negative shift count");
Victor Stinner8aed6f12013-07-17 22:31:17 +02004437 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004438 }
Mark Dickinson82a95272016-08-29 19:27:06 +01004439 if (Py_SIZE(a) == 0) {
4440 return PyLong_FromLong(0);
4441 }
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004442 if (divmod_shift(b, &wordshift, &remshift) < 0)
4443 return NULL;
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004444 return long_rshift1((PyLongObject *)a, wordshift, remshift);
4445}
4446
4447/* Return a >> shiftby. */
4448PyObject *
4449_PyLong_Rshift(PyObject *a, size_t shiftby)
4450{
4451 Py_ssize_t wordshift;
4452 digit remshift;
4453
4454 assert(PyLong_Check(a));
4455 if (Py_SIZE(a) == 0) {
4456 return PyLong_FromLong(0);
4457 }
4458 wordshift = shiftby / PyLong_SHIFT;
4459 remshift = shiftby % PyLong_SHIFT;
4460 return long_rshift1((PyLongObject *)a, wordshift, remshift);
4461}
4462
4463static PyObject *
4464long_lshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift)
4465{
4466 /* This version due to Tim Peters */
4467 PyLongObject *z = NULL;
4468 Py_ssize_t oldsize, newsize, i, j;
4469 twodigits accum;
4470
Victor Stinner45e8e2f2014-05-14 17:24:35 +02004471 oldsize = Py_ABS(Py_SIZE(a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004472 newsize = oldsize + wordshift;
4473 if (remshift)
4474 ++newsize;
4475 z = _PyLong_New(newsize);
4476 if (z == NULL)
Victor Stinner8aed6f12013-07-17 22:31:17 +02004477 return NULL;
4478 if (Py_SIZE(a) < 0) {
4479 assert(Py_REFCNT(z) == 1);
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004480 Py_SET_SIZE(z, -Py_SIZE(z));
Victor Stinner8aed6f12013-07-17 22:31:17 +02004481 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004482 for (i = 0; i < wordshift; i++)
4483 z->ob_digit[i] = 0;
4484 accum = 0;
4485 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
4486 accum |= (twodigits)a->ob_digit[j] << remshift;
4487 z->ob_digit[i] = (digit)(accum & PyLong_MASK);
4488 accum >>= PyLong_SHIFT;
4489 }
4490 if (remshift)
4491 z->ob_digit[newsize-1] = (digit)accum;
4492 else
4493 assert(!accum);
4494 z = long_normalize(z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004495 return (PyObject *) maybe_small_long(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00004496}
4497
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03004498static PyObject *
4499long_lshift(PyObject *a, PyObject *b)
4500{
4501 Py_ssize_t wordshift;
4502 digit remshift;
4503
4504 CHECK_BINOP(a, b);
4505
4506 if (Py_SIZE(b) < 0) {
4507 PyErr_SetString(PyExc_ValueError, "negative shift count");
4508 return NULL;
4509 }
4510 if (Py_SIZE(a) == 0) {
4511 return PyLong_FromLong(0);
4512 }
4513 if (divmod_shift(b, &wordshift, &remshift) < 0)
4514 return NULL;
4515 return long_lshift1((PyLongObject *)a, wordshift, remshift);
4516}
4517
4518/* Return a << shiftby. */
4519PyObject *
4520_PyLong_Lshift(PyObject *a, size_t shiftby)
4521{
4522 Py_ssize_t wordshift;
4523 digit remshift;
4524
4525 assert(PyLong_Check(a));
4526 if (Py_SIZE(a) == 0) {
4527 return PyLong_FromLong(0);
4528 }
4529 wordshift = shiftby / PyLong_SHIFT;
4530 remshift = shiftby % PyLong_SHIFT;
4531 return long_lshift1((PyLongObject *)a, wordshift, remshift);
4532}
4533
Mark Dickinson27a87a22009-10-25 20:43:34 +00004534/* Compute two's complement of digit vector a[0:m], writing result to
4535 z[0:m]. The digit vector a need not be normalized, but should not
4536 be entirely zero. a and z may point to the same digit vector. */
4537
4538static void
4539v_complement(digit *z, digit *a, Py_ssize_t m)
4540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 Py_ssize_t i;
4542 digit carry = 1;
4543 for (i = 0; i < m; ++i) {
4544 carry += a[i] ^ PyLong_MASK;
4545 z[i] = carry & PyLong_MASK;
4546 carry >>= PyLong_SHIFT;
4547 }
4548 assert(carry == 0);
Mark Dickinson27a87a22009-10-25 20:43:34 +00004549}
Guido van Rossum4c260ff1992-01-14 18:36:43 +00004550
4551/* Bitwise and/xor/or operations */
4552
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004553static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00004554long_bitwise(PyLongObject *a,
Benjamin Peterson513762f2012-12-26 16:43:33 -06004555 char op, /* '&', '|', '^' */
Mark Dickinson22b20182010-05-10 21:27:53 +00004556 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004557{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004558 int nega, negb, negz;
4559 Py_ssize_t size_a, size_b, size_z, i;
4560 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00004561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 /* Bitwise operations for negative numbers operate as though
4563 on a two's complement representation. So convert arguments
4564 from sign-magnitude to two's complement, and convert the
4565 result back to sign-magnitude at the end. */
Mark Dickinson27a87a22009-10-25 20:43:34 +00004566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004567 /* If a is negative, replace it by its two's complement. */
Victor Stinner45e8e2f2014-05-14 17:24:35 +02004568 size_a = Py_ABS(Py_SIZE(a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 nega = Py_SIZE(a) < 0;
4570 if (nega) {
4571 z = _PyLong_New(size_a);
4572 if (z == NULL)
4573 return NULL;
4574 v_complement(z->ob_digit, a->ob_digit, size_a);
4575 a = z;
4576 }
4577 else
4578 /* Keep reference count consistent. */
4579 Py_INCREF(a);
Mark Dickinson27a87a22009-10-25 20:43:34 +00004580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004581 /* Same for b. */
Victor Stinner45e8e2f2014-05-14 17:24:35 +02004582 size_b = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 negb = Py_SIZE(b) < 0;
4584 if (negb) {
4585 z = _PyLong_New(size_b);
4586 if (z == NULL) {
4587 Py_DECREF(a);
4588 return NULL;
4589 }
4590 v_complement(z->ob_digit, b->ob_digit, size_b);
4591 b = z;
4592 }
4593 else
4594 Py_INCREF(b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00004595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004596 /* Swap a and b if necessary to ensure size_a >= size_b. */
4597 if (size_a < size_b) {
4598 z = a; a = b; b = z;
4599 size_z = size_a; size_a = size_b; size_b = size_z;
4600 negz = nega; nega = negb; negb = negz;
4601 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00004602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 /* JRH: The original logic here was to allocate the result value (z)
4604 as the longer of the two operands. However, there are some cases
4605 where the result is guaranteed to be shorter than that: AND of two
4606 positives, OR of two negatives: use the shorter number. AND with
4607 mixed signs: use the positive number. OR with mixed signs: use the
4608 negative number.
4609 */
4610 switch (op) {
4611 case '^':
4612 negz = nega ^ negb;
4613 size_z = size_a;
4614 break;
4615 case '&':
4616 negz = nega & negb;
4617 size_z = negb ? size_a : size_b;
4618 break;
4619 case '|':
4620 negz = nega | negb;
4621 size_z = negb ? size_b : size_a;
4622 break;
4623 default:
stratakisa10d4262019-03-18 18:59:20 +01004624 Py_UNREACHABLE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +00004626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 /* We allow an extra digit if z is negative, to make sure that
4628 the final two's complement of z doesn't overflow. */
4629 z = _PyLong_New(size_z + negz);
4630 if (z == NULL) {
4631 Py_DECREF(a);
4632 Py_DECREF(b);
4633 return NULL;
4634 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00004635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 /* Compute digits for overlap of a and b. */
4637 switch(op) {
4638 case '&':
4639 for (i = 0; i < size_b; ++i)
4640 z->ob_digit[i] = a->ob_digit[i] & b->ob_digit[i];
4641 break;
4642 case '|':
4643 for (i = 0; i < size_b; ++i)
4644 z->ob_digit[i] = a->ob_digit[i] | b->ob_digit[i];
4645 break;
4646 case '^':
4647 for (i = 0; i < size_b; ++i)
4648 z->ob_digit[i] = a->ob_digit[i] ^ b->ob_digit[i];
4649 break;
4650 default:
stratakisa10d4262019-03-18 18:59:20 +01004651 Py_UNREACHABLE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 }
Mark Dickinson27a87a22009-10-25 20:43:34 +00004653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 /* Copy any remaining digits of a, inverting if necessary. */
4655 if (op == '^' && negb)
4656 for (; i < size_z; ++i)
4657 z->ob_digit[i] = a->ob_digit[i] ^ PyLong_MASK;
4658 else if (i < size_z)
4659 memcpy(&z->ob_digit[i], &a->ob_digit[i],
4660 (size_z-i)*sizeof(digit));
Mark Dickinson27a87a22009-10-25 20:43:34 +00004661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 /* Complement result if negative. */
4663 if (negz) {
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004664 Py_SET_SIZE(z, -(Py_SIZE(z)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 z->ob_digit[size_z] = PyLong_MASK;
4666 v_complement(z->ob_digit, z->ob_digit, size_z+1);
4667 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00004668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 Py_DECREF(a);
4670 Py_DECREF(b);
4671 return (PyObject *)maybe_small_long(long_normalize(z));
Guido van Rossumc6913e71991-11-19 20:26:46 +00004672}
4673
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004674static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00004675long_and(PyObject *a, PyObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004677 PyObject *c;
4678 CHECK_BINOP(a, b);
4679 c = long_bitwise((PyLongObject*)a, '&', (PyLongObject*)b);
4680 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00004681}
4682
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004683static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00004684long_xor(PyObject *a, PyObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004686 PyObject *c;
4687 CHECK_BINOP(a, b);
4688 c = long_bitwise((PyLongObject*)a, '^', (PyLongObject*)b);
4689 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00004690}
4691
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004692static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00004693long_or(PyObject *a, PyObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 PyObject *c;
4696 CHECK_BINOP(a, b);
4697 c = long_bitwise((PyLongObject*)a, '|', (PyLongObject*)b);
4698 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004699}
4700
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004701static PyObject *
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03004702long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00004703{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 if (PyLong_CheckExact(v))
4705 Py_INCREF(v);
4706 else
4707 v = _PyLong_Copy((PyLongObject *)v);
4708 return v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00004709}
4710
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004711PyObject *
4712_PyLong_GCD(PyObject *aarg, PyObject *barg)
4713{
4714 PyLongObject *a, *b, *c = NULL, *d = NULL, *r;
4715 stwodigits x, y, q, s, t, c_carry, d_carry;
4716 stwodigits A, B, C, D, T;
4717 int nbits, k;
4718 Py_ssize_t size_a, size_b, alloc_a, alloc_b;
4719 digit *a_digit, *b_digit, *c_digit, *d_digit, *a_end, *b_end;
4720
4721 a = (PyLongObject *)aarg;
4722 b = (PyLongObject *)barg;
4723 size_a = Py_SIZE(a);
4724 size_b = Py_SIZE(b);
4725 if (-2 <= size_a && size_a <= 2 && -2 <= size_b && size_b <= 2) {
4726 Py_INCREF(a);
4727 Py_INCREF(b);
4728 goto simple;
4729 }
4730
4731 /* Initial reduction: make sure that 0 <= b <= a. */
4732 a = (PyLongObject *)long_abs(a);
4733 if (a == NULL)
4734 return NULL;
4735 b = (PyLongObject *)long_abs(b);
4736 if (b == NULL) {
4737 Py_DECREF(a);
4738 return NULL;
4739 }
4740 if (long_compare(a, b) < 0) {
4741 r = a;
4742 a = b;
4743 b = r;
4744 }
4745 /* We now own references to a and b */
4746
4747 alloc_a = Py_SIZE(a);
4748 alloc_b = Py_SIZE(b);
4749 /* reduce until a fits into 2 digits */
4750 while ((size_a = Py_SIZE(a)) > 2) {
Niklas Fiekasc5b79002020-01-16 15:09:19 +01004751 nbits = _Py_bit_length(a->ob_digit[size_a-1]);
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004752 /* extract top 2*PyLong_SHIFT bits of a into x, along with
4753 corresponding bits of b into y */
4754 size_b = Py_SIZE(b);
4755 assert(size_b <= size_a);
4756 if (size_b == 0) {
4757 if (size_a < alloc_a) {
4758 r = (PyLongObject *)_PyLong_Copy(a);
4759 Py_DECREF(a);
4760 }
4761 else
4762 r = a;
4763 Py_DECREF(b);
4764 Py_XDECREF(c);
4765 Py_XDECREF(d);
4766 return (PyObject *)r;
4767 }
4768 x = (((twodigits)a->ob_digit[size_a-1] << (2*PyLong_SHIFT-nbits)) |
4769 ((twodigits)a->ob_digit[size_a-2] << (PyLong_SHIFT-nbits)) |
4770 (a->ob_digit[size_a-3] >> nbits));
4771
4772 y = ((size_b >= size_a - 2 ? b->ob_digit[size_a-3] >> nbits : 0) |
4773 (size_b >= size_a - 1 ? (twodigits)b->ob_digit[size_a-2] << (PyLong_SHIFT-nbits) : 0) |
4774 (size_b >= size_a ? (twodigits)b->ob_digit[size_a-1] << (2*PyLong_SHIFT-nbits) : 0));
4775
4776 /* inner loop of Lehmer's algorithm; A, B, C, D never grow
4777 larger than PyLong_MASK during the algorithm. */
4778 A = 1; B = 0; C = 0; D = 1;
4779 for (k=0;; k++) {
4780 if (y-C == 0)
4781 break;
4782 q = (x+(A-1))/(y-C);
4783 s = B+q*D;
4784 t = x-q*y;
4785 if (s > t)
4786 break;
4787 x = y; y = t;
4788 t = A+q*C; A = D; B = C; C = s; D = t;
4789 }
4790
4791 if (k == 0) {
4792 /* no progress; do a Euclidean step */
4793 if (l_divmod(a, b, NULL, &r) < 0)
4794 goto error;
4795 Py_DECREF(a);
4796 a = b;
4797 b = r;
4798 alloc_a = alloc_b;
4799 alloc_b = Py_SIZE(b);
4800 continue;
4801 }
4802
4803 /*
4804 a, b = A*b-B*a, D*a-C*b if k is odd
4805 a, b = A*a-B*b, D*b-C*a if k is even
4806 */
4807 if (k&1) {
4808 T = -A; A = -B; B = T;
4809 T = -C; C = -D; D = T;
4810 }
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004811 if (c != NULL) {
4812 Py_SET_SIZE(c, size_a);
4813 }
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004814 else if (Py_REFCNT(a) == 1) {
4815 Py_INCREF(a);
4816 c = a;
4817 }
4818 else {
4819 alloc_a = size_a;
4820 c = _PyLong_New(size_a);
4821 if (c == NULL)
4822 goto error;
4823 }
4824
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004825 if (d != NULL) {
4826 Py_SET_SIZE(d, size_a);
4827 }
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004828 else if (Py_REFCNT(b) == 1 && size_a <= alloc_b) {
4829 Py_INCREF(b);
4830 d = b;
Victor Stinner60ac6ed2020-02-07 23:18:08 +01004831 Py_SET_SIZE(d, size_a);
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004832 }
4833 else {
4834 alloc_b = size_a;
4835 d = _PyLong_New(size_a);
4836 if (d == NULL)
4837 goto error;
4838 }
4839 a_end = a->ob_digit + size_a;
4840 b_end = b->ob_digit + size_b;
4841
4842 /* compute new a and new b in parallel */
4843 a_digit = a->ob_digit;
4844 b_digit = b->ob_digit;
4845 c_digit = c->ob_digit;
4846 d_digit = d->ob_digit;
4847 c_carry = 0;
4848 d_carry = 0;
4849 while (b_digit < b_end) {
4850 c_carry += (A * *a_digit) - (B * *b_digit);
4851 d_carry += (D * *b_digit++) - (C * *a_digit++);
4852 *c_digit++ = (digit)(c_carry & PyLong_MASK);
4853 *d_digit++ = (digit)(d_carry & PyLong_MASK);
4854 c_carry >>= PyLong_SHIFT;
4855 d_carry >>= PyLong_SHIFT;
4856 }
4857 while (a_digit < a_end) {
4858 c_carry += A * *a_digit;
4859 d_carry -= C * *a_digit++;
4860 *c_digit++ = (digit)(c_carry & PyLong_MASK);
4861 *d_digit++ = (digit)(d_carry & PyLong_MASK);
4862 c_carry >>= PyLong_SHIFT;
4863 d_carry >>= PyLong_SHIFT;
4864 }
4865 assert(c_carry == 0);
4866 assert(d_carry == 0);
4867
4868 Py_INCREF(c);
4869 Py_INCREF(d);
4870 Py_DECREF(a);
4871 Py_DECREF(b);
4872 a = long_normalize(c);
4873 b = long_normalize(d);
4874 }
4875 Py_XDECREF(c);
4876 Py_XDECREF(d);
4877
4878simple:
4879 assert(Py_REFCNT(a) > 0);
4880 assert(Py_REFCNT(b) > 0);
Victor Stinner5783fd22015-09-19 13:39:03 +02004881/* Issue #24999: use two shifts instead of ">> 2*PyLong_SHIFT" to avoid
4882 undefined behaviour when LONG_MAX type is smaller than 60 bits */
4883#if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004884 /* a fits into a long, so b must too */
4885 x = PyLong_AsLong((PyObject *)a);
4886 y = PyLong_AsLong((PyObject *)b);
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05004887#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004888 x = PyLong_AsLongLong((PyObject *)a);
4889 y = PyLong_AsLongLong((PyObject *)b);
4890#else
4891# error "_PyLong_GCD"
4892#endif
4893 x = Py_ABS(x);
4894 y = Py_ABS(y);
4895 Py_DECREF(a);
4896 Py_DECREF(b);
4897
4898 /* usual Euclidean algorithm for longs */
4899 while (y != 0) {
4900 t = y;
4901 y = x % y;
4902 x = t;
4903 }
Victor Stinner5783fd22015-09-19 13:39:03 +02004904#if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004905 return PyLong_FromLong(x);
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05004906#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004907 return PyLong_FromLongLong(x);
4908#else
4909# error "_PyLong_GCD"
4910#endif
4911
4912error:
4913 Py_DECREF(a);
4914 Py_DECREF(b);
4915 Py_XDECREF(c);
4916 Py_XDECREF(d);
4917 return NULL;
4918}
4919
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004920static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00004921long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00004922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 double result;
4924 result = PyLong_AsDouble(v);
4925 if (result == -1.0 && PyErr_Occurred())
4926 return NULL;
4927 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00004928}
4929
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004930static PyObject *
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02004931long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase);
4932
4933/*[clinic input]
4934@classmethod
4935int.__new__ as long_new
4936 x: object(c_default="NULL") = 0
4937 /
4938 base as obase: object(c_default="NULL") = 10
4939[clinic start generated code]*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00004940
Tim Peters6d6c1a32001-08-02 04:15:00 +00004941static PyObject *
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02004942long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase)
4943/*[clinic end generated code: output=e47cfe777ab0f24c input=81c98f418af9eb6f]*/
Tim Peters6d6c1a32001-08-02 04:15:00 +00004944{
Gregory P. Smitha689e522012-12-25 22:38:32 -08004945 Py_ssize_t base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947 if (type != &PyLong_Type)
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02004948 return long_subtype_new(type, x, obase); /* Wimp out */
Serhiy Storchaka0b386d52012-12-28 09:42:11 +02004949 if (x == NULL) {
4950 if (obase != NULL) {
4951 PyErr_SetString(PyExc_TypeError,
4952 "int() missing string argument");
4953 return NULL;
4954 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 return PyLong_FromLong(0L);
Serhiy Storchaka0b386d52012-12-28 09:42:11 +02004956 }
Mark Dickinsonf9a5a8e2010-05-26 20:07:58 +00004957 if (obase == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004958 return PyNumber_Long(x);
Mark Dickinsonf9a5a8e2010-05-26 20:07:58 +00004959
Gregory P. Smitha689e522012-12-25 22:38:32 -08004960 base = PyNumber_AsSsize_t(obase, NULL);
Mark Dickinsonf9a5a8e2010-05-26 20:07:58 +00004961 if (base == -1 && PyErr_Occurred())
4962 return NULL;
Gregory P. Smitha689e522012-12-25 22:38:32 -08004963 if ((base != 0 && base < 2) || base > 36) {
Mark Dickinsonf9a5a8e2010-05-26 20:07:58 +00004964 PyErr_SetString(PyExc_ValueError,
Sanyam Khurana28b62482017-11-14 03:19:26 +05304965 "int() base must be >= 2 and <= 36, or 0");
Mark Dickinsonf9a5a8e2010-05-26 20:07:58 +00004966 return NULL;
4967 }
4968
4969 if (PyUnicode_Check(x))
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004970 return PyLong_FromUnicodeObject(x, (int)base);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004971 else if (PyByteArray_Check(x) || PyBytes_Check(x)) {
Serhiy Storchaka8f87eef2020-04-12 14:58:27 +03004972 const char *string;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 if (PyByteArray_Check(x))
4974 string = PyByteArray_AS_STRING(x);
4975 else
4976 string = PyBytes_AS_STRING(x);
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03004977 return _PyLong_FromBytes(string, Py_SIZE(x), (int)base);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 }
4979 else {
4980 PyErr_SetString(PyExc_TypeError,
Mark Dickinson22b20182010-05-10 21:27:53 +00004981 "int() can't convert non-string with explicit base");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982 return NULL;
4983 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00004984}
4985
Serhiy Storchaka95949422013-08-27 19:40:23 +03004986/* Wimpy, slow approach to tp_new calls for subtypes of int:
4987 first create a regular int from whatever arguments we got,
Guido van Rossumbef14172001-08-29 15:47:46 +00004988 then allocate a subtype instance and initialize it from
Serhiy Storchaka95949422013-08-27 19:40:23 +03004989 the regular int. The regular int is then thrown away.
Guido van Rossumbef14172001-08-29 15:47:46 +00004990*/
4991static PyObject *
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02004992long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase)
Guido van Rossumbef14172001-08-29 15:47:46 +00004993{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 PyLongObject *tmp, *newobj;
4995 Py_ssize_t i, n;
Guido van Rossumbef14172001-08-29 15:47:46 +00004996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 assert(PyType_IsSubtype(type, &PyLong_Type));
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02004998 tmp = (PyLongObject *)long_new_impl(&PyLong_Type, x, obase);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004999 if (tmp == NULL)
5000 return NULL;
Serhiy Storchaka15095802015-11-25 15:47:01 +02005001 assert(PyLong_Check(tmp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 n = Py_SIZE(tmp);
5003 if (n < 0)
5004 n = -n;
5005 newobj = (PyLongObject *)type->tp_alloc(type, n);
5006 if (newobj == NULL) {
5007 Py_DECREF(tmp);
5008 return NULL;
5009 }
5010 assert(PyLong_Check(newobj));
Victor Stinner60ac6ed2020-02-07 23:18:08 +01005011 Py_SET_SIZE(newobj, Py_SIZE(tmp));
5012 for (i = 0; i < n; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 newobj->ob_digit[i] = tmp->ob_digit[i];
Victor Stinner60ac6ed2020-02-07 23:18:08 +01005014 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 Py_DECREF(tmp);
5016 return (PyObject *)newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00005017}
5018
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005019/*[clinic input]
5020int.__getnewargs__
5021[clinic start generated code]*/
5022
Guido van Rossum5d9113d2003-01-29 17:58:45 +00005023static PyObject *
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005024int___getnewargs___impl(PyObject *self)
5025/*[clinic end generated code: output=839a49de3f00b61b input=5904770ab1fb8c75]*/
Guido van Rossum5d9113d2003-01-29 17:58:45 +00005026{
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005027 return Py_BuildValue("(N)", _PyLong_Copy((PyLongObject *)self));
Guido van Rossum5d9113d2003-01-29 17:58:45 +00005028}
5029
Guido van Rossumb43daf72007-08-01 18:08:08 +00005030static PyObject *
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005031long_get0(PyObject *Py_UNUSED(self), void *Py_UNUSED(context))
5032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 return PyLong_FromLong(0L);
Mark Dickinson6bf19002009-05-02 17:57:52 +00005034}
5035
5036static PyObject *
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005037long_get1(PyObject *Py_UNUSED(self), void *Py_UNUSED(ignored))
5038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005039 return PyLong_FromLong(1L);
Guido van Rossumb43daf72007-08-01 18:08:08 +00005040}
5041
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005042/*[clinic input]
5043int.__format__
5044
5045 format_spec: unicode
5046 /
5047[clinic start generated code]*/
5048
Guido van Rossum2fa33db2007-08-23 22:07:24 +00005049static PyObject *
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005050int___format___impl(PyObject *self, PyObject *format_spec)
5051/*[clinic end generated code: output=b4929dee9ae18689 input=e31944a9b3e428b7]*/
Eric Smith8c663262007-08-25 02:26:07 +00005052{
Victor Stinnerd3f08822012-05-29 12:57:52 +02005053 _PyUnicodeWriter writer;
5054 int ret;
Eric Smith4a7d76d2008-05-30 18:10:19 +00005055
Victor Stinner8f674cc2013-04-17 23:02:17 +02005056 _PyUnicodeWriter_Init(&writer);
Victor Stinnerd3f08822012-05-29 12:57:52 +02005057 ret = _PyLong_FormatAdvancedWriter(
5058 &writer,
5059 self,
5060 format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
5061 if (ret == -1) {
5062 _PyUnicodeWriter_Dealloc(&writer);
5063 return NULL;
5064 }
5065 return _PyUnicodeWriter_Finish(&writer);
Eric Smith8c663262007-08-25 02:26:07 +00005066}
5067
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005068/* Return a pair (q, r) such that a = b * q + r, and
5069 abs(r) <= abs(b)/2, with equality possible only if q is even.
5070 In other words, q == a / b, rounded to the nearest integer using
5071 round-half-to-even. */
5072
5073PyObject *
Mark Dickinsonfa68a612010-06-07 18:47:09 +00005074_PyLong_DivmodNear(PyObject *a, PyObject *b)
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005075{
5076 PyLongObject *quo = NULL, *rem = NULL;
Serhiy Storchakaba85d692017-03-30 09:09:41 +03005077 PyObject *twice_rem, *result, *temp;
HongWeipeng42acb7b2019-09-18 23:10:15 +08005078 int quo_is_odd, quo_is_neg;
5079 Py_ssize_t cmp;
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005080
5081 /* Equivalent Python code:
5082
5083 def divmod_near(a, b):
5084 q, r = divmod(a, b)
5085 # round up if either r / b > 0.5, or r / b == 0.5 and q is odd.
5086 # The expression r / b > 0.5 is equivalent to 2 * r > b if b is
5087 # positive, 2 * r < b if b negative.
5088 greater_than_half = 2*r > b if b > 0 else 2*r < b
5089 exactly_half = 2*r == b
5090 if greater_than_half or exactly_half and q % 2 == 1:
5091 q += 1
5092 r -= b
5093 return q, r
5094
5095 */
5096 if (!PyLong_Check(a) || !PyLong_Check(b)) {
5097 PyErr_SetString(PyExc_TypeError,
5098 "non-integer arguments in division");
5099 return NULL;
5100 }
5101
5102 /* Do a and b have different signs? If so, quotient is negative. */
5103 quo_is_neg = (Py_SIZE(a) < 0) != (Py_SIZE(b) < 0);
5104
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005105 if (long_divrem((PyLongObject*)a, (PyLongObject*)b, &quo, &rem) < 0)
5106 goto error;
5107
5108 /* compare twice the remainder with the divisor, to see
5109 if we need to adjust the quotient and remainder */
Serhiy Storchakaba85d692017-03-30 09:09:41 +03005110 twice_rem = long_lshift((PyObject *)rem, _PyLong_One);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005111 if (twice_rem == NULL)
5112 goto error;
5113 if (quo_is_neg) {
5114 temp = long_neg((PyLongObject*)twice_rem);
5115 Py_DECREF(twice_rem);
5116 twice_rem = temp;
5117 if (twice_rem == NULL)
5118 goto error;
5119 }
5120 cmp = long_compare((PyLongObject *)twice_rem, (PyLongObject *)b);
5121 Py_DECREF(twice_rem);
5122
5123 quo_is_odd = Py_SIZE(quo) != 0 && ((quo->ob_digit[0] & 1) != 0);
5124 if ((Py_SIZE(b) < 0 ? cmp < 0 : cmp > 0) || (cmp == 0 && quo_is_odd)) {
5125 /* fix up quotient */
5126 if (quo_is_neg)
Serhiy Storchakaba85d692017-03-30 09:09:41 +03005127 temp = long_sub(quo, (PyLongObject *)_PyLong_One);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005128 else
Serhiy Storchakaba85d692017-03-30 09:09:41 +03005129 temp = long_add(quo, (PyLongObject *)_PyLong_One);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005130 Py_DECREF(quo);
5131 quo = (PyLongObject *)temp;
5132 if (quo == NULL)
5133 goto error;
5134 /* and remainder */
5135 if (quo_is_neg)
5136 temp = long_add(rem, (PyLongObject *)b);
5137 else
5138 temp = long_sub(rem, (PyLongObject *)b);
5139 Py_DECREF(rem);
5140 rem = (PyLongObject *)temp;
5141 if (rem == NULL)
5142 goto error;
5143 }
5144
5145 result = PyTuple_New(2);
5146 if (result == NULL)
5147 goto error;
5148
5149 /* PyTuple_SET_ITEM steals references */
5150 PyTuple_SET_ITEM(result, 0, (PyObject *)quo);
5151 PyTuple_SET_ITEM(result, 1, (PyObject *)rem);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005152 return result;
5153
5154 error:
5155 Py_XDECREF(quo);
5156 Py_XDECREF(rem);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005157 return NULL;
5158}
5159
Eric Smith8c663262007-08-25 02:26:07 +00005160static PyObject *
Guido van Rossum2fa33db2007-08-23 22:07:24 +00005161long_round(PyObject *self, PyObject *args)
5162{
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005163 PyObject *o_ndigits=NULL, *temp, *result, *ndigits;
Guido van Rossum2fa33db2007-08-23 22:07:24 +00005164
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005165 /* To round an integer m to the nearest 10**n (n positive), we make use of
5166 * the divmod_near operation, defined by:
5167 *
5168 * divmod_near(a, b) = (q, r)
5169 *
5170 * where q is the nearest integer to the quotient a / b (the
5171 * nearest even integer in the case of a tie) and r == a - q * b.
5172 * Hence q * b = a - r is the nearest multiple of b to a,
5173 * preferring even multiples in the case of a tie.
5174 *
5175 * So the nearest multiple of 10**n to m is:
5176 *
5177 * m - divmod_near(m, 10**n)[1].
5178 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 if (!PyArg_ParseTuple(args, "|O", &o_ndigits))
5180 return NULL;
5181 if (o_ndigits == NULL)
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005182 return long_long(self);
Guido van Rossum2fa33db2007-08-23 22:07:24 +00005183
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03005184 ndigits = _PyNumber_Index(o_ndigits);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 if (ndigits == NULL)
5186 return NULL;
Mark Dickinson1124e712009-01-28 21:25:58 +00005187
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005188 /* if ndigits >= 0 then no rounding is necessary; return self unchanged */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005189 if (Py_SIZE(ndigits) >= 0) {
5190 Py_DECREF(ndigits);
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005191 return long_long(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005192 }
Mark Dickinson1124e712009-01-28 21:25:58 +00005193
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005194 /* result = self - divmod_near(self, 10 ** -ndigits)[1] */
5195 temp = long_neg((PyLongObject*)ndigits);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005196 Py_DECREF(ndigits);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005197 ndigits = temp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005198 if (ndigits == NULL)
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005199 return NULL;
Mark Dickinson1124e712009-01-28 21:25:58 +00005200
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005201 result = PyLong_FromLong(10L);
5202 if (result == NULL) {
5203 Py_DECREF(ndigits);
5204 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 }
Mark Dickinson1124e712009-01-28 21:25:58 +00005206
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005207 temp = long_pow(result, ndigits, Py_None);
5208 Py_DECREF(ndigits);
5209 Py_DECREF(result);
5210 result = temp;
5211 if (result == NULL)
5212 return NULL;
5213
Mark Dickinsonfa68a612010-06-07 18:47:09 +00005214 temp = _PyLong_DivmodNear(self, result);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005215 Py_DECREF(result);
5216 result = temp;
5217 if (result == NULL)
5218 return NULL;
5219
5220 temp = long_sub((PyLongObject *)self,
5221 (PyLongObject *)PyTuple_GET_ITEM(result, 1));
5222 Py_DECREF(result);
5223 result = temp;
5224
5225 return result;
Guido van Rossum2fa33db2007-08-23 22:07:24 +00005226}
5227
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005228/*[clinic input]
5229int.__sizeof__ -> Py_ssize_t
5230
5231Returns size in memory, in bytes.
5232[clinic start generated code]*/
5233
5234static Py_ssize_t
5235int___sizeof___impl(PyObject *self)
5236/*[clinic end generated code: output=3303f008eaa6a0a5 input=9b51620c76fc4507]*/
Martin v. Löwis00709aa2008-06-04 14:18:43 +00005237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00005239
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005240 res = offsetof(PyLongObject, ob_digit) + Py_ABS(Py_SIZE(self))*sizeof(digit);
5241 return res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00005242}
5243
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005244/*[clinic input]
5245int.bit_length
5246
5247Number of bits necessary to represent self in binary.
5248
5249>>> bin(37)
5250'0b100101'
5251>>> (37).bit_length()
52526
5253[clinic start generated code]*/
5254
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005255static PyObject *
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005256int_bit_length_impl(PyObject *self)
5257/*[clinic end generated code: output=fc1977c9353d6a59 input=e4eb7a587e849a32]*/
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 PyLongObject *result, *x, *y;
Serhiy Storchakab2e64f92016-11-08 20:34:22 +02005260 Py_ssize_t ndigits;
5261 int msd_bits;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 digit msd;
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005263
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005264 assert(self != NULL);
5265 assert(PyLong_Check(self));
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005266
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005267 ndigits = Py_ABS(Py_SIZE(self));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005268 if (ndigits == 0)
5269 return PyLong_FromLong(0);
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005270
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005271 msd = ((PyLongObject *)self)->ob_digit[ndigits-1];
Niklas Fiekasc5b79002020-01-16 15:09:19 +01005272 msd_bits = _Py_bit_length(msd);
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 if (ndigits <= PY_SSIZE_T_MAX/PyLong_SHIFT)
5275 return PyLong_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits);
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 /* expression above may overflow; use Python integers instead */
5278 result = (PyLongObject *)PyLong_FromSsize_t(ndigits - 1);
5279 if (result == NULL)
5280 return NULL;
5281 x = (PyLongObject *)PyLong_FromLong(PyLong_SHIFT);
5282 if (x == NULL)
5283 goto error;
5284 y = (PyLongObject *)long_mul(result, x);
5285 Py_DECREF(x);
5286 if (y == NULL)
5287 goto error;
5288 Py_DECREF(result);
5289 result = y;
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 x = (PyLongObject *)PyLong_FromLong((long)msd_bits);
5292 if (x == NULL)
5293 goto error;
5294 y = (PyLongObject *)long_add(result, x);
5295 Py_DECREF(x);
5296 if (y == NULL)
5297 goto error;
5298 Py_DECREF(result);
5299 result = y;
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 return (PyObject *)result;
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005302
Mark Dickinson22b20182010-05-10 21:27:53 +00005303 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 Py_DECREF(result);
5305 return NULL;
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005306}
5307
Niklas Fiekas8bd216d2020-05-29 18:28:02 +02005308static int
5309popcount_digit(digit d)
5310{
Victor Stinnerc6b292c2020-06-08 16:30:33 +02005311 // digit can be larger than uint32_t, but only PyLong_SHIFT bits
5312 // of it will be ever used.
5313 Py_BUILD_ASSERT(PyLong_SHIFT <= 32);
5314 return _Py_popcount32((uint32_t)d);
Niklas Fiekas8bd216d2020-05-29 18:28:02 +02005315}
5316
5317/*[clinic input]
5318int.bit_count
5319
5320Number of ones in the binary representation of the absolute value of self.
5321
5322Also known as the population count.
5323
5324>>> bin(13)
5325'0b1101'
5326>>> (13).bit_count()
53273
5328[clinic start generated code]*/
5329
5330static PyObject *
5331int_bit_count_impl(PyObject *self)
5332/*[clinic end generated code: output=2e571970daf1e5c3 input=7e0adef8e8ccdf2e]*/
5333{
5334 assert(self != NULL);
5335 assert(PyLong_Check(self));
5336
5337 PyLongObject *z = (PyLongObject *)self;
5338 Py_ssize_t ndigits = Py_ABS(Py_SIZE(z));
5339 Py_ssize_t bit_count = 0;
5340
5341 /* Each digit has up to PyLong_SHIFT ones, so the accumulated bit count
5342 from the first PY_SSIZE_T_MAX/PyLong_SHIFT digits can't overflow a
5343 Py_ssize_t. */
5344 Py_ssize_t ndigits_fast = Py_MIN(ndigits, PY_SSIZE_T_MAX/PyLong_SHIFT);
5345 for (Py_ssize_t i = 0; i < ndigits_fast; i++) {
5346 bit_count += popcount_digit(z->ob_digit[i]);
5347 }
5348
5349 PyObject *result = PyLong_FromSsize_t(bit_count);
5350 if (result == NULL) {
5351 return NULL;
5352 }
5353
5354 /* Use Python integers if bit_count would overflow. */
5355 for (Py_ssize_t i = ndigits_fast; i < ndigits; i++) {
5356 PyObject *x = PyLong_FromLong(popcount_digit(z->ob_digit[i]));
5357 if (x == NULL) {
5358 goto error;
5359 }
5360 PyObject *y = long_add((PyLongObject *)result, (PyLongObject *)x);
5361 Py_DECREF(x);
5362 if (y == NULL) {
5363 goto error;
5364 }
5365 Py_DECREF(result);
5366 result = y;
5367 }
5368
5369 return result;
5370
5371 error:
5372 Py_DECREF(result);
5373 return NULL;
5374}
Christian Heimes53876d92008-04-19 00:31:39 +00005375
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005376/*[clinic input]
Lisa Roach5ac70432018-09-13 23:56:23 -07005377int.as_integer_ratio
5378
5379Return integer ratio.
5380
5381Return a pair of integers, whose ratio is exactly equal to the original int
5382and with a positive denominator.
5383
5384>>> (10).as_integer_ratio()
5385(10, 1)
5386>>> (-10).as_integer_ratio()
5387(-10, 1)
5388>>> (0).as_integer_ratio()
5389(0, 1)
5390[clinic start generated code]*/
5391
5392static PyObject *
5393int_as_integer_ratio_impl(PyObject *self)
5394/*[clinic end generated code: output=e60803ae1cc8621a input=55ce3058e15de393]*/
5395{
Raymond Hettinger00bc08e2018-09-14 01:00:11 -07005396 PyObject *ratio_tuple;
Serhiy Storchakab2e20252018-10-20 00:46:31 +03005397 PyObject *numerator = long_long(self);
Raymond Hettinger00bc08e2018-09-14 01:00:11 -07005398 if (numerator == NULL) {
5399 return NULL;
5400 }
5401 ratio_tuple = PyTuple_Pack(2, numerator, _PyLong_One);
5402 Py_DECREF(numerator);
5403 return ratio_tuple;
Lisa Roach5ac70432018-09-13 23:56:23 -07005404}
5405
5406/*[clinic input]
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005407int.to_bytes
5408
5409 length: Py_ssize_t
5410 Length of bytes object to use. An OverflowError is raised if the
5411 integer is not representable with the given number of bytes.
5412 byteorder: unicode
5413 The byte order used to represent the integer. If byteorder is 'big',
5414 the most significant byte is at the beginning of the byte array. If
5415 byteorder is 'little', the most significant byte is at the end of the
5416 byte array. To request the native byte order of the host system, use
5417 `sys.byteorder' as the byte order value.
5418 *
5419 signed as is_signed: bool = False
5420 Determines whether two's complement is used to represent the integer.
5421 If signed is False and a negative integer is given, an OverflowError
5422 is raised.
5423
5424Return an array of bytes representing an integer.
5425[clinic start generated code]*/
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005426
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005427static PyObject *
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005428int_to_bytes_impl(PyObject *self, Py_ssize_t length, PyObject *byteorder,
5429 int is_signed)
5430/*[clinic end generated code: output=89c801df114050a3 input=ddac63f4c7bf414c]*/
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 int little_endian;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 PyObject *bytes;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005434
Serhiy Storchaka196a7bc2017-02-02 16:54:45 +02005435 if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_little))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005436 little_endian = 1;
Serhiy Storchaka196a7bc2017-02-02 16:54:45 +02005437 else if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_big))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005438 little_endian = 0;
5439 else {
5440 PyErr_SetString(PyExc_ValueError,
5441 "byteorder must be either 'little' or 'big'");
5442 return NULL;
5443 }
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 if (length < 0) {
5446 PyErr_SetString(PyExc_ValueError,
5447 "length argument must be non-negative");
5448 return NULL;
5449 }
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 bytes = PyBytes_FromStringAndSize(NULL, length);
5452 if (bytes == NULL)
5453 return NULL;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005454
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005455 if (_PyLong_AsByteArray((PyLongObject *)self,
5456 (unsigned char *)PyBytes_AS_STRING(bytes),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005457 length, little_endian, is_signed) < 0) {
5458 Py_DECREF(bytes);
5459 return NULL;
5460 }
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 return bytes;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005463}
5464
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005465/*[clinic input]
5466@classmethod
5467int.from_bytes
5468
5469 bytes as bytes_obj: object
5470 Holds the array of bytes to convert. The argument must either
5471 support the buffer protocol or be an iterable object producing bytes.
5472 Bytes and bytearray are examples of built-in objects that support the
5473 buffer protocol.
5474 byteorder: unicode
5475 The byte order used to represent the integer. If byteorder is 'big',
5476 the most significant byte is at the beginning of the byte array. If
5477 byteorder is 'little', the most significant byte is at the end of the
5478 byte array. To request the native byte order of the host system, use
5479 `sys.byteorder' as the byte order value.
5480 *
5481 signed as is_signed: bool = False
5482 Indicates whether two's complement is used to represent the integer.
5483
5484Return the integer represented by the given array of bytes.
5485[clinic start generated code]*/
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005486
5487static PyObject *
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005488int_from_bytes_impl(PyTypeObject *type, PyObject *bytes_obj,
5489 PyObject *byteorder, int is_signed)
5490/*[clinic end generated code: output=efc5d68e31f9314f input=cdf98332b6a821b0]*/
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 int little_endian;
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005493 PyObject *long_obj, *bytes;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005494
Serhiy Storchaka196a7bc2017-02-02 16:54:45 +02005495 if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_little))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 little_endian = 1;
Serhiy Storchaka196a7bc2017-02-02 16:54:45 +02005497 else if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_big))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005498 little_endian = 0;
5499 else {
5500 PyErr_SetString(PyExc_ValueError,
5501 "byteorder must be either 'little' or 'big'");
5502 return NULL;
5503 }
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005504
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005505 bytes = PyObject_Bytes(bytes_obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 if (bytes == NULL)
5507 return NULL;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005509 long_obj = _PyLong_FromByteArray(
5510 (unsigned char *)PyBytes_AS_STRING(bytes), Py_SIZE(bytes),
5511 little_endian, is_signed);
5512 Py_DECREF(bytes);
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005513
Zackery Spytz7bb9cd02018-10-05 15:02:23 -06005514 if (long_obj != NULL && type != &PyLong_Type) {
Petr Viktorinffd97532020-02-11 17:46:57 +01005515 Py_SETREF(long_obj, PyObject_CallOneArg((PyObject *)type, long_obj));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005516 }
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005518 return long_obj;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005519}
5520
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005521static PyObject *
5522long_long_meth(PyObject *self, PyObject *Py_UNUSED(ignored))
5523{
5524 return long_long(self);
5525}
5526
Guido van Rossum5d9113d2003-01-29 17:58:45 +00005527static PyMethodDef long_methods[] = {
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005528 {"conjugate", long_long_meth, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 "Returns self, the complex conjugate of any int."},
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005530 INT_BIT_LENGTH_METHODDEF
Niklas Fiekas8bd216d2020-05-29 18:28:02 +02005531 INT_BIT_COUNT_METHODDEF
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005532 INT_TO_BYTES_METHODDEF
5533 INT_FROM_BYTES_METHODDEF
Lisa Roach5ac70432018-09-13 23:56:23 -07005534 INT_AS_INTEGER_RATIO_METHODDEF
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005535 {"__trunc__", long_long_meth, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 "Truncating an Integral returns itself."},
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005537 {"__floor__", long_long_meth, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 "Flooring an Integral returns itself."},
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005539 {"__ceil__", long_long_meth, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 "Ceiling of an Integral returns itself."},
5541 {"__round__", (PyCFunction)long_round, METH_VARARGS,
5542 "Rounding an Integral returns itself.\n"
5543 "Rounding with an ndigits argument also returns an integer."},
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005544 INT___GETNEWARGS___METHODDEF
5545 INT___FORMAT___METHODDEF
5546 INT___SIZEOF___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 {NULL, NULL} /* sentinel */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00005548};
5549
Guido van Rossumb43daf72007-08-01 18:08:08 +00005550static PyGetSetDef long_getset[] = {
Mark Dickinson6bf19002009-05-02 17:57:52 +00005551 {"real",
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005552 (getter)long_long_meth, (setter)NULL,
Guido van Rossumb43daf72007-08-01 18:08:08 +00005553 "the real part of a complex number",
5554 NULL},
Mark Dickinson6bf19002009-05-02 17:57:52 +00005555 {"imag",
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005556 long_get0, (setter)NULL,
Guido van Rossumb43daf72007-08-01 18:08:08 +00005557 "the imaginary part of a complex number",
Mark Dickinson6bf19002009-05-02 17:57:52 +00005558 NULL},
5559 {"numerator",
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005560 (getter)long_long_meth, (setter)NULL,
Guido van Rossumb43daf72007-08-01 18:08:08 +00005561 "the numerator of a rational number in lowest terms",
5562 NULL},
Mark Dickinson6bf19002009-05-02 17:57:52 +00005563 {"denominator",
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005564 long_get1, (setter)NULL,
Guido van Rossumb43daf72007-08-01 18:08:08 +00005565 "the denominator of a rational number in lowest terms",
Mark Dickinson6bf19002009-05-02 17:57:52 +00005566 NULL},
Guido van Rossumb43daf72007-08-01 18:08:08 +00005567 {NULL} /* Sentinel */
5568};
5569
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005570PyDoc_STRVAR(long_doc,
svelankar390a0962017-03-08 19:29:01 -05005571"int([x]) -> integer\n\
Chris Jerdonek83fe2e12012-10-07 14:48:36 -07005572int(x, base=10) -> integer\n\
Tim Peters6d6c1a32001-08-02 04:15:00 +00005573\n\
Chris Jerdonek83fe2e12012-10-07 14:48:36 -07005574Convert a number or string to an integer, or return 0 if no arguments\n\
5575are given. If x is a number, return x.__int__(). For floating point\n\
5576numbers, this truncates towards zero.\n\
5577\n\
5578If x is not a number or if base is given, then x must be a string,\n\
5579bytes, or bytearray instance representing an integer literal in the\n\
5580given base. The literal can be preceded by '+' or '-' and be surrounded\n\
5581by whitespace. The base defaults to 10. Valid bases are 0 and 2-36.\n\
5582Base 0 means to interpret the base from the string as an integer literal.\n\
5583>>> int('0b100', base=0)\n\
55844");
Tim Peters6d6c1a32001-08-02 04:15:00 +00005585
Guido van Rossumc0b618a1997-05-02 03:12:38 +00005586static PyNumberMethods long_as_number = {
Mark Dickinson22b20182010-05-10 21:27:53 +00005587 (binaryfunc)long_add, /*nb_add*/
5588 (binaryfunc)long_sub, /*nb_subtract*/
5589 (binaryfunc)long_mul, /*nb_multiply*/
5590 long_mod, /*nb_remainder*/
5591 long_divmod, /*nb_divmod*/
5592 long_pow, /*nb_power*/
5593 (unaryfunc)long_neg, /*nb_negative*/
Serhiy Storchaka6405fee2018-04-30 15:35:08 +03005594 long_long, /*tp_positive*/
Mark Dickinson22b20182010-05-10 21:27:53 +00005595 (unaryfunc)long_abs, /*tp_absolute*/
5596 (inquiry)long_bool, /*tp_bool*/
5597 (unaryfunc)long_invert, /*nb_invert*/
5598 long_lshift, /*nb_lshift*/
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03005599 long_rshift, /*nb_rshift*/
Mark Dickinson22b20182010-05-10 21:27:53 +00005600 long_and, /*nb_and*/
5601 long_xor, /*nb_xor*/
5602 long_or, /*nb_or*/
5603 long_long, /*nb_int*/
5604 0, /*nb_reserved*/
5605 long_float, /*nb_float*/
5606 0, /* nb_inplace_add */
5607 0, /* nb_inplace_subtract */
5608 0, /* nb_inplace_multiply */
5609 0, /* nb_inplace_remainder */
5610 0, /* nb_inplace_power */
5611 0, /* nb_inplace_lshift */
5612 0, /* nb_inplace_rshift */
5613 0, /* nb_inplace_and */
5614 0, /* nb_inplace_xor */
5615 0, /* nb_inplace_or */
5616 long_div, /* nb_floor_divide */
5617 long_true_divide, /* nb_true_divide */
5618 0, /* nb_inplace_floor_divide */
5619 0, /* nb_inplace_true_divide */
5620 long_long, /* nb_index */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00005621};
5622
Guido van Rossumc0b618a1997-05-02 03:12:38 +00005623PyTypeObject PyLong_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005624 PyVarObject_HEAD_INIT(&PyType_Type, 0)
5625 "int", /* tp_name */
5626 offsetof(PyLongObject, ob_digit), /* tp_basicsize */
5627 sizeof(digit), /* tp_itemsize */
Inada Naoki7d408692019-05-29 17:23:27 +09005628 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005629 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005630 0, /* tp_getattr */
5631 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005632 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 long_to_decimal_string, /* tp_repr */
5634 &long_as_number, /* tp_as_number */
5635 0, /* tp_as_sequence */
5636 0, /* tp_as_mapping */
5637 (hashfunc)long_hash, /* tp_hash */
5638 0, /* tp_call */
Serhiy Storchaka96aeaec2019-05-06 22:29:40 +03005639 0, /* tp_str */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 PyObject_GenericGetAttr, /* tp_getattro */
5641 0, /* tp_setattro */
5642 0, /* tp_as_buffer */
5643 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
5644 Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */
5645 long_doc, /* tp_doc */
5646 0, /* tp_traverse */
5647 0, /* tp_clear */
5648 long_richcompare, /* tp_richcompare */
5649 0, /* tp_weaklistoffset */
5650 0, /* tp_iter */
5651 0, /* tp_iternext */
5652 long_methods, /* tp_methods */
5653 0, /* tp_members */
5654 long_getset, /* tp_getset */
5655 0, /* tp_base */
5656 0, /* tp_dict */
5657 0, /* tp_descr_get */
5658 0, /* tp_descr_set */
5659 0, /* tp_dictoffset */
5660 0, /* tp_init */
5661 0, /* tp_alloc */
5662 long_new, /* tp_new */
5663 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00005664};
Guido van Rossumddefaf32007-01-14 03:31:43 +00005665
Mark Dickinsonbd792642009-03-18 20:06:12 +00005666static PyTypeObject Int_InfoType;
5667
5668PyDoc_STRVAR(int_info__doc__,
5669"sys.int_info\n\
5670\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07005671A named tuple that holds information about Python's\n\
Mark Dickinsonbd792642009-03-18 20:06:12 +00005672internal representation of integers. The attributes are read only.");
5673
5674static PyStructSequence_Field int_info_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 {"bits_per_digit", "size of a digit in bits"},
Mark Dickinson22b20182010-05-10 21:27:53 +00005676 {"sizeof_digit", "size in bytes of the C type used to represent a digit"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 {NULL, NULL}
Mark Dickinsonbd792642009-03-18 20:06:12 +00005678};
5679
5680static PyStructSequence_Desc int_info_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 "sys.int_info", /* name */
5682 int_info__doc__, /* doc */
5683 int_info_fields, /* fields */
5684 2 /* number of fields */
Mark Dickinsonbd792642009-03-18 20:06:12 +00005685};
5686
5687PyObject *
5688PyLong_GetInfo(void)
5689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005690 PyObject* int_info;
5691 int field = 0;
5692 int_info = PyStructSequence_New(&Int_InfoType);
5693 if (int_info == NULL)
5694 return NULL;
5695 PyStructSequence_SET_ITEM(int_info, field++,
5696 PyLong_FromLong(PyLong_SHIFT));
5697 PyStructSequence_SET_ITEM(int_info, field++,
5698 PyLong_FromLong(sizeof(digit)));
5699 if (PyErr_Occurred()) {
5700 Py_CLEAR(int_info);
5701 return NULL;
5702 }
5703 return int_info;
Mark Dickinsonbd792642009-03-18 20:06:12 +00005704}
5705
Guido van Rossumddefaf32007-01-14 03:31:43 +00005706int
Victor Stinner630c8df2019-12-17 13:02:18 +01005707_PyLong_Init(PyThreadState *tstate)
Guido van Rossumddefaf32007-01-14 03:31:43 +00005708{
5709#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Victor Stinner5dcc06f2019-11-21 08:51:59 +01005710 for (Py_ssize_t i=0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) {
5711 sdigit ival = (sdigit)i - NSMALLNEGINTS;
5712 int size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1);
Christian Heimesdfc12ed2008-01-31 15:16:38 +00005713
Victor Stinner5dcc06f2019-11-21 08:51:59 +01005714 PyLongObject *v = _PyLong_New(1);
5715 if (!v) {
5716 return -1;
5717 }
Christian Heimesdfc12ed2008-01-31 15:16:38 +00005718
Victor Stinner60ac6ed2020-02-07 23:18:08 +01005719 Py_SET_SIZE(v, size);
Victor Stinner12174a52014-08-15 23:17:38 +02005720 v->ob_digit[0] = (digit)abs(ival);
Victor Stinner5dcc06f2019-11-21 08:51:59 +01005721
Victor Stinner630c8df2019-12-17 13:02:18 +01005722 tstate->interp->small_ints[i] = v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00005724#endif
Victor Stinner5dcc06f2019-11-21 08:51:59 +01005725
Victor Stinner630c8df2019-12-17 13:02:18 +01005726 if (_Py_IsMainInterpreter(tstate)) {
5727 _PyLong_Zero = PyLong_FromLong(0);
5728 if (_PyLong_Zero == NULL) {
Victor Stinner1c8f0592013-07-22 22:24:54 +02005729 return 0;
Victor Stinner6d43f6f2019-01-22 21:18:05 +01005730 }
Victor Stinner630c8df2019-12-17 13:02:18 +01005731
5732 _PyLong_One = PyLong_FromLong(1);
5733 if (_PyLong_One == NULL) {
5734 return 0;
5735 }
5736
5737 /* initialize int_info */
5738 if (Int_InfoType.tp_name == NULL) {
5739 if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) {
5740 return 0;
5741 }
5742 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02005743 }
Mark Dickinsonbd792642009-03-18 20:06:12 +00005744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 return 1;
Guido van Rossumddefaf32007-01-14 03:31:43 +00005746}
5747
5748void
Victor Stinner630c8df2019-12-17 13:02:18 +01005749_PyLong_Fini(PyThreadState *tstate)
Guido van Rossumddefaf32007-01-14 03:31:43 +00005750{
Victor Stinner630c8df2019-12-17 13:02:18 +01005751 if (_Py_IsMainInterpreter(tstate)) {
5752 Py_CLEAR(_PyLong_One);
5753 Py_CLEAR(_PyLong_Zero);
5754 }
5755
Guido van Rossumddefaf32007-01-14 03:31:43 +00005756#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Victor Stinner5dcc06f2019-11-21 08:51:59 +01005757 for (Py_ssize_t i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) {
Victor Stinner630c8df2019-12-17 13:02:18 +01005758 Py_CLEAR(tstate->interp->small_ints[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00005760#endif
5761}