blob: c3dc59ee9e95db24788c82558c2b6b86e3aeeeeb [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"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00006#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00007
Mark Dickinsonc6300392009-04-20 21:38:00 +00008#include <float.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00009#include <ctype.h>
Mark Dickinson5a74bf62009-02-15 11:04:38 +000010#include <stddef.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011
Serhiy Storchaka495e8802017-02-01 23:12:20 +020012#include "clinic/longobject.c.h"
13/*[clinic input]
14class int "PyObject *" "&PyLong_Type"
15[clinic start generated code]*/
16/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ec0275e3422a36e3]*/
17
Guido van Rossumddefaf32007-01-14 03:31:43 +000018#ifndef NSMALLPOSINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000019#define NSMALLPOSINTS 257
Guido van Rossumddefaf32007-01-14 03:31:43 +000020#endif
21#ifndef NSMALLNEGINTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022#define NSMALLNEGINTS 5
Guido van Rossumddefaf32007-01-14 03:31:43 +000023#endif
Facundo Batista6e6f59b2008-07-24 18:57:11 +000024
Serhiy Storchaka196a7bc2017-02-02 16:54:45 +020025_Py_IDENTIFIER(little);
26_Py_IDENTIFIER(big);
27
Mark Dickinsone4416742009-02-15 15:14:57 +000028/* convert a PyLong of size 1, 0 or -1 to an sdigit */
Victor Stinner08a80b12013-07-17 22:33:42 +020029#define MEDIUM_VALUE(x) (assert(-1 <= Py_SIZE(x) && Py_SIZE(x) <= 1), \
30 Py_SIZE(x) < 0 ? -(sdigit)(x)->ob_digit[0] : \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000031 (Py_SIZE(x) == 0 ? (sdigit)0 : \
32 (sdigit)(x)->ob_digit[0]))
Facundo Batista6e6f59b2008-07-24 18:57:11 +000033
Serhiy Storchakaba85d692017-03-30 09:09:41 +030034PyObject *_PyLong_Zero = NULL;
35PyObject *_PyLong_One = NULL;
36
Guido van Rossumddefaf32007-01-14 03:31:43 +000037#if NSMALLNEGINTS + NSMALLPOSINTS > 0
38/* Small integers are preallocated in this array so that they
39 can be shared.
40 The integers that are preallocated are those in the range
41 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
42*/
43static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
44#ifdef COUNT_ALLOCS
Mark Dickinsonc286e582012-09-20 21:29:28 +010045Py_ssize_t quick_int_allocs, quick_neg_int_allocs;
Guido van Rossumddefaf32007-01-14 03:31:43 +000046#endif
47
Guido van Rossum7eaf8222007-06-18 17:58:50 +000048static PyObject *
Mark Dickinsone4416742009-02-15 15:14:57 +000049get_small_int(sdigit ival)
Guido van Rossumddefaf32007-01-14 03:31:43 +000050{
Benjamin Peterson45c9dce2014-03-14 21:53:51 -050051 PyObject *v;
Benjamin Peterson041c38a2014-03-14 21:47:23 -050052 assert(-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS);
Benjamin Peterson45c9dce2014-03-14 21:53:51 -050053 v = (PyObject *)&small_ints[ival + NSMALLNEGINTS];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 Py_INCREF(v);
Guido van Rossumddefaf32007-01-14 03:31:43 +000055#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 if (ival >= 0)
57 quick_int_allocs++;
58 else
59 quick_neg_int_allocs++;
Guido van Rossumddefaf32007-01-14 03:31:43 +000060#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 return v;
Guido van Rossumddefaf32007-01-14 03:31:43 +000062}
63#define CHECK_SMALL_INT(ival) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \
65 return get_small_int((sdigit)ival); \
66 } while(0)
Guido van Rossumddefaf32007-01-14 03:31:43 +000067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068static PyLongObject *
Facundo Batista6e6f59b2008-07-24 18:57:11 +000069maybe_small_long(PyLongObject *v)
70{
Victor Stinner45e8e2f2014-05-14 17:24:35 +020071 if (v && Py_ABS(Py_SIZE(v)) <= 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 sdigit ival = MEDIUM_VALUE(v);
73 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
74 Py_DECREF(v);
75 return (PyLongObject *)get_small_int(ival);
76 }
77 }
78 return v;
Facundo Batista6e6f59b2008-07-24 18:57:11 +000079}
Guido van Rossumddefaf32007-01-14 03:31:43 +000080#else
81#define CHECK_SMALL_INT(ival)
Facundo Batista6e6f59b2008-07-24 18:57:11 +000082#define maybe_small_long(val) (val)
Guido van Rossumddefaf32007-01-14 03:31:43 +000083#endif
84
Serhiy Storchaka95949422013-08-27 19:40:23 +030085/* If a freshly-allocated int is already shared, it must
Guido van Rossumddefaf32007-01-14 03:31:43 +000086 be a small integer, so negating it must go to PyLong_FromLong */
Victor Stinner8aed6f12013-07-17 22:31:17 +020087Py_LOCAL_INLINE(void)
88_PyLong_Negate(PyLongObject **x_p)
89{
90 PyLongObject *x;
91
92 x = (PyLongObject *)*x_p;
93 if (Py_REFCNT(x) == 1) {
94 Py_SIZE(x) = -Py_SIZE(x);
95 return;
96 }
97
98 *x_p = (PyLongObject *)PyLong_FromLong(-MEDIUM_VALUE(x));
99 Py_DECREF(x);
100}
101
Serhiy Storchaka95949422013-08-27 19:40:23 +0300102/* For int multiplication, use the O(N**2) school algorithm unless
Tim Peters5af4e6c2002-08-12 02:31:19 +0000103 * both operands contain more than KARATSUBA_CUTOFF digits (this
Serhiy Storchaka95949422013-08-27 19:40:23 +0300104 * being an internal Python int digit, in base BASE).
Tim Peters5af4e6c2002-08-12 02:31:19 +0000105 */
Tim Peters0973b992004-08-29 22:16:50 +0000106#define KARATSUBA_CUTOFF 70
107#define KARATSUBA_SQUARE_CUTOFF (2 * KARATSUBA_CUTOFF)
Tim Peters5af4e6c2002-08-12 02:31:19 +0000108
Tim Peters47e52ee2004-08-30 02:44:38 +0000109/* For exponentiation, use the binary left-to-right algorithm
110 * unless the exponent contains more than FIVEARY_CUTOFF digits.
111 * In that case, do 5 bits at a time. The potential drawback is that
112 * a table of 2**5 intermediate results is computed.
113 */
114#define FIVEARY_CUTOFF 8
115
Mark Dickinsoncdd01d22010-05-10 21:37:34 +0000116#define SIGCHECK(PyTryBlock) \
117 do { \
118 if (PyErr_CheckSignals()) PyTryBlock \
119 } while(0)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000120
Serhiy Storchaka95949422013-08-27 19:40:23 +0300121/* Normalize (remove leading zeros from) an int object.
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000122 Doesn't attempt to free the storage--in most cases, due to the nature
123 of the algorithms used, this could save at most be one word anyway. */
124
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125static PyLongObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200126long_normalize(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000127{
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200128 Py_ssize_t j = Py_ABS(Py_SIZE(v));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 Py_ssize_t i = j;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 while (i > 0 && v->ob_digit[i-1] == 0)
132 --i;
133 if (i != j)
134 Py_SIZE(v) = (Py_SIZE(v) < 0) ? -(i) : i;
135 return v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000136}
137
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200138/* _PyLong_FromNbInt: Convert the given object to a PyLongObject
139 using the nb_int slot, if available. Raise TypeError if either the
140 nb_int slot is not available or the result of the call to nb_int
141 returns something not of type int.
142*/
143PyLongObject *
144_PyLong_FromNbInt(PyObject *integral)
145{
146 PyNumberMethods *nb;
147 PyObject *result;
148
149 /* Fast path for the case that we already have an int. */
150 if (PyLong_CheckExact(integral)) {
151 Py_INCREF(integral);
152 return (PyLongObject *)integral;
153 }
154
155 nb = Py_TYPE(integral)->tp_as_number;
156 if (nb == NULL || nb->nb_int == NULL) {
157 PyErr_Format(PyExc_TypeError,
158 "an integer is required (got type %.200s)",
159 Py_TYPE(integral)->tp_name);
160 return NULL;
161 }
162
163 /* Convert using the nb_int slot, which should return something
164 of exact type int. */
165 result = nb->nb_int(integral);
166 if (!result || PyLong_CheckExact(result))
167 return (PyLongObject *)result;
168 if (!PyLong_Check(result)) {
169 PyErr_Format(PyExc_TypeError,
170 "__int__ returned non-int (type %.200s)",
171 result->ob_type->tp_name);
172 Py_DECREF(result);
173 return NULL;
174 }
175 /* Issue #17576: warn if 'result' not of exact type int. */
176 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
177 "__int__ returned non-int (type %.200s). "
178 "The ability to return an instance of a strict subclass of int "
179 "is deprecated, and may be removed in a future version of Python.",
180 result->ob_type->tp_name)) {
181 Py_DECREF(result);
182 return NULL;
183 }
184 return (PyLongObject *)result;
185}
186
187
Serhiy Storchaka95949422013-08-27 19:40:23 +0300188/* Allocate a new int object with size digits.
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000189 Return NULL and set exception if we run out of memory. */
190
Mark Dickinson5a74bf62009-02-15 11:04:38 +0000191#define MAX_LONG_DIGITS \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 ((PY_SSIZE_T_MAX - offsetof(PyLongObject, ob_digit))/sizeof(digit))
Mark Dickinson5a74bf62009-02-15 11:04:38 +0000193
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194PyLongObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000195_PyLong_New(Py_ssize_t size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000196{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 PyLongObject *result;
198 /* Number of bytes needed is: offsetof(PyLongObject, ob_digit) +
199 sizeof(digit)*size. Previous incarnations of this code used
200 sizeof(PyVarObject) instead of the offsetof, but this risks being
201 incorrect in the presence of padding between the PyVarObject header
202 and the digits. */
203 if (size > (Py_ssize_t)MAX_LONG_DIGITS) {
204 PyErr_SetString(PyExc_OverflowError,
205 "too many digits in integer");
206 return NULL;
207 }
208 result = PyObject_MALLOC(offsetof(PyLongObject, ob_digit) +
209 size*sizeof(digit));
210 if (!result) {
211 PyErr_NoMemory();
212 return NULL;
213 }
214 return (PyLongObject*)PyObject_INIT_VAR(result, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000215}
216
Tim Peters64b5ce32001-09-10 20:52:51 +0000217PyObject *
218_PyLong_Copy(PyLongObject *src)
219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 PyLongObject *result;
221 Py_ssize_t i;
Tim Peters64b5ce32001-09-10 20:52:51 +0000222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 assert(src != NULL);
224 i = Py_SIZE(src);
225 if (i < 0)
226 i = -(i);
227 if (i < 2) {
Mark Dickinsonbcc17ee2012-04-20 21:42:49 +0100228 sdigit ival = MEDIUM_VALUE(src);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 CHECK_SMALL_INT(ival);
230 }
231 result = _PyLong_New(i);
232 if (result != NULL) {
233 Py_SIZE(result) = Py_SIZE(src);
234 while (--i >= 0)
235 result->ob_digit[i] = src->ob_digit[i];
236 }
237 return (PyObject *)result;
Tim Peters64b5ce32001-09-10 20:52:51 +0000238}
239
Serhiy Storchaka95949422013-08-27 19:40:23 +0300240/* Create a new int object from a C long int */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000241
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000242PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000243PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 PyLongObject *v;
246 unsigned long abs_ival;
247 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
248 int ndigits = 0;
Mark Dickinson36820dd2016-09-10 20:17:36 +0100249 int sign;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 CHECK_SMALL_INT(ival);
Tim Petersce9de2f2001-06-14 04:56:19 +0000252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 if (ival < 0) {
254 /* negate: can't write this as abs_ival = -ival since that
255 invokes undefined behaviour when ival is LONG_MIN */
256 abs_ival = 0U-(unsigned long)ival;
257 sign = -1;
258 }
259 else {
260 abs_ival = (unsigned long)ival;
Mark Dickinson36820dd2016-09-10 20:17:36 +0100261 sign = ival == 0 ? 0 : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 }
Tim Petersce9de2f2001-06-14 04:56:19 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 /* Fast path for single-digit ints */
265 if (!(abs_ival >> PyLong_SHIFT)) {
266 v = _PyLong_New(1);
267 if (v) {
268 Py_SIZE(v) = sign;
269 v->ob_digit[0] = Py_SAFE_DOWNCAST(
270 abs_ival, unsigned long, digit);
271 }
272 return (PyObject*)v;
273 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000274
Mark Dickinson249b8982009-04-27 19:41:00 +0000275#if PyLong_SHIFT==15
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 /* 2 digits */
277 if (!(abs_ival >> 2*PyLong_SHIFT)) {
278 v = _PyLong_New(2);
279 if (v) {
280 Py_SIZE(v) = 2*sign;
281 v->ob_digit[0] = Py_SAFE_DOWNCAST(
282 abs_ival & PyLong_MASK, unsigned long, digit);
283 v->ob_digit[1] = Py_SAFE_DOWNCAST(
284 abs_ival >> PyLong_SHIFT, unsigned long, digit);
285 }
286 return (PyObject*)v;
287 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000288#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +0000289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 /* Larger numbers: loop to determine number of digits */
291 t = abs_ival;
292 while (t) {
293 ++ndigits;
294 t >>= PyLong_SHIFT;
295 }
296 v = _PyLong_New(ndigits);
297 if (v != NULL) {
298 digit *p = v->ob_digit;
299 Py_SIZE(v) = ndigits*sign;
300 t = abs_ival;
301 while (t) {
302 *p++ = Py_SAFE_DOWNCAST(
303 t & PyLong_MASK, unsigned long, digit);
304 t >>= PyLong_SHIFT;
305 }
306 }
307 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000308}
309
Serhiy Storchaka95949422013-08-27 19:40:23 +0300310/* Create a new int object from a C unsigned long int */
Guido van Rossum53756b11997-01-03 17:14:46 +0000311
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000313PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 PyLongObject *v;
316 unsigned long t;
317 int ndigits = 0;
Tim Petersce9de2f2001-06-14 04:56:19 +0000318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 if (ival < PyLong_BASE)
320 return PyLong_FromLong(ival);
321 /* Count the number of Python digits. */
orenmn86aa2692017-03-06 10:42:47 +0200322 t = ival;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 while (t) {
324 ++ndigits;
325 t >>= PyLong_SHIFT;
326 }
327 v = _PyLong_New(ndigits);
328 if (v != NULL) {
329 digit *p = v->ob_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 while (ival) {
331 *p++ = (digit)(ival & PyLong_MASK);
332 ival >>= PyLong_SHIFT;
333 }
334 }
335 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000336}
337
Serhiy Storchaka95949422013-08-27 19:40:23 +0300338/* Create a new int object from a C double */
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000339
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 PyLongObject *v;
344 double frac;
345 int i, ndig, expo, neg;
346 neg = 0;
347 if (Py_IS_INFINITY(dval)) {
348 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson22b20182010-05-10 21:27:53 +0000349 "cannot convert float infinity to integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 return NULL;
351 }
352 if (Py_IS_NAN(dval)) {
353 PyErr_SetString(PyExc_ValueError,
Mark Dickinson22b20182010-05-10 21:27:53 +0000354 "cannot convert float NaN to integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 return NULL;
356 }
357 if (dval < 0.0) {
358 neg = 1;
359 dval = -dval;
360 }
361 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
362 if (expo <= 0)
363 return PyLong_FromLong(0L);
364 ndig = (expo-1) / PyLong_SHIFT + 1; /* Number of 'digits' in result */
365 v = _PyLong_New(ndig);
366 if (v == NULL)
367 return NULL;
368 frac = ldexp(frac, (expo-1) % PyLong_SHIFT + 1);
369 for (i = ndig; --i >= 0; ) {
370 digit bits = (digit)frac;
371 v->ob_digit[i] = bits;
372 frac = frac - (double)bits;
373 frac = ldexp(frac, PyLong_SHIFT);
374 }
375 if (neg)
376 Py_SIZE(v) = -(Py_SIZE(v));
377 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000378}
379
Thomas Wouters89f507f2006-12-13 04:49:30 +0000380/* Checking for overflow in PyLong_AsLong is a PITA since C doesn't define
381 * anything about what happens when a signed integer operation overflows,
382 * and some compilers think they're doing you a favor by being "clever"
Raymond Hettinger15f44ab2016-08-30 10:47:49 -0700383 * then. The bit pattern for the largest positive signed long is
Thomas Wouters89f507f2006-12-13 04:49:30 +0000384 * (unsigned long)LONG_MAX, and for the smallest negative signed long
385 * it is abs(LONG_MIN), which we could write -(unsigned long)LONG_MIN.
386 * However, some other compilers warn about applying unary minus to an
387 * unsigned operand. Hence the weird "0-".
388 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389#define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN)
390#define PY_ABS_SSIZE_T_MIN (0-(size_t)PY_SSIZE_T_MIN)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000391
Serhiy Storchaka95949422013-08-27 19:40:23 +0300392/* Get a C long int from an int object or any object that has an __int__
Mark Dickinson8d48b432011-10-23 20:47:14 +0100393 method.
394
395 On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
396 the result. Otherwise *overflow is 0.
397
398 For other errors (e.g., TypeError), return -1 and set an error condition.
399 In this case *overflow will be 0.
400*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000401
402long
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000403PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 /* This version by Tim Peters */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200406 PyLongObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 unsigned long x, prev;
408 long res;
409 Py_ssize_t i;
410 int sign;
411 int do_decref = 0; /* if nb_int was called */
Guido van Rossumf7531811998-05-26 14:33:37 +0000412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 *overflow = 0;
414 if (vv == NULL) {
415 PyErr_BadInternalCall();
416 return -1;
417 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000418
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200419 if (PyLong_Check(vv)) {
420 v = (PyLongObject *)vv;
421 }
422 else {
423 v = _PyLong_FromNbInt(vv);
424 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 return -1;
426 do_decref = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 res = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 i = Py_SIZE(v);
Guido van Rossumf7531811998-05-26 14:33:37 +0000431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 switch (i) {
433 case -1:
434 res = -(sdigit)v->ob_digit[0];
435 break;
436 case 0:
437 res = 0;
438 break;
439 case 1:
440 res = v->ob_digit[0];
441 break;
442 default:
443 sign = 1;
444 x = 0;
445 if (i < 0) {
446 sign = -1;
447 i = -(i);
448 }
449 while (--i >= 0) {
450 prev = x;
451 x = (x << PyLong_SHIFT) | v->ob_digit[i];
452 if ((x >> PyLong_SHIFT) != prev) {
453 *overflow = sign;
454 goto exit;
455 }
456 }
457 /* Haven't lost any bits, but casting to long requires extra
458 * care (see comment above).
459 */
460 if (x <= (unsigned long)LONG_MAX) {
461 res = (long)x * sign;
462 }
463 else if (sign < 0 && x == PY_ABS_LONG_MIN) {
464 res = LONG_MIN;
465 }
466 else {
467 *overflow = sign;
468 /* res is already set to -1 */
469 }
470 }
Mark Dickinson22b20182010-05-10 21:27:53 +0000471 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 if (do_decref) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200473 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 }
475 return res;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000476}
477
Serhiy Storchaka95949422013-08-27 19:40:23 +0300478/* Get a C long int from an int object or any object that has an __int__
Mark Dickinson8d48b432011-10-23 20:47:14 +0100479 method. Return -1 and set an error if overflow occurs. */
480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481long
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000482PyLong_AsLong(PyObject *obj)
483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 int overflow;
485 long result = PyLong_AsLongAndOverflow(obj, &overflow);
486 if (overflow) {
487 /* XXX: could be cute and give a different
488 message for overflow == -1 */
489 PyErr_SetString(PyExc_OverflowError,
490 "Python int too large to convert to C long");
491 }
492 return result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000493}
494
Serhiy Storchaka95949422013-08-27 19:40:23 +0300495/* Get a C int from an int object or any object that has an __int__
Serhiy Storchaka78980432013-01-15 01:12:17 +0200496 method. Return -1 and set an error if overflow occurs. */
497
498int
499_PyLong_AsInt(PyObject *obj)
500{
501 int overflow;
502 long result = PyLong_AsLongAndOverflow(obj, &overflow);
503 if (overflow || result > INT_MAX || result < INT_MIN) {
504 /* XXX: could be cute and give a different
505 message for overflow == -1 */
506 PyErr_SetString(PyExc_OverflowError,
507 "Python int too large to convert to C int");
508 return -1;
509 }
510 return (int)result;
511}
512
Serhiy Storchaka95949422013-08-27 19:40:23 +0300513/* Get a Py_ssize_t from an int object.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000514 Returns -1 and sets an error condition if overflow occurs. */
515
516Py_ssize_t
Guido van Rossumddefaf32007-01-14 03:31:43 +0000517PyLong_AsSsize_t(PyObject *vv) {
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200518 PyLongObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 size_t x, prev;
520 Py_ssize_t i;
521 int sign;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 if (vv == NULL) {
524 PyErr_BadInternalCall();
525 return -1;
526 }
527 if (!PyLong_Check(vv)) {
528 PyErr_SetString(PyExc_TypeError, "an integer is required");
529 return -1;
530 }
Mark Dickinsond59b4162010-03-13 11:34:40 +0000531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 v = (PyLongObject *)vv;
533 i = Py_SIZE(v);
534 switch (i) {
535 case -1: return -(sdigit)v->ob_digit[0];
536 case 0: return 0;
537 case 1: return v->ob_digit[0];
538 }
539 sign = 1;
540 x = 0;
541 if (i < 0) {
542 sign = -1;
543 i = -(i);
544 }
545 while (--i >= 0) {
546 prev = x;
547 x = (x << PyLong_SHIFT) | v->ob_digit[i];
548 if ((x >> PyLong_SHIFT) != prev)
549 goto overflow;
550 }
551 /* Haven't lost any bits, but casting to a signed type requires
552 * extra care (see comment above).
553 */
554 if (x <= (size_t)PY_SSIZE_T_MAX) {
555 return (Py_ssize_t)x * sign;
556 }
557 else if (sign < 0 && x == PY_ABS_SSIZE_T_MIN) {
558 return PY_SSIZE_T_MIN;
559 }
560 /* else overflow */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000561
Mark Dickinson22b20182010-05-10 21:27:53 +0000562 overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 PyErr_SetString(PyExc_OverflowError,
564 "Python int too large to convert to C ssize_t");
565 return -1;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000566}
567
Serhiy Storchaka95949422013-08-27 19:40:23 +0300568/* Get a C unsigned long int from an int object.
Guido van Rossum53756b11997-01-03 17:14:46 +0000569 Returns -1 and sets an error condition if overflow occurs. */
570
571unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000572PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000573{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200574 PyLongObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 unsigned long x, prev;
576 Py_ssize_t i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 if (vv == NULL) {
579 PyErr_BadInternalCall();
580 return (unsigned long)-1;
581 }
582 if (!PyLong_Check(vv)) {
583 PyErr_SetString(PyExc_TypeError, "an integer is required");
584 return (unsigned long)-1;
585 }
Mark Dickinsond59b4162010-03-13 11:34:40 +0000586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 v = (PyLongObject *)vv;
588 i = Py_SIZE(v);
589 x = 0;
590 if (i < 0) {
591 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson22b20182010-05-10 21:27:53 +0000592 "can't convert negative value to unsigned int");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 return (unsigned long) -1;
594 }
595 switch (i) {
596 case 0: return 0;
597 case 1: return v->ob_digit[0];
598 }
599 while (--i >= 0) {
600 prev = x;
601 x = (x << PyLong_SHIFT) | v->ob_digit[i];
602 if ((x >> PyLong_SHIFT) != prev) {
603 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson02515f72013-08-03 12:08:22 +0100604 "Python int too large to convert "
Mark Dickinson22b20182010-05-10 21:27:53 +0000605 "to C unsigned long");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 return (unsigned long) -1;
607 }
608 }
609 return x;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000610}
611
Serhiy Storchaka95949422013-08-27 19:40:23 +0300612/* Get a C size_t from an int object. Returns (size_t)-1 and sets
Stefan Krahb77c6c62011-09-12 16:22:47 +0200613 an error condition if overflow occurs. */
Guido van Rossumddefaf32007-01-14 03:31:43 +0000614
615size_t
616PyLong_AsSize_t(PyObject *vv)
617{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200618 PyLongObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 size_t x, prev;
620 Py_ssize_t i;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 if (vv == NULL) {
623 PyErr_BadInternalCall();
624 return (size_t) -1;
625 }
626 if (!PyLong_Check(vv)) {
627 PyErr_SetString(PyExc_TypeError, "an integer is required");
628 return (size_t)-1;
629 }
Mark Dickinsond59b4162010-03-13 11:34:40 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 v = (PyLongObject *)vv;
632 i = Py_SIZE(v);
633 x = 0;
634 if (i < 0) {
635 PyErr_SetString(PyExc_OverflowError,
636 "can't convert negative value to size_t");
637 return (size_t) -1;
638 }
639 switch (i) {
640 case 0: return 0;
641 case 1: return v->ob_digit[0];
642 }
643 while (--i >= 0) {
644 prev = x;
645 x = (x << PyLong_SHIFT) | v->ob_digit[i];
646 if ((x >> PyLong_SHIFT) != prev) {
647 PyErr_SetString(PyExc_OverflowError,
648 "Python int too large to convert to C size_t");
Stefan Krahb77c6c62011-09-12 16:22:47 +0200649 return (size_t) -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 }
651 }
652 return x;
Guido van Rossum53756b11997-01-03 17:14:46 +0000653}
654
Serhiy Storchaka95949422013-08-27 19:40:23 +0300655/* Get a C unsigned long int from an int object, ignoring the high bits.
Thomas Hellera4ea6032003-04-17 18:55:45 +0000656 Returns -1 and sets an error condition if an error occurs. */
657
Guido van Rossumddefaf32007-01-14 03:31:43 +0000658static unsigned long
659_PyLong_AsUnsignedLongMask(PyObject *vv)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000660{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200661 PyLongObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 unsigned long x;
663 Py_ssize_t i;
664 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 if (vv == NULL || !PyLong_Check(vv)) {
667 PyErr_BadInternalCall();
668 return (unsigned long) -1;
669 }
670 v = (PyLongObject *)vv;
671 i = Py_SIZE(v);
672 switch (i) {
673 case 0: return 0;
674 case 1: return v->ob_digit[0];
675 }
676 sign = 1;
677 x = 0;
678 if (i < 0) {
679 sign = -1;
680 i = -i;
681 }
682 while (--i >= 0) {
683 x = (x << PyLong_SHIFT) | v->ob_digit[i];
684 }
685 return x * sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000686}
687
Guido van Rossumddefaf32007-01-14 03:31:43 +0000688unsigned long
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200689PyLong_AsUnsignedLongMask(PyObject *op)
Guido van Rossumddefaf32007-01-14 03:31:43 +0000690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 PyLongObject *lo;
692 unsigned long val;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000693
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200694 if (op == NULL) {
695 PyErr_BadInternalCall();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 return (unsigned long)-1;
697 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000698
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200699 if (PyLong_Check(op)) {
700 return _PyLong_AsUnsignedLongMask(op);
701 }
702
703 lo = _PyLong_FromNbInt(op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 if (lo == NULL)
705 return (unsigned long)-1;
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200706
707 val = _PyLong_AsUnsignedLongMask((PyObject *)lo);
708 Py_DECREF(lo);
709 return val;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000710}
711
Tim Peters5b8132f2003-01-31 15:52:05 +0000712int
713_PyLong_Sign(PyObject *vv)
714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 assert(v != NULL);
718 assert(PyLong_Check(v));
Tim Peters5b8132f2003-01-31 15:52:05 +0000719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1);
Tim Peters5b8132f2003-01-31 15:52:05 +0000721}
722
Serhiy Storchakab2e64f92016-11-08 20:34:22 +0200723/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
724 2**k if d is nonzero, else 0. */
725
726static const unsigned char BitLengthTable[32] = {
727 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
728 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
729};
730
731static int
732bits_in_digit(digit d)
733{
734 int d_bits = 0;
735 while (d >= 32) {
736 d_bits += 6;
737 d >>= 6;
738 }
739 d_bits += (int)BitLengthTable[d];
740 return d_bits;
741}
742
Tim Petersbaefd9e2003-01-28 20:37:45 +0000743size_t
744_PyLong_NumBits(PyObject *vv)
745{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 PyLongObject *v = (PyLongObject *)vv;
747 size_t result = 0;
748 Py_ssize_t ndigits;
Serhiy Storchakab2e64f92016-11-08 20:34:22 +0200749 int msd_bits;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 assert(v != NULL);
752 assert(PyLong_Check(v));
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200753 ndigits = Py_ABS(Py_SIZE(v));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
755 if (ndigits > 0) {
756 digit msd = v->ob_digit[ndigits - 1];
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -0700757 if ((size_t)(ndigits - 1) > SIZE_MAX / (size_t)PyLong_SHIFT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 goto Overflow;
Mark Dickinsonfc9adb62012-10-06 18:50:02 +0100759 result = (size_t)(ndigits - 1) * (size_t)PyLong_SHIFT;
Serhiy Storchakab2e64f92016-11-08 20:34:22 +0200760 msd_bits = bits_in_digit(msd);
761 if (SIZE_MAX - msd_bits < result)
762 goto Overflow;
763 result += msd_bits;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 }
765 return result;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000766
Mark Dickinson22b20182010-05-10 21:27:53 +0000767 Overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 PyErr_SetString(PyExc_OverflowError, "int has too many bits "
769 "to express in a platform size_t");
770 return (size_t)-1;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000771}
772
Tim Peters2a9b3672001-06-11 21:23:58 +0000773PyObject *
774_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 int little_endian, int is_signed)
Tim Peters2a9b3672001-06-11 21:23:58 +0000776{
Mark Dickinson22b20182010-05-10 21:27:53 +0000777 const unsigned char* pstartbyte; /* LSB of bytes */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 int incr; /* direction to move pstartbyte */
779 const unsigned char* pendbyte; /* MSB of bytes */
780 size_t numsignificantbytes; /* number of bytes that matter */
Serhiy Storchaka95949422013-08-27 19:40:23 +0300781 Py_ssize_t ndigits; /* number of Python int digits */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 PyLongObject* v; /* result */
783 Py_ssize_t idigit = 0; /* next free index in v->ob_digit */
Tim Peters2a9b3672001-06-11 21:23:58 +0000784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 if (n == 0)
786 return PyLong_FromLong(0L);
Tim Peters2a9b3672001-06-11 21:23:58 +0000787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 if (little_endian) {
789 pstartbyte = bytes;
790 pendbyte = bytes + n - 1;
791 incr = 1;
792 }
793 else {
794 pstartbyte = bytes + n - 1;
795 pendbyte = bytes;
796 incr = -1;
797 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 if (is_signed)
800 is_signed = *pendbyte >= 0x80;
Tim Peters2a9b3672001-06-11 21:23:58 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 /* Compute numsignificantbytes. This consists of finding the most
Ezio Melotti13925002011-03-16 11:05:33 +0200803 significant byte. Leading 0 bytes are insignificant if the number
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 is positive, and leading 0xff bytes if negative. */
805 {
806 size_t i;
807 const unsigned char* p = pendbyte;
808 const int pincr = -incr; /* search MSB to LSB */
Martin Pantereb995702016-07-28 01:11:04 +0000809 const unsigned char insignificant = is_signed ? 0xff : 0x00;
Tim Peters2a9b3672001-06-11 21:23:58 +0000810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 for (i = 0; i < n; ++i, p += pincr) {
Martin Pantereb995702016-07-28 01:11:04 +0000812 if (*p != insignificant)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 break;
814 }
815 numsignificantbytes = n - i;
816 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
817 actually has 2 significant bytes. OTOH, 0xff0001 ==
818 -0x00ffff, so we wouldn't *need* to bump it there; but we
819 do for 0xffff = -0x0001. To be safe without bothering to
820 check every case, bump it regardless. */
821 if (is_signed && numsignificantbytes < n)
822 ++numsignificantbytes;
823 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000824
Serhiy Storchaka95949422013-08-27 19:40:23 +0300825 /* How many Python int digits do we need? We have
826 8*numsignificantbytes bits, and each Python int digit has
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 PyLong_SHIFT bits, so it's the ceiling of the quotient. */
828 /* catch overflow before it happens */
829 if (numsignificantbytes > (PY_SSIZE_T_MAX - PyLong_SHIFT) / 8) {
830 PyErr_SetString(PyExc_OverflowError,
831 "byte array too long to convert to int");
832 return NULL;
833 }
834 ndigits = (numsignificantbytes * 8 + PyLong_SHIFT - 1) / PyLong_SHIFT;
835 v = _PyLong_New(ndigits);
836 if (v == NULL)
837 return NULL;
Tim Peters2a9b3672001-06-11 21:23:58 +0000838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 /* Copy the bits over. The tricky parts are computing 2's-comp on
840 the fly for signed numbers, and dealing with the mismatch between
841 8-bit bytes and (probably) 15-bit Python digits.*/
842 {
843 size_t i;
844 twodigits carry = 1; /* for 2's-comp calculation */
845 twodigits accum = 0; /* sliding register */
846 unsigned int accumbits = 0; /* number of bits in accum */
847 const unsigned char* p = pstartbyte;
Tim Peters2a9b3672001-06-11 21:23:58 +0000848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
850 twodigits thisbyte = *p;
851 /* Compute correction for 2's comp, if needed. */
852 if (is_signed) {
853 thisbyte = (0xff ^ thisbyte) + carry;
854 carry = thisbyte >> 8;
855 thisbyte &= 0xff;
856 }
857 /* Because we're going LSB to MSB, thisbyte is
858 more significant than what's already in accum,
859 so needs to be prepended to accum. */
orenmn86aa2692017-03-06 10:42:47 +0200860 accum |= thisbyte << accumbits;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 accumbits += 8;
862 if (accumbits >= PyLong_SHIFT) {
863 /* There's enough to fill a Python digit. */
864 assert(idigit < ndigits);
Mark Dickinson22b20182010-05-10 21:27:53 +0000865 v->ob_digit[idigit] = (digit)(accum & PyLong_MASK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 ++idigit;
867 accum >>= PyLong_SHIFT;
868 accumbits -= PyLong_SHIFT;
869 assert(accumbits < PyLong_SHIFT);
870 }
871 }
872 assert(accumbits < PyLong_SHIFT);
873 if (accumbits) {
874 assert(idigit < ndigits);
875 v->ob_digit[idigit] = (digit)accum;
876 ++idigit;
877 }
878 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 Py_SIZE(v) = is_signed ? -idigit : idigit;
881 return (PyObject *)long_normalize(v);
Tim Peters2a9b3672001-06-11 21:23:58 +0000882}
883
884int
885_PyLong_AsByteArray(PyLongObject* v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 unsigned char* bytes, size_t n,
887 int little_endian, int is_signed)
Tim Peters2a9b3672001-06-11 21:23:58 +0000888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 Py_ssize_t i; /* index into v->ob_digit */
Mark Dickinson22b20182010-05-10 21:27:53 +0000890 Py_ssize_t ndigits; /* |v->ob_size| */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 twodigits accum; /* sliding register */
Mark Dickinson22b20182010-05-10 21:27:53 +0000892 unsigned int accumbits; /* # bits in accum */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
894 digit carry; /* for computing 2's-comp */
895 size_t j; /* # bytes filled */
896 unsigned char* p; /* pointer to next byte in bytes */
897 int pincr; /* direction to move p */
Tim Peters2a9b3672001-06-11 21:23:58 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 assert(v != NULL && PyLong_Check(v));
Tim Peters2a9b3672001-06-11 21:23:58 +0000900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 if (Py_SIZE(v) < 0) {
902 ndigits = -(Py_SIZE(v));
903 if (!is_signed) {
904 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson22b20182010-05-10 21:27:53 +0000905 "can't convert negative int to unsigned");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 return -1;
907 }
908 do_twos_comp = 1;
909 }
910 else {
911 ndigits = Py_SIZE(v);
912 do_twos_comp = 0;
913 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 if (little_endian) {
916 p = bytes;
917 pincr = 1;
918 }
919 else {
920 p = bytes + n - 1;
921 pincr = -1;
922 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 /* Copy over all the Python digits.
925 It's crucial that every Python digit except for the MSD contribute
Serhiy Storchaka95949422013-08-27 19:40:23 +0300926 exactly PyLong_SHIFT bits to the total, so first assert that the int is
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 normalized. */
928 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
929 j = 0;
930 accum = 0;
931 accumbits = 0;
932 carry = do_twos_comp ? 1 : 0;
933 for (i = 0; i < ndigits; ++i) {
934 digit thisdigit = v->ob_digit[i];
935 if (do_twos_comp) {
936 thisdigit = (thisdigit ^ PyLong_MASK) + carry;
937 carry = thisdigit >> PyLong_SHIFT;
938 thisdigit &= PyLong_MASK;
939 }
940 /* Because we're going LSB to MSB, thisdigit is more
941 significant than what's already in accum, so needs to be
942 prepended to accum. */
943 accum |= (twodigits)thisdigit << accumbits;
Tim Peters8bc84b42001-06-12 19:17:03 +0000944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 /* The most-significant digit may be (probably is) at least
946 partly empty. */
947 if (i == ndigits - 1) {
948 /* Count # of sign bits -- they needn't be stored,
949 * although for signed conversion we need later to
950 * make sure at least one sign bit gets stored. */
Mark Dickinson22b20182010-05-10 21:27:53 +0000951 digit s = do_twos_comp ? thisdigit ^ PyLong_MASK : thisdigit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 while (s != 0) {
953 s >>= 1;
954 accumbits++;
955 }
956 }
957 else
958 accumbits += PyLong_SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 /* Store as many bytes as possible. */
961 while (accumbits >= 8) {
962 if (j >= n)
963 goto Overflow;
964 ++j;
965 *p = (unsigned char)(accum & 0xff);
966 p += pincr;
967 accumbits -= 8;
968 accum >>= 8;
969 }
970 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 /* Store the straggler (if any). */
973 assert(accumbits < 8);
974 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
975 if (accumbits > 0) {
976 if (j >= n)
977 goto Overflow;
978 ++j;
979 if (do_twos_comp) {
980 /* Fill leading bits of the byte with sign bits
Serhiy Storchaka95949422013-08-27 19:40:23 +0300981 (appropriately pretending that the int had an
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 infinite supply of sign bits). */
983 accum |= (~(twodigits)0) << accumbits;
984 }
985 *p = (unsigned char)(accum & 0xff);
986 p += pincr;
987 }
988 else if (j == n && n > 0 && is_signed) {
989 /* The main loop filled the byte array exactly, so the code
990 just above didn't get to ensure there's a sign bit, and the
991 loop below wouldn't add one either. Make sure a sign bit
992 exists. */
993 unsigned char msb = *(p - pincr);
994 int sign_bit_set = msb >= 0x80;
995 assert(accumbits == 0);
996 if (sign_bit_set == do_twos_comp)
997 return 0;
998 else
999 goto Overflow;
1000 }
Tim Peters05607ad2001-06-13 21:01:27 +00001001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 /* Fill remaining bytes with copies of the sign bit. */
1003 {
1004 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
1005 for ( ; j < n; ++j, p += pincr)
1006 *p = signbyte;
1007 }
Tim Peters05607ad2001-06-13 21:01:27 +00001008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 return 0;
Tim Peters2a9b3672001-06-11 21:23:58 +00001010
Mark Dickinson22b20182010-05-10 21:27:53 +00001011 Overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 PyErr_SetString(PyExc_OverflowError, "int too big to convert");
1013 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001014
Tim Peters2a9b3672001-06-11 21:23:58 +00001015}
1016
Serhiy Storchaka95949422013-08-27 19:40:23 +03001017/* Create a new int object from a C pointer */
Guido van Rossum78694d91998-09-18 14:14:13 +00001018
1019PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001020PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +00001021{
Mark Dickinson91044792012-10-18 19:21:43 +01001022#if SIZEOF_VOID_P <= SIZEOF_LONG
Benjamin Petersonca470632016-09-06 13:47:26 -07001023 return PyLong_FromUnsignedLong((unsigned long)(uintptr_t)p);
Mark Dickinson91044792012-10-18 19:21:43 +01001024#else
1025
Tim Peters70128a12001-06-16 08:48:40 +00001026#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001027# error "PyLong_FromVoidPtr: sizeof(long long) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +00001028#endif
Benjamin Petersonca470632016-09-06 13:47:26 -07001029 return PyLong_FromUnsignedLongLong((unsigned long long)(uintptr_t)p);
Mark Dickinson91044792012-10-18 19:21:43 +01001030#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Tim Peters70128a12001-06-16 08:48:40 +00001031
Guido van Rossum78694d91998-09-18 14:14:13 +00001032}
1033
Serhiy Storchaka95949422013-08-27 19:40:23 +03001034/* Get a C pointer from an int object. */
Guido van Rossum78694d91998-09-18 14:14:13 +00001035
1036void *
Tim Peters9f688bf2000-07-07 15:53:28 +00001037PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +00001038{
Tim Peters70128a12001-06-16 08:48:40 +00001039#if SIZEOF_VOID_P <= SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 long x;
Guido van Rossum78694d91998-09-18 14:14:13 +00001041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
1043 x = PyLong_AsLong(vv);
1044 else
1045 x = PyLong_AsUnsignedLong(vv);
Guido van Rossum78694d91998-09-18 14:14:13 +00001046#else
Tim Peters70128a12001-06-16 08:48:40 +00001047
Tim Peters70128a12001-06-16 08:48:40 +00001048#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001049# error "PyLong_AsVoidPtr: sizeof(long long) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +00001050#endif
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001051 long long x;
Guido van Rossum78694d91998-09-18 14:14:13 +00001052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
1054 x = PyLong_AsLongLong(vv);
1055 else
1056 x = PyLong_AsUnsignedLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +00001057
1058#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +00001059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 if (x == -1 && PyErr_Occurred())
1061 return NULL;
1062 return (void *)x;
Guido van Rossum78694d91998-09-18 14:14:13 +00001063}
1064
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001065/* Initial long long support by Chris Herborth (chrish@qnx.com), later
Tim Petersd1a7da62001-06-13 00:35:57 +00001066 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001067 */
1068
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001069#define PY_ABS_LLONG_MIN (0-(unsigned long long)PY_LLONG_MIN)
Tim Petersd1a7da62001-06-13 00:35:57 +00001070
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001071/* Create a new int object from a C long long int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001072
1073PyObject *
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001074PyLong_FromLongLong(long long ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001075{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 PyLongObject *v;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001077 unsigned long long abs_ival;
1078 unsigned long long t; /* unsigned so >> doesn't propagate sign bit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 int ndigits = 0;
1080 int negative = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 CHECK_SMALL_INT(ival);
1083 if (ival < 0) {
1084 /* avoid signed overflow on negation; see comments
1085 in PyLong_FromLong above. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001086 abs_ival = (unsigned long long)(-1-ival) + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 negative = 1;
1088 }
1089 else {
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001090 abs_ival = (unsigned long long)ival;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 /* Count the number of Python digits.
1094 We used to pick 5 ("big enough for anything"), but that's a
1095 waste of time and space given that 5*15 = 75 bits are rarely
1096 needed. */
1097 t = abs_ival;
1098 while (t) {
1099 ++ndigits;
1100 t >>= PyLong_SHIFT;
1101 }
1102 v = _PyLong_New(ndigits);
1103 if (v != NULL) {
1104 digit *p = v->ob_digit;
1105 Py_SIZE(v) = negative ? -ndigits : ndigits;
1106 t = abs_ival;
1107 while (t) {
1108 *p++ = (digit)(t & PyLong_MASK);
1109 t >>= PyLong_SHIFT;
1110 }
1111 }
1112 return (PyObject *)v;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001113}
1114
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001115/* Create a new int object from a C unsigned long long int. */
Tim Petersd1a7da62001-06-13 00:35:57 +00001116
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001117PyObject *
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001118PyLong_FromUnsignedLongLong(unsigned long long ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 PyLongObject *v;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001121 unsigned long long t;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 int ndigits = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 if (ival < PyLong_BASE)
1125 return PyLong_FromLong((long)ival);
1126 /* Count the number of Python digits. */
orenmn86aa2692017-03-06 10:42:47 +02001127 t = ival;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 while (t) {
1129 ++ndigits;
1130 t >>= PyLong_SHIFT;
1131 }
1132 v = _PyLong_New(ndigits);
1133 if (v != NULL) {
1134 digit *p = v->ob_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 while (ival) {
1136 *p++ = (digit)(ival & PyLong_MASK);
1137 ival >>= PyLong_SHIFT;
1138 }
1139 }
1140 return (PyObject *)v;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001141}
1142
Serhiy Storchaka95949422013-08-27 19:40:23 +03001143/* Create a new int object from a C Py_ssize_t. */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001144
1145PyObject *
Guido van Rossumddefaf32007-01-14 03:31:43 +00001146PyLong_FromSsize_t(Py_ssize_t ival)
Martin v. Löwis18e16552006-02-15 17:27:45 +00001147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 PyLongObject *v;
1149 size_t abs_ival;
1150 size_t t; /* unsigned so >> doesn't propagate sign bit */
1151 int ndigits = 0;
1152 int negative = 0;
Mark Dickinson7ab6be22008-04-15 21:42:42 +00001153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 CHECK_SMALL_INT(ival);
1155 if (ival < 0) {
1156 /* avoid signed overflow when ival = SIZE_T_MIN */
1157 abs_ival = (size_t)(-1-ival)+1;
1158 negative = 1;
1159 }
1160 else {
1161 abs_ival = (size_t)ival;
1162 }
Mark Dickinson7ab6be22008-04-15 21:42:42 +00001163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 /* Count the number of Python digits. */
1165 t = abs_ival;
1166 while (t) {
1167 ++ndigits;
1168 t >>= PyLong_SHIFT;
1169 }
1170 v = _PyLong_New(ndigits);
1171 if (v != NULL) {
1172 digit *p = v->ob_digit;
1173 Py_SIZE(v) = negative ? -ndigits : ndigits;
1174 t = abs_ival;
1175 while (t) {
1176 *p++ = (digit)(t & PyLong_MASK);
1177 t >>= PyLong_SHIFT;
1178 }
1179 }
1180 return (PyObject *)v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001181}
1182
Serhiy Storchaka95949422013-08-27 19:40:23 +03001183/* Create a new int object from a C size_t. */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001184
1185PyObject *
Guido van Rossumddefaf32007-01-14 03:31:43 +00001186PyLong_FromSize_t(size_t ival)
Martin v. Löwis18e16552006-02-15 17:27:45 +00001187{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 PyLongObject *v;
1189 size_t t;
1190 int ndigits = 0;
Mark Dickinson7ab6be22008-04-15 21:42:42 +00001191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 if (ival < PyLong_BASE)
1193 return PyLong_FromLong((long)ival);
1194 /* Count the number of Python digits. */
1195 t = ival;
1196 while (t) {
1197 ++ndigits;
1198 t >>= PyLong_SHIFT;
1199 }
1200 v = _PyLong_New(ndigits);
1201 if (v != NULL) {
1202 digit *p = v->ob_digit;
1203 Py_SIZE(v) = ndigits;
1204 while (ival) {
1205 *p++ = (digit)(ival & PyLong_MASK);
1206 ival >>= PyLong_SHIFT;
1207 }
1208 }
1209 return (PyObject *)v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001210}
1211
Serhiy Storchaka95949422013-08-27 19:40:23 +03001212/* Get a C long long int from an int object or any object that has an
Mark Dickinson8d48b432011-10-23 20:47:14 +01001213 __int__ method. Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001214
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001215long long
Tim Peters9f688bf2000-07-07 15:53:28 +00001216PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 PyLongObject *v;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001219 long long bytes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 int res;
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001221 int do_decref = 0; /* if nb_int was called */
Tim Petersd1a7da62001-06-13 00:35:57 +00001222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 if (vv == NULL) {
1224 PyErr_BadInternalCall();
1225 return -1;
1226 }
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001227
1228 if (PyLong_Check(vv)) {
1229 v = (PyLongObject *)vv;
1230 }
1231 else {
1232 v = _PyLong_FromNbInt(vv);
1233 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 return -1;
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001235 do_decref = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001237
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001238 res = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 switch(Py_SIZE(v)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001240 case -1:
1241 bytes = -(sdigit)v->ob_digit[0];
1242 break;
1243 case 0:
1244 bytes = 0;
1245 break;
1246 case 1:
1247 bytes = v->ob_digit[0];
1248 break;
1249 default:
1250 res = _PyLong_AsByteArray((PyLongObject *)v, (unsigned char *)&bytes,
Serhiy Storchakac4f32122013-12-11 21:26:36 +02001251 SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 }
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001253 if (do_decref) {
1254 Py_DECREF(v);
1255 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001256
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001257 /* Plan 9 can't handle long long in ? : expressions */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 if (res < 0)
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001259 return (long long)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 else
1261 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001262}
1263
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001264/* Get a C unsigned long long int from an int object.
Tim Petersd1a7da62001-06-13 00:35:57 +00001265 Return -1 and set an error if overflow occurs. */
1266
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001267unsigned long long
Tim Peters9f688bf2000-07-07 15:53:28 +00001268PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 PyLongObject *v;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001271 unsigned long long bytes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 int res;
Tim Petersd1a7da62001-06-13 00:35:57 +00001273
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02001274 if (vv == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 PyErr_BadInternalCall();
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001276 return (unsigned long long)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 }
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02001278 if (!PyLong_Check(vv)) {
1279 PyErr_SetString(PyExc_TypeError, "an integer is required");
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001280 return (unsigned long long)-1;
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02001281 }
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 v = (PyLongObject*)vv;
1284 switch(Py_SIZE(v)) {
1285 case 0: return 0;
1286 case 1: return v->ob_digit[0];
1287 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00001288
Mark Dickinson22b20182010-05-10 21:27:53 +00001289 res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes,
Christian Heimes743e0cd2012-10-17 23:52:17 +02001290 SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001291
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001292 /* Plan 9 can't handle long long in ? : expressions */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 if (res < 0)
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001294 return (unsigned long long)res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 else
1296 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001297}
Tim Petersd1a7da62001-06-13 00:35:57 +00001298
Serhiy Storchaka95949422013-08-27 19:40:23 +03001299/* Get a C unsigned long int from an int object, ignoring the high bits.
Thomas Hellera4ea6032003-04-17 18:55:45 +00001300 Returns -1 and sets an error condition if an error occurs. */
1301
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001302static unsigned long long
Guido van Rossumddefaf32007-01-14 03:31:43 +00001303_PyLong_AsUnsignedLongLongMask(PyObject *vv)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001304{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001305 PyLongObject *v;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001306 unsigned long long x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 Py_ssize_t i;
1308 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 if (vv == NULL || !PyLong_Check(vv)) {
1311 PyErr_BadInternalCall();
1312 return (unsigned long) -1;
1313 }
1314 v = (PyLongObject *)vv;
1315 switch(Py_SIZE(v)) {
1316 case 0: return 0;
1317 case 1: return v->ob_digit[0];
1318 }
1319 i = Py_SIZE(v);
1320 sign = 1;
1321 x = 0;
1322 if (i < 0) {
1323 sign = -1;
1324 i = -i;
1325 }
1326 while (--i >= 0) {
1327 x = (x << PyLong_SHIFT) | v->ob_digit[i];
1328 }
1329 return x * sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001330}
Guido van Rossumddefaf32007-01-14 03:31:43 +00001331
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001332unsigned long long
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001333PyLong_AsUnsignedLongLongMask(PyObject *op)
Guido van Rossumddefaf32007-01-14 03:31:43 +00001334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 PyLongObject *lo;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001336 unsigned long long val;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001337
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001338 if (op == NULL) {
1339 PyErr_BadInternalCall();
1340 return (unsigned long)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00001342
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001343 if (PyLong_Check(op)) {
1344 return _PyLong_AsUnsignedLongLongMask(op);
1345 }
1346
1347 lo = _PyLong_FromNbInt(op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 if (lo == NULL)
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001349 return (unsigned long long)-1;
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001350
1351 val = _PyLong_AsUnsignedLongLongMask((PyObject *)lo);
1352 Py_DECREF(lo);
1353 return val;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001354}
Tim Petersd1a7da62001-06-13 00:35:57 +00001355
Serhiy Storchaka95949422013-08-27 19:40:23 +03001356/* Get a C long long int from an int object or any object that has an
Mark Dickinson8d48b432011-10-23 20:47:14 +01001357 __int__ method.
Mark Dickinson93f562c2010-01-30 10:30:15 +00001358
Mark Dickinson8d48b432011-10-23 20:47:14 +01001359 On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
1360 the result. Otherwise *overflow is 0.
1361
1362 For other errors (e.g., TypeError), return -1 and set an error condition.
1363 In this case *overflow will be 0.
Mark Dickinson93f562c2010-01-30 10:30:15 +00001364*/
1365
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001366long long
Mark Dickinson93f562c2010-01-30 10:30:15 +00001367PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
1368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 /* This version by Tim Peters */
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001370 PyLongObject *v;
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001371 unsigned long long x, prev;
1372 long long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 Py_ssize_t i;
1374 int sign;
1375 int do_decref = 0; /* if nb_int was called */
Mark Dickinson93f562c2010-01-30 10:30:15 +00001376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 *overflow = 0;
1378 if (vv == NULL) {
1379 PyErr_BadInternalCall();
1380 return -1;
1381 }
Mark Dickinson93f562c2010-01-30 10:30:15 +00001382
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001383 if (PyLong_Check(vv)) {
1384 v = (PyLongObject *)vv;
1385 }
1386 else {
1387 v = _PyLong_FromNbInt(vv);
1388 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 return -1;
1390 do_decref = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 }
Mark Dickinson93f562c2010-01-30 10:30:15 +00001392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 res = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 i = Py_SIZE(v);
Mark Dickinson93f562c2010-01-30 10:30:15 +00001395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 switch (i) {
1397 case -1:
1398 res = -(sdigit)v->ob_digit[0];
1399 break;
1400 case 0:
1401 res = 0;
1402 break;
1403 case 1:
1404 res = v->ob_digit[0];
1405 break;
1406 default:
1407 sign = 1;
1408 x = 0;
1409 if (i < 0) {
1410 sign = -1;
1411 i = -(i);
1412 }
1413 while (--i >= 0) {
1414 prev = x;
1415 x = (x << PyLong_SHIFT) + v->ob_digit[i];
1416 if ((x >> PyLong_SHIFT) != prev) {
1417 *overflow = sign;
1418 goto exit;
1419 }
1420 }
1421 /* Haven't lost any bits, but casting to long requires extra
1422 * care (see comment above).
1423 */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001424 if (x <= (unsigned long long)PY_LLONG_MAX) {
1425 res = (long long)x * sign;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 }
1427 else if (sign < 0 && x == PY_ABS_LLONG_MIN) {
1428 res = PY_LLONG_MIN;
1429 }
1430 else {
1431 *overflow = sign;
1432 /* res is already set to -1 */
1433 }
1434 }
Mark Dickinson22b20182010-05-10 21:27:53 +00001435 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 if (do_decref) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001437 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 }
1439 return res;
Mark Dickinson93f562c2010-01-30 10:30:15 +00001440}
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 +
1825 bits_in_digit(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;
2027 int 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 }
Brett Cannona721aba2016-09-09 14:57:09 -07002130 while (*str != '\0' && Py_ISSPACE(Py_CHARMASK(*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;
Brett Cannona721aba2016-09-09 14:57:09 -07002271 int 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 */
Brett Cannona721aba2016-09-09 14:57:09 -07002333 size_z = (Py_ssize_t)(digits * log_base_BASE[base]) + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 /* Uncomment next line to test exceedingly rare copy code */
2335 /* size_z = 1; */
2336 assert(size_z > 0);
2337 z = _PyLong_New(size_z);
Brett Cannona721aba2016-09-09 14:57:09 -07002338 if (z == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 return NULL;
Brett Cannona721aba2016-09-09 14:57:09 -07002340 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 Py_SIZE(z) = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 /* `convwidth` consecutive input digits are treated as a single
2344 * digit in base `convmultmax`.
2345 */
2346 convwidth = convwidth_base[base];
2347 convmultmax = convmultmax_base[base];
Thomas Wouters477c8d52006-05-27 19:21:47 +00002348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 /* Work ;-) */
2350 while (str < scan) {
Brett Cannona721aba2016-09-09 14:57:09 -07002351 if (*str == '_') {
2352 str++;
2353 continue;
2354 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 /* grab up to convwidth digits from the input string */
2356 c = (digit)_PyLong_DigitValue[Py_CHARMASK(*str++)];
Brett Cannona721aba2016-09-09 14:57:09 -07002357 for (i = 1; i < convwidth && str != scan; ++str) {
2358 if (*str == '_') {
2359 continue;
2360 }
2361 i++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 c = (twodigits)(c * base +
Mark Dickinson22b20182010-05-10 21:27:53 +00002363 (int)_PyLong_DigitValue[Py_CHARMASK(*str)]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 assert(c < PyLong_BASE);
2365 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 convmult = convmultmax;
2368 /* Calculate the shift only if we couldn't get
2369 * convwidth digits.
2370 */
2371 if (i != convwidth) {
2372 convmult = base;
Brett Cannona721aba2016-09-09 14:57:09 -07002373 for ( ; i > 1; --i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 convmult *= base;
Brett Cannona721aba2016-09-09 14:57:09 -07002375 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 /* Multiply z by convmult, and add c. */
2379 pz = z->ob_digit;
2380 pzstop = pz + Py_SIZE(z);
2381 for (; pz < pzstop; ++pz) {
2382 c += (twodigits)*pz * convmult;
2383 *pz = (digit)(c & PyLong_MASK);
2384 c >>= PyLong_SHIFT;
2385 }
2386 /* carry off the current end? */
2387 if (c) {
2388 assert(c < PyLong_BASE);
2389 if (Py_SIZE(z) < size_z) {
2390 *pz = (digit)c;
2391 ++Py_SIZE(z);
2392 }
2393 else {
2394 PyLongObject *tmp;
2395 /* Extremely rare. Get more space. */
2396 assert(Py_SIZE(z) == size_z);
2397 tmp = _PyLong_New(size_z + 1);
2398 if (tmp == NULL) {
2399 Py_DECREF(z);
2400 return NULL;
2401 }
2402 memcpy(tmp->ob_digit,
2403 z->ob_digit,
2404 sizeof(digit) * size_z);
2405 Py_DECREF(z);
2406 z = tmp;
2407 z->ob_digit[size_z] = (digit)c;
2408 ++size_z;
2409 }
2410 }
2411 }
2412 }
Brett Cannona721aba2016-09-09 14:57:09 -07002413 if (z == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 return NULL;
Brett Cannona721aba2016-09-09 14:57:09 -07002415 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 if (error_if_nonzero) {
2417 /* reset the base to 0, else the exception message
2418 doesn't make too much sense */
2419 base = 0;
Brett Cannona721aba2016-09-09 14:57:09 -07002420 if (Py_SIZE(z) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 goto onError;
Brett Cannona721aba2016-09-09 14:57:09 -07002422 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 /* there might still be other problems, therefore base
2424 remains zero here for the same reason */
2425 }
Brett Cannona721aba2016-09-09 14:57:09 -07002426 if (str == start) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 goto onError;
Brett Cannona721aba2016-09-09 14:57:09 -07002428 }
2429 if (sign < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 Py_SIZE(z) = -(Py_SIZE(z));
Brett Cannona721aba2016-09-09 14:57:09 -07002431 }
2432 while (*str && Py_ISSPACE(Py_CHARMASK(*str))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 str++;
Brett Cannona721aba2016-09-09 14:57:09 -07002434 }
2435 if (*str != '\0') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 goto onError;
Brett Cannona721aba2016-09-09 14:57:09 -07002437 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 long_normalize(z);
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002439 z = maybe_small_long(z);
Brett Cannona721aba2016-09-09 14:57:09 -07002440 if (z == NULL) {
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002441 return NULL;
Brett Cannona721aba2016-09-09 14:57:09 -07002442 }
2443 if (pend != NULL) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03002444 *pend = (char *)str;
Brett Cannona721aba2016-09-09 14:57:09 -07002445 }
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002446 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00002447
Mark Dickinson22b20182010-05-10 21:27:53 +00002448 onError:
Brett Cannona721aba2016-09-09 14:57:09 -07002449 if (pend != NULL) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03002450 *pend = (char *)str;
Brett Cannona721aba2016-09-09 14:57:09 -07002451 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 Py_XDECREF(z);
2453 slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200;
2454 strobj = PyUnicode_FromStringAndSize(orig_str, slen);
Brett Cannona721aba2016-09-09 14:57:09 -07002455 if (strobj == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 return NULL;
Brett Cannona721aba2016-09-09 14:57:09 -07002457 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 PyErr_Format(PyExc_ValueError,
Serhiy Storchaka579ddc22013-08-03 21:14:05 +03002459 "invalid literal for int() with base %d: %.200R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 base, strobj);
2461 Py_DECREF(strobj);
2462 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00002463}
2464
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002465/* Since PyLong_FromString doesn't have a length parameter,
2466 * check here for possible NULs in the string.
2467 *
2468 * Reports an invalid literal as a bytes object.
2469 */
2470PyObject *
2471_PyLong_FromBytes(const char *s, Py_ssize_t len, int base)
2472{
2473 PyObject *result, *strobj;
2474 char *end = NULL;
2475
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002476 result = PyLong_FromString(s, &end, base);
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002477 if (end == NULL || (result != NULL && end == s + len))
2478 return result;
2479 Py_XDECREF(result);
2480 strobj = PyBytes_FromStringAndSize(s, Py_MIN(len, 200));
2481 if (strobj != NULL) {
2482 PyErr_Format(PyExc_ValueError,
Serhiy Storchaka579ddc22013-08-03 21:14:05 +03002483 "invalid literal for int() with base %d: %.200R",
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002484 base, strobj);
2485 Py_DECREF(strobj);
2486 }
2487 return NULL;
2488}
2489
Guido van Rossum9e896b32000-04-05 20:11:21 +00002490PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00002491PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00002492{
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02002493 PyObject *v, *unicode = PyUnicode_FromWideChar(u, length);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002494 if (unicode == NULL)
2495 return NULL;
2496 v = PyLong_FromUnicodeObject(unicode, base);
2497 Py_DECREF(unicode);
2498 return v;
2499}
2500
2501PyObject *
2502PyLong_FromUnicodeObject(PyObject *u, int base)
2503{
Serhiy Storchaka579ddc22013-08-03 21:14:05 +03002504 PyObject *result, *asciidig;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02002505 const char *buffer;
2506 char *end = NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002507 Py_ssize_t buflen;
Guido van Rossum9e896b32000-04-05 20:11:21 +00002508
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002509 asciidig = _PyUnicode_TransformDecimalAndSpaceToASCII(u);
Alexander Belopolsky942af5a2010-12-04 03:38:46 +00002510 if (asciidig == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 return NULL;
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +02002512 assert(PyUnicode_IS_ASCII(asciidig));
2513 /* Simply get a pointer to existing ASCII characters. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002514 buffer = PyUnicode_AsUTF8AndSize(asciidig, &buflen);
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +02002515 assert(buffer != NULL);
2516
2517 result = PyLong_FromString(buffer, &end, base);
2518 if (end == NULL || (result != NULL && end == buffer + buflen)) {
Alexander Belopolsky942af5a2010-12-04 03:38:46 +00002519 Py_DECREF(asciidig);
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +02002520 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 }
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +02002522 Py_DECREF(asciidig);
2523 Py_XDECREF(result);
Serhiy Storchaka579ddc22013-08-03 21:14:05 +03002524 PyErr_Format(PyExc_ValueError,
2525 "invalid literal for int() with base %d: %.200R",
2526 base, u);
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03002527 return NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002528}
2529
Tim Peters9f688bf2000-07-07 15:53:28 +00002530/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002531static PyLongObject *x_divrem
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 (PyLongObject *, PyLongObject *, PyLongObject **);
Guido van Rossumb43daf72007-08-01 18:08:08 +00002533static PyObject *long_long(PyObject *v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002534
Serhiy Storchaka95949422013-08-27 19:40:23 +03002535/* Int division with remainder, top-level routine */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002536
Guido van Rossume32e0141992-01-19 16:31:05 +00002537static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002538long_divrem(PyLongObject *a, PyLongObject *b,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002540{
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002541 Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 if (size_b == 0) {
2545 PyErr_SetString(PyExc_ZeroDivisionError,
2546 "integer division or modulo by zero");
2547 return -1;
2548 }
2549 if (size_a < size_b ||
2550 (size_a == size_b &&
2551 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
2552 /* |a| < |b|. */
Mark Dickinsonb820d7f2016-08-22 12:24:46 +01002553 *prem = (PyLongObject *)long_long((PyObject *)a);
2554 if (*prem == NULL) {
Mark Dickinsonb820d7f2016-08-22 12:24:46 +01002555 return -1;
2556 }
Serhiy Storchakaba85d692017-03-30 09:09:41 +03002557 Py_INCREF(_PyLong_Zero);
2558 *pdiv = (PyLongObject*)_PyLong_Zero;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 return 0;
2560 }
2561 if (size_b == 1) {
2562 digit rem = 0;
2563 z = divrem1(a, b->ob_digit[0], &rem);
2564 if (z == NULL)
2565 return -1;
2566 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
2567 if (*prem == NULL) {
2568 Py_DECREF(z);
2569 return -1;
2570 }
2571 }
2572 else {
2573 z = x_divrem(a, b, prem);
2574 if (z == NULL)
2575 return -1;
2576 }
2577 /* Set the signs.
2578 The quotient z has the sign of a*b;
2579 the remainder r has the sign of a,
2580 so a = b*z + r. */
Victor Stinner8aed6f12013-07-17 22:31:17 +02002581 if ((Py_SIZE(a) < 0) != (Py_SIZE(b) < 0)) {
2582 _PyLong_Negate(&z);
2583 if (z == NULL) {
2584 Py_CLEAR(*prem);
2585 return -1;
2586 }
2587 }
2588 if (Py_SIZE(a) < 0 && Py_SIZE(*prem) != 0) {
2589 _PyLong_Negate(prem);
2590 if (*prem == NULL) {
2591 Py_DECREF(z);
2592 Py_CLEAR(*prem);
2593 return -1;
2594 }
2595 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 *pdiv = maybe_small_long(z);
2597 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002598}
2599
Serhiy Storchaka95949422013-08-27 19:40:23 +03002600/* Unsigned int division with remainder -- the algorithm. The arguments v1
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002601 and w1 should satisfy 2 <= Py_ABS(Py_SIZE(w1)) <= Py_ABS(Py_SIZE(v1)). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002602
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002603static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002604x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 PyLongObject *v, *w, *a;
2607 Py_ssize_t i, k, size_v, size_w;
2608 int d;
2609 digit wm1, wm2, carry, q, r, vtop, *v0, *vk, *w0, *ak;
2610 twodigits vv;
2611 sdigit zhi;
2612 stwodigits z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 /* We follow Knuth [The Art of Computer Programming, Vol. 2 (3rd
2615 edn.), section 4.3.1, Algorithm D], except that we don't explicitly
2616 handle the special case when the initial estimate q for a quotient
2617 digit is >= PyLong_BASE: the max value for q is PyLong_BASE+1, and
2618 that won't overflow a digit. */
Mark Dickinson17e4fdd2009-03-23 18:44:57 +00002619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 /* allocate space; w will also be used to hold the final remainder */
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002621 size_v = Py_ABS(Py_SIZE(v1));
2622 size_w = Py_ABS(Py_SIZE(w1));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 assert(size_v >= size_w && size_w >= 2); /* Assert checks by div() */
2624 v = _PyLong_New(size_v+1);
2625 if (v == NULL) {
2626 *prem = NULL;
2627 return NULL;
2628 }
2629 w = _PyLong_New(size_w);
2630 if (w == NULL) {
2631 Py_DECREF(v);
2632 *prem = NULL;
2633 return NULL;
2634 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 /* normalize: shift w1 left so that its top digit is >= PyLong_BASE/2.
2637 shift v1 left by the same amount. Results go into w and v. */
2638 d = PyLong_SHIFT - bits_in_digit(w1->ob_digit[size_w-1]);
2639 carry = v_lshift(w->ob_digit, w1->ob_digit, size_w, d);
2640 assert(carry == 0);
2641 carry = v_lshift(v->ob_digit, v1->ob_digit, size_v, d);
2642 if (carry != 0 || v->ob_digit[size_v-1] >= w->ob_digit[size_w-1]) {
2643 v->ob_digit[size_v] = carry;
2644 size_v++;
2645 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 /* Now v->ob_digit[size_v-1] < w->ob_digit[size_w-1], so quotient has
2648 at most (and usually exactly) k = size_v - size_w digits. */
2649 k = size_v - size_w;
2650 assert(k >= 0);
2651 a = _PyLong_New(k);
2652 if (a == NULL) {
2653 Py_DECREF(w);
2654 Py_DECREF(v);
2655 *prem = NULL;
2656 return NULL;
2657 }
2658 v0 = v->ob_digit;
2659 w0 = w->ob_digit;
2660 wm1 = w0[size_w-1];
2661 wm2 = w0[size_w-2];
2662 for (vk = v0+k, ak = a->ob_digit + k; vk-- > v0;) {
2663 /* inner loop: divide vk[0:size_w+1] by w0[0:size_w], giving
2664 single-digit quotient q, remainder in vk[0:size_w]. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 SIGCHECK({
Mark Dickinson22b20182010-05-10 21:27:53 +00002667 Py_DECREF(a);
2668 Py_DECREF(w);
2669 Py_DECREF(v);
2670 *prem = NULL;
2671 return NULL;
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00002672 });
Tim Peters5af4e6c2002-08-12 02:31:19 +00002673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 /* estimate quotient digit q; may overestimate by 1 (rare) */
2675 vtop = vk[size_w];
2676 assert(vtop <= wm1);
2677 vv = ((twodigits)vtop << PyLong_SHIFT) | vk[size_w-1];
2678 q = (digit)(vv / wm1);
2679 r = (digit)(vv - (twodigits)wm1 * q); /* r = vv % wm1 */
2680 while ((twodigits)wm2 * q > (((twodigits)r << PyLong_SHIFT)
2681 | vk[size_w-2])) {
2682 --q;
2683 r += wm1;
2684 if (r >= PyLong_BASE)
2685 break;
2686 }
2687 assert(q <= PyLong_BASE);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 /* subtract q*w0[0:size_w] from vk[0:size_w+1] */
2690 zhi = 0;
2691 for (i = 0; i < size_w; ++i) {
2692 /* invariants: -PyLong_BASE <= -q <= zhi <= 0;
2693 -PyLong_BASE * q <= z < PyLong_BASE */
2694 z = (sdigit)vk[i] + zhi -
2695 (stwodigits)q * (stwodigits)w0[i];
2696 vk[i] = (digit)z & PyLong_MASK;
2697 zhi = (sdigit)Py_ARITHMETIC_RIGHT_SHIFT(stwodigits,
Mark Dickinson22b20182010-05-10 21:27:53 +00002698 z, PyLong_SHIFT);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 /* add w back if q was too large (this branch taken rarely) */
2702 assert((sdigit)vtop + zhi == -1 || (sdigit)vtop + zhi == 0);
2703 if ((sdigit)vtop + zhi < 0) {
2704 carry = 0;
2705 for (i = 0; i < size_w; ++i) {
2706 carry += vk[i] + w0[i];
2707 vk[i] = carry & PyLong_MASK;
2708 carry >>= PyLong_SHIFT;
2709 }
2710 --q;
2711 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 /* store quotient digit */
2714 assert(q < PyLong_BASE);
2715 *--ak = q;
2716 }
Mark Dickinson17e4fdd2009-03-23 18:44:57 +00002717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 /* unshift remainder; we reuse w to store the result */
2719 carry = v_rshift(w0, v0, size_w, d);
2720 assert(carry==0);
2721 Py_DECREF(v);
Mark Dickinson17e4fdd2009-03-23 18:44:57 +00002722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 *prem = long_normalize(w);
2724 return long_normalize(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002725}
2726
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002727/* For a nonzero PyLong a, express a in the form x * 2**e, with 0.5 <=
2728 abs(x) < 1.0 and e >= 0; return x and put e in *e. Here x is
2729 rounded to DBL_MANT_DIG significant bits using round-half-to-even.
2730 If a == 0, return 0.0 and set *e = 0. If the resulting exponent
2731 e is larger than PY_SSIZE_T_MAX, raise OverflowError and return
2732 -1.0. */
2733
2734/* attempt to define 2.0**DBL_MANT_DIG as a compile-time constant */
2735#if DBL_MANT_DIG == 53
2736#define EXP2_DBL_MANT_DIG 9007199254740992.0
2737#else
2738#define EXP2_DBL_MANT_DIG (ldexp(1.0, DBL_MANT_DIG))
2739#endif
2740
2741double
2742_PyLong_Frexp(PyLongObject *a, Py_ssize_t *e)
2743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 Py_ssize_t a_size, a_bits, shift_digits, shift_bits, x_size;
2745 /* See below for why x_digits is always large enough. */
2746 digit rem, x_digits[2 + (DBL_MANT_DIG + 1) / PyLong_SHIFT];
2747 double dx;
2748 /* Correction term for round-half-to-even rounding. For a digit x,
2749 "x + half_even_correction[x & 7]" gives x rounded to the nearest
2750 multiple of 4, rounding ties to a multiple of 8. */
2751 static const int half_even_correction[8] = {0, -1, -2, 1, 0, -1, 2, 1};
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002752
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002753 a_size = Py_ABS(Py_SIZE(a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 if (a_size == 0) {
2755 /* Special case for 0: significand 0.0, exponent 0. */
2756 *e = 0;
2757 return 0.0;
2758 }
2759 a_bits = bits_in_digit(a->ob_digit[a_size-1]);
2760 /* The following is an overflow-free version of the check
2761 "if ((a_size - 1) * PyLong_SHIFT + a_bits > PY_SSIZE_T_MAX) ..." */
2762 if (a_size >= (PY_SSIZE_T_MAX - 1) / PyLong_SHIFT + 1 &&
2763 (a_size > (PY_SSIZE_T_MAX - 1) / PyLong_SHIFT + 1 ||
2764 a_bits > (PY_SSIZE_T_MAX - 1) % PyLong_SHIFT + 1))
Mark Dickinson22b20182010-05-10 21:27:53 +00002765 goto overflow;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 a_bits = (a_size - 1) * PyLong_SHIFT + a_bits;
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 /* Shift the first DBL_MANT_DIG + 2 bits of a into x_digits[0:x_size]
2769 (shifting left if a_bits <= DBL_MANT_DIG + 2).
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 Number of digits needed for result: write // for floor division.
2772 Then if shifting left, we end up using
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 1 + a_size + (DBL_MANT_DIG + 2 - a_bits) // PyLong_SHIFT
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002776 digits. If shifting right, we use
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 a_size - (a_bits - DBL_MANT_DIG - 2) // PyLong_SHIFT
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 digits. Using a_size = 1 + (a_bits - 1) // PyLong_SHIFT along with
2781 the inequalities
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 m // PyLong_SHIFT + n // PyLong_SHIFT <= (m + n) // PyLong_SHIFT
2784 m // PyLong_SHIFT - n // PyLong_SHIFT <=
2785 1 + (m - n - 1) // PyLong_SHIFT,
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 valid for any integers m and n, we find that x_size satisfies
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 x_size <= 2 + (DBL_MANT_DIG + 1) // PyLong_SHIFT
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 in both cases.
2792 */
2793 if (a_bits <= DBL_MANT_DIG + 2) {
2794 shift_digits = (DBL_MANT_DIG + 2 - a_bits) / PyLong_SHIFT;
2795 shift_bits = (DBL_MANT_DIG + 2 - a_bits) % PyLong_SHIFT;
2796 x_size = 0;
2797 while (x_size < shift_digits)
2798 x_digits[x_size++] = 0;
2799 rem = v_lshift(x_digits + x_size, a->ob_digit, a_size,
2800 (int)shift_bits);
2801 x_size += a_size;
2802 x_digits[x_size++] = rem;
2803 }
2804 else {
2805 shift_digits = (a_bits - DBL_MANT_DIG - 2) / PyLong_SHIFT;
2806 shift_bits = (a_bits - DBL_MANT_DIG - 2) % PyLong_SHIFT;
2807 rem = v_rshift(x_digits, a->ob_digit + shift_digits,
2808 a_size - shift_digits, (int)shift_bits);
2809 x_size = a_size - shift_digits;
2810 /* For correct rounding below, we need the least significant
2811 bit of x to be 'sticky' for this shift: if any of the bits
2812 shifted out was nonzero, we set the least significant bit
2813 of x. */
2814 if (rem)
2815 x_digits[0] |= 1;
2816 else
2817 while (shift_digits > 0)
2818 if (a->ob_digit[--shift_digits]) {
2819 x_digits[0] |= 1;
2820 break;
2821 }
2822 }
Victor Stinner63941882011-09-29 00:42:28 +02002823 assert(1 <= x_size && x_size <= (Py_ssize_t)Py_ARRAY_LENGTH(x_digits));
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 /* Round, and convert to double. */
2826 x_digits[0] += half_even_correction[x_digits[0] & 7];
2827 dx = x_digits[--x_size];
2828 while (x_size > 0)
2829 dx = dx * PyLong_BASE + x_digits[--x_size];
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 /* Rescale; make correction if result is 1.0. */
2832 dx /= 4.0 * EXP2_DBL_MANT_DIG;
2833 if (dx == 1.0) {
2834 if (a_bits == PY_SSIZE_T_MAX)
2835 goto overflow;
2836 dx = 0.5;
2837 a_bits += 1;
2838 }
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 *e = a_bits;
2841 return Py_SIZE(a) < 0 ? -dx : dx;
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002842
2843 overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 /* exponent > PY_SSIZE_T_MAX */
2845 PyErr_SetString(PyExc_OverflowError,
2846 "huge integer: number of bits overflows a Py_ssize_t");
2847 *e = 0;
2848 return -1.0;
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002849}
2850
Serhiy Storchaka95949422013-08-27 19:40:23 +03002851/* Get a C double from an int object. Rounds to the nearest double,
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002852 using the round-half-to-even rule in the case of a tie. */
2853
2854double
2855PyLong_AsDouble(PyObject *v)
2856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 Py_ssize_t exponent;
2858 double x;
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002859
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02002860 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 PyErr_BadInternalCall();
2862 return -1.0;
2863 }
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02002864 if (!PyLong_Check(v)) {
2865 PyErr_SetString(PyExc_TypeError, "an integer is required");
2866 return -1.0;
2867 }
Yury Selivanov186c30b2016-02-05 19:40:01 -05002868 if (Py_ABS(Py_SIZE(v)) <= 1) {
Yury Selivanova0fcaca2016-02-06 12:21:33 -05002869 /* Fast path; single digit long (31 bits) will cast safely
Mark Dickinson1dc3c892016-08-21 10:33:36 +01002870 to double. This improves performance of FP/long operations
2871 by 20%.
Yury Selivanov186c30b2016-02-05 19:40:01 -05002872 */
2873 return (double)MEDIUM_VALUE((PyLongObject *)v);
2874 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 x = _PyLong_Frexp((PyLongObject *)v, &exponent);
2876 if ((x == -1.0 && PyErr_Occurred()) || exponent > DBL_MAX_EXP) {
2877 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson02515f72013-08-03 12:08:22 +01002878 "int too large to convert to float");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002879 return -1.0;
2880 }
2881 return ldexp(x, (int)exponent);
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002882}
2883
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002884/* Methods */
2885
2886static void
Tim Peters9f688bf2000-07-07 15:53:28 +00002887long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002889 Py_TYPE(v)->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002890}
2891
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002892static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002893long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895 Py_ssize_t sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 if (Py_SIZE(a) != Py_SIZE(b)) {
2898 sign = Py_SIZE(a) - Py_SIZE(b);
2899 }
2900 else {
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002901 Py_ssize_t i = Py_ABS(Py_SIZE(a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
2903 ;
2904 if (i < 0)
2905 sign = 0;
2906 else {
2907 sign = (sdigit)a->ob_digit[i] - (sdigit)b->ob_digit[i];
2908 if (Py_SIZE(a) < 0)
2909 sign = -sign;
2910 }
2911 }
2912 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002913}
2914
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002915static PyObject *
2916long_richcompare(PyObject *self, PyObject *other, int op)
2917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 int result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 CHECK_BINOP(self, other);
2920 if (self == other)
2921 result = 0;
2922 else
2923 result = long_compare((PyLongObject*)self, (PyLongObject*)other);
stratakise8b19652017-11-02 11:32:54 +01002924 Py_RETURN_RICHCOMPARE(result, 0, op);
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002925}
2926
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002927static Py_hash_t
Tim Peters9f688bf2000-07-07 15:53:28 +00002928long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002929{
Benjamin Peterson8035bc52010-10-23 16:20:50 +00002930 Py_uhash_t x;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 Py_ssize_t i;
2932 int sign;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 i = Py_SIZE(v);
2935 switch(i) {
2936 case -1: return v->ob_digit[0]==1 ? -2 : -(sdigit)v->ob_digit[0];
2937 case 0: return 0;
2938 case 1: return v->ob_digit[0];
2939 }
2940 sign = 1;
2941 x = 0;
2942 if (i < 0) {
2943 sign = -1;
2944 i = -(i);
2945 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 while (--i >= 0) {
Mark Dickinsondc787d22010-05-23 13:33:13 +00002947 /* Here x is a quantity in the range [0, _PyHASH_MODULUS); we
2948 want to compute x * 2**PyLong_SHIFT + v->ob_digit[i] modulo
2949 _PyHASH_MODULUS.
2950
2951 The computation of x * 2**PyLong_SHIFT % _PyHASH_MODULUS
2952 amounts to a rotation of the bits of x. To see this, write
2953
2954 x * 2**PyLong_SHIFT = y * 2**_PyHASH_BITS + z
2955
2956 where y = x >> (_PyHASH_BITS - PyLong_SHIFT) gives the top
2957 PyLong_SHIFT bits of x (those that are shifted out of the
2958 original _PyHASH_BITS bits, and z = (x << PyLong_SHIFT) &
2959 _PyHASH_MODULUS gives the bottom _PyHASH_BITS - PyLong_SHIFT
2960 bits of x, shifted up. Then since 2**_PyHASH_BITS is
2961 congruent to 1 modulo _PyHASH_MODULUS, y*2**_PyHASH_BITS is
2962 congruent to y modulo _PyHASH_MODULUS. So
2963
2964 x * 2**PyLong_SHIFT = y + z (mod _PyHASH_MODULUS).
2965
2966 The right-hand side is just the result of rotating the
2967 _PyHASH_BITS bits of x left by PyLong_SHIFT places; since
2968 not all _PyHASH_BITS bits of x are 1s, the same is true
2969 after rotation, so 0 <= y+z < _PyHASH_MODULUS and y + z is
2970 the reduction of x*2**PyLong_SHIFT modulo
2971 _PyHASH_MODULUS. */
2972 x = ((x << PyLong_SHIFT) & _PyHASH_MODULUS) |
2973 (x >> (_PyHASH_BITS - PyLong_SHIFT));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002974 x += v->ob_digit[i];
Mark Dickinsondc787d22010-05-23 13:33:13 +00002975 if (x >= _PyHASH_MODULUS)
2976 x -= _PyHASH_MODULUS;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977 }
2978 x = x * sign;
Benjamin Peterson8035bc52010-10-23 16:20:50 +00002979 if (x == (Py_uhash_t)-1)
2980 x = (Py_uhash_t)-2;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00002981 return (Py_hash_t)x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002982}
2983
2984
Serhiy Storchaka95949422013-08-27 19:40:23 +03002985/* Add the absolute values of two integers. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002986
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002987static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002988x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002989{
Victor Stinner45e8e2f2014-05-14 17:24:35 +02002990 Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002991 PyLongObject *z;
2992 Py_ssize_t i;
2993 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00002994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 /* Ensure a is the larger of the two: */
2996 if (size_a < size_b) {
2997 { PyLongObject *temp = a; a = b; b = temp; }
2998 { Py_ssize_t size_temp = size_a;
Mark Dickinson22b20182010-05-10 21:27:53 +00002999 size_a = size_b;
3000 size_b = size_temp; }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003001 }
3002 z = _PyLong_New(size_a+1);
3003 if (z == NULL)
3004 return NULL;
3005 for (i = 0; i < size_b; ++i) {
3006 carry += a->ob_digit[i] + b->ob_digit[i];
3007 z->ob_digit[i] = carry & PyLong_MASK;
3008 carry >>= PyLong_SHIFT;
3009 }
3010 for (; i < size_a; ++i) {
3011 carry += a->ob_digit[i];
3012 z->ob_digit[i] = carry & PyLong_MASK;
3013 carry >>= PyLong_SHIFT;
3014 }
3015 z->ob_digit[i] = carry;
3016 return long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003017}
3018
3019/* Subtract the absolute values of two integers. */
3020
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003021static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003022x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003023{
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003024 Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 PyLongObject *z;
3026 Py_ssize_t i;
3027 int sign = 1;
3028 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00003029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003030 /* Ensure a is the larger of the two: */
3031 if (size_a < size_b) {
3032 sign = -1;
3033 { PyLongObject *temp = a; a = b; b = temp; }
3034 { Py_ssize_t size_temp = size_a;
Mark Dickinson22b20182010-05-10 21:27:53 +00003035 size_a = size_b;
3036 size_b = size_temp; }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 }
3038 else if (size_a == size_b) {
3039 /* Find highest digit where a and b differ: */
3040 i = size_a;
3041 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
3042 ;
3043 if (i < 0)
3044 return (PyLongObject *)PyLong_FromLong(0);
3045 if (a->ob_digit[i] < b->ob_digit[i]) {
3046 sign = -1;
3047 { PyLongObject *temp = a; a = b; b = temp; }
3048 }
3049 size_a = size_b = i+1;
3050 }
3051 z = _PyLong_New(size_a);
3052 if (z == NULL)
3053 return NULL;
3054 for (i = 0; i < size_b; ++i) {
3055 /* The following assumes unsigned arithmetic
3056 works module 2**N for some N>PyLong_SHIFT. */
3057 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
3058 z->ob_digit[i] = borrow & PyLong_MASK;
3059 borrow >>= PyLong_SHIFT;
3060 borrow &= 1; /* Keep only one sign bit */
3061 }
3062 for (; i < size_a; ++i) {
3063 borrow = a->ob_digit[i] - borrow;
3064 z->ob_digit[i] = borrow & PyLong_MASK;
3065 borrow >>= PyLong_SHIFT;
3066 borrow &= 1; /* Keep only one sign bit */
3067 }
3068 assert(borrow == 0);
Victor Stinner8aed6f12013-07-17 22:31:17 +02003069 if (sign < 0) {
Victor Stinner8bcf3122016-08-17 19:48:33 +02003070 Py_SIZE(z) = -Py_SIZE(z);
Victor Stinner8aed6f12013-07-17 22:31:17 +02003071 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 return long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003073}
3074
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003075static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003076long_add(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003078 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00003079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 CHECK_BINOP(a, b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003081
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003082 if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
Mark Dickinsonc1c4a642016-09-17 20:01:56 +01003083 return PyLong_FromLong(MEDIUM_VALUE(a) + MEDIUM_VALUE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 }
3085 if (Py_SIZE(a) < 0) {
3086 if (Py_SIZE(b) < 0) {
3087 z = x_add(a, b);
Serhiy Storchakae63e5d62016-06-04 00:06:45 +03003088 if (z != NULL) {
3089 /* x_add received at least one multiple-digit int,
3090 and thus z must be a multiple-digit int.
3091 That also means z is not an element of
3092 small_ints, so negating it in-place is safe. */
3093 assert(Py_REFCNT(z) == 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003094 Py_SIZE(z) = -(Py_SIZE(z));
Serhiy Storchakae63e5d62016-06-04 00:06:45 +03003095 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 }
3097 else
3098 z = x_sub(b, a);
3099 }
3100 else {
3101 if (Py_SIZE(b) < 0)
3102 z = x_sub(a, b);
3103 else
3104 z = x_add(a, b);
3105 }
3106 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003107}
3108
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003109static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003110long_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 CHECK_BINOP(a, b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003115
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003116 if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
Mark Dickinsonc1c4a642016-09-17 20:01:56 +01003117 return PyLong_FromLong(MEDIUM_VALUE(a) - MEDIUM_VALUE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 }
3119 if (Py_SIZE(a) < 0) {
3120 if (Py_SIZE(b) < 0)
3121 z = x_sub(a, b);
3122 else
3123 z = x_add(a, b);
Serhiy Storchakae63e5d62016-06-04 00:06:45 +03003124 if (z != NULL) {
3125 assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 Py_SIZE(z) = -(Py_SIZE(z));
Serhiy Storchakae63e5d62016-06-04 00:06:45 +03003127 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 }
3129 else {
3130 if (Py_SIZE(b) < 0)
3131 z = x_add(a, b);
3132 else
3133 z = x_sub(a, b);
3134 }
3135 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003136}
3137
Tim Peters5af4e6c2002-08-12 02:31:19 +00003138/* Grade school multiplication, ignoring the signs.
3139 * Returns the absolute value of the product, or NULL if error.
3140 */
3141static PyLongObject *
3142x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00003143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 PyLongObject *z;
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003145 Py_ssize_t size_a = Py_ABS(Py_SIZE(a));
3146 Py_ssize_t size_b = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 Py_ssize_t i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 z = _PyLong_New(size_a + size_b);
3150 if (z == NULL)
3151 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 memset(z->ob_digit, 0, Py_SIZE(z) * sizeof(digit));
3154 if (a == b) {
3155 /* Efficient squaring per HAC, Algorithm 14.16:
3156 * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
3157 * Gives slightly less than a 2x speedup when a == b,
3158 * via exploiting that each entry in the multiplication
3159 * pyramid appears twice (except for the size_a squares).
3160 */
3161 for (i = 0; i < size_a; ++i) {
3162 twodigits carry;
3163 twodigits f = a->ob_digit[i];
3164 digit *pz = z->ob_digit + (i << 1);
3165 digit *pa = a->ob_digit + i + 1;
3166 digit *paend = a->ob_digit + size_a;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 SIGCHECK({
Mark Dickinson22b20182010-05-10 21:27:53 +00003169 Py_DECREF(z);
3170 return NULL;
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00003171 });
Tim Peters0973b992004-08-29 22:16:50 +00003172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 carry = *pz + f * f;
3174 *pz++ = (digit)(carry & PyLong_MASK);
3175 carry >>= PyLong_SHIFT;
3176 assert(carry <= PyLong_MASK);
Tim Peters0973b992004-08-29 22:16:50 +00003177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 /* Now f is added in twice in each column of the
3179 * pyramid it appears. Same as adding f<<1 once.
3180 */
3181 f <<= 1;
3182 while (pa < paend) {
3183 carry += *pz + *pa++ * f;
3184 *pz++ = (digit)(carry & PyLong_MASK);
3185 carry >>= PyLong_SHIFT;
3186 assert(carry <= (PyLong_MASK << 1));
3187 }
3188 if (carry) {
3189 carry += *pz;
3190 *pz++ = (digit)(carry & PyLong_MASK);
3191 carry >>= PyLong_SHIFT;
3192 }
3193 if (carry)
3194 *pz += (digit)(carry & PyLong_MASK);
3195 assert((carry >> PyLong_SHIFT) == 0);
3196 }
3197 }
Serhiy Storchaka95949422013-08-27 19:40:23 +03003198 else { /* a is not the same as b -- gradeschool int mult */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003199 for (i = 0; i < size_a; ++i) {
3200 twodigits carry = 0;
3201 twodigits f = a->ob_digit[i];
3202 digit *pz = z->ob_digit + i;
3203 digit *pb = b->ob_digit;
3204 digit *pbend = b->ob_digit + size_b;
Tim Peters0973b992004-08-29 22:16:50 +00003205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 SIGCHECK({
Mark Dickinson22b20182010-05-10 21:27:53 +00003207 Py_DECREF(z);
3208 return NULL;
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00003209 });
Tim Peters0973b992004-08-29 22:16:50 +00003210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 while (pb < pbend) {
3212 carry += *pz + *pb++ * f;
3213 *pz++ = (digit)(carry & PyLong_MASK);
3214 carry >>= PyLong_SHIFT;
3215 assert(carry <= PyLong_MASK);
3216 }
3217 if (carry)
3218 *pz += (digit)(carry & PyLong_MASK);
3219 assert((carry >> PyLong_SHIFT) == 0);
3220 }
3221 }
3222 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00003223}
3224
3225/* A helper for Karatsuba multiplication (k_mul).
Serhiy Storchaka95949422013-08-27 19:40:23 +03003226 Takes an int "n" and an integer "size" representing the place to
Tim Peters5af4e6c2002-08-12 02:31:19 +00003227 split, and sets low and high such that abs(n) == (high << size) + low,
3228 viewing the shift as being by digits. The sign bit is ignored, and
3229 the return values are >= 0.
3230 Returns 0 on success, -1 on failure.
3231*/
3232static int
Mark Dickinson22b20182010-05-10 21:27:53 +00003233kmul_split(PyLongObject *n,
3234 Py_ssize_t size,
3235 PyLongObject **high,
3236 PyLongObject **low)
Tim Peters5af4e6c2002-08-12 02:31:19 +00003237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 PyLongObject *hi, *lo;
3239 Py_ssize_t size_lo, size_hi;
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003240 const Py_ssize_t size_n = Py_ABS(Py_SIZE(n));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003241
Victor Stinner640c35c2013-06-04 23:14:37 +02003242 size_lo = Py_MIN(size_n, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 size_hi = size_n - size_lo;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 if ((hi = _PyLong_New(size_hi)) == NULL)
3246 return -1;
3247 if ((lo = _PyLong_New(size_lo)) == NULL) {
3248 Py_DECREF(hi);
3249 return -1;
3250 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
3253 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 *high = long_normalize(hi);
3256 *low = long_normalize(lo);
3257 return 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003258}
3259
Tim Peters60004642002-08-12 22:01:34 +00003260static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
3261
Tim Peters5af4e6c2002-08-12 02:31:19 +00003262/* Karatsuba multiplication. Ignores the input signs, and returns the
3263 * absolute value of the product (or NULL if error).
3264 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
3265 */
3266static PyLongObject *
3267k_mul(PyLongObject *a, PyLongObject *b)
3268{
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003269 Py_ssize_t asize = Py_ABS(Py_SIZE(a));
3270 Py_ssize_t bsize = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 PyLongObject *ah = NULL;
3272 PyLongObject *al = NULL;
3273 PyLongObject *bh = NULL;
3274 PyLongObject *bl = NULL;
3275 PyLongObject *ret = NULL;
3276 PyLongObject *t1, *t2, *t3;
3277 Py_ssize_t shift; /* the number of digits we split off */
3278 Py_ssize_t i;
Tim Peters738eda72002-08-12 15:08:20 +00003279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
3281 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
3282 * Then the original product is
3283 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
3284 * By picking X to be a power of 2, "*X" is just shifting, and it's
3285 * been reduced to 3 multiplies on numbers half the size.
3286 */
Tim Peters5af4e6c2002-08-12 02:31:19 +00003287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 /* We want to split based on the larger number; fiddle so that b
3289 * is largest.
3290 */
3291 if (asize > bsize) {
3292 t1 = a;
3293 a = b;
3294 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00003295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296 i = asize;
3297 asize = bsize;
3298 bsize = i;
3299 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 /* Use gradeschool math when either number is too small. */
3302 i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF;
3303 if (asize <= i) {
3304 if (asize == 0)
3305 return (PyLongObject *)PyLong_FromLong(0);
3306 else
3307 return x_mul(a, b);
3308 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 /* If a is small compared to b, splitting on b gives a degenerate
3311 * case with ah==0, and Karatsuba may be (even much) less efficient
3312 * than "grade school" then. However, we can still win, by viewing
3313 * b as a string of "big digits", each of width a->ob_size. That
3314 * leads to a sequence of balanced calls to k_mul.
3315 */
3316 if (2 * asize <= bsize)
3317 return k_lopsided_mul(a, b);
Tim Peters60004642002-08-12 22:01:34 +00003318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 /* Split a & b into hi & lo pieces. */
3320 shift = bsize >> 1;
3321 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
3322 assert(Py_SIZE(ah) > 0); /* the split isn't degenerate */
Tim Petersd6974a52002-08-13 20:37:51 +00003323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 if (a == b) {
3325 bh = ah;
3326 bl = al;
3327 Py_INCREF(bh);
3328 Py_INCREF(bl);
3329 }
3330 else if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 /* The plan:
3333 * 1. Allocate result space (asize + bsize digits: that's always
3334 * enough).
3335 * 2. Compute ah*bh, and copy into result at 2*shift.
3336 * 3. Compute al*bl, and copy into result at 0. Note that this
3337 * can't overlap with #2.
3338 * 4. Subtract al*bl from the result, starting at shift. This may
3339 * underflow (borrow out of the high digit), but we don't care:
3340 * we're effectively doing unsigned arithmetic mod
3341 * BASE**(sizea + sizeb), and so long as the *final* result fits,
3342 * borrows and carries out of the high digit can be ignored.
3343 * 5. Subtract ah*bh from the result, starting at shift.
3344 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
3345 * at shift.
3346 */
Tim Petersd64c1de2002-08-12 17:36:03 +00003347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003348 /* 1. Allocate result space. */
3349 ret = _PyLong_New(asize + bsize);
3350 if (ret == NULL) goto fail;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003351#ifdef Py_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 /* Fill with trash, to catch reference to uninitialized digits. */
3353 memset(ret->ob_digit, 0xDF, Py_SIZE(ret) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003354#endif
Tim Peters44121a62002-08-12 06:17:58 +00003355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 /* 2. t1 <- ah*bh, and copy into high digits of result. */
3357 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
3358 assert(Py_SIZE(t1) >= 0);
3359 assert(2*shift + Py_SIZE(t1) <= Py_SIZE(ret));
3360 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
3361 Py_SIZE(t1) * sizeof(digit));
Tim Peters738eda72002-08-12 15:08:20 +00003362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 /* Zero-out the digits higher than the ah*bh copy. */
3364 i = Py_SIZE(ret) - 2*shift - Py_SIZE(t1);
3365 if (i)
3366 memset(ret->ob_digit + 2*shift + Py_SIZE(t1), 0,
3367 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 /* 3. t2 <- al*bl, and copy into the low digits. */
3370 if ((t2 = k_mul(al, bl)) == NULL) {
3371 Py_DECREF(t1);
3372 goto fail;
3373 }
3374 assert(Py_SIZE(t2) >= 0);
3375 assert(Py_SIZE(t2) <= 2*shift); /* no overlap with high digits */
3376 memcpy(ret->ob_digit, t2->ob_digit, Py_SIZE(t2) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 /* Zero out remaining digits. */
3379 i = 2*shift - Py_SIZE(t2); /* number of uninitialized digits */
3380 if (i)
3381 memset(ret->ob_digit + Py_SIZE(t2), 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00003382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
3384 * because it's fresher in cache.
3385 */
3386 i = Py_SIZE(ret) - shift; /* # digits after shift */
3387 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, Py_SIZE(t2));
3388 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00003389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003390 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, Py_SIZE(t1));
3391 Py_DECREF(t1);
Tim Peters738eda72002-08-12 15:08:20 +00003392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003393 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
3394 if ((t1 = x_add(ah, al)) == NULL) goto fail;
3395 Py_DECREF(ah);
3396 Py_DECREF(al);
3397 ah = al = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 if (a == b) {
3400 t2 = t1;
3401 Py_INCREF(t2);
3402 }
3403 else if ((t2 = x_add(bh, bl)) == NULL) {
3404 Py_DECREF(t1);
3405 goto fail;
3406 }
3407 Py_DECREF(bh);
3408 Py_DECREF(bl);
3409 bh = bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003411 t3 = k_mul(t1, t2);
3412 Py_DECREF(t1);
3413 Py_DECREF(t2);
3414 if (t3 == NULL) goto fail;
3415 assert(Py_SIZE(t3) >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00003416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 /* Add t3. It's not obvious why we can't run out of room here.
3418 * See the (*) comment after this function.
3419 */
3420 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, Py_SIZE(t3));
3421 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00003422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003423 return long_normalize(ret);
Tim Peters5af4e6c2002-08-12 02:31:19 +00003424
Mark Dickinson22b20182010-05-10 21:27:53 +00003425 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 Py_XDECREF(ret);
3427 Py_XDECREF(ah);
3428 Py_XDECREF(al);
3429 Py_XDECREF(bh);
3430 Py_XDECREF(bl);
3431 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003432}
3433
Tim Petersd6974a52002-08-13 20:37:51 +00003434/* (*) Why adding t3 can't "run out of room" above.
3435
Tim Petersab86c2b2002-08-15 20:06:00 +00003436Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
3437to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00003438
Tim Petersab86c2b2002-08-15 20:06:00 +000034391. For any integer i, i = c(i/2) + f(i/2). In particular,
3440 bsize = c(bsize/2) + f(bsize/2).
34412. shift = f(bsize/2)
34423. asize <= bsize
34434. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
3444 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00003445
Tim Petersab86c2b2002-08-15 20:06:00 +00003446We allocated asize + bsize result digits, and add t3 into them at an offset
3447of shift. This leaves asize+bsize-shift allocated digit positions for t3
3448to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
3449asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00003450
Tim Petersab86c2b2002-08-15 20:06:00 +00003451bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
3452at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00003453
Tim Petersab86c2b2002-08-15 20:06:00 +00003454If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
3455digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
3456most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00003457
Tim Petersab86c2b2002-08-15 20:06:00 +00003458The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00003459
Tim Petersab86c2b2002-08-15 20:06:00 +00003460 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00003461
Tim Petersab86c2b2002-08-15 20:06:00 +00003462and we have asize + c(bsize/2) available digit positions. We need to show
3463this is always enough. An instance of c(bsize/2) cancels out in both, so
3464the question reduces to whether asize digits is enough to hold
3465(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
3466then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
3467asize 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 +00003468digit is enough to hold 2 bits. This is so since PyLong_SHIFT=15 >= 2. If
Tim Petersab86c2b2002-08-15 20:06:00 +00003469asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00003470c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
3471is enough to hold 2 bits. This is so if bsize >= 2, which holds because
3472bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00003473
Tim Peters48d52c02002-08-14 17:07:32 +00003474Note that since there's always enough room for (ah+al)*(bh+bl), and that's
3475clearly >= each of ah*bh and al*bl, there's always enough room to subtract
3476ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00003477*/
3478
Tim Peters60004642002-08-12 22:01:34 +00003479/* b has at least twice the digits of a, and a is big enough that Karatsuba
3480 * would pay off *if* the inputs had balanced sizes. View b as a sequence
3481 * of slices, each with a->ob_size digits, and multiply the slices by a,
3482 * one at a time. This gives k_mul balanced inputs to work with, and is
3483 * also cache-friendly (we compute one double-width slice of the result
Ezio Melotti42da6632011-03-15 05:18:48 +02003484 * at a time, then move on, never backtracking except for the helpful
Tim Peters60004642002-08-12 22:01:34 +00003485 * single-width slice overlap between successive partial sums).
3486 */
3487static PyLongObject *
3488k_lopsided_mul(PyLongObject *a, PyLongObject *b)
3489{
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003490 const Py_ssize_t asize = Py_ABS(Py_SIZE(a));
3491 Py_ssize_t bsize = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003492 Py_ssize_t nbdone; /* # of b digits already multiplied */
3493 PyLongObject *ret;
3494 PyLongObject *bslice = NULL;
Tim Peters60004642002-08-12 22:01:34 +00003495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003496 assert(asize > KARATSUBA_CUTOFF);
3497 assert(2 * asize <= bsize);
Tim Peters60004642002-08-12 22:01:34 +00003498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 /* Allocate result space, and zero it out. */
3500 ret = _PyLong_New(asize + bsize);
3501 if (ret == NULL)
3502 return NULL;
3503 memset(ret->ob_digit, 0, Py_SIZE(ret) * sizeof(digit));
Tim Peters60004642002-08-12 22:01:34 +00003504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003505 /* Successive slices of b are copied into bslice. */
3506 bslice = _PyLong_New(asize);
3507 if (bslice == NULL)
3508 goto fail;
Tim Peters60004642002-08-12 22:01:34 +00003509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 nbdone = 0;
3511 while (bsize > 0) {
3512 PyLongObject *product;
Victor Stinner640c35c2013-06-04 23:14:37 +02003513 const Py_ssize_t nbtouse = Py_MIN(bsize, asize);
Tim Peters60004642002-08-12 22:01:34 +00003514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003515 /* Multiply the next slice of b by a. */
3516 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
3517 nbtouse * sizeof(digit));
3518 Py_SIZE(bslice) = nbtouse;
3519 product = k_mul(a, bslice);
3520 if (product == NULL)
3521 goto fail;
Tim Peters60004642002-08-12 22:01:34 +00003522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003523 /* Add into result. */
3524 (void)v_iadd(ret->ob_digit + nbdone, Py_SIZE(ret) - nbdone,
3525 product->ob_digit, Py_SIZE(product));
3526 Py_DECREF(product);
Tim Peters60004642002-08-12 22:01:34 +00003527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003528 bsize -= nbtouse;
3529 nbdone += nbtouse;
3530 }
Tim Peters60004642002-08-12 22:01:34 +00003531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003532 Py_DECREF(bslice);
3533 return long_normalize(ret);
Tim Peters60004642002-08-12 22:01:34 +00003534
Mark Dickinson22b20182010-05-10 21:27:53 +00003535 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 Py_DECREF(ret);
3537 Py_XDECREF(bslice);
3538 return NULL;
Tim Peters60004642002-08-12 22:01:34 +00003539}
Tim Peters5af4e6c2002-08-12 02:31:19 +00003540
3541static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003542long_mul(PyLongObject *a, PyLongObject *b)
Tim Peters5af4e6c2002-08-12 02:31:19 +00003543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003546 CHECK_BINOP(a, b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00003547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003548 /* fast path for single-digit multiplication */
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003549 if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 stwodigits v = (stwodigits)(MEDIUM_VALUE(a)) * MEDIUM_VALUE(b);
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003551 return PyLong_FromLongLong((long long)v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003552 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00003553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003554 z = k_mul(a, b);
3555 /* Negate if exactly one of the inputs is negative. */
Victor Stinner8aed6f12013-07-17 22:31:17 +02003556 if (((Py_SIZE(a) ^ Py_SIZE(b)) < 0) && z) {
3557 _PyLong_Negate(&z);
3558 if (z == NULL)
3559 return NULL;
3560 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003561 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003562}
3563
Yury Selivanove0b23092016-02-11 10:26:27 -05003564/* Fast modulo division for single-digit longs. */
3565static PyObject *
3566fast_mod(PyLongObject *a, PyLongObject *b)
3567{
3568 sdigit left = a->ob_digit[0];
3569 sdigit right = b->ob_digit[0];
3570 sdigit mod;
3571
3572 assert(Py_ABS(Py_SIZE(a)) == 1);
3573 assert(Py_ABS(Py_SIZE(b)) == 1);
3574
3575 if (Py_SIZE(a) == Py_SIZE(b)) {
3576 /* 'a' and 'b' have the same sign. */
3577 mod = left % right;
3578 }
3579 else {
3580 /* Either 'a' or 'b' is negative. */
3581 mod = right - 1 - (left - 1) % right;
3582 }
3583
Victor Stinnerf963c132016-03-23 18:36:54 +01003584 return PyLong_FromLong(mod * (sdigit)Py_SIZE(b));
Yury Selivanove0b23092016-02-11 10:26:27 -05003585}
3586
3587/* Fast floor division for single-digit longs. */
3588static PyObject *
3589fast_floor_div(PyLongObject *a, PyLongObject *b)
3590{
3591 sdigit left = a->ob_digit[0];
3592 sdigit right = b->ob_digit[0];
3593 sdigit div;
3594
3595 assert(Py_ABS(Py_SIZE(a)) == 1);
3596 assert(Py_ABS(Py_SIZE(b)) == 1);
3597
3598 if (Py_SIZE(a) == Py_SIZE(b)) {
3599 /* 'a' and 'b' have the same sign. */
3600 div = left / right;
3601 }
3602 else {
3603 /* Either 'a' or 'b' is negative. */
3604 div = -1 - (left - 1) / right;
3605 }
3606
3607 return PyLong_FromLong(div);
3608}
3609
Guido van Rossume32e0141992-01-19 16:31:05 +00003610/* The / and % operators are now defined in terms of divmod().
3611 The expression a mod b has the value a - b*floor(a/b).
3612 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003613 |a| by |b|, with the sign of a. This is also expressed
3614 as a - b*trunc(a/b), if trunc truncates towards zero.
3615 Some examples:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003616 a b a rem b a mod b
3617 13 10 3 3
3618 -13 10 -3 7
3619 13 -10 3 -7
3620 -13 -10 -3 -3
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003621 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00003622 have different signs. We then subtract one from the 'div'
3623 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003624
Tim Peters47e52ee2004-08-30 02:44:38 +00003625/* Compute
3626 * *pdiv, *pmod = divmod(v, w)
3627 * NULL can be passed for pdiv or pmod, in which case that part of
3628 * the result is simply thrown away. The caller owns a reference to
3629 * each of these it requests (does not pass NULL for).
3630 */
Guido van Rossume32e0141992-01-19 16:31:05 +00003631static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00003632l_divmod(PyLongObject *v, PyLongObject *w,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003633 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00003634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003636
Yury Selivanove0b23092016-02-11 10:26:27 -05003637 if (Py_ABS(Py_SIZE(v)) == 1 && Py_ABS(Py_SIZE(w)) == 1) {
3638 /* Fast path for single-digit longs */
3639 div = NULL;
3640 if (pdiv != NULL) {
3641 div = (PyLongObject *)fast_floor_div(v, w);
3642 if (div == NULL) {
3643 return -1;
3644 }
3645 }
3646 if (pmod != NULL) {
3647 mod = (PyLongObject *)fast_mod(v, w);
3648 if (mod == NULL) {
3649 Py_XDECREF(div);
3650 return -1;
3651 }
3652 *pmod = mod;
3653 }
3654 if (pdiv != NULL) {
3655 /* We only want to set `*pdiv` when `*pmod` is
3656 set successfully. */
3657 *pdiv = div;
3658 }
3659 return 0;
3660 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003661 if (long_divrem(v, w, &div, &mod) < 0)
3662 return -1;
3663 if ((Py_SIZE(mod) < 0 && Py_SIZE(w) > 0) ||
3664 (Py_SIZE(mod) > 0 && Py_SIZE(w) < 0)) {
3665 PyLongObject *temp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003666 temp = (PyLongObject *) long_add(mod, w);
3667 Py_DECREF(mod);
3668 mod = temp;
3669 if (mod == NULL) {
3670 Py_DECREF(div);
3671 return -1;
3672 }
Serhiy Storchakaba85d692017-03-30 09:09:41 +03003673 temp = (PyLongObject *) long_sub(div, (PyLongObject *)_PyLong_One);
3674 if (temp == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003675 Py_DECREF(mod);
3676 Py_DECREF(div);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 return -1;
3678 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003679 Py_DECREF(div);
3680 div = temp;
3681 }
3682 if (pdiv != NULL)
3683 *pdiv = div;
3684 else
3685 Py_DECREF(div);
Tim Peters47e52ee2004-08-30 02:44:38 +00003686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 if (pmod != NULL)
3688 *pmod = mod;
3689 else
3690 Py_DECREF(mod);
Tim Peters47e52ee2004-08-30 02:44:38 +00003691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003692 return 0;
Guido van Rossume32e0141992-01-19 16:31:05 +00003693}
3694
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003695static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003696long_div(PyObject *a, PyObject *b)
Guido van Rossume32e0141992-01-19 16:31:05 +00003697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003698 PyLongObject *div;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003700 CHECK_BINOP(a, b);
Yury Selivanove0b23092016-02-11 10:26:27 -05003701
3702 if (Py_ABS(Py_SIZE(a)) == 1 && Py_ABS(Py_SIZE(b)) == 1) {
3703 return fast_floor_div((PyLongObject*)a, (PyLongObject*)b);
3704 }
3705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003706 if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, NULL) < 0)
3707 div = NULL;
3708 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00003709}
3710
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003711/* PyLong/PyLong -> float, with correctly rounded result. */
3712
3713#define MANT_DIG_DIGITS (DBL_MANT_DIG / PyLong_SHIFT)
3714#define MANT_DIG_BITS (DBL_MANT_DIG % PyLong_SHIFT)
3715
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003716static PyObject *
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003717long_true_divide(PyObject *v, PyObject *w)
Tim Peters20dab9f2001-09-04 05:31:47 +00003718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003719 PyLongObject *a, *b, *x;
3720 Py_ssize_t a_size, b_size, shift, extra_bits, diff, x_size, x_bits;
3721 digit mask, low;
3722 int inexact, negate, a_is_small, b_is_small;
3723 double dx, result;
Tim Peterse2a60002001-09-04 06:17:36 +00003724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003725 CHECK_BINOP(v, w);
3726 a = (PyLongObject *)v;
3727 b = (PyLongObject *)w;
Tim Peterse2a60002001-09-04 06:17:36 +00003728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003729 /*
3730 Method in a nutshell:
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003732 0. reduce to case a, b > 0; filter out obvious underflow/overflow
3733 1. choose a suitable integer 'shift'
3734 2. use integer arithmetic to compute x = floor(2**-shift*a/b)
3735 3. adjust x for correct rounding
3736 4. convert x to a double dx with the same value
3737 5. return ldexp(dx, shift).
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003739 In more detail:
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 0. For any a, a/0 raises ZeroDivisionError; for nonzero b, 0/b
3742 returns either 0.0 or -0.0, depending on the sign of b. For a and
3743 b both nonzero, ignore signs of a and b, and add the sign back in
3744 at the end. Now write a_bits and b_bits for the bit lengths of a
3745 and b respectively (that is, a_bits = 1 + floor(log_2(a)); likewise
3746 for b). Then
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003748 2**(a_bits - b_bits - 1) < a/b < 2**(a_bits - b_bits + 1).
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003750 So if a_bits - b_bits > DBL_MAX_EXP then a/b > 2**DBL_MAX_EXP and
3751 so overflows. Similarly, if a_bits - b_bits < DBL_MIN_EXP -
3752 DBL_MANT_DIG - 1 then a/b underflows to 0. With these cases out of
3753 the way, we can assume that
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003755 DBL_MIN_EXP - DBL_MANT_DIG - 1 <= a_bits - b_bits <= DBL_MAX_EXP.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003757 1. The integer 'shift' is chosen so that x has the right number of
3758 bits for a double, plus two or three extra bits that will be used
3759 in the rounding decisions. Writing a_bits and b_bits for the
3760 number of significant bits in a and b respectively, a
3761 straightforward formula for shift is:
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003763 shift = a_bits - b_bits - DBL_MANT_DIG - 2
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003765 This is fine in the usual case, but if a/b is smaller than the
3766 smallest normal float then it can lead to double rounding on an
3767 IEEE 754 platform, giving incorrectly rounded results. So we
3768 adjust the formula slightly. The actual formula used is:
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003770 shift = MAX(a_bits - b_bits, DBL_MIN_EXP) - DBL_MANT_DIG - 2
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003772 2. The quantity x is computed by first shifting a (left -shift bits
3773 if shift <= 0, right shift bits if shift > 0) and then dividing by
3774 b. For both the shift and the division, we keep track of whether
3775 the result is inexact, in a flag 'inexact'; this information is
3776 needed at the rounding stage.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003778 With the choice of shift above, together with our assumption that
3779 a_bits - b_bits >= DBL_MIN_EXP - DBL_MANT_DIG - 1, it follows
3780 that x >= 1.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003782 3. Now x * 2**shift <= a/b < (x+1) * 2**shift. We want to replace
3783 this with an exactly representable float of the form
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003785 round(x/2**extra_bits) * 2**(extra_bits+shift).
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003787 For float representability, we need x/2**extra_bits <
3788 2**DBL_MANT_DIG and extra_bits + shift >= DBL_MIN_EXP -
3789 DBL_MANT_DIG. This translates to the condition:
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003791 extra_bits >= MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003793 To round, we just modify the bottom digit of x in-place; this can
3794 end up giving a digit with value > PyLONG_MASK, but that's not a
3795 problem since digits can hold values up to 2*PyLONG_MASK+1.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003797 With the original choices for shift above, extra_bits will always
3798 be 2 or 3. Then rounding under the round-half-to-even rule, we
3799 round up iff the most significant of the extra bits is 1, and
3800 either: (a) the computation of x in step 2 had an inexact result,
3801 or (b) at least one other of the extra bits is 1, or (c) the least
3802 significant bit of x (above those to be rounded) is 1.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003804 4. Conversion to a double is straightforward; all floating-point
3805 operations involved in the conversion are exact, so there's no
3806 danger of rounding errors.
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808 5. Use ldexp(x, shift) to compute x*2**shift, the final result.
3809 The result will always be exactly representable as a double, except
3810 in the case that it overflows. To avoid dependence on the exact
3811 behaviour of ldexp on overflow, we check for overflow before
3812 applying ldexp. The result of ldexp is adjusted for sign before
3813 returning.
3814 */
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003816 /* Reduce to case where a and b are both positive. */
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003817 a_size = Py_ABS(Py_SIZE(a));
3818 b_size = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003819 negate = (Py_SIZE(a) < 0) ^ (Py_SIZE(b) < 0);
3820 if (b_size == 0) {
3821 PyErr_SetString(PyExc_ZeroDivisionError,
3822 "division by zero");
3823 goto error;
3824 }
3825 if (a_size == 0)
3826 goto underflow_or_zero;
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003828 /* Fast path for a and b small (exactly representable in a double).
3829 Relies on floating-point division being correctly rounded; results
3830 may be subject to double rounding on x86 machines that operate with
3831 the x87 FPU set to 64-bit precision. */
3832 a_is_small = a_size <= MANT_DIG_DIGITS ||
3833 (a_size == MANT_DIG_DIGITS+1 &&
3834 a->ob_digit[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0);
3835 b_is_small = b_size <= MANT_DIG_DIGITS ||
3836 (b_size == MANT_DIG_DIGITS+1 &&
3837 b->ob_digit[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0);
3838 if (a_is_small && b_is_small) {
3839 double da, db;
3840 da = a->ob_digit[--a_size];
3841 while (a_size > 0)
3842 da = da * PyLong_BASE + a->ob_digit[--a_size];
3843 db = b->ob_digit[--b_size];
3844 while (b_size > 0)
3845 db = db * PyLong_BASE + b->ob_digit[--b_size];
3846 result = da / db;
3847 goto success;
3848 }
Tim Peterse2a60002001-09-04 06:17:36 +00003849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 /* Catch obvious cases of underflow and overflow */
3851 diff = a_size - b_size;
3852 if (diff > PY_SSIZE_T_MAX/PyLong_SHIFT - 1)
3853 /* Extreme overflow */
3854 goto overflow;
3855 else if (diff < 1 - PY_SSIZE_T_MAX/PyLong_SHIFT)
3856 /* Extreme underflow */
3857 goto underflow_or_zero;
3858 /* Next line is now safe from overflowing a Py_ssize_t */
3859 diff = diff * PyLong_SHIFT + bits_in_digit(a->ob_digit[a_size - 1]) -
3860 bits_in_digit(b->ob_digit[b_size - 1]);
3861 /* Now diff = a_bits - b_bits. */
3862 if (diff > DBL_MAX_EXP)
3863 goto overflow;
3864 else if (diff < DBL_MIN_EXP - DBL_MANT_DIG - 1)
3865 goto underflow_or_zero;
Tim Peterse2a60002001-09-04 06:17:36 +00003866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003867 /* Choose value for shift; see comments for step 1 above. */
Victor Stinner640c35c2013-06-04 23:14:37 +02003868 shift = Py_MAX(diff, DBL_MIN_EXP) - DBL_MANT_DIG - 2;
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003870 inexact = 0;
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 /* x = abs(a * 2**-shift) */
3873 if (shift <= 0) {
3874 Py_ssize_t i, shift_digits = -shift / PyLong_SHIFT;
3875 digit rem;
3876 /* x = a << -shift */
3877 if (a_size >= PY_SSIZE_T_MAX - 1 - shift_digits) {
3878 /* In practice, it's probably impossible to end up
3879 here. Both a and b would have to be enormous,
3880 using close to SIZE_T_MAX bytes of memory each. */
3881 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson22b20182010-05-10 21:27:53 +00003882 "intermediate overflow during division");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003883 goto error;
3884 }
3885 x = _PyLong_New(a_size + shift_digits + 1);
3886 if (x == NULL)
3887 goto error;
3888 for (i = 0; i < shift_digits; i++)
3889 x->ob_digit[i] = 0;
3890 rem = v_lshift(x->ob_digit + shift_digits, a->ob_digit,
3891 a_size, -shift % PyLong_SHIFT);
3892 x->ob_digit[a_size + shift_digits] = rem;
3893 }
3894 else {
3895 Py_ssize_t shift_digits = shift / PyLong_SHIFT;
3896 digit rem;
3897 /* x = a >> shift */
3898 assert(a_size >= shift_digits);
3899 x = _PyLong_New(a_size - shift_digits);
3900 if (x == NULL)
3901 goto error;
3902 rem = v_rshift(x->ob_digit, a->ob_digit + shift_digits,
3903 a_size - shift_digits, shift % PyLong_SHIFT);
3904 /* set inexact if any of the bits shifted out is nonzero */
3905 if (rem)
3906 inexact = 1;
3907 while (!inexact && shift_digits > 0)
3908 if (a->ob_digit[--shift_digits])
3909 inexact = 1;
3910 }
3911 long_normalize(x);
3912 x_size = Py_SIZE(x);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003914 /* x //= b. If the remainder is nonzero, set inexact. We own the only
3915 reference to x, so it's safe to modify it in-place. */
3916 if (b_size == 1) {
3917 digit rem = inplace_divrem1(x->ob_digit, x->ob_digit, x_size,
3918 b->ob_digit[0]);
3919 long_normalize(x);
3920 if (rem)
3921 inexact = 1;
3922 }
3923 else {
3924 PyLongObject *div, *rem;
3925 div = x_divrem(x, b, &rem);
3926 Py_DECREF(x);
3927 x = div;
3928 if (x == NULL)
3929 goto error;
3930 if (Py_SIZE(rem))
3931 inexact = 1;
3932 Py_DECREF(rem);
3933 }
Victor Stinner45e8e2f2014-05-14 17:24:35 +02003934 x_size = Py_ABS(Py_SIZE(x));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003935 assert(x_size > 0); /* result of division is never zero */
3936 x_bits = (x_size-1)*PyLong_SHIFT+bits_in_digit(x->ob_digit[x_size-1]);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003938 /* The number of extra bits that have to be rounded away. */
Victor Stinner640c35c2013-06-04 23:14:37 +02003939 extra_bits = Py_MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003940 assert(extra_bits == 2 || extra_bits == 3);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003942 /* Round by directly modifying the low digit of x. */
3943 mask = (digit)1 << (extra_bits - 1);
3944 low = x->ob_digit[0] | inexact;
Mark Dickinsondc590a42016-08-21 10:23:23 +01003945 if ((low & mask) && (low & (3U*mask-1U)))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003946 low += mask;
Mark Dickinsondc590a42016-08-21 10:23:23 +01003947 x->ob_digit[0] = low & ~(2U*mask-1U);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003949 /* Convert x to a double dx; the conversion is exact. */
3950 dx = x->ob_digit[--x_size];
3951 while (x_size > 0)
3952 dx = dx * PyLong_BASE + x->ob_digit[--x_size];
3953 Py_DECREF(x);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003955 /* Check whether ldexp result will overflow a double. */
3956 if (shift + x_bits >= DBL_MAX_EXP &&
3957 (shift + x_bits > DBL_MAX_EXP || dx == ldexp(1.0, (int)x_bits)))
3958 goto overflow;
3959 result = ldexp(dx, (int)shift);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003960
3961 success:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003962 return PyFloat_FromDouble(negate ? -result : result);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003963
3964 underflow_or_zero:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 return PyFloat_FromDouble(negate ? -0.0 : 0.0);
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003966
3967 overflow:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003968 PyErr_SetString(PyExc_OverflowError,
3969 "integer division result too large for a float");
Mark Dickinsoncbb62742009-12-27 15:09:50 +00003970 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003971 return NULL;
Tim Peters20dab9f2001-09-04 05:31:47 +00003972}
3973
3974static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003975long_mod(PyObject *a, PyObject *b)
Guido van Rossume32e0141992-01-19 16:31:05 +00003976{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003977 PyLongObject *mod;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003979 CHECK_BINOP(a, b);
3980
Yury Selivanove0b23092016-02-11 10:26:27 -05003981 if (Py_ABS(Py_SIZE(a)) == 1 && Py_ABS(Py_SIZE(b)) == 1) {
3982 return fast_mod((PyLongObject*)a, (PyLongObject*)b);
3983 }
3984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003985 if (l_divmod((PyLongObject*)a, (PyLongObject*)b, NULL, &mod) < 0)
3986 mod = NULL;
3987 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00003988}
3989
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003990static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00003991long_divmod(PyObject *a, PyObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003993 PyLongObject *div, *mod;
3994 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003996 CHECK_BINOP(a, b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, &mod) < 0) {
3999 return NULL;
4000 }
4001 z = PyTuple_New(2);
4002 if (z != NULL) {
4003 PyTuple_SetItem(z, 0, (PyObject *) div);
4004 PyTuple_SetItem(z, 1, (PyObject *) mod);
4005 }
4006 else {
4007 Py_DECREF(div);
4008 Py_DECREF(mod);
4009 }
4010 return z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004011}
4012
Tim Peters47e52ee2004-08-30 02:44:38 +00004013/* pow(v, w, x) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004014static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00004015long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004017 PyLongObject *a, *b, *c; /* a,b,c = v,w,x */
4018 int negativeOutput = 0; /* if x<0 return negative output */
Neil Schemenauerba872e22001-01-04 01:46:03 +00004019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004020 PyLongObject *z = NULL; /* accumulated result */
4021 Py_ssize_t i, j, k; /* counters */
4022 PyLongObject *temp = NULL;
Tim Peters47e52ee2004-08-30 02:44:38 +00004023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004024 /* 5-ary values. If the exponent is large enough, table is
4025 * precomputed so that table[i] == a**i % c for i in range(32).
4026 */
4027 PyLongObject *table[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4028 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
Tim Peters47e52ee2004-08-30 02:44:38 +00004029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004030 /* a, b, c = v, w, x */
4031 CHECK_BINOP(v, w);
4032 a = (PyLongObject*)v; Py_INCREF(a);
4033 b = (PyLongObject*)w; Py_INCREF(b);
4034 if (PyLong_Check(x)) {
4035 c = (PyLongObject *)x;
4036 Py_INCREF(x);
4037 }
4038 else if (x == Py_None)
4039 c = NULL;
4040 else {
4041 Py_DECREF(a);
4042 Py_DECREF(b);
Brian Curtindfc80e32011-08-10 20:28:54 -05004043 Py_RETURN_NOTIMPLEMENTED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 }
Tim Peters4c483c42001-09-05 06:24:58 +00004045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004046 if (Py_SIZE(b) < 0) { /* if exponent is negative */
4047 if (c) {
Mark Dickinson0c346d82014-04-11 14:34:40 -04004048 PyErr_SetString(PyExc_ValueError, "pow() 2nd argument "
Mark Dickinson22b20182010-05-10 21:27:53 +00004049 "cannot be negative when 3rd argument specified");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004050 goto Error;
4051 }
4052 else {
4053 /* else return a float. This works because we know
4054 that this calls float_pow() which converts its
4055 arguments to double. */
4056 Py_DECREF(a);
4057 Py_DECREF(b);
4058 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
4059 }
4060 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 if (c) {
4063 /* if modulus == 0:
4064 raise ValueError() */
4065 if (Py_SIZE(c) == 0) {
4066 PyErr_SetString(PyExc_ValueError,
4067 "pow() 3rd argument cannot be 0");
4068 goto Error;
4069 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 /* if modulus < 0:
4072 negativeOutput = True
4073 modulus = -modulus */
4074 if (Py_SIZE(c) < 0) {
4075 negativeOutput = 1;
4076 temp = (PyLongObject *)_PyLong_Copy(c);
4077 if (temp == NULL)
4078 goto Error;
4079 Py_DECREF(c);
4080 c = temp;
4081 temp = NULL;
Victor Stinner8aed6f12013-07-17 22:31:17 +02004082 _PyLong_Negate(&c);
4083 if (c == NULL)
4084 goto Error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004087 /* if modulus == 1:
4088 return 0 */
4089 if ((Py_SIZE(c) == 1) && (c->ob_digit[0] == 1)) {
4090 z = (PyLongObject *)PyLong_FromLong(0L);
4091 goto Done;
4092 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004093
Tim Peters81a93152013-10-05 16:53:52 -05004094 /* Reduce base by modulus in some cases:
4095 1. If base < 0. Forcing the base non-negative makes things easier.
4096 2. If base is obviously larger than the modulus. The "small
4097 exponent" case later can multiply directly by base repeatedly,
4098 while the "large exponent" case multiplies directly by base 31
4099 times. It can be unboundedly faster to multiply by
4100 base % modulus instead.
4101 We could _always_ do this reduction, but l_divmod() isn't cheap,
4102 so we only do it when it buys something. */
4103 if (Py_SIZE(a) < 0 || Py_SIZE(a) > Py_SIZE(c)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004104 if (l_divmod(a, c, NULL, &temp) < 0)
4105 goto Error;
4106 Py_DECREF(a);
4107 a = temp;
4108 temp = NULL;
4109 }
4110 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004112 /* At this point a, b, and c are guaranteed non-negative UNLESS
4113 c is NULL, in which case a may be negative. */
Tim Peters47e52ee2004-08-30 02:44:38 +00004114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004115 z = (PyLongObject *)PyLong_FromLong(1L);
4116 if (z == NULL)
4117 goto Error;
Tim Peters47e52ee2004-08-30 02:44:38 +00004118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004119 /* Perform a modular reduction, X = X % c, but leave X alone if c
4120 * is NULL.
4121 */
4122#define REDUCE(X) \
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004123 do { \
4124 if (c != NULL) { \
4125 if (l_divmod(X, c, NULL, &temp) < 0) \
4126 goto Error; \
4127 Py_XDECREF(X); \
4128 X = temp; \
4129 temp = NULL; \
4130 } \
4131 } while(0)
Tim Peters47e52ee2004-08-30 02:44:38 +00004132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004133 /* Multiply two values, then reduce the result:
4134 result = X*Y % c. If c is NULL, skip the mod. */
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004135#define MULT(X, Y, result) \
4136 do { \
4137 temp = (PyLongObject *)long_mul(X, Y); \
4138 if (temp == NULL) \
4139 goto Error; \
4140 Py_XDECREF(result); \
4141 result = temp; \
4142 temp = NULL; \
4143 REDUCE(result); \
4144 } while(0)
Tim Peters47e52ee2004-08-30 02:44:38 +00004145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004146 if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
4147 /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
4148 /* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf */
4149 for (i = Py_SIZE(b) - 1; i >= 0; --i) {
4150 digit bi = b->ob_digit[i];
Tim Peters47e52ee2004-08-30 02:44:38 +00004151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004152 for (j = (digit)1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004153 MULT(z, z, z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004154 if (bi & j)
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004155 MULT(z, a, z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004156 }
4157 }
4158 }
4159 else {
4160 /* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */
4161 Py_INCREF(z); /* still holds 1L */
4162 table[0] = z;
4163 for (i = 1; i < 32; ++i)
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004164 MULT(table[i-1], a, table[i]);
Tim Peters47e52ee2004-08-30 02:44:38 +00004165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004166 for (i = Py_SIZE(b) - 1; i >= 0; --i) {
4167 const digit bi = b->ob_digit[i];
Tim Peters47e52ee2004-08-30 02:44:38 +00004168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
4170 const int index = (bi >> j) & 0x1f;
4171 for (k = 0; k < 5; ++k)
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004172 MULT(z, z, z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 if (index)
Mark Dickinsoncdd01d22010-05-10 21:37:34 +00004174 MULT(z, table[index], z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 }
4176 }
4177 }
Tim Peters47e52ee2004-08-30 02:44:38 +00004178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 if (negativeOutput && (Py_SIZE(z) != 0)) {
4180 temp = (PyLongObject *)long_sub(z, c);
4181 if (temp == NULL)
4182 goto Error;
4183 Py_DECREF(z);
4184 z = temp;
4185 temp = NULL;
4186 }
4187 goto Done;
Tim Peters47e52ee2004-08-30 02:44:38 +00004188
Mark Dickinson22b20182010-05-10 21:27:53 +00004189 Error:
Victor Stinner8aed6f12013-07-17 22:31:17 +02004190 Py_CLEAR(z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004191 /* fall through */
Mark Dickinson22b20182010-05-10 21:27:53 +00004192 Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 if (Py_SIZE(b) > FIVEARY_CUTOFF) {
4194 for (i = 0; i < 32; ++i)
4195 Py_XDECREF(table[i]);
4196 }
4197 Py_DECREF(a);
4198 Py_DECREF(b);
4199 Py_XDECREF(c);
4200 Py_XDECREF(temp);
4201 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004202}
4203
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004204static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00004205long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004207 /* Implement ~x as -(x+1) */
4208 PyLongObject *x;
Victor Stinner45e8e2f2014-05-14 17:24:35 +02004209 if (Py_ABS(Py_SIZE(v)) <=1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004210 return PyLong_FromLong(-(MEDIUM_VALUE(v)+1));
Serhiy Storchakaba85d692017-03-30 09:09:41 +03004211 x = (PyLongObject *) long_add(v, (PyLongObject *)_PyLong_One);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004212 if (x == NULL)
4213 return NULL;
Mark Dickinson583c6e82016-08-29 16:40:29 +01004214 _PyLong_Negate(&x);
4215 /* No need for maybe_small_long here, since any small
4216 longs will have been caught in the Py_SIZE <= 1 fast path. */
4217 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004218}
4219
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004220static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00004221long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004223 PyLongObject *z;
Victor Stinner45e8e2f2014-05-14 17:24:35 +02004224 if (Py_ABS(Py_SIZE(v)) <= 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004225 return PyLong_FromLong(-MEDIUM_VALUE(v));
4226 z = (PyLongObject *)_PyLong_Copy(v);
4227 if (z != NULL)
4228 Py_SIZE(z) = -(Py_SIZE(v));
4229 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00004230}
4231
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004232static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00004233long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004235 if (Py_SIZE(v) < 0)
4236 return long_neg(v);
4237 else
4238 return long_long((PyObject *)v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004239}
4240
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004241static int
Jack Diederich4dafcc42006-11-28 19:15:13 +00004242long_bool(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 return Py_SIZE(v) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00004245}
4246
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004247/* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
4248static int
4249divmod_shift(PyLongObject *shiftby, Py_ssize_t *wordshift, digit *remshift)
4250{
4251 assert(PyLong_Check((PyObject *)shiftby));
4252 assert(Py_SIZE(shiftby) >= 0);
4253 Py_ssize_t lshiftby = PyLong_AsSsize_t((PyObject *)shiftby);
4254 if (lshiftby >= 0) {
4255 *wordshift = lshiftby / PyLong_SHIFT;
4256 *remshift = lshiftby % PyLong_SHIFT;
4257 return 0;
4258 }
4259 /* PyLong_Check(shiftby) is true and Py_SIZE(shiftby) >= 0, so it must
4260 be that PyLong_AsSsize_t raised an OverflowError. */
4261 assert(PyErr_ExceptionMatches(PyExc_OverflowError));
4262 PyErr_Clear();
4263 PyLongObject *wordshift_obj = divrem1(shiftby, PyLong_SHIFT, remshift);
4264 if (wordshift_obj == NULL) {
4265 return -1;
4266 }
4267 *wordshift = PyLong_AsSsize_t((PyObject *)wordshift_obj);
4268 Py_DECREF(wordshift_obj);
4269 if (*wordshift >= 0 && *wordshift < PY_SSIZE_T_MAX / (Py_ssize_t)sizeof(digit)) {
4270 return 0;
4271 }
4272 PyErr_Clear();
4273 /* Clip the value. With such large wordshift the right shift
4274 returns 0 and the left shift raises an error in _PyLong_New(). */
4275 *wordshift = PY_SSIZE_T_MAX / sizeof(digit);
4276 *remshift = 0;
4277 return 0;
4278}
4279
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004280static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00004281long_rshift(PyLongObject *a, PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 PyLongObject *z = NULL;
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004284 Py_ssize_t newsize, wordshift, hishift, i, j;
4285 digit loshift, lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00004286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 CHECK_BINOP(a, b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00004288
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004289 if (Py_SIZE(b) < 0) {
4290 PyErr_SetString(PyExc_ValueError,
4291 "negative shift count");
4292 return NULL;
4293 }
4294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004295 if (Py_SIZE(a) < 0) {
4296 /* Right shifting negative numbers is harder */
4297 PyLongObject *a1, *a2;
4298 a1 = (PyLongObject *) long_invert(a);
4299 if (a1 == NULL)
Mark Dickinson92ca5352016-09-17 17:50:50 +01004300 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004301 a2 = (PyLongObject *) long_rshift(a1, b);
4302 Py_DECREF(a1);
4303 if (a2 == NULL)
Mark Dickinson92ca5352016-09-17 17:50:50 +01004304 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004305 z = (PyLongObject *) long_invert(a2);
4306 Py_DECREF(a2);
4307 }
4308 else {
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004309 if (divmod_shift(b, &wordshift, &loshift) < 0)
Mark Dickinson92ca5352016-09-17 17:50:50 +01004310 return NULL;
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004311 newsize = Py_SIZE(a) - wordshift;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004312 if (newsize <= 0)
4313 return PyLong_FromLong(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 hishift = PyLong_SHIFT - loshift;
4315 lomask = ((digit)1 << hishift) - 1;
4316 himask = PyLong_MASK ^ lomask;
4317 z = _PyLong_New(newsize);
4318 if (z == NULL)
Mark Dickinson92ca5352016-09-17 17:50:50 +01004319 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004320 for (i = 0, j = wordshift; i < newsize; i++, j++) {
4321 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
4322 if (i+1 < newsize)
Mark Dickinson22b20182010-05-10 21:27:53 +00004323 z->ob_digit[i] |= (a->ob_digit[j+1] << hishift) & himask;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004324 }
Mark Dickinson92ca5352016-09-17 17:50:50 +01004325 z = maybe_small_long(long_normalize(z));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004326 }
Mark Dickinson92ca5352016-09-17 17:50:50 +01004327 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00004328}
4329
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004330static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00004331long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004333 /* This version due to Tim Peters */
4334 PyLongObject *a = (PyLongObject*)v;
4335 PyLongObject *b = (PyLongObject*)w;
4336 PyLongObject *z = NULL;
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004337 Py_ssize_t oldsize, newsize, wordshift, i, j;
4338 digit remshift;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00004340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004341 CHECK_BINOP(a, b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00004342
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004343 if (Py_SIZE(b) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 PyErr_SetString(PyExc_ValueError, "negative shift count");
Victor Stinner8aed6f12013-07-17 22:31:17 +02004345 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004346 }
Mark Dickinson82a95272016-08-29 19:27:06 +01004347 if (Py_SIZE(a) == 0) {
4348 return PyLong_FromLong(0);
4349 }
4350
Serhiy Storchaka918403c2017-03-30 09:47:07 +03004351 if (divmod_shift(b, &wordshift, &remshift) < 0)
4352 return NULL;
Victor Stinner45e8e2f2014-05-14 17:24:35 +02004353 oldsize = Py_ABS(Py_SIZE(a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 newsize = oldsize + wordshift;
4355 if (remshift)
4356 ++newsize;
4357 z = _PyLong_New(newsize);
4358 if (z == NULL)
Victor Stinner8aed6f12013-07-17 22:31:17 +02004359 return NULL;
4360 if (Py_SIZE(a) < 0) {
4361 assert(Py_REFCNT(z) == 1);
4362 Py_SIZE(z) = -Py_SIZE(z);
4363 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004364 for (i = 0; i < wordshift; i++)
4365 z->ob_digit[i] = 0;
4366 accum = 0;
4367 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
4368 accum |= (twodigits)a->ob_digit[j] << remshift;
4369 z->ob_digit[i] = (digit)(accum & PyLong_MASK);
4370 accum >>= PyLong_SHIFT;
4371 }
4372 if (remshift)
4373 z->ob_digit[newsize-1] = (digit)accum;
4374 else
4375 assert(!accum);
4376 z = long_normalize(z);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004377 return (PyObject *) maybe_small_long(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00004378}
4379
Mark Dickinson27a87a22009-10-25 20:43:34 +00004380/* Compute two's complement of digit vector a[0:m], writing result to
4381 z[0:m]. The digit vector a need not be normalized, but should not
4382 be entirely zero. a and z may point to the same digit vector. */
4383
4384static void
4385v_complement(digit *z, digit *a, Py_ssize_t m)
4386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 Py_ssize_t i;
4388 digit carry = 1;
4389 for (i = 0; i < m; ++i) {
4390 carry += a[i] ^ PyLong_MASK;
4391 z[i] = carry & PyLong_MASK;
4392 carry >>= PyLong_SHIFT;
4393 }
4394 assert(carry == 0);
Mark Dickinson27a87a22009-10-25 20:43:34 +00004395}
Guido van Rossum4c260ff1992-01-14 18:36:43 +00004396
4397/* Bitwise and/xor/or operations */
4398
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004399static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00004400long_bitwise(PyLongObject *a,
Benjamin Peterson513762f2012-12-26 16:43:33 -06004401 char op, /* '&', '|', '^' */
Mark Dickinson22b20182010-05-10 21:27:53 +00004402 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 int nega, negb, negz;
4405 Py_ssize_t size_a, size_b, size_z, i;
4406 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00004407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 /* Bitwise operations for negative numbers operate as though
4409 on a two's complement representation. So convert arguments
4410 from sign-magnitude to two's complement, and convert the
4411 result back to sign-magnitude at the end. */
Mark Dickinson27a87a22009-10-25 20:43:34 +00004412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004413 /* If a is negative, replace it by its two's complement. */
Victor Stinner45e8e2f2014-05-14 17:24:35 +02004414 size_a = Py_ABS(Py_SIZE(a));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004415 nega = Py_SIZE(a) < 0;
4416 if (nega) {
4417 z = _PyLong_New(size_a);
4418 if (z == NULL)
4419 return NULL;
4420 v_complement(z->ob_digit, a->ob_digit, size_a);
4421 a = z;
4422 }
4423 else
4424 /* Keep reference count consistent. */
4425 Py_INCREF(a);
Mark Dickinson27a87a22009-10-25 20:43:34 +00004426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 /* Same for b. */
Victor Stinner45e8e2f2014-05-14 17:24:35 +02004428 size_b = Py_ABS(Py_SIZE(b));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 negb = Py_SIZE(b) < 0;
4430 if (negb) {
4431 z = _PyLong_New(size_b);
4432 if (z == NULL) {
4433 Py_DECREF(a);
4434 return NULL;
4435 }
4436 v_complement(z->ob_digit, b->ob_digit, size_b);
4437 b = z;
4438 }
4439 else
4440 Py_INCREF(b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00004441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 /* Swap a and b if necessary to ensure size_a >= size_b. */
4443 if (size_a < size_b) {
4444 z = a; a = b; b = z;
4445 size_z = size_a; size_a = size_b; size_b = size_z;
4446 negz = nega; nega = negb; negb = negz;
4447 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00004448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 /* JRH: The original logic here was to allocate the result value (z)
4450 as the longer of the two operands. However, there are some cases
4451 where the result is guaranteed to be shorter than that: AND of two
4452 positives, OR of two negatives: use the shorter number. AND with
4453 mixed signs: use the positive number. OR with mixed signs: use the
4454 negative number.
4455 */
4456 switch (op) {
4457 case '^':
4458 negz = nega ^ negb;
4459 size_z = size_a;
4460 break;
4461 case '&':
4462 negz = nega & negb;
4463 size_z = negb ? size_a : size_b;
4464 break;
4465 case '|':
4466 negz = nega | negb;
4467 size_z = negb ? size_b : size_a;
4468 break;
4469 default:
4470 PyErr_BadArgument();
4471 return NULL;
4472 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +00004473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 /* We allow an extra digit if z is negative, to make sure that
4475 the final two's complement of z doesn't overflow. */
4476 z = _PyLong_New(size_z + negz);
4477 if (z == NULL) {
4478 Py_DECREF(a);
4479 Py_DECREF(b);
4480 return NULL;
4481 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00004482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004483 /* Compute digits for overlap of a and b. */
4484 switch(op) {
4485 case '&':
4486 for (i = 0; i < size_b; ++i)
4487 z->ob_digit[i] = a->ob_digit[i] & b->ob_digit[i];
4488 break;
4489 case '|':
4490 for (i = 0; i < size_b; ++i)
4491 z->ob_digit[i] = a->ob_digit[i] | b->ob_digit[i];
4492 break;
4493 case '^':
4494 for (i = 0; i < size_b; ++i)
4495 z->ob_digit[i] = a->ob_digit[i] ^ b->ob_digit[i];
4496 break;
4497 default:
4498 PyErr_BadArgument();
4499 return NULL;
4500 }
Mark Dickinson27a87a22009-10-25 20:43:34 +00004501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 /* Copy any remaining digits of a, inverting if necessary. */
4503 if (op == '^' && negb)
4504 for (; i < size_z; ++i)
4505 z->ob_digit[i] = a->ob_digit[i] ^ PyLong_MASK;
4506 else if (i < size_z)
4507 memcpy(&z->ob_digit[i], &a->ob_digit[i],
4508 (size_z-i)*sizeof(digit));
Mark Dickinson27a87a22009-10-25 20:43:34 +00004509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 /* Complement result if negative. */
4511 if (negz) {
4512 Py_SIZE(z) = -(Py_SIZE(z));
4513 z->ob_digit[size_z] = PyLong_MASK;
4514 v_complement(z->ob_digit, z->ob_digit, size_z+1);
4515 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00004516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004517 Py_DECREF(a);
4518 Py_DECREF(b);
4519 return (PyObject *)maybe_small_long(long_normalize(z));
Guido van Rossumc6913e71991-11-19 20:26:46 +00004520}
4521
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004522static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00004523long_and(PyObject *a, PyObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004525 PyObject *c;
4526 CHECK_BINOP(a, b);
4527 c = long_bitwise((PyLongObject*)a, '&', (PyLongObject*)b);
4528 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00004529}
4530
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004531static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00004532long_xor(PyObject *a, PyObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004534 PyObject *c;
4535 CHECK_BINOP(a, b);
4536 c = long_bitwise((PyLongObject*)a, '^', (PyLongObject*)b);
4537 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00004538}
4539
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004540static PyObject *
Martin v. Löwisda86fcc2007-09-10 07:59:54 +00004541long_or(PyObject *a, PyObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00004542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004543 PyObject *c;
4544 CHECK_BINOP(a, b);
4545 c = long_bitwise((PyLongObject*)a, '|', (PyLongObject*)b);
4546 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004547}
4548
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004549static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00004550long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00004551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 if (PyLong_CheckExact(v))
4553 Py_INCREF(v);
4554 else
4555 v = _PyLong_Copy((PyLongObject *)v);
4556 return v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00004557}
4558
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004559PyObject *
4560_PyLong_GCD(PyObject *aarg, PyObject *barg)
4561{
4562 PyLongObject *a, *b, *c = NULL, *d = NULL, *r;
4563 stwodigits x, y, q, s, t, c_carry, d_carry;
4564 stwodigits A, B, C, D, T;
4565 int nbits, k;
4566 Py_ssize_t size_a, size_b, alloc_a, alloc_b;
4567 digit *a_digit, *b_digit, *c_digit, *d_digit, *a_end, *b_end;
4568
4569 a = (PyLongObject *)aarg;
4570 b = (PyLongObject *)barg;
4571 size_a = Py_SIZE(a);
4572 size_b = Py_SIZE(b);
4573 if (-2 <= size_a && size_a <= 2 && -2 <= size_b && size_b <= 2) {
4574 Py_INCREF(a);
4575 Py_INCREF(b);
4576 goto simple;
4577 }
4578
4579 /* Initial reduction: make sure that 0 <= b <= a. */
4580 a = (PyLongObject *)long_abs(a);
4581 if (a == NULL)
4582 return NULL;
4583 b = (PyLongObject *)long_abs(b);
4584 if (b == NULL) {
4585 Py_DECREF(a);
4586 return NULL;
4587 }
4588 if (long_compare(a, b) < 0) {
4589 r = a;
4590 a = b;
4591 b = r;
4592 }
4593 /* We now own references to a and b */
4594
4595 alloc_a = Py_SIZE(a);
4596 alloc_b = Py_SIZE(b);
4597 /* reduce until a fits into 2 digits */
4598 while ((size_a = Py_SIZE(a)) > 2) {
4599 nbits = bits_in_digit(a->ob_digit[size_a-1]);
4600 /* extract top 2*PyLong_SHIFT bits of a into x, along with
4601 corresponding bits of b into y */
4602 size_b = Py_SIZE(b);
4603 assert(size_b <= size_a);
4604 if (size_b == 0) {
4605 if (size_a < alloc_a) {
4606 r = (PyLongObject *)_PyLong_Copy(a);
4607 Py_DECREF(a);
4608 }
4609 else
4610 r = a;
4611 Py_DECREF(b);
4612 Py_XDECREF(c);
4613 Py_XDECREF(d);
4614 return (PyObject *)r;
4615 }
4616 x = (((twodigits)a->ob_digit[size_a-1] << (2*PyLong_SHIFT-nbits)) |
4617 ((twodigits)a->ob_digit[size_a-2] << (PyLong_SHIFT-nbits)) |
4618 (a->ob_digit[size_a-3] >> nbits));
4619
4620 y = ((size_b >= size_a - 2 ? b->ob_digit[size_a-3] >> nbits : 0) |
4621 (size_b >= size_a - 1 ? (twodigits)b->ob_digit[size_a-2] << (PyLong_SHIFT-nbits) : 0) |
4622 (size_b >= size_a ? (twodigits)b->ob_digit[size_a-1] << (2*PyLong_SHIFT-nbits) : 0));
4623
4624 /* inner loop of Lehmer's algorithm; A, B, C, D never grow
4625 larger than PyLong_MASK during the algorithm. */
4626 A = 1; B = 0; C = 0; D = 1;
4627 for (k=0;; k++) {
4628 if (y-C == 0)
4629 break;
4630 q = (x+(A-1))/(y-C);
4631 s = B+q*D;
4632 t = x-q*y;
4633 if (s > t)
4634 break;
4635 x = y; y = t;
4636 t = A+q*C; A = D; B = C; C = s; D = t;
4637 }
4638
4639 if (k == 0) {
4640 /* no progress; do a Euclidean step */
4641 if (l_divmod(a, b, NULL, &r) < 0)
4642 goto error;
4643 Py_DECREF(a);
4644 a = b;
4645 b = r;
4646 alloc_a = alloc_b;
4647 alloc_b = Py_SIZE(b);
4648 continue;
4649 }
4650
4651 /*
4652 a, b = A*b-B*a, D*a-C*b if k is odd
4653 a, b = A*a-B*b, D*b-C*a if k is even
4654 */
4655 if (k&1) {
4656 T = -A; A = -B; B = T;
4657 T = -C; C = -D; D = T;
4658 }
4659 if (c != NULL)
4660 Py_SIZE(c) = size_a;
4661 else if (Py_REFCNT(a) == 1) {
4662 Py_INCREF(a);
4663 c = a;
4664 }
4665 else {
4666 alloc_a = size_a;
4667 c = _PyLong_New(size_a);
4668 if (c == NULL)
4669 goto error;
4670 }
4671
4672 if (d != NULL)
4673 Py_SIZE(d) = size_a;
4674 else if (Py_REFCNT(b) == 1 && size_a <= alloc_b) {
4675 Py_INCREF(b);
4676 d = b;
4677 Py_SIZE(d) = size_a;
4678 }
4679 else {
4680 alloc_b = size_a;
4681 d = _PyLong_New(size_a);
4682 if (d == NULL)
4683 goto error;
4684 }
4685 a_end = a->ob_digit + size_a;
4686 b_end = b->ob_digit + size_b;
4687
4688 /* compute new a and new b in parallel */
4689 a_digit = a->ob_digit;
4690 b_digit = b->ob_digit;
4691 c_digit = c->ob_digit;
4692 d_digit = d->ob_digit;
4693 c_carry = 0;
4694 d_carry = 0;
4695 while (b_digit < b_end) {
4696 c_carry += (A * *a_digit) - (B * *b_digit);
4697 d_carry += (D * *b_digit++) - (C * *a_digit++);
4698 *c_digit++ = (digit)(c_carry & PyLong_MASK);
4699 *d_digit++ = (digit)(d_carry & PyLong_MASK);
4700 c_carry >>= PyLong_SHIFT;
4701 d_carry >>= PyLong_SHIFT;
4702 }
4703 while (a_digit < a_end) {
4704 c_carry += A * *a_digit;
4705 d_carry -= C * *a_digit++;
4706 *c_digit++ = (digit)(c_carry & PyLong_MASK);
4707 *d_digit++ = (digit)(d_carry & PyLong_MASK);
4708 c_carry >>= PyLong_SHIFT;
4709 d_carry >>= PyLong_SHIFT;
4710 }
4711 assert(c_carry == 0);
4712 assert(d_carry == 0);
4713
4714 Py_INCREF(c);
4715 Py_INCREF(d);
4716 Py_DECREF(a);
4717 Py_DECREF(b);
4718 a = long_normalize(c);
4719 b = long_normalize(d);
4720 }
4721 Py_XDECREF(c);
4722 Py_XDECREF(d);
4723
4724simple:
4725 assert(Py_REFCNT(a) > 0);
4726 assert(Py_REFCNT(b) > 0);
Victor Stinner5783fd22015-09-19 13:39:03 +02004727/* Issue #24999: use two shifts instead of ">> 2*PyLong_SHIFT" to avoid
4728 undefined behaviour when LONG_MAX type is smaller than 60 bits */
4729#if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004730 /* a fits into a long, so b must too */
4731 x = PyLong_AsLong((PyObject *)a);
4732 y = PyLong_AsLong((PyObject *)b);
Benjamin Petersond953f8e2016-09-06 10:51:19 -07004733#elif PY_LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004734 x = PyLong_AsLongLong((PyObject *)a);
4735 y = PyLong_AsLongLong((PyObject *)b);
4736#else
4737# error "_PyLong_GCD"
4738#endif
4739 x = Py_ABS(x);
4740 y = Py_ABS(y);
4741 Py_DECREF(a);
4742 Py_DECREF(b);
4743
4744 /* usual Euclidean algorithm for longs */
4745 while (y != 0) {
4746 t = y;
4747 y = x % y;
4748 x = t;
4749 }
Victor Stinner5783fd22015-09-19 13:39:03 +02004750#if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004751 return PyLong_FromLong(x);
Benjamin Petersond953f8e2016-09-06 10:51:19 -07004752#elif PY_LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +03004753 return PyLong_FromLongLong(x);
4754#else
4755# error "_PyLong_GCD"
4756#endif
4757
4758error:
4759 Py_DECREF(a);
4760 Py_DECREF(b);
4761 Py_XDECREF(c);
4762 Py_XDECREF(d);
4763 return NULL;
4764}
4765
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004766static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00004767long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00004768{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004769 double result;
4770 result = PyLong_AsDouble(v);
4771 if (result == -1.0 && PyErr_Occurred())
4772 return NULL;
4773 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00004774}
4775
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004776static PyObject *
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02004777long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase);
4778
4779/*[clinic input]
4780@classmethod
4781int.__new__ as long_new
4782 x: object(c_default="NULL") = 0
4783 /
4784 base as obase: object(c_default="NULL") = 10
4785[clinic start generated code]*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00004786
Tim Peters6d6c1a32001-08-02 04:15:00 +00004787static PyObject *
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02004788long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase)
4789/*[clinic end generated code: output=e47cfe777ab0f24c input=81c98f418af9eb6f]*/
Tim Peters6d6c1a32001-08-02 04:15:00 +00004790{
Gregory P. Smitha689e522012-12-25 22:38:32 -08004791 Py_ssize_t base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004793 if (type != &PyLong_Type)
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02004794 return long_subtype_new(type, x, obase); /* Wimp out */
Serhiy Storchaka0b386d52012-12-28 09:42:11 +02004795 if (x == NULL) {
4796 if (obase != NULL) {
4797 PyErr_SetString(PyExc_TypeError,
4798 "int() missing string argument");
4799 return NULL;
4800 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 return PyLong_FromLong(0L);
Serhiy Storchaka0b386d52012-12-28 09:42:11 +02004802 }
Mark Dickinsonf9a5a8e2010-05-26 20:07:58 +00004803 if (obase == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 return PyNumber_Long(x);
Mark Dickinsonf9a5a8e2010-05-26 20:07:58 +00004805
Gregory P. Smitha689e522012-12-25 22:38:32 -08004806 base = PyNumber_AsSsize_t(obase, NULL);
Mark Dickinsonf9a5a8e2010-05-26 20:07:58 +00004807 if (base == -1 && PyErr_Occurred())
4808 return NULL;
Gregory P. Smitha689e522012-12-25 22:38:32 -08004809 if ((base != 0 && base < 2) || base > 36) {
Mark Dickinsonf9a5a8e2010-05-26 20:07:58 +00004810 PyErr_SetString(PyExc_ValueError,
Sanyam Khurana28b62482017-11-14 03:19:26 +05304811 "int() base must be >= 2 and <= 36, or 0");
Mark Dickinsonf9a5a8e2010-05-26 20:07:58 +00004812 return NULL;
4813 }
4814
4815 if (PyUnicode_Check(x))
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004816 return PyLong_FromUnicodeObject(x, (int)base);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004817 else if (PyByteArray_Check(x) || PyBytes_Check(x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 char *string;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004819 if (PyByteArray_Check(x))
4820 string = PyByteArray_AS_STRING(x);
4821 else
4822 string = PyBytes_AS_STRING(x);
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03004823 return _PyLong_FromBytes(string, Py_SIZE(x), (int)base);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824 }
4825 else {
4826 PyErr_SetString(PyExc_TypeError,
Mark Dickinson22b20182010-05-10 21:27:53 +00004827 "int() can't convert non-string with explicit base");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004828 return NULL;
4829 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00004830}
4831
Serhiy Storchaka95949422013-08-27 19:40:23 +03004832/* Wimpy, slow approach to tp_new calls for subtypes of int:
4833 first create a regular int from whatever arguments we got,
Guido van Rossumbef14172001-08-29 15:47:46 +00004834 then allocate a subtype instance and initialize it from
Serhiy Storchaka95949422013-08-27 19:40:23 +03004835 the regular int. The regular int is then thrown away.
Guido van Rossumbef14172001-08-29 15:47:46 +00004836*/
4837static PyObject *
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02004838long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase)
Guido van Rossumbef14172001-08-29 15:47:46 +00004839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004840 PyLongObject *tmp, *newobj;
4841 Py_ssize_t i, n;
Guido van Rossumbef14172001-08-29 15:47:46 +00004842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843 assert(PyType_IsSubtype(type, &PyLong_Type));
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02004844 tmp = (PyLongObject *)long_new_impl(&PyLong_Type, x, obase);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 if (tmp == NULL)
4846 return NULL;
Serhiy Storchaka15095802015-11-25 15:47:01 +02004847 assert(PyLong_Check(tmp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848 n = Py_SIZE(tmp);
4849 if (n < 0)
4850 n = -n;
4851 newobj = (PyLongObject *)type->tp_alloc(type, n);
4852 if (newobj == NULL) {
4853 Py_DECREF(tmp);
4854 return NULL;
4855 }
4856 assert(PyLong_Check(newobj));
4857 Py_SIZE(newobj) = Py_SIZE(tmp);
4858 for (i = 0; i < n; i++)
4859 newobj->ob_digit[i] = tmp->ob_digit[i];
4860 Py_DECREF(tmp);
4861 return (PyObject *)newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00004862}
4863
Serhiy Storchaka495e8802017-02-01 23:12:20 +02004864/*[clinic input]
4865int.__getnewargs__
4866[clinic start generated code]*/
4867
Guido van Rossum5d9113d2003-01-29 17:58:45 +00004868static PyObject *
Serhiy Storchaka495e8802017-02-01 23:12:20 +02004869int___getnewargs___impl(PyObject *self)
4870/*[clinic end generated code: output=839a49de3f00b61b input=5904770ab1fb8c75]*/
Guido van Rossum5d9113d2003-01-29 17:58:45 +00004871{
Serhiy Storchaka495e8802017-02-01 23:12:20 +02004872 return Py_BuildValue("(N)", _PyLong_Copy((PyLongObject *)self));
Guido van Rossum5d9113d2003-01-29 17:58:45 +00004873}
4874
Guido van Rossumb43daf72007-08-01 18:08:08 +00004875static PyObject *
Mark Dickinson6bf19002009-05-02 17:57:52 +00004876long_get0(PyLongObject *v, void *context) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 return PyLong_FromLong(0L);
Mark Dickinson6bf19002009-05-02 17:57:52 +00004878}
4879
4880static PyObject *
4881long_get1(PyLongObject *v, void *context) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882 return PyLong_FromLong(1L);
Guido van Rossumb43daf72007-08-01 18:08:08 +00004883}
4884
Serhiy Storchaka495e8802017-02-01 23:12:20 +02004885/*[clinic input]
4886int.__format__
4887
4888 format_spec: unicode
4889 /
4890[clinic start generated code]*/
4891
Guido van Rossum2fa33db2007-08-23 22:07:24 +00004892static PyObject *
Serhiy Storchaka495e8802017-02-01 23:12:20 +02004893int___format___impl(PyObject *self, PyObject *format_spec)
4894/*[clinic end generated code: output=b4929dee9ae18689 input=e31944a9b3e428b7]*/
Eric Smith8c663262007-08-25 02:26:07 +00004895{
Victor Stinnerd3f08822012-05-29 12:57:52 +02004896 _PyUnicodeWriter writer;
4897 int ret;
Eric Smith4a7d76d2008-05-30 18:10:19 +00004898
Victor Stinner8f674cc2013-04-17 23:02:17 +02004899 _PyUnicodeWriter_Init(&writer);
Victor Stinnerd3f08822012-05-29 12:57:52 +02004900 ret = _PyLong_FormatAdvancedWriter(
4901 &writer,
4902 self,
4903 format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
4904 if (ret == -1) {
4905 _PyUnicodeWriter_Dealloc(&writer);
4906 return NULL;
4907 }
4908 return _PyUnicodeWriter_Finish(&writer);
Eric Smith8c663262007-08-25 02:26:07 +00004909}
4910
Mark Dickinson7f1bf802010-05-26 16:02:59 +00004911/* Return a pair (q, r) such that a = b * q + r, and
4912 abs(r) <= abs(b)/2, with equality possible only if q is even.
4913 In other words, q == a / b, rounded to the nearest integer using
4914 round-half-to-even. */
4915
4916PyObject *
Mark Dickinsonfa68a612010-06-07 18:47:09 +00004917_PyLong_DivmodNear(PyObject *a, PyObject *b)
Mark Dickinson7f1bf802010-05-26 16:02:59 +00004918{
4919 PyLongObject *quo = NULL, *rem = NULL;
Serhiy Storchakaba85d692017-03-30 09:09:41 +03004920 PyObject *twice_rem, *result, *temp;
Mark Dickinson7f1bf802010-05-26 16:02:59 +00004921 int cmp, quo_is_odd, quo_is_neg;
4922
4923 /* Equivalent Python code:
4924
4925 def divmod_near(a, b):
4926 q, r = divmod(a, b)
4927 # round up if either r / b > 0.5, or r / b == 0.5 and q is odd.
4928 # The expression r / b > 0.5 is equivalent to 2 * r > b if b is
4929 # positive, 2 * r < b if b negative.
4930 greater_than_half = 2*r > b if b > 0 else 2*r < b
4931 exactly_half = 2*r == b
4932 if greater_than_half or exactly_half and q % 2 == 1:
4933 q += 1
4934 r -= b
4935 return q, r
4936
4937 */
4938 if (!PyLong_Check(a) || !PyLong_Check(b)) {
4939 PyErr_SetString(PyExc_TypeError,
4940 "non-integer arguments in division");
4941 return NULL;
4942 }
4943
4944 /* Do a and b have different signs? If so, quotient is negative. */
4945 quo_is_neg = (Py_SIZE(a) < 0) != (Py_SIZE(b) < 0);
4946
Mark Dickinson7f1bf802010-05-26 16:02:59 +00004947 if (long_divrem((PyLongObject*)a, (PyLongObject*)b, &quo, &rem) < 0)
4948 goto error;
4949
4950 /* compare twice the remainder with the divisor, to see
4951 if we need to adjust the quotient and remainder */
Serhiy Storchakaba85d692017-03-30 09:09:41 +03004952 twice_rem = long_lshift((PyObject *)rem, _PyLong_One);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00004953 if (twice_rem == NULL)
4954 goto error;
4955 if (quo_is_neg) {
4956 temp = long_neg((PyLongObject*)twice_rem);
4957 Py_DECREF(twice_rem);
4958 twice_rem = temp;
4959 if (twice_rem == NULL)
4960 goto error;
4961 }
4962 cmp = long_compare((PyLongObject *)twice_rem, (PyLongObject *)b);
4963 Py_DECREF(twice_rem);
4964
4965 quo_is_odd = Py_SIZE(quo) != 0 && ((quo->ob_digit[0] & 1) != 0);
4966 if ((Py_SIZE(b) < 0 ? cmp < 0 : cmp > 0) || (cmp == 0 && quo_is_odd)) {
4967 /* fix up quotient */
4968 if (quo_is_neg)
Serhiy Storchakaba85d692017-03-30 09:09:41 +03004969 temp = long_sub(quo, (PyLongObject *)_PyLong_One);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00004970 else
Serhiy Storchakaba85d692017-03-30 09:09:41 +03004971 temp = long_add(quo, (PyLongObject *)_PyLong_One);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00004972 Py_DECREF(quo);
4973 quo = (PyLongObject *)temp;
4974 if (quo == NULL)
4975 goto error;
4976 /* and remainder */
4977 if (quo_is_neg)
4978 temp = long_add(rem, (PyLongObject *)b);
4979 else
4980 temp = long_sub(rem, (PyLongObject *)b);
4981 Py_DECREF(rem);
4982 rem = (PyLongObject *)temp;
4983 if (rem == NULL)
4984 goto error;
4985 }
4986
4987 result = PyTuple_New(2);
4988 if (result == NULL)
4989 goto error;
4990
4991 /* PyTuple_SET_ITEM steals references */
4992 PyTuple_SET_ITEM(result, 0, (PyObject *)quo);
4993 PyTuple_SET_ITEM(result, 1, (PyObject *)rem);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00004994 return result;
4995
4996 error:
4997 Py_XDECREF(quo);
4998 Py_XDECREF(rem);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00004999 return NULL;
5000}
5001
Eric Smith8c663262007-08-25 02:26:07 +00005002static PyObject *
Guido van Rossum2fa33db2007-08-23 22:07:24 +00005003long_round(PyObject *self, PyObject *args)
5004{
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005005 PyObject *o_ndigits=NULL, *temp, *result, *ndigits;
Guido van Rossum2fa33db2007-08-23 22:07:24 +00005006
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005007 /* To round an integer m to the nearest 10**n (n positive), we make use of
5008 * the divmod_near operation, defined by:
5009 *
5010 * divmod_near(a, b) = (q, r)
5011 *
5012 * where q is the nearest integer to the quotient a / b (the
5013 * nearest even integer in the case of a tie) and r == a - q * b.
5014 * Hence q * b = a - r is the nearest multiple of b to a,
5015 * preferring even multiples in the case of a tie.
5016 *
5017 * So the nearest multiple of 10**n to m is:
5018 *
5019 * m - divmod_near(m, 10**n)[1].
5020 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 if (!PyArg_ParseTuple(args, "|O", &o_ndigits))
5022 return NULL;
5023 if (o_ndigits == NULL)
5024 return long_long(self);
Guido van Rossum2fa33db2007-08-23 22:07:24 +00005025
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005026 ndigits = PyNumber_Index(o_ndigits);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 if (ndigits == NULL)
5028 return NULL;
Mark Dickinson1124e712009-01-28 21:25:58 +00005029
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005030 /* if ndigits >= 0 then no rounding is necessary; return self unchanged */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 if (Py_SIZE(ndigits) >= 0) {
5032 Py_DECREF(ndigits);
5033 return long_long(self);
5034 }
Mark Dickinson1124e712009-01-28 21:25:58 +00005035
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005036 /* result = self - divmod_near(self, 10 ** -ndigits)[1] */
5037 temp = long_neg((PyLongObject*)ndigits);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005038 Py_DECREF(ndigits);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005039 ndigits = temp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 if (ndigits == NULL)
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005041 return NULL;
Mark Dickinson1124e712009-01-28 21:25:58 +00005042
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005043 result = PyLong_FromLong(10L);
5044 if (result == NULL) {
5045 Py_DECREF(ndigits);
5046 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 }
Mark Dickinson1124e712009-01-28 21:25:58 +00005048
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005049 temp = long_pow(result, ndigits, Py_None);
5050 Py_DECREF(ndigits);
5051 Py_DECREF(result);
5052 result = temp;
5053 if (result == NULL)
5054 return NULL;
5055
Mark Dickinsonfa68a612010-06-07 18:47:09 +00005056 temp = _PyLong_DivmodNear(self, result);
Mark Dickinson7f1bf802010-05-26 16:02:59 +00005057 Py_DECREF(result);
5058 result = temp;
5059 if (result == NULL)
5060 return NULL;
5061
5062 temp = long_sub((PyLongObject *)self,
5063 (PyLongObject *)PyTuple_GET_ITEM(result, 1));
5064 Py_DECREF(result);
5065 result = temp;
5066
5067 return result;
Guido van Rossum2fa33db2007-08-23 22:07:24 +00005068}
5069
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005070/*[clinic input]
5071int.__sizeof__ -> Py_ssize_t
5072
5073Returns size in memory, in bytes.
5074[clinic start generated code]*/
5075
5076static Py_ssize_t
5077int___sizeof___impl(PyObject *self)
5078/*[clinic end generated code: output=3303f008eaa6a0a5 input=9b51620c76fc4507]*/
Martin v. Löwis00709aa2008-06-04 14:18:43 +00005079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005080 Py_ssize_t res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00005081
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005082 res = offsetof(PyLongObject, ob_digit) + Py_ABS(Py_SIZE(self))*sizeof(digit);
5083 return res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00005084}
5085
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005086/*[clinic input]
5087int.bit_length
5088
5089Number of bits necessary to represent self in binary.
5090
5091>>> bin(37)
5092'0b100101'
5093>>> (37).bit_length()
50946
5095[clinic start generated code]*/
5096
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005097static PyObject *
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005098int_bit_length_impl(PyObject *self)
5099/*[clinic end generated code: output=fc1977c9353d6a59 input=e4eb7a587e849a32]*/
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 PyLongObject *result, *x, *y;
Serhiy Storchakab2e64f92016-11-08 20:34:22 +02005102 Py_ssize_t ndigits;
5103 int msd_bits;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 digit msd;
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005105
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005106 assert(self != NULL);
5107 assert(PyLong_Check(self));
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005108
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005109 ndigits = Py_ABS(Py_SIZE(self));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 if (ndigits == 0)
5111 return PyLong_FromLong(0);
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005112
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005113 msd = ((PyLongObject *)self)->ob_digit[ndigits-1];
Serhiy Storchakab2e64f92016-11-08 20:34:22 +02005114 msd_bits = bits_in_digit(msd);
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 if (ndigits <= PY_SSIZE_T_MAX/PyLong_SHIFT)
5117 return PyLong_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits);
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 /* expression above may overflow; use Python integers instead */
5120 result = (PyLongObject *)PyLong_FromSsize_t(ndigits - 1);
5121 if (result == NULL)
5122 return NULL;
5123 x = (PyLongObject *)PyLong_FromLong(PyLong_SHIFT);
5124 if (x == NULL)
5125 goto error;
5126 y = (PyLongObject *)long_mul(result, x);
5127 Py_DECREF(x);
5128 if (y == NULL)
5129 goto error;
5130 Py_DECREF(result);
5131 result = y;
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005133 x = (PyLongObject *)PyLong_FromLong((long)msd_bits);
5134 if (x == NULL)
5135 goto error;
5136 y = (PyLongObject *)long_add(result, x);
5137 Py_DECREF(x);
5138 if (y == NULL)
5139 goto error;
5140 Py_DECREF(result);
5141 result = y;
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 return (PyObject *)result;
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005144
Mark Dickinson22b20182010-05-10 21:27:53 +00005145 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005146 Py_DECREF(result);
5147 return NULL;
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00005148}
5149
Christian Heimes53876d92008-04-19 00:31:39 +00005150#if 0
5151static PyObject *
5152long_is_finite(PyObject *v)
5153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005154 Py_RETURN_TRUE;
Christian Heimes53876d92008-04-19 00:31:39 +00005155}
5156#endif
5157
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005158/*[clinic input]
5159int.to_bytes
5160
5161 length: Py_ssize_t
5162 Length of bytes object to use. An OverflowError is raised if the
5163 integer is not representable with the given number of bytes.
5164 byteorder: unicode
5165 The byte order used to represent the integer. If byteorder is 'big',
5166 the most significant byte is at the beginning of the byte array. If
5167 byteorder is 'little', the most significant byte is at the end of the
5168 byte array. To request the native byte order of the host system, use
5169 `sys.byteorder' as the byte order value.
5170 *
5171 signed as is_signed: bool = False
5172 Determines whether two's complement is used to represent the integer.
5173 If signed is False and a negative integer is given, an OverflowError
5174 is raised.
5175
5176Return an array of bytes representing an integer.
5177[clinic start generated code]*/
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005178
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005179static PyObject *
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005180int_to_bytes_impl(PyObject *self, Py_ssize_t length, PyObject *byteorder,
5181 int is_signed)
5182/*[clinic end generated code: output=89c801df114050a3 input=ddac63f4c7bf414c]*/
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 int little_endian;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 PyObject *bytes;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005186
Serhiy Storchaka196a7bc2017-02-02 16:54:45 +02005187 if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_little))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 little_endian = 1;
Serhiy Storchaka196a7bc2017-02-02 16:54:45 +02005189 else if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_big))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005190 little_endian = 0;
5191 else {
5192 PyErr_SetString(PyExc_ValueError,
5193 "byteorder must be either 'little' or 'big'");
5194 return NULL;
5195 }
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 if (length < 0) {
5198 PyErr_SetString(PyExc_ValueError,
5199 "length argument must be non-negative");
5200 return NULL;
5201 }
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005203 bytes = PyBytes_FromStringAndSize(NULL, length);
5204 if (bytes == NULL)
5205 return NULL;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005206
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005207 if (_PyLong_AsByteArray((PyLongObject *)self,
5208 (unsigned char *)PyBytes_AS_STRING(bytes),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 length, little_endian, is_signed) < 0) {
5210 Py_DECREF(bytes);
5211 return NULL;
5212 }
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 return bytes;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005215}
5216
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005217/*[clinic input]
5218@classmethod
5219int.from_bytes
5220
5221 bytes as bytes_obj: object
5222 Holds the array of bytes to convert. The argument must either
5223 support the buffer protocol or be an iterable object producing bytes.
5224 Bytes and bytearray are examples of built-in objects that support the
5225 buffer protocol.
5226 byteorder: unicode
5227 The byte order used to represent the integer. If byteorder is 'big',
5228 the most significant byte is at the beginning of the byte array. If
5229 byteorder is 'little', the most significant byte is at the end of the
5230 byte array. To request the native byte order of the host system, use
5231 `sys.byteorder' as the byte order value.
5232 *
5233 signed as is_signed: bool = False
5234 Indicates whether two's complement is used to represent the integer.
5235
5236Return the integer represented by the given array of bytes.
5237[clinic start generated code]*/
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005238
5239static PyObject *
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005240int_from_bytes_impl(PyTypeObject *type, PyObject *bytes_obj,
5241 PyObject *byteorder, int is_signed)
5242/*[clinic end generated code: output=efc5d68e31f9314f input=cdf98332b6a821b0]*/
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 int little_endian;
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005245 PyObject *long_obj, *bytes;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005246
Serhiy Storchaka196a7bc2017-02-02 16:54:45 +02005247 if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_little))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005248 little_endian = 1;
Serhiy Storchaka196a7bc2017-02-02 16:54:45 +02005249 else if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_big))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 little_endian = 0;
5251 else {
5252 PyErr_SetString(PyExc_ValueError,
5253 "byteorder must be either 'little' or 'big'");
5254 return NULL;
5255 }
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005256
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005257 bytes = PyObject_Bytes(bytes_obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 if (bytes == NULL)
5259 return NULL;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 long_obj = _PyLong_FromByteArray(
5262 (unsigned char *)PyBytes_AS_STRING(bytes), Py_SIZE(bytes),
5263 little_endian, is_signed);
5264 Py_DECREF(bytes);
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005265
Serhiy Storchakaea36c942016-05-12 10:37:58 +03005266 if (type != &PyLong_Type) {
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01005267 Py_SETREF(long_obj, PyObject_CallFunctionObjArgs((PyObject *)type,
5268 long_obj, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 }
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005271 return long_obj;
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00005272}
5273
Guido van Rossum5d9113d2003-01-29 17:58:45 +00005274static PyMethodDef long_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 {"conjugate", (PyCFunction)long_long, METH_NOARGS,
5276 "Returns self, the complex conjugate of any int."},
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005277 INT_BIT_LENGTH_METHODDEF
Christian Heimes53876d92008-04-19 00:31:39 +00005278#if 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 {"is_finite", (PyCFunction)long_is_finite, METH_NOARGS,
5280 "Returns always True."},
Christian Heimes53876d92008-04-19 00:31:39 +00005281#endif
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005282 INT_TO_BYTES_METHODDEF
5283 INT_FROM_BYTES_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 {"__trunc__", (PyCFunction)long_long, METH_NOARGS,
5285 "Truncating an Integral returns itself."},
5286 {"__floor__", (PyCFunction)long_long, METH_NOARGS,
5287 "Flooring an Integral returns itself."},
5288 {"__ceil__", (PyCFunction)long_long, METH_NOARGS,
5289 "Ceiling of an Integral returns itself."},
5290 {"__round__", (PyCFunction)long_round, METH_VARARGS,
5291 "Rounding an Integral returns itself.\n"
5292 "Rounding with an ndigits argument also returns an integer."},
Serhiy Storchaka495e8802017-02-01 23:12:20 +02005293 INT___GETNEWARGS___METHODDEF
5294 INT___FORMAT___METHODDEF
5295 INT___SIZEOF___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005296 {NULL, NULL} /* sentinel */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00005297};
5298
Guido van Rossumb43daf72007-08-01 18:08:08 +00005299static PyGetSetDef long_getset[] = {
Mark Dickinson6bf19002009-05-02 17:57:52 +00005300 {"real",
Guido van Rossumb43daf72007-08-01 18:08:08 +00005301 (getter)long_long, (setter)NULL,
5302 "the real part of a complex number",
5303 NULL},
Mark Dickinson6bf19002009-05-02 17:57:52 +00005304 {"imag",
5305 (getter)long_get0, (setter)NULL,
Guido van Rossumb43daf72007-08-01 18:08:08 +00005306 "the imaginary part of a complex number",
Mark Dickinson6bf19002009-05-02 17:57:52 +00005307 NULL},
5308 {"numerator",
Guido van Rossumb43daf72007-08-01 18:08:08 +00005309 (getter)long_long, (setter)NULL,
5310 "the numerator of a rational number in lowest terms",
5311 NULL},
Mark Dickinson6bf19002009-05-02 17:57:52 +00005312 {"denominator",
5313 (getter)long_get1, (setter)NULL,
Guido van Rossumb43daf72007-08-01 18:08:08 +00005314 "the denominator of a rational number in lowest terms",
Mark Dickinson6bf19002009-05-02 17:57:52 +00005315 NULL},
Guido van Rossumb43daf72007-08-01 18:08:08 +00005316 {NULL} /* Sentinel */
5317};
5318
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005319PyDoc_STRVAR(long_doc,
svelankar390a0962017-03-08 19:29:01 -05005320"int([x]) -> integer\n\
Chris Jerdonek83fe2e12012-10-07 14:48:36 -07005321int(x, base=10) -> integer\n\
Tim Peters6d6c1a32001-08-02 04:15:00 +00005322\n\
Chris Jerdonek83fe2e12012-10-07 14:48:36 -07005323Convert a number or string to an integer, or return 0 if no arguments\n\
5324are given. If x is a number, return x.__int__(). For floating point\n\
5325numbers, this truncates towards zero.\n\
5326\n\
5327If x is not a number or if base is given, then x must be a string,\n\
5328bytes, or bytearray instance representing an integer literal in the\n\
5329given base. The literal can be preceded by '+' or '-' and be surrounded\n\
5330by whitespace. The base defaults to 10. Valid bases are 0 and 2-36.\n\
5331Base 0 means to interpret the base from the string as an integer literal.\n\
5332>>> int('0b100', base=0)\n\
53334");
Tim Peters6d6c1a32001-08-02 04:15:00 +00005334
Guido van Rossumc0b618a1997-05-02 03:12:38 +00005335static PyNumberMethods long_as_number = {
Mark Dickinson22b20182010-05-10 21:27:53 +00005336 (binaryfunc)long_add, /*nb_add*/
5337 (binaryfunc)long_sub, /*nb_subtract*/
5338 (binaryfunc)long_mul, /*nb_multiply*/
5339 long_mod, /*nb_remainder*/
5340 long_divmod, /*nb_divmod*/
5341 long_pow, /*nb_power*/
5342 (unaryfunc)long_neg, /*nb_negative*/
5343 (unaryfunc)long_long, /*tp_positive*/
5344 (unaryfunc)long_abs, /*tp_absolute*/
5345 (inquiry)long_bool, /*tp_bool*/
5346 (unaryfunc)long_invert, /*nb_invert*/
5347 long_lshift, /*nb_lshift*/
5348 (binaryfunc)long_rshift, /*nb_rshift*/
5349 long_and, /*nb_and*/
5350 long_xor, /*nb_xor*/
5351 long_or, /*nb_or*/
5352 long_long, /*nb_int*/
5353 0, /*nb_reserved*/
5354 long_float, /*nb_float*/
5355 0, /* nb_inplace_add */
5356 0, /* nb_inplace_subtract */
5357 0, /* nb_inplace_multiply */
5358 0, /* nb_inplace_remainder */
5359 0, /* nb_inplace_power */
5360 0, /* nb_inplace_lshift */
5361 0, /* nb_inplace_rshift */
5362 0, /* nb_inplace_and */
5363 0, /* nb_inplace_xor */
5364 0, /* nb_inplace_or */
5365 long_div, /* nb_floor_divide */
5366 long_true_divide, /* nb_true_divide */
5367 0, /* nb_inplace_floor_divide */
5368 0, /* nb_inplace_true_divide */
5369 long_long, /* nb_index */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00005370};
5371
Guido van Rossumc0b618a1997-05-02 03:12:38 +00005372PyTypeObject PyLong_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 PyVarObject_HEAD_INIT(&PyType_Type, 0)
5374 "int", /* tp_name */
5375 offsetof(PyLongObject, ob_digit), /* tp_basicsize */
5376 sizeof(digit), /* tp_itemsize */
5377 long_dealloc, /* tp_dealloc */
5378 0, /* tp_print */
5379 0, /* tp_getattr */
5380 0, /* tp_setattr */
5381 0, /* tp_reserved */
5382 long_to_decimal_string, /* tp_repr */
5383 &long_as_number, /* tp_as_number */
5384 0, /* tp_as_sequence */
5385 0, /* tp_as_mapping */
5386 (hashfunc)long_hash, /* tp_hash */
5387 0, /* tp_call */
5388 long_to_decimal_string, /* tp_str */
5389 PyObject_GenericGetAttr, /* tp_getattro */
5390 0, /* tp_setattro */
5391 0, /* tp_as_buffer */
5392 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
5393 Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */
5394 long_doc, /* tp_doc */
5395 0, /* tp_traverse */
5396 0, /* tp_clear */
5397 long_richcompare, /* tp_richcompare */
5398 0, /* tp_weaklistoffset */
5399 0, /* tp_iter */
5400 0, /* tp_iternext */
5401 long_methods, /* tp_methods */
5402 0, /* tp_members */
5403 long_getset, /* tp_getset */
5404 0, /* tp_base */
5405 0, /* tp_dict */
5406 0, /* tp_descr_get */
5407 0, /* tp_descr_set */
5408 0, /* tp_dictoffset */
5409 0, /* tp_init */
5410 0, /* tp_alloc */
5411 long_new, /* tp_new */
5412 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00005413};
Guido van Rossumddefaf32007-01-14 03:31:43 +00005414
Mark Dickinsonbd792642009-03-18 20:06:12 +00005415static PyTypeObject Int_InfoType;
5416
5417PyDoc_STRVAR(int_info__doc__,
5418"sys.int_info\n\
5419\n\
5420A struct sequence that holds information about Python's\n\
5421internal representation of integers. The attributes are read only.");
5422
5423static PyStructSequence_Field int_info_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 {"bits_per_digit", "size of a digit in bits"},
Mark Dickinson22b20182010-05-10 21:27:53 +00005425 {"sizeof_digit", "size in bytes of the C type used to represent a digit"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 {NULL, NULL}
Mark Dickinsonbd792642009-03-18 20:06:12 +00005427};
5428
5429static PyStructSequence_Desc int_info_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005430 "sys.int_info", /* name */
5431 int_info__doc__, /* doc */
5432 int_info_fields, /* fields */
5433 2 /* number of fields */
Mark Dickinsonbd792642009-03-18 20:06:12 +00005434};
5435
5436PyObject *
5437PyLong_GetInfo(void)
5438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 PyObject* int_info;
5440 int field = 0;
5441 int_info = PyStructSequence_New(&Int_InfoType);
5442 if (int_info == NULL)
5443 return NULL;
5444 PyStructSequence_SET_ITEM(int_info, field++,
5445 PyLong_FromLong(PyLong_SHIFT));
5446 PyStructSequence_SET_ITEM(int_info, field++,
5447 PyLong_FromLong(sizeof(digit)));
5448 if (PyErr_Occurred()) {
5449 Py_CLEAR(int_info);
5450 return NULL;
5451 }
5452 return int_info;
Mark Dickinsonbd792642009-03-18 20:06:12 +00005453}
5454
Guido van Rossumddefaf32007-01-14 03:31:43 +00005455int
5456_PyLong_Init(void)
5457{
5458#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005459 int ival, size;
5460 PyLongObject *v = small_ints;
Christian Heimesdfc12ed2008-01-31 15:16:38 +00005461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++, v++) {
5463 size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1);
5464 if (Py_TYPE(v) == &PyLong_Type) {
5465 /* The element is already initialized, most likely
5466 * the Python interpreter was initialized before.
5467 */
5468 Py_ssize_t refcnt;
5469 PyObject* op = (PyObject*)v;
Christian Heimesdfc12ed2008-01-31 15:16:38 +00005470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 refcnt = Py_REFCNT(op) < 0 ? 0 : Py_REFCNT(op);
5472 _Py_NewReference(op);
5473 /* _Py_NewReference sets the ref count to 1 but
5474 * the ref count might be larger. Set the refcnt
5475 * to the original refcnt + 1 */
5476 Py_REFCNT(op) = refcnt + 1;
5477 assert(Py_SIZE(op) == size);
Victor Stinner12174a52014-08-15 23:17:38 +02005478 assert(v->ob_digit[0] == (digit)abs(ival));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 }
5480 else {
Christian Heimesd3afe782013-12-04 09:27:47 +01005481 (void)PyObject_INIT(v, &PyLong_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005482 }
5483 Py_SIZE(v) = size;
Victor Stinner12174a52014-08-15 23:17:38 +02005484 v->ob_digit[0] = (digit)abs(ival);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005485 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00005486#endif
Serhiy Storchakaba85d692017-03-30 09:09:41 +03005487 _PyLong_Zero = PyLong_FromLong(0);
5488 if (_PyLong_Zero == NULL)
5489 return 0;
5490 _PyLong_One = PyLong_FromLong(1);
5491 if (_PyLong_One == NULL)
5492 return 0;
5493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 /* initialize int_info */
Victor Stinner1c8f0592013-07-22 22:24:54 +02005495 if (Int_InfoType.tp_name == NULL) {
5496 if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0)
5497 return 0;
5498 }
Mark Dickinsonbd792642009-03-18 20:06:12 +00005499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 return 1;
Guido van Rossumddefaf32007-01-14 03:31:43 +00005501}
5502
5503void
5504PyLong_Fini(void)
5505{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 /* Integers are currently statically allocated. Py_DECREF is not
5507 needed, but Python must forget about the reference or multiple
5508 reinitializations will fail. */
Serhiy Storchakaba85d692017-03-30 09:09:41 +03005509 Py_CLEAR(_PyLong_One);
5510 Py_CLEAR(_PyLong_Zero);
Guido van Rossumddefaf32007-01-14 03:31:43 +00005511#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 int i;
5513 PyLongObject *v = small_ints;
5514 for (i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++, v++) {
5515 _Py_DEC_REFTOTAL;
5516 _Py_ForgetReference((PyObject*)v);
5517 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00005518#endif
5519}