blob: b7328fd8630c942813f05530cac3d854518a7b34 [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
Eric Smith8c663262007-08-25 02:26:07 +00008#include "formatter_unicode.h"
9
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000010#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011
Guido van Rossum22201222007-08-07 22:02:18 +000012long
13PyInt_GetMax(void)
14{
15 return LONG_MAX; /* To initialize sys.maxint */
16}
17
Guido van Rossumddefaf32007-01-14 03:31:43 +000018#ifndef NSMALLPOSINTS
19#define NSMALLPOSINTS 257
20#endif
21#ifndef NSMALLNEGINTS
22#define NSMALLNEGINTS 5
23#endif
24#if NSMALLNEGINTS + NSMALLPOSINTS > 0
25/* Small integers are preallocated in this array so that they
26 can be shared.
27 The integers that are preallocated are those in the range
28 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
29*/
30static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
31#ifdef COUNT_ALLOCS
32int quick_int_allocs, quick_neg_int_allocs;
33#endif
34
Guido van Rossum7eaf8222007-06-18 17:58:50 +000035static PyObject *
Guido van Rossumddefaf32007-01-14 03:31:43 +000036get_small_int(int ival)
37{
38 PyObject *v = (PyObject*)(small_ints + ival + NSMALLNEGINTS);
39 Py_INCREF(v);
40#ifdef COUNT_ALLOCS
41 if (ival >= 0)
42 quick_int_allocs++;
43 else
44 quick_neg_int_allocs++;
45#endif
46 return v;
47}
48#define CHECK_SMALL_INT(ival) \
49 do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \
50 return get_small_int(ival); \
51 } while(0)
52
53#else
54#define CHECK_SMALL_INT(ival)
55#endif
56
Martin v. Löwis9f2e3462007-07-21 17:22:18 +000057#define MEDIUM_VALUE(x) (Py_Size(x) < 0 ? -(x)->ob_digit[0] : (Py_Size(x) == 0 ? 0 : (x)->ob_digit[0]))
Guido van Rossumddefaf32007-01-14 03:31:43 +000058/* If a freshly-allocated long is already shared, it must
59 be a small integer, so negating it must go to PyLong_FromLong */
60#define NEGATE(x) \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +000061 do if (Py_Refcnt(x) == 1) Py_Size(x) = -Py_Size(x); \
Guido van Rossumddefaf32007-01-14 03:31:43 +000062 else { PyObject* tmp=PyInt_FromLong(-MEDIUM_VALUE(x)); \
63 Py_DECREF(x); (x) = (PyLongObject*)tmp; } \
64 while(0)
Tim Peters5af4e6c2002-08-12 02:31:19 +000065/* For long multiplication, use the O(N**2) school algorithm unless
66 * both operands contain more than KARATSUBA_CUTOFF digits (this
67 * being an internal Python long digit, in base BASE).
68 */
Tim Peters0973b992004-08-29 22:16:50 +000069#define KARATSUBA_CUTOFF 70
70#define KARATSUBA_SQUARE_CUTOFF (2 * KARATSUBA_CUTOFF)
Tim Peters5af4e6c2002-08-12 02:31:19 +000071
Tim Peters47e52ee2004-08-30 02:44:38 +000072/* For exponentiation, use the binary left-to-right algorithm
73 * unless the exponent contains more than FIVEARY_CUTOFF digits.
74 * In that case, do 5 bits at a time. The potential drawback is that
75 * a table of 2**5 intermediate results is computed.
76 */
77#define FIVEARY_CUTOFF 8
78
Guido van Rossume32e0141992-01-19 16:31:05 +000079#define ABS(x) ((x) < 0 ? -(x) : (x))
80
Tim Peters5af4e6c2002-08-12 02:31:19 +000081#undef MIN
82#undef MAX
83#define MAX(x, y) ((x) < (y) ? (y) : (x))
84#define MIN(x, y) ((x) > (y) ? (y) : (x))
85
Guido van Rossume32e0141992-01-19 16:31:05 +000086/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000087static PyLongObject *long_normalize(PyLongObject *);
88static PyLongObject *mul1(PyLongObject *, wdigit);
89static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000090static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Guido van Rossume32e0141992-01-19 16:31:05 +000091
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092#define SIGCHECK(PyTryBlock) \
Skip Montanarod581d772002-09-03 20:10:45 +000093 if (--_Py_Ticker < 0) { \
94 _Py_Ticker = _Py_CheckInterval; \
Thomas Wouters477c8d52006-05-27 19:21:47 +000095 if (PyErr_CheckSignals()) PyTryBlock \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000096 }
97
Guido van Rossumedcc38a1991-05-05 20:09:44 +000098/* Normalize (remove leading zeros from) a long int object.
99 Doesn't attempt to free the storage--in most cases, due to the nature
100 of the algorithms used, this could save at most be one word anyway. */
101
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000103long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000104{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000105 Py_ssize_t j = ABS(Py_Size(v));
Martin v. Löwis18e16552006-02-15 17:27:45 +0000106 Py_ssize_t i = j;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000107
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000108 while (i > 0 && v->ob_digit[i-1] == 0)
109 --i;
110 if (i != j)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000111 Py_Size(v) = (Py_Size(v) < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000112 return v;
113}
114
115/* Allocate a new long int object with size digits.
116 Return NULL and set exception if we run out of memory. */
117
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118PyLongObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000119_PyLong_New(Py_ssize_t size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000120{
Guido van Rossumddefaf32007-01-14 03:31:43 +0000121 PyLongObject *result;
122 /* Can't use sizeof(PyLongObject) here, since the
123 compiler takes padding at the end into account.
124 As the consequence, this would waste 2 bytes on
125 a 32-bit system, and 6 bytes on a 64-bit system.
126 This computation would be incorrect on systems
127 which have padding before the digits; with 16-bit
128 digits this should not happen. */
129 result = PyObject_MALLOC(sizeof(PyVarObject) +
130 size*sizeof(digit));
131 if (!result) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000132 PyErr_NoMemory();
133 return NULL;
134 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000135 return (PyLongObject*)PyObject_INIT_VAR(result, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000136}
137
Tim Peters64b5ce32001-09-10 20:52:51 +0000138PyObject *
139_PyLong_Copy(PyLongObject *src)
140{
141 PyLongObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000142 Py_ssize_t i;
Tim Peters64b5ce32001-09-10 20:52:51 +0000143
144 assert(src != NULL);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000145 i = Py_Size(src);
Tim Peters64b5ce32001-09-10 20:52:51 +0000146 if (i < 0)
147 i = -(i);
Guido van Rossumddefaf32007-01-14 03:31:43 +0000148 if (i < 2) {
149 int ival = src->ob_digit[0];
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000150 if (Py_Size(src) < 0)
Guido van Rossumddefaf32007-01-14 03:31:43 +0000151 ival = -ival;
152 CHECK_SMALL_INT(ival);
153 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000154 result = _PyLong_New(i);
155 if (result != NULL) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000156 Py_Size(result) = Py_Size(src);
Tim Peters64b5ce32001-09-10 20:52:51 +0000157 while (--i >= 0)
158 result->ob_digit[i] = src->ob_digit[i];
159 }
160 return (PyObject *)result;
161}
162
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000163/* Create a new long int object from a C long int */
164
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000166PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000167{
Tim Petersce9de2f2001-06-14 04:56:19 +0000168 PyLongObject *v;
169 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
170 int ndigits = 0;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000171 int sign = 1;
172
173 CHECK_SMALL_INT(ival);
Tim Petersce9de2f2001-06-14 04:56:19 +0000174
175 if (ival < 0) {
176 ival = -ival;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000177 sign = -1;
Tim Petersce9de2f2001-06-14 04:56:19 +0000178 }
179
Guido van Rossumddefaf32007-01-14 03:31:43 +0000180 /* Fast path for single-digits ints */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000181 if (!(ival>>PyLong_SHIFT)) {
Guido van Rossumddefaf32007-01-14 03:31:43 +0000182 v = _PyLong_New(1);
183 if (v) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000184 Py_Size(v) = sign;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000185 v->ob_digit[0] = ival;
186 }
187 return (PyObject*)v;
188 }
189
190 /* 2 digits */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000191 if (!(ival >> 2*PyLong_SHIFT)) {
Guido van Rossumddefaf32007-01-14 03:31:43 +0000192 v = _PyLong_New(2);
193 if (v) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000194 Py_Size(v) = 2*sign;
195 v->ob_digit[0] = (digit)ival & PyLong_MASK;
196 v->ob_digit[1] = ival >> PyLong_SHIFT;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000197 }
198 return (PyObject*)v;
199 }
200
201 /* Larger numbers: loop to determine number of digits */
Tim Petersce9de2f2001-06-14 04:56:19 +0000202 t = (unsigned long)ival;
203 while (t) {
204 ++ndigits;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000205 t >>= PyLong_SHIFT;
Tim Petersce9de2f2001-06-14 04:56:19 +0000206 }
207 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000208 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000209 digit *p = v->ob_digit;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000210 Py_Size(v) = ndigits*sign;
Tim Petersce9de2f2001-06-14 04:56:19 +0000211 t = (unsigned long)ival;
212 while (t) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000213 *p++ = (digit)(t & PyLong_MASK);
214 t >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000215 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000216 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000218}
219
Guido van Rossum53756b11997-01-03 17:14:46 +0000220/* Create a new long int object from a C unsigned long int */
221
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000222PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000223PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000224{
Tim Petersce9de2f2001-06-14 04:56:19 +0000225 PyLongObject *v;
226 unsigned long t;
227 int ndigits = 0;
228
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000229 if (ival < PyLong_BASE)
Guido van Rossumddefaf32007-01-14 03:31:43 +0000230 return PyLong_FromLong(ival);
Tim Petersce9de2f2001-06-14 04:56:19 +0000231 /* Count the number of Python digits. */
232 t = (unsigned long)ival;
233 while (t) {
234 ++ndigits;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000235 t >>= PyLong_SHIFT;
Tim Petersce9de2f2001-06-14 04:56:19 +0000236 }
237 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000238 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000239 digit *p = v->ob_digit;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000240 Py_Size(v) = ndigits;
Tim Petersce9de2f2001-06-14 04:56:19 +0000241 while (ival) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000242 *p++ = (digit)(ival & PyLong_MASK);
243 ival >>= PyLong_SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000244 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000245 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000247}
248
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000249/* Create a new long int object from a C double */
250
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000251PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000252PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000253{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000255 double frac;
256 int i, ndig, expo, neg;
257 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000258 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000259 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumddefaf32007-01-14 03:31:43 +0000260 "cannot convert float infinity to int");
Guido van Rossum1a23c241999-09-27 17:11:52 +0000261 return NULL;
262 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000263 if (dval < 0.0) {
264 neg = 1;
265 dval = -dval;
266 }
267 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
268 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 return PyLong_FromLong(0L);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000270 ndig = (expo-1) / PyLong_SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000271 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000272 if (v == NULL)
273 return NULL;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000274 frac = ldexp(frac, (expo-1) % PyLong_SHIFT + 1);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000275 for (i = ndig; --i >= 0; ) {
276 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000277 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000278 frac = frac - (double)bits;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000279 frac = ldexp(frac, PyLong_SHIFT);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000280 }
281 if (neg)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000282 Py_Size(v) = -(Py_Size(v));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000283 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000284}
285
Thomas Wouters89f507f2006-12-13 04:49:30 +0000286/* Checking for overflow in PyLong_AsLong is a PITA since C doesn't define
287 * anything about what happens when a signed integer operation overflows,
288 * and some compilers think they're doing you a favor by being "clever"
289 * then. The bit pattern for the largest postive signed long is
290 * (unsigned long)LONG_MAX, and for the smallest negative signed long
291 * it is abs(LONG_MIN), which we could write -(unsigned long)LONG_MIN.
292 * However, some other compilers warn about applying unary minus to an
293 * unsigned operand. Hence the weird "0-".
294 */
295#define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN)
296#define PY_ABS_SSIZE_T_MIN (0-(size_t)PY_SSIZE_T_MIN)
297
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000298/* Get a C long int from a long int object.
299 Returns -1 and sets an error condition if overflow occurs. */
300
301long
Tim Peters9f688bf2000-07-07 15:53:28 +0000302PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000303{
Guido van Rossumf7531811998-05-26 14:33:37 +0000304 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000306 unsigned long x, prev;
Georg Brandl61c31b02007-02-26 14:46:30 +0000307 long res;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000308 Py_ssize_t i;
309 int sign;
Guido van Rossumddefaf32007-01-14 03:31:43 +0000310 int do_decref = 0; /* if nb_int was called */
Guido van Rossumf7531811998-05-26 14:33:37 +0000311
Guido van Rossumddefaf32007-01-14 03:31:43 +0000312 if (vv == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000313 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000314 return -1;
315 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000316
317 if (!PyLong_Check(vv)) {
318 PyNumberMethods *nb;
319 if ((nb = vv->ob_type->tp_as_number) == NULL ||
320 nb->nb_int == NULL) {
321 PyErr_SetString(PyExc_TypeError, "an integer is required");
322 return -1;
323 }
324 vv = (*nb->nb_int) (vv);
325 if (vv == NULL)
326 return -1;
327 do_decref = 1;
328 if (!PyLong_Check(vv)) {
329 Py_DECREF(vv);
330 PyErr_SetString(PyExc_TypeError,
331 "nb_int should return int object");
332 return -1;
333 }
334 }
335
Georg Brandl61c31b02007-02-26 14:46:30 +0000336 res = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 v = (PyLongObject *)vv;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000338 i = Py_Size(v);
Guido van Rossumf7531811998-05-26 14:33:37 +0000339
Georg Brandl61c31b02007-02-26 14:46:30 +0000340 switch (i) {
341 case -1:
342 res = -v->ob_digit[0];
343 break;
344 case 0:
345 res = 0;
346 break;
347 case 1:
348 res = v->ob_digit[0];
349 break;
350 default:
351 sign = 1;
352 x = 0;
353 if (i < 0) {
354 sign = -1;
355 i = -(i);
356 }
357 while (--i >= 0) {
358 prev = x;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000359 x = (x << PyLong_SHIFT) + v->ob_digit[i];
360 if ((x >> PyLong_SHIFT) != prev) {
Georg Brandl61c31b02007-02-26 14:46:30 +0000361 PyErr_SetString(PyExc_OverflowError,
362 "Python int too large to convert to C long");
363 goto exit;
364 }
365 }
366 /* Haven't lost any bits, but casting to long requires extra care
367 * (see comment above).
368 */
369 if (x <= (unsigned long)LONG_MAX) {
370 res = (long)x * sign;
371 }
372 else if (sign < 0 && x == PY_ABS_LONG_MIN) {
373 res = LONG_MIN;
374 }
375 else {
376 PyErr_SetString(PyExc_OverflowError,
377 "Python int too large to convert to C long");
378 }
379 }
380 exit:
Guido van Rossumddefaf32007-01-14 03:31:43 +0000381 if (do_decref) {
382 Py_DECREF(vv);
383 }
Georg Brandl61c31b02007-02-26 14:46:30 +0000384 return res;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000385}
386
Guido van Rossumddefaf32007-01-14 03:31:43 +0000387int
388_PyLong_FitsInLong(PyObject *vv)
389{
390 int size;
391 if (!PyLong_CheckExact(vv)) {
392 PyErr_BadInternalCall();
393 return 0;
394 }
395 /* conservative estimate */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000396 size = Py_Size(vv);
Guido van Rossumddefaf32007-01-14 03:31:43 +0000397 return -2 <= size && size <= 2;
398}
399
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000400/* Get a Py_ssize_t from a long int object.
401 Returns -1 and sets an error condition if overflow occurs. */
402
403Py_ssize_t
Guido van Rossumddefaf32007-01-14 03:31:43 +0000404PyLong_AsSsize_t(PyObject *vv) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000405 register PyLongObject *v;
406 size_t x, prev;
407 Py_ssize_t i;
408 int sign;
409
410 if (vv == NULL || !PyLong_Check(vv)) {
411 PyErr_BadInternalCall();
412 return -1;
413 }
414 v = (PyLongObject *)vv;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000415 i = Py_Size(v);
Guido van Rossumddefaf32007-01-14 03:31:43 +0000416 switch (i) {
417 case -1: return -v->ob_digit[0];
418 case 0: return 0;
419 case 1: return v->ob_digit[0];
420 }
Martin v. Löwis18e16552006-02-15 17:27:45 +0000421 sign = 1;
422 x = 0;
423 if (i < 0) {
424 sign = -1;
425 i = -(i);
426 }
427 while (--i >= 0) {
428 prev = x;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000429 x = (x << PyLong_SHIFT) + v->ob_digit[i];
430 if ((x >> PyLong_SHIFT) != prev)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000431 goto overflow;
432 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000433 /* Haven't lost any bits, but casting to a signed type requires
434 * extra care (see comment above).
Martin v. Löwis18e16552006-02-15 17:27:45 +0000435 */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000436 if (x <= (size_t)PY_SSIZE_T_MAX) {
437 return (Py_ssize_t)x * sign;
438 }
439 else if (sign < 0 && x == PY_ABS_SSIZE_T_MIN) {
440 return PY_SSIZE_T_MIN;
441 }
442 /* else overflow */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000443
444 overflow:
445 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum523d4f92007-01-15 00:31:49 +0000446 "Python int too large to convert to C ssize_t");
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000447 return -1;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000448}
449
Guido van Rossumd8c80482002-08-13 00:24:58 +0000450/* Get a C unsigned long int from a long int object.
Guido van Rossum53756b11997-01-03 17:14:46 +0000451 Returns -1 and sets an error condition if overflow occurs. */
452
453unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000454PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000455{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000457 unsigned long x, prev;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000458 Py_ssize_t i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000459
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 if (vv == NULL || !PyLong_Check(vv)) {
461 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000462 return (unsigned long) -1;
463 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 v = (PyLongObject *)vv;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000465 i = Py_Size(v);
Guido van Rossum53756b11997-01-03 17:14:46 +0000466 x = 0;
467 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumddefaf32007-01-14 03:31:43 +0000469 "can't convert negative value to unsigned int");
Guido van Rossum53756b11997-01-03 17:14:46 +0000470 return (unsigned long) -1;
471 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000472 switch (i) {
473 case 0: return 0;
474 case 1: return v->ob_digit[0];
475 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000476 while (--i >= 0) {
477 prev = x;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000478 x = (x << PyLong_SHIFT) + v->ob_digit[i];
479 if ((x >> PyLong_SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum523d4f92007-01-15 00:31:49 +0000481 "python int too large to convert to C unsigned long");
Guido van Rossumddefaf32007-01-14 03:31:43 +0000482 return (unsigned long) -1;
483 }
484 }
485 return x;
486}
487
488/* Get a C unsigned long int from a long int object.
489 Returns -1 and sets an error condition if overflow occurs. */
490
491size_t
492PyLong_AsSize_t(PyObject *vv)
493{
494 register PyLongObject *v;
495 size_t x, prev;
496 Py_ssize_t i;
497
498 if (vv == NULL || !PyLong_Check(vv)) {
499 PyErr_BadInternalCall();
500 return (unsigned long) -1;
501 }
502 v = (PyLongObject *)vv;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000503 i = Py_Size(v);
Guido van Rossumddefaf32007-01-14 03:31:43 +0000504 x = 0;
505 if (i < 0) {
506 PyErr_SetString(PyExc_OverflowError,
507 "can't convert negative value to size_t");
508 return (size_t) -1;
509 }
510 switch (i) {
511 case 0: return 0;
512 case 1: return v->ob_digit[0];
513 }
514 while (--i >= 0) {
515 prev = x;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000516 x = (x << PyLong_SHIFT) + v->ob_digit[i];
517 if ((x >> PyLong_SHIFT) != prev) {
Guido van Rossumddefaf32007-01-14 03:31:43 +0000518 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum523d4f92007-01-15 00:31:49 +0000519 "Python int too large to convert to C size_t");
Guido van Rossum53756b11997-01-03 17:14:46 +0000520 return (unsigned long) -1;
521 }
522 }
523 return x;
524}
525
Thomas Hellera4ea6032003-04-17 18:55:45 +0000526/* Get a C unsigned long int from a long int object, ignoring the high bits.
527 Returns -1 and sets an error condition if an error occurs. */
528
Guido van Rossumddefaf32007-01-14 03:31:43 +0000529static unsigned long
530_PyLong_AsUnsignedLongMask(PyObject *vv)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000531{
532 register PyLongObject *v;
533 unsigned long x;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000534 Py_ssize_t i;
535 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000536
537 if (vv == NULL || !PyLong_Check(vv)) {
538 PyErr_BadInternalCall();
539 return (unsigned long) -1;
540 }
541 v = (PyLongObject *)vv;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000542 i = Py_Size(v);
Guido van Rossumddefaf32007-01-14 03:31:43 +0000543 switch (i) {
544 case 0: return 0;
545 case 1: return v->ob_digit[0];
546 }
Thomas Hellera4ea6032003-04-17 18:55:45 +0000547 sign = 1;
548 x = 0;
549 if (i < 0) {
550 sign = -1;
551 i = -i;
552 }
553 while (--i >= 0) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000554 x = (x << PyLong_SHIFT) + v->ob_digit[i];
Thomas Hellera4ea6032003-04-17 18:55:45 +0000555 }
556 return x * sign;
557}
558
Guido van Rossumddefaf32007-01-14 03:31:43 +0000559unsigned long
560PyLong_AsUnsignedLongMask(register PyObject *op)
561{
562 PyNumberMethods *nb;
563 PyLongObject *lo;
564 unsigned long val;
565
566 if (op && PyLong_Check(op))
567 return _PyLong_AsUnsignedLongMask(op);
568
569 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
570 nb->nb_int == NULL) {
571 PyErr_SetString(PyExc_TypeError, "an integer is required");
572 return (unsigned long)-1;
573 }
574
575 lo = (PyLongObject*) (*nb->nb_int) (op);
576 if (lo == NULL)
577 return (unsigned long)-1;
578 if (PyLong_Check(lo)) {
579 val = _PyLong_AsUnsignedLongMask((PyObject *)lo);
580 Py_DECREF(lo);
581 if (PyErr_Occurred())
582 return (unsigned long)-1;
583 return val;
584 }
585 else
586 {
587 Py_DECREF(lo);
588 PyErr_SetString(PyExc_TypeError,
589 "nb_int should return int object");
590 return (unsigned long)-1;
591 }
592}
593
Tim Peters5b8132f2003-01-31 15:52:05 +0000594int
595_PyLong_Sign(PyObject *vv)
596{
597 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000598
599 assert(v != NULL);
600 assert(PyLong_Check(v));
Tim Peters5b8132f2003-01-31 15:52:05 +0000601
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000602 return Py_Size(v) == 0 ? 0 : (Py_Size(v) < 0 ? -1 : 1);
Tim Peters5b8132f2003-01-31 15:52:05 +0000603}
604
Tim Petersbaefd9e2003-01-28 20:37:45 +0000605size_t
606_PyLong_NumBits(PyObject *vv)
607{
608 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000609 size_t result = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000610 Py_ssize_t ndigits;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000611
612 assert(v != NULL);
613 assert(PyLong_Check(v));
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000614 ndigits = ABS(Py_Size(v));
Tim Petersbaefd9e2003-01-28 20:37:45 +0000615 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
616 if (ndigits > 0) {
Tim Petersbaefd9e2003-01-28 20:37:45 +0000617 digit msd = v->ob_digit[ndigits - 1];
618
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000619 result = (ndigits - 1) * PyLong_SHIFT;
620 if (result / PyLong_SHIFT != (size_t)(ndigits - 1))
Tim Petersbaefd9e2003-01-28 20:37:45 +0000621 goto Overflow;
622 do {
623 ++result;
624 if (result == 0)
625 goto Overflow;
626 msd >>= 1;
627 } while (msd);
628 }
629 return result;
630
631Overflow:
Guido van Rossumddefaf32007-01-14 03:31:43 +0000632 PyErr_SetString(PyExc_OverflowError, "int has too many bits "
Tim Petersbaefd9e2003-01-28 20:37:45 +0000633 "to express in a platform size_t");
634 return (size_t)-1;
635}
636
Tim Peters2a9b3672001-06-11 21:23:58 +0000637PyObject *
638_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
639 int little_endian, int is_signed)
640{
641 const unsigned char* pstartbyte;/* LSB of bytes */
642 int incr; /* direction to move pstartbyte */
643 const unsigned char* pendbyte; /* MSB of bytes */
644 size_t numsignificantbytes; /* number of bytes that matter */
645 size_t ndigits; /* number of Python long digits */
646 PyLongObject* v; /* result */
647 int idigit = 0; /* next free index in v->ob_digit */
648
649 if (n == 0)
650 return PyLong_FromLong(0L);
651
652 if (little_endian) {
653 pstartbyte = bytes;
654 pendbyte = bytes + n - 1;
655 incr = 1;
656 }
657 else {
658 pstartbyte = bytes + n - 1;
659 pendbyte = bytes;
660 incr = -1;
661 }
662
663 if (is_signed)
664 is_signed = *pendbyte >= 0x80;
665
666 /* Compute numsignificantbytes. This consists of finding the most
667 significant byte. Leading 0 bytes are insignficant if the number
668 is positive, and leading 0xff bytes if negative. */
669 {
670 size_t i;
671 const unsigned char* p = pendbyte;
672 const int pincr = -incr; /* search MSB to LSB */
673 const unsigned char insignficant = is_signed ? 0xff : 0x00;
674
675 for (i = 0; i < n; ++i, p += pincr) {
676 if (*p != insignficant)
677 break;
678 }
679 numsignificantbytes = n - i;
680 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
681 actually has 2 significant bytes. OTOH, 0xff0001 ==
682 -0x00ffff, so we wouldn't *need* to bump it there; but we
683 do for 0xffff = -0x0001. To be safe without bothering to
684 check every case, bump it regardless. */
685 if (is_signed && numsignificantbytes < n)
686 ++numsignificantbytes;
687 }
688
689 /* How many Python long digits do we need? We have
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000690 8*numsignificantbytes bits, and each Python long digit has PyLong_SHIFT
Tim Peters2a9b3672001-06-11 21:23:58 +0000691 bits, so it's the ceiling of the quotient. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000692 ndigits = (numsignificantbytes * 8 + PyLong_SHIFT - 1) / PyLong_SHIFT;
Tim Peters2a9b3672001-06-11 21:23:58 +0000693 if (ndigits > (size_t)INT_MAX)
694 return PyErr_NoMemory();
695 v = _PyLong_New((int)ndigits);
696 if (v == NULL)
697 return NULL;
698
699 /* Copy the bits over. The tricky parts are computing 2's-comp on
700 the fly for signed numbers, and dealing with the mismatch between
701 8-bit bytes and (probably) 15-bit Python digits.*/
702 {
703 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000704 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000705 twodigits accum = 0; /* sliding register */
706 unsigned int accumbits = 0; /* number of bits in accum */
707 const unsigned char* p = pstartbyte;
708
709 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000710 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000711 /* Compute correction for 2's comp, if needed. */
712 if (is_signed) {
713 thisbyte = (0xff ^ thisbyte) + carry;
714 carry = thisbyte >> 8;
715 thisbyte &= 0xff;
716 }
717 /* Because we're going LSB to MSB, thisbyte is
718 more significant than what's already in accum,
719 so needs to be prepended to accum. */
720 accum |= thisbyte << accumbits;
721 accumbits += 8;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000722 if (accumbits >= PyLong_SHIFT) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000723 /* There's enough to fill a Python digit. */
724 assert(idigit < (int)ndigits);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000725 v->ob_digit[idigit] = (digit)(accum & PyLong_MASK);
Tim Peters2a9b3672001-06-11 21:23:58 +0000726 ++idigit;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000727 accum >>= PyLong_SHIFT;
728 accumbits -= PyLong_SHIFT;
729 assert(accumbits < PyLong_SHIFT);
Tim Peters2a9b3672001-06-11 21:23:58 +0000730 }
731 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000732 assert(accumbits < PyLong_SHIFT);
Tim Peters2a9b3672001-06-11 21:23:58 +0000733 if (accumbits) {
734 assert(idigit < (int)ndigits);
735 v->ob_digit[idigit] = (digit)accum;
736 ++idigit;
737 }
738 }
739
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000740 Py_Size(v) = is_signed ? -idigit : idigit;
Tim Peters2a9b3672001-06-11 21:23:58 +0000741 return (PyObject *)long_normalize(v);
742}
743
744int
745_PyLong_AsByteArray(PyLongObject* v,
746 unsigned char* bytes, size_t n,
747 int little_endian, int is_signed)
748{
749 int i; /* index into v->ob_digit */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000750 Py_ssize_t ndigits; /* |v->ob_size| */
Tim Peters2a9b3672001-06-11 21:23:58 +0000751 twodigits accum; /* sliding register */
752 unsigned int accumbits; /* # bits in accum */
753 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
754 twodigits carry; /* for computing 2's-comp */
755 size_t j; /* # bytes filled */
756 unsigned char* p; /* pointer to next byte in bytes */
757 int pincr; /* direction to move p */
758
759 assert(v != NULL && PyLong_Check(v));
760
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000761 if (Py_Size(v) < 0) {
762 ndigits = -(Py_Size(v));
Tim Peters2a9b3672001-06-11 21:23:58 +0000763 if (!is_signed) {
764 PyErr_SetString(PyExc_TypeError,
Guido van Rossumddefaf32007-01-14 03:31:43 +0000765 "can't convert negative int to unsigned");
Tim Peters2a9b3672001-06-11 21:23:58 +0000766 return -1;
767 }
768 do_twos_comp = 1;
769 }
770 else {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000771 ndigits = Py_Size(v);
Tim Peters2a9b3672001-06-11 21:23:58 +0000772 do_twos_comp = 0;
773 }
774
775 if (little_endian) {
776 p = bytes;
777 pincr = 1;
778 }
779 else {
780 p = bytes + n - 1;
781 pincr = -1;
782 }
783
Tim Peters898cf852001-06-13 20:50:08 +0000784 /* Copy over all the Python digits.
785 It's crucial that every Python digit except for the MSD contribute
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000786 exactly PyLong_SHIFT bits to the total, so first assert that the long is
Tim Peters898cf852001-06-13 20:50:08 +0000787 normalized. */
788 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000789 j = 0;
790 accum = 0;
791 accumbits = 0;
792 carry = do_twos_comp ? 1 : 0;
793 for (i = 0; i < ndigits; ++i) {
794 twodigits thisdigit = v->ob_digit[i];
795 if (do_twos_comp) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000796 thisdigit = (thisdigit ^ PyLong_MASK) + carry;
797 carry = thisdigit >> PyLong_SHIFT;
798 thisdigit &= PyLong_MASK;
Tim Peters2a9b3672001-06-11 21:23:58 +0000799 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000800 /* Because we're going LSB to MSB, thisdigit is more
801 significant than what's already in accum, so needs to be
802 prepended to accum. */
803 accum |= thisdigit << accumbits;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000804 accumbits += PyLong_SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000805
Tim Petersede05092001-06-14 08:53:38 +0000806 /* The most-significant digit may be (probably is) at least
807 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000808 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000809 /* Count # of sign bits -- they needn't be stored,
810 * although for signed conversion we need later to
811 * make sure at least one sign bit gets stored.
812 * First shift conceptual sign bit to real sign bit.
813 */
814 stwodigits s = (stwodigits)(thisdigit <<
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000815 (8*sizeof(stwodigits) - PyLong_SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000816 unsigned int nsignbits = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000817 while ((s < 0) == do_twos_comp && nsignbits < PyLong_SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000818 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000819 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000820 }
Tim Petersede05092001-06-14 08:53:38 +0000821 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000822 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000823
Tim Peters2a9b3672001-06-11 21:23:58 +0000824 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000825 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000826 if (j >= n)
827 goto Overflow;
828 ++j;
829 *p = (unsigned char)(accum & 0xff);
830 p += pincr;
831 accumbits -= 8;
832 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000833 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000834 }
835
836 /* Store the straggler (if any). */
837 assert(accumbits < 8);
838 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000839 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000840 if (j >= n)
841 goto Overflow;
842 ++j;
843 if (do_twos_comp) {
844 /* Fill leading bits of the byte with sign bits
845 (appropriately pretending that the long had an
846 infinite supply of sign bits). */
847 accum |= (~(twodigits)0) << accumbits;
848 }
849 *p = (unsigned char)(accum & 0xff);
850 p += pincr;
851 }
Tim Peters05607ad2001-06-13 21:01:27 +0000852 else if (j == n && n > 0 && is_signed) {
853 /* The main loop filled the byte array exactly, so the code
854 just above didn't get to ensure there's a sign bit, and the
855 loop below wouldn't add one either. Make sure a sign bit
856 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000857 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000858 int sign_bit_set = msb >= 0x80;
859 assert(accumbits == 0);
860 if (sign_bit_set == do_twos_comp)
861 return 0;
862 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000863 goto Overflow;
864 }
Tim Peters05607ad2001-06-13 21:01:27 +0000865
866 /* Fill remaining bytes with copies of the sign bit. */
867 {
868 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
869 for ( ; j < n; ++j, p += pincr)
870 *p = signbyte;
871 }
872
Tim Peters2a9b3672001-06-11 21:23:58 +0000873 return 0;
874
875Overflow:
Guido van Rossumddefaf32007-01-14 03:31:43 +0000876 PyErr_SetString(PyExc_OverflowError, "int too big to convert");
Tim Peters2a9b3672001-06-11 21:23:58 +0000877 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000878
Tim Peters2a9b3672001-06-11 21:23:58 +0000879}
880
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000881double
882_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
883{
884/* NBITS_WANTED should be > the number of bits in a double's precision,
885 but small enough so that 2**NBITS_WANTED is within the normal double
886 range. nbitsneeded is set to 1 less than that because the most-significant
887 Python digit contains at least 1 significant bit, but we don't want to
888 bother counting them (catering to the worst case cheaply).
889
890 57 is one more than VAX-D double precision; I (Tim) don't know of a double
891 format with more precision than that; it's 1 larger so that we add in at
892 least one round bit to stand in for the ignored least-significant bits.
893*/
894#define NBITS_WANTED 57
895 PyLongObject *v;
896 double x;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000897 const double multiplier = (double)(1L << PyLong_SHIFT);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000898 Py_ssize_t i;
899 int sign;
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000900 int nbitsneeded;
901
902 if (vv == NULL || !PyLong_Check(vv)) {
903 PyErr_BadInternalCall();
904 return -1;
905 }
906 v = (PyLongObject *)vv;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000907 i = Py_Size(v);
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000908 sign = 1;
909 if (i < 0) {
910 sign = -1;
911 i = -(i);
912 }
913 else if (i == 0) {
914 *exponent = 0;
915 return 0.0;
916 }
917 --i;
918 x = (double)v->ob_digit[i];
919 nbitsneeded = NBITS_WANTED - 1;
920 /* Invariant: i Python digits remain unaccounted for. */
921 while (i > 0 && nbitsneeded > 0) {
922 --i;
923 x = x * multiplier + (double)v->ob_digit[i];
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000924 nbitsneeded -= PyLong_SHIFT;
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000925 }
926 /* There are i digits we didn't shift in. Pretending they're all
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000927 zeroes, the true value is x * 2**(i*PyLong_SHIFT). */
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000928 *exponent = i;
929 assert(x > 0.0);
930 return x * sign;
931#undef NBITS_WANTED
932}
933
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000934/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000935
936double
Tim Peters9f688bf2000-07-07 15:53:28 +0000937PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000938{
Thomas Wouters553489a2006-02-01 21:32:04 +0000939 int e = -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000940 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000941
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942 if (vv == NULL || !PyLong_Check(vv)) {
943 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000944 return -1;
945 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000946 x = _PyLong_AsScaledDouble(vv, &e);
947 if (x == -1.0 && PyErr_Occurred())
948 return -1.0;
Thomas Wouters553489a2006-02-01 21:32:04 +0000949 /* 'e' initialized to -1 to silence gcc-4.0.x, but it should be
950 set correctly after a successful _PyLong_AsScaledDouble() call */
951 assert(e >= 0);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000952 if (e > INT_MAX / PyLong_SHIFT)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000953 goto overflow;
954 errno = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000955 x = ldexp(x, e * PyLong_SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000956 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000957 goto overflow;
958 return x;
959
960overflow:
961 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum523d4f92007-01-15 00:31:49 +0000962 "Python int too large to convert to C double");
Tim Peters9fffa3e2001-09-04 05:14:19 +0000963 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000964}
965
Guido van Rossum78694d91998-09-18 14:14:13 +0000966/* Create a new long (or int) object from a C pointer */
967
968PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000969PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000970{
Tim Peters70128a12001-06-16 08:48:40 +0000971#ifndef HAVE_LONG_LONG
972# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
973#endif
974#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000975# error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000976#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +0000977 /* special-case null pointer */
978 if (!p)
Tim Peters70128a12001-06-16 08:48:40 +0000979 return PyInt_FromLong(0);
Guido van Rossumddefaf32007-01-14 03:31:43 +0000980 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)(Py_uintptr_t)p);
Tim Peters70128a12001-06-16 08:48:40 +0000981
Guido van Rossum78694d91998-09-18 14:14:13 +0000982}
983
984/* Get a C pointer from a long object (or an int object in some cases) */
985
986void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000987PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000988{
989 /* This function will allow int or long objects. If vv is neither,
990 then the PyLong_AsLong*() functions will raise the exception:
991 PyExc_SystemError, "bad argument to internal function"
992 */
Tim Peters70128a12001-06-16 08:48:40 +0000993#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000994 long x;
995
Guido van Rossumddefaf32007-01-14 03:31:43 +0000996 if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
Guido van Rossum78694d91998-09-18 14:14:13 +0000997 x = PyLong_AsLong(vv);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000998 else
999 x = PyLong_AsUnsignedLong(vv);
Guido van Rossum78694d91998-09-18 14:14:13 +00001000#else
Tim Peters70128a12001-06-16 08:48:40 +00001001
1002#ifndef HAVE_LONG_LONG
1003# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
1004#endif
1005#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001006# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +00001007#endif
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001008 PY_LONG_LONG x;
Guido van Rossum78694d91998-09-18 14:14:13 +00001009
Guido van Rossumddefaf32007-01-14 03:31:43 +00001010 if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
Guido van Rossum78694d91998-09-18 14:14:13 +00001011 x = PyLong_AsLongLong(vv);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001012 else
1013 x = PyLong_AsUnsignedLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +00001014
1015#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +00001016
1017 if (x == -1 && PyErr_Occurred())
1018 return NULL;
1019 return (void *)x;
1020}
1021
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001022#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +00001023
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001024/* Initial PY_LONG_LONG support by Chris Herborth (chrish@qnx.com), later
Tim Petersd1a7da62001-06-13 00:35:57 +00001025 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001026 */
1027
Tim Peterscf37dfc2001-06-14 18:42:50 +00001028#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +00001029
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001030/* Create a new long int object from a C PY_LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001031
1032PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001033PyLong_FromLongLong(PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001034{
Thomas Wouters477c8d52006-05-27 19:21:47 +00001035 PyLongObject *v;
1036 unsigned PY_LONG_LONG t; /* unsigned so >> doesn't propagate sign bit */
1037 int ndigits = 0;
1038 int negative = 0;
1039
Guido van Rossumddefaf32007-01-14 03:31:43 +00001040 CHECK_SMALL_INT(ival);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001041 if (ival < 0) {
1042 ival = -ival;
1043 negative = 1;
1044 }
1045
1046 /* Count the number of Python digits.
1047 We used to pick 5 ("big enough for anything"), but that's a
1048 waste of time and space given that 5*15 = 75 bits are rarely
1049 needed. */
1050 t = (unsigned PY_LONG_LONG)ival;
1051 while (t) {
1052 ++ndigits;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001053 t >>= PyLong_SHIFT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001054 }
1055 v = _PyLong_New(ndigits);
1056 if (v != NULL) {
1057 digit *p = v->ob_digit;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001058 Py_Size(v) = negative ? -ndigits : ndigits;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001059 t = (unsigned PY_LONG_LONG)ival;
1060 while (t) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001061 *p++ = (digit)(t & PyLong_MASK);
1062 t >>= PyLong_SHIFT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001063 }
1064 }
1065 return (PyObject *)v;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001066}
1067
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001068/* Create a new long int object from a C unsigned PY_LONG_LONG int. */
Tim Petersd1a7da62001-06-13 00:35:57 +00001069
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001070PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001071PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001072{
Thomas Wouters477c8d52006-05-27 19:21:47 +00001073 PyLongObject *v;
1074 unsigned PY_LONG_LONG t;
1075 int ndigits = 0;
1076
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001077 if (ival < PyLong_BASE)
Guido van Rossumddefaf32007-01-14 03:31:43 +00001078 return PyLong_FromLong(ival);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001079 /* Count the number of Python digits. */
1080 t = (unsigned PY_LONG_LONG)ival;
1081 while (t) {
1082 ++ndigits;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001083 t >>= PyLong_SHIFT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001084 }
1085 v = _PyLong_New(ndigits);
1086 if (v != NULL) {
1087 digit *p = v->ob_digit;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001088 Py_Size(v) = ndigits;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001089 while (ival) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001090 *p++ = (digit)(ival & PyLong_MASK);
1091 ival >>= PyLong_SHIFT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001092 }
1093 }
1094 return (PyObject *)v;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001095}
1096
Martin v. Löwis18e16552006-02-15 17:27:45 +00001097/* Create a new long int object from a C Py_ssize_t. */
1098
1099PyObject *
Guido van Rossumddefaf32007-01-14 03:31:43 +00001100PyLong_FromSsize_t(Py_ssize_t ival)
Martin v. Löwis18e16552006-02-15 17:27:45 +00001101{
1102 Py_ssize_t bytes = ival;
1103 int one = 1;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001104 if (ival < PyLong_BASE)
Guido van Rossumddefaf32007-01-14 03:31:43 +00001105 return PyLong_FromLong(ival);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001106 return _PyLong_FromByteArray(
1107 (unsigned char *)&bytes,
Guido van Rossumddefaf32007-01-14 03:31:43 +00001108 SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 1);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001109}
1110
1111/* Create a new long int object from a C size_t. */
1112
1113PyObject *
Guido van Rossumddefaf32007-01-14 03:31:43 +00001114PyLong_FromSize_t(size_t ival)
Martin v. Löwis18e16552006-02-15 17:27:45 +00001115{
1116 size_t bytes = ival;
1117 int one = 1;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001118 if (ival < PyLong_BASE)
Guido van Rossumddefaf32007-01-14 03:31:43 +00001119 return PyLong_FromLong(ival);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001120 return _PyLong_FromByteArray(
1121 (unsigned char *)&bytes,
1122 SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0);
1123}
1124
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001125/* Get a C PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +00001126 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001127
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001128PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +00001129PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001130{
Guido van Rossumddefaf32007-01-14 03:31:43 +00001131 PyLongObject *v;
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001132 PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +00001133 int one = 1;
1134 int res;
1135
Tim Petersd38b1c72001-09-30 05:09:37 +00001136 if (vv == NULL) {
1137 PyErr_BadInternalCall();
1138 return -1;
1139 }
1140 if (!PyLong_Check(vv)) {
Martin v. Löwis6ce7ed22005-03-03 12:26:35 +00001141 PyNumberMethods *nb;
1142 PyObject *io;
Martin v. Löwis6ce7ed22005-03-03 12:26:35 +00001143 if ((nb = vv->ob_type->tp_as_number) == NULL ||
1144 nb->nb_int == NULL) {
1145 PyErr_SetString(PyExc_TypeError, "an integer is required");
1146 return -1;
1147 }
1148 io = (*nb->nb_int) (vv);
1149 if (io == NULL)
1150 return -1;
Martin v. Löwis6ce7ed22005-03-03 12:26:35 +00001151 if (PyLong_Check(io)) {
1152 bytes = PyLong_AsLongLong(io);
1153 Py_DECREF(io);
1154 return bytes;
1155 }
1156 Py_DECREF(io);
1157 PyErr_SetString(PyExc_TypeError, "integer conversion failed");
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001158 return -1;
1159 }
1160
Guido van Rossumddefaf32007-01-14 03:31:43 +00001161 v = (PyLongObject*)vv;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001162 switch(Py_Size(v)) {
Guido van Rossumddefaf32007-01-14 03:31:43 +00001163 case -1: return -v->ob_digit[0];
1164 case 0: return 0;
1165 case 1: return v->ob_digit[0];
1166 }
Tim Petersd1a7da62001-06-13 00:35:57 +00001167 res = _PyLong_AsByteArray(
1168 (PyLongObject *)vv, (unsigned char *)&bytes,
1169 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001170
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001171 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +00001172 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001173 return (PY_LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +00001174 else
1175 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001176}
1177
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001178/* Get a C unsigned PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +00001179 Return -1 and set an error if overflow occurs. */
1180
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001181unsigned PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +00001182PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001183{
Guido van Rossumddefaf32007-01-14 03:31:43 +00001184 PyLongObject *v;
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001185 unsigned PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +00001186 int one = 1;
1187 int res;
1188
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001189 if (vv == NULL || !PyLong_Check(vv)) {
1190 PyErr_BadInternalCall();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001191 return (unsigned PY_LONG_LONG)-1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001192 }
1193
Guido van Rossumddefaf32007-01-14 03:31:43 +00001194 v = (PyLongObject*)vv;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001195 switch(Py_Size(v)) {
Guido van Rossumddefaf32007-01-14 03:31:43 +00001196 case 0: return 0;
1197 case 1: return v->ob_digit[0];
1198 }
1199
Tim Petersd1a7da62001-06-13 00:35:57 +00001200 res = _PyLong_AsByteArray(
1201 (PyLongObject *)vv, (unsigned char *)&bytes,
1202 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001203
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001204 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +00001205 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001206 return (unsigned PY_LONG_LONG)res;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +00001207 else
1208 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001209}
Tim Petersd1a7da62001-06-13 00:35:57 +00001210
Thomas Hellera4ea6032003-04-17 18:55:45 +00001211/* Get a C unsigned long int from a long int object, ignoring the high bits.
1212 Returns -1 and sets an error condition if an error occurs. */
1213
Guido van Rossumddefaf32007-01-14 03:31:43 +00001214static unsigned PY_LONG_LONG
1215_PyLong_AsUnsignedLongLongMask(PyObject *vv)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001216{
1217 register PyLongObject *v;
1218 unsigned PY_LONG_LONG x;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001219 Py_ssize_t i;
1220 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001221
1222 if (vv == NULL || !PyLong_Check(vv)) {
1223 PyErr_BadInternalCall();
1224 return (unsigned long) -1;
1225 }
1226 v = (PyLongObject *)vv;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001227 switch(Py_Size(v)) {
Guido van Rossumddefaf32007-01-14 03:31:43 +00001228 case 0: return 0;
1229 case 1: return v->ob_digit[0];
1230 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001231 i = Py_Size(v);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001232 sign = 1;
1233 x = 0;
1234 if (i < 0) {
1235 sign = -1;
1236 i = -i;
1237 }
1238 while (--i >= 0) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001239 x = (x << PyLong_SHIFT) + v->ob_digit[i];
Thomas Hellera4ea6032003-04-17 18:55:45 +00001240 }
1241 return x * sign;
1242}
Guido van Rossumddefaf32007-01-14 03:31:43 +00001243
1244unsigned PY_LONG_LONG
1245PyLong_AsUnsignedLongLongMask(register PyObject *op)
1246{
1247 PyNumberMethods *nb;
1248 PyLongObject *lo;
1249 unsigned PY_LONG_LONG val;
1250
1251 if (op && PyLong_Check(op))
1252 return _PyLong_AsUnsignedLongLongMask(op);
1253
1254 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
1255 nb->nb_int == NULL) {
1256 PyErr_SetString(PyExc_TypeError, "an integer is required");
1257 return (unsigned PY_LONG_LONG)-1;
1258 }
1259
1260 lo = (PyLongObject*) (*nb->nb_int) (op);
1261 if (lo == NULL)
1262 return (unsigned PY_LONG_LONG)-1;
1263 if (PyLong_Check(lo)) {
1264 val = _PyLong_AsUnsignedLongLongMask((PyObject *)lo);
1265 Py_DECREF(lo);
1266 if (PyErr_Occurred())
1267 return (unsigned PY_LONG_LONG)-1;
1268 return val;
1269 }
1270 else
1271 {
1272 Py_DECREF(lo);
1273 PyErr_SetString(PyExc_TypeError,
1274 "nb_int should return int object");
1275 return (unsigned PY_LONG_LONG)-1;
1276 }
1277}
Tim Petersd1a7da62001-06-13 00:35:57 +00001278#undef IS_LITTLE_ENDIAN
1279
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001280#endif /* HAVE_LONG_LONG */
1281
Neil Schemenauerba872e22001-01-04 01:46:03 +00001282
1283static int
1284convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001285 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001286 *a = (PyLongObject *) v;
1287 Py_INCREF(v);
1288 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001289 else {
1290 return 0;
1291 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001292 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001293 *b = (PyLongObject *) w;
1294 Py_INCREF(w);
1295 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001296 else {
1297 Py_DECREF(*a);
1298 return 0;
1299 }
1300 return 1;
1301}
1302
1303#define CONVERT_BINOP(v, w, a, b) \
1304 if (!convert_binop(v, w, a, b)) { \
1305 Py_INCREF(Py_NotImplemented); \
1306 return Py_NotImplemented; \
1307 }
1308
Tim Peters877a2122002-08-12 05:09:36 +00001309/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
1310 * is modified in place, by adding y to it. Carries are propagated as far as
1311 * x[m-1], and the remaining carry (0 or 1) is returned.
1312 */
1313static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001314v_iadd(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
Tim Peters877a2122002-08-12 05:09:36 +00001315{
1316 int i;
1317 digit carry = 0;
1318
1319 assert(m >= n);
1320 for (i = 0; i < n; ++i) {
1321 carry += x[i] + y[i];
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001322 x[i] = carry & PyLong_MASK;
1323 carry >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001324 assert((carry & 1) == carry);
1325 }
1326 for (; carry && i < m; ++i) {
1327 carry += x[i];
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001328 x[i] = carry & PyLong_MASK;
1329 carry >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001330 assert((carry & 1) == carry);
1331 }
1332 return carry;
1333}
1334
1335/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
1336 * is modified in place, by subtracting y from it. Borrows are propagated as
1337 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
1338 */
1339static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001340v_isub(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
Tim Peters877a2122002-08-12 05:09:36 +00001341{
1342 int i;
1343 digit borrow = 0;
1344
1345 assert(m >= n);
1346 for (i = 0; i < n; ++i) {
1347 borrow = x[i] - y[i] - borrow;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001348 x[i] = borrow & PyLong_MASK;
1349 borrow >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001350 borrow &= 1; /* keep only 1 sign bit */
1351 }
1352 for (; borrow && i < m; ++i) {
1353 borrow = x[i] - borrow;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001354 x[i] = borrow & PyLong_MASK;
1355 borrow >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001356 borrow &= 1;
1357 }
1358 return borrow;
1359}
Neil Schemenauerba872e22001-01-04 01:46:03 +00001360
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001361/* Multiply by a single digit, ignoring the sign. */
1362
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001363static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001364mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001365{
1366 return muladd1(a, n, (digit)0);
1367}
1368
1369/* Multiply by a single digit and add a single digit, ignoring the sign. */
1370
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001371static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001372muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001373{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001374 Py_ssize_t size_a = ABS(Py_Size(a));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001375 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001376 twodigits carry = extra;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001377 Py_ssize_t i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001378
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001379 if (z == NULL)
1380 return NULL;
1381 for (i = 0; i < size_a; ++i) {
1382 carry += (twodigits)a->ob_digit[i] * n;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001383 z->ob_digit[i] = (digit) (carry & PyLong_MASK);
1384 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001385 }
Guido van Rossum2095d241997-04-09 19:41:24 +00001386 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001387 return long_normalize(z);
1388}
1389
Tim Peters212e6142001-07-14 12:23:19 +00001390/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
1391 in pout, and returning the remainder. pin and pout point at the LSD.
1392 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001393 _PyLong_Format, but that should be done with great care since longs are
Tim Peters212e6142001-07-14 12:23:19 +00001394 immutable. */
1395
1396static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001397inplace_divrem1(digit *pout, digit *pin, Py_ssize_t size, digit n)
Tim Peters212e6142001-07-14 12:23:19 +00001398{
1399 twodigits rem = 0;
1400
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001401 assert(n > 0 && n <= PyLong_MASK);
Tim Peters212e6142001-07-14 12:23:19 +00001402 pin += size;
1403 pout += size;
1404 while (--size >= 0) {
1405 digit hi;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001406 rem = (rem << PyLong_SHIFT) + *--pin;
Tim Peters212e6142001-07-14 12:23:19 +00001407 *--pout = hi = (digit)(rem / n);
1408 rem -= hi * n;
1409 }
1410 return (digit)rem;
1411}
1412
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001413/* Divide a long integer by a digit, returning both the quotient
1414 (as function result) and the remainder (through *prem).
1415 The sign of a is ignored; n should not be zero. */
1416
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +00001418divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001419{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001420 const Py_ssize_t size = ABS(Py_Size(a));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001422
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001423 assert(n > 0 && n <= PyLong_MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001424 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001425 if (z == NULL)
1426 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +00001427 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001428 return long_normalize(z);
1429}
1430
1431/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001432 Return a string object.
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001433 If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001434
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001435PyObject *
1436_PyLong_Format(PyObject *aa, int base)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001437{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 register PyLongObject *a = (PyLongObject *)aa;
Walter Dörwald1ab83302007-05-18 17:15:44 +00001439 PyObject *str;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001440 Py_ssize_t i, j, sz;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001441 Py_ssize_t size_a;
Walter Dörwald1ab83302007-05-18 17:15:44 +00001442 Py_UNICODE *p;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001443 int bits;
1444 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +00001445
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 if (a == NULL || !PyLong_Check(a)) {
1447 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +00001448 return NULL;
1449 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001450 assert(base >= 2 && base <= 36);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001451 size_a = ABS(Py_Size(a));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001452
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001453 /* Compute a rough upper bound for the length of the string */
1454 i = base;
1455 bits = 0;
1456 while (i > 1) {
1457 ++bits;
1458 i >>= 1;
1459 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001460 i = 5;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001461 j = size_a*PyLong_SHIFT + bits-1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001462 sz = i + j / bits;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001463 if (j / PyLong_SHIFT < size_a || sz < i) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001464 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumddefaf32007-01-14 03:31:43 +00001465 "int is too large to format");
Thomas Wouters89f507f2006-12-13 04:49:30 +00001466 return NULL;
1467 }
Walter Dörwald1ab83302007-05-18 17:15:44 +00001468 str = PyUnicode_FromUnicode(NULL, sz);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001469 if (str == NULL)
1470 return NULL;
Walter Dörwald1ab83302007-05-18 17:15:44 +00001471 p = PyUnicode_AS_UNICODE(str) + sz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001472 *p = '\0';
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001473 if (Py_Size(a) < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001474 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +00001475
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001476 if (Py_Size(a) == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001477 *--p = '0';
1478 }
1479 else if ((base & (base - 1)) == 0) {
1480 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +00001481 twodigits accum = 0;
1482 int accumbits = 0; /* # of bits in accum */
1483 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001484 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +00001485 while ((i >>= 1) > 1)
1486 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +00001487
1488 for (i = 0; i < size_a; ++i) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00001489 accum |= (twodigits)a->ob_digit[i] << accumbits;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001490 accumbits += PyLong_SHIFT;
Tim Peters586b2e32001-07-15 09:11:14 +00001491 assert(accumbits >= basebits);
1492 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001493 char cdigit = (char)(accum & (base - 1));
Raymond Hettinger3296e692005-06-29 23:29:56 +00001494 cdigit += (cdigit < 10) ? '0' : 'a'-10;
Walter Dörwald1ab83302007-05-18 17:15:44 +00001495 assert(p > PyUnicode_AS_UNICODE(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001496 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +00001497 accumbits -= basebits;
1498 accum >>= basebits;
1499 } while (i < size_a-1 ? accumbits >= basebits :
1500 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001501 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001502 }
1503 else {
Tim Petersfad225f2001-07-13 02:59:26 +00001504 /* Not 0, and base not a power of 2. Divide repeatedly by
1505 base, but for speed use the highest power of base that
1506 fits in a digit. */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001507 Py_ssize_t size = size_a;
Tim Peters212e6142001-07-14 12:23:19 +00001508 digit *pin = a->ob_digit;
1509 PyLongObject *scratch;
1510 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +00001511 digit powbase = base; /* powbase == base ** power */
1512 int power = 1;
1513 for (;;) {
1514 unsigned long newpow = powbase * (unsigned long)base;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001515 if (newpow >> PyLong_SHIFT) /* doesn't fit in a digit */
Tim Petersfad225f2001-07-13 02:59:26 +00001516 break;
1517 powbase = (digit)newpow;
1518 ++power;
1519 }
Tim Peters212e6142001-07-14 12:23:19 +00001520
1521 /* Get a scratch area for repeated division. */
1522 scratch = _PyLong_New(size);
1523 if (scratch == NULL) {
1524 Py_DECREF(str);
1525 return NULL;
1526 }
1527
1528 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001529 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001530 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +00001531 digit rem = inplace_divrem1(scratch->ob_digit,
1532 pin, size, powbase);
1533 pin = scratch->ob_digit; /* no need to use a again */
1534 if (pin[size - 1] == 0)
1535 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001536 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +00001537 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001538 Py_DECREF(str);
1539 return NULL;
1540 })
Tim Peters212e6142001-07-14 12:23:19 +00001541
1542 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001543 assert(ntostore > 0);
1544 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001545 digit nextrem = (digit)(rem / base);
1546 char c = (char)(rem - nextrem * base);
Walter Dörwald1ab83302007-05-18 17:15:44 +00001547 assert(p > PyUnicode_AS_UNICODE(str));
Raymond Hettinger3296e692005-06-29 23:29:56 +00001548 c += (c < 10) ? '0' : 'a'-10;
Tim Petersfad225f2001-07-13 02:59:26 +00001549 *--p = c;
1550 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001551 --ntostore;
1552 /* Termination is a bit delicate: must not
1553 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001554 remaining quotient and rem are both 0. */
1555 } while (ntostore && (size || rem));
1556 } while (size != 0);
1557 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001558 }
1559
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001560 if (base == 16) {
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001561 *--p = 'x';
1562 *--p = '0';
1563 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001564 else if (base == 8) {
1565 *--p = 'o';
1566 *--p = '0';
1567 }
1568 else if (base == 2) {
1569 *--p = 'b';
1570 *--p = '0';
1571 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001572 else if (base != 10) {
1573 *--p = '#';
1574 *--p = '0' + base%10;
1575 if (base > 10)
1576 *--p = '0' + base/10;
1577 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001578 if (sign)
1579 *--p = sign;
Walter Dörwald1ab83302007-05-18 17:15:44 +00001580 if (p != PyUnicode_AS_UNICODE(str)) {
1581 Py_UNICODE *q = PyUnicode_AS_UNICODE(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001582 assert(p > q);
1583 do {
1584 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001585 q--;
Walter Dörwald1ab83302007-05-18 17:15:44 +00001586 if (PyUnicode_Resize(&str, (Py_ssize_t) (q - PyUnicode_AS_UNICODE(str)))) {
1587 Py_DECREF(str);
1588 return NULL;
1589 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001590 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001591 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001592}
1593
Thomas Wouters477c8d52006-05-27 19:21:47 +00001594/* Table of digit values for 8-bit string -> integer conversion.
1595 * '0' maps to 0, ..., '9' maps to 9.
1596 * 'a' and 'A' map to 10, ..., 'z' and 'Z' map to 35.
1597 * All other indices map to 37.
1598 * Note that when converting a base B string, a char c is a legitimate
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001599 * base B digit iff _PyLong_DigitValue[Py_CHARPyLong_MASK(c)] < B.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001600 */
1601int _PyLong_DigitValue[256] = {
1602 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1603 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1604 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1605 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 37, 37, 37, 37, 37, 37,
1606 37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1607 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
1608 37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1609 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
1610 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1611 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1612 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1613 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1614 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1615 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1616 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1617 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1618};
1619
1620/* *str points to the first digit in a string of base `base` digits. base
Tim Petersbf2674b2003-02-02 07:51:32 +00001621 * is a power of 2 (2, 4, 8, 16, or 32). *str is set to point to the first
1622 * non-digit (which may be *str!). A normalized long is returned.
1623 * The point to this routine is that it takes time linear in the number of
1624 * string characters.
1625 */
1626static PyLongObject *
1627long_from_binary_base(char **str, int base)
1628{
1629 char *p = *str;
1630 char *start = p;
1631 int bits_per_char;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001632 Py_ssize_t n;
Tim Petersbf2674b2003-02-02 07:51:32 +00001633 PyLongObject *z;
1634 twodigits accum;
1635 int bits_in_accum;
1636 digit *pdigit;
1637
1638 assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
1639 n = base;
1640 for (bits_per_char = -1; n; ++bits_per_char)
1641 n >>= 1;
1642 /* n <- total # of bits needed, while setting p to end-of-string */
1643 n = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001644 while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base)
Tim Petersbf2674b2003-02-02 07:51:32 +00001645 ++p;
Tim Petersbf2674b2003-02-02 07:51:32 +00001646 *str = p;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001647 /* n <- # of Python digits needed, = ceiling(n/PyLong_SHIFT). */
1648 n = (p - start) * bits_per_char + PyLong_SHIFT - 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001649 if (n / bits_per_char < p - start) {
Tim Peters1a3b19a2003-02-02 17:33:53 +00001650 PyErr_SetString(PyExc_ValueError,
Guido van Rossumddefaf32007-01-14 03:31:43 +00001651 "int string too large to convert");
Tim Peters1a3b19a2003-02-02 17:33:53 +00001652 return NULL;
1653 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001654 n = n / PyLong_SHIFT;
Tim Petersbf2674b2003-02-02 07:51:32 +00001655 z = _PyLong_New(n);
1656 if (z == NULL)
1657 return NULL;
1658 /* Read string from right, and fill in long from left; i.e.,
1659 * from least to most significant in both.
1660 */
1661 accum = 0;
1662 bits_in_accum = 0;
1663 pdigit = z->ob_digit;
1664 while (--p >= start) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001665 int k = _PyLong_DigitValue[Py_CHARMASK(*p)];
Tim Petersc7bc0b92003-05-05 20:39:43 +00001666 assert(k >= 0 && k < base);
1667 accum |= (twodigits)(k << bits_in_accum);
Tim Petersbf2674b2003-02-02 07:51:32 +00001668 bits_in_accum += bits_per_char;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001669 if (bits_in_accum >= PyLong_SHIFT) {
1670 *pdigit++ = (digit)(accum & PyLong_MASK);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001671 assert(pdigit - z->ob_digit <= (int)n);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001672 accum >>= PyLong_SHIFT;
1673 bits_in_accum -= PyLong_SHIFT;
1674 assert(bits_in_accum < PyLong_SHIFT);
Tim Petersbf2674b2003-02-02 07:51:32 +00001675 }
1676 }
1677 if (bits_in_accum) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001678 assert(bits_in_accum <= PyLong_SHIFT);
Tim Petersbf2674b2003-02-02 07:51:32 +00001679 *pdigit++ = (digit)accum;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001680 assert(pdigit - z->ob_digit <= (int)n);
Tim Petersbf2674b2003-02-02 07:51:32 +00001681 }
1682 while (pdigit - z->ob_digit < n)
1683 *pdigit++ = 0;
1684 return long_normalize(z);
1685}
1686
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001687PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001688PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001689{
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001690 int sign = 1, error_if_nonzero = 0;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001691 char *start, *orig_str = str;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001692 PyLongObject *z = NULL;
Guido van Rossum25236212007-08-22 23:28:23 +00001693 PyObject *strobj;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001694 Py_ssize_t slen;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001695
Guido van Rossum472c04f1996-12-05 21:57:21 +00001696 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001697 PyErr_SetString(PyExc_ValueError,
Guido van Rossumddefaf32007-01-14 03:31:43 +00001698 "int() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001699 return NULL;
1700 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001701 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001702 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001703 if (*str == '+')
1704 ++str;
1705 else if (*str == '-') {
1706 ++str;
1707 sign = -1;
1708 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001709 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001710 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001711 if (base == 0) {
1712 if (str[0] != '0')
1713 base = 10;
1714 else if (str[1] == 'x' || str[1] == 'X')
1715 base = 16;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001716 else if (str[1] == 'o' || str[1] == 'O')
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001717 base = 8;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001718 else if (str[1] == 'b' || str[1] == 'B')
1719 base = 2;
1720 else {
1721 /* "old" (C-style) octal literal, now invalid.
1722 it might still be zero though */
1723 error_if_nonzero = 1;
1724 base = 10;
1725 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001726 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001727 if (str[0] == '0' &&
1728 ((base == 16 && (str[1] == 'x' || str[1] == 'X')) ||
1729 (base == 8 && (str[1] == 'o' || str[1] == 'O')) ||
1730 (base == 2 && (str[1] == 'b' || str[1] == 'B'))))
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001731 str += 2;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001732
Guido van Rossume6762971998-06-22 03:54:46 +00001733 start = str;
Tim Petersbf2674b2003-02-02 07:51:32 +00001734 if ((base & (base - 1)) == 0)
1735 z = long_from_binary_base(&str, base);
1736 else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001737/***
1738Binary bases can be converted in time linear in the number of digits, because
1739Python's representation base is binary. Other bases (including decimal!) use
1740the simple quadratic-time algorithm below, complicated by some speed tricks.
Tim Peters5af4e6c2002-08-12 02:31:19 +00001741
Thomas Wouters477c8d52006-05-27 19:21:47 +00001742First some math: the largest integer that can be expressed in N base-B digits
1743is B**N-1. Consequently, if we have an N-digit input in base B, the worst-
1744case number of Python digits needed to hold it is the smallest integer n s.t.
1745
1746 BASE**n-1 >= B**N-1 [or, adding 1 to both sides]
1747 BASE**n >= B**N [taking logs to base BASE]
1748 n >= log(B**N)/log(BASE) = N * log(B)/log(BASE)
1749
1750The static array log_base_BASE[base] == log(base)/log(BASE) so we can compute
1751this quickly. A Python long with that much space is reserved near the start,
1752and the result is computed into it.
1753
1754The input string is actually treated as being in base base**i (i.e., i digits
1755are processed at a time), where two more static arrays hold:
1756
1757 convwidth_base[base] = the largest integer i such that base**i <= BASE
1758 convmultmax_base[base] = base ** convwidth_base[base]
1759
1760The first of these is the largest i such that i consecutive input digits
1761must fit in a single Python digit. The second is effectively the input
1762base we're really using.
1763
1764Viewing the input as a sequence <c0, c1, ..., c_n-1> of digits in base
1765convmultmax_base[base], the result is "simply"
1766
1767 (((c0*B + c1)*B + c2)*B + c3)*B + ... ))) + c_n-1
1768
1769where B = convmultmax_base[base].
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001770
1771Error analysis: as above, the number of Python digits `n` needed is worst-
1772case
1773
1774 n >= N * log(B)/log(BASE)
1775
1776where `N` is the number of input digits in base `B`. This is computed via
1777
1778 size_z = (Py_ssize_t)((scan - str) * log_base_BASE[base]) + 1;
1779
1780below. Two numeric concerns are how much space this can waste, and whether
1781the computed result can be too small. To be concrete, assume BASE = 2**15,
1782which is the default (and it's unlikely anyone changes that).
1783
1784Waste isn't a problem: provided the first input digit isn't 0, the difference
1785between the worst-case input with N digits and the smallest input with N
1786digits is about a factor of B, but B is small compared to BASE so at most
1787one allocated Python digit can remain unused on that count. If
1788N*log(B)/log(BASE) is mathematically an exact integer, then truncating that
1789and adding 1 returns a result 1 larger than necessary. However, that can't
1790happen: whenever B is a power of 2, long_from_binary_base() is called
1791instead, and it's impossible for B**i to be an integer power of 2**15 when
1792B is not a power of 2 (i.e., it's impossible for N*log(B)/log(BASE) to be
1793an exact integer when B is not a power of 2, since B**i has a prime factor
1794other than 2 in that case, but (2**15)**j's only prime factor is 2).
1795
1796The computed result can be too small if the true value of N*log(B)/log(BASE)
1797is a little bit larger than an exact integer, but due to roundoff errors (in
1798computing log(B), log(BASE), their quotient, and/or multiplying that by N)
1799yields a numeric result a little less than that integer. Unfortunately, "how
1800close can a transcendental function get to an integer over some range?"
1801questions are generally theoretically intractable. Computer analysis via
1802continued fractions is practical: expand log(B)/log(BASE) via continued
1803fractions, giving a sequence i/j of "the best" rational approximations. Then
1804j*log(B)/log(BASE) is approximately equal to (the integer) i. This shows that
1805we can get very close to being in trouble, but very rarely. For example,
180676573 is a denominator in one of the continued-fraction approximations to
1807log(10)/log(2**15), and indeed:
1808
1809 >>> log(10)/log(2**15)*76573
1810 16958.000000654003
1811
1812is very close to an integer. If we were working with IEEE single-precision,
1813rounding errors could kill us. Finding worst cases in IEEE double-precision
1814requires better-than-double-precision log() functions, and Tim didn't bother.
1815Instead the code checks to see whether the allocated space is enough as each
1816new Python digit is added, and copies the whole thing to a larger long if not.
1817This should happen extremely rarely, and in fact I don't have a test case
1818that triggers it(!). Instead the code was tested by artificially allocating
1819just 1 digit at the start, so that the copying code was exercised for every
1820digit beyond the first.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001821***/
1822 register twodigits c; /* current input character */
1823 Py_ssize_t size_z;
1824 int i;
1825 int convwidth;
1826 twodigits convmultmax, convmult;
1827 digit *pz, *pzstop;
1828 char* scan;
1829
1830 static double log_base_BASE[37] = {0.0e0,};
1831 static int convwidth_base[37] = {0,};
1832 static twodigits convmultmax_base[37] = {0,};
1833
1834 if (log_base_BASE[base] == 0.0) {
1835 twodigits convmax = base;
1836 int i = 1;
1837
1838 log_base_BASE[base] = log((double)base) /
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001839 log((double)PyLong_BASE);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001840 for (;;) {
1841 twodigits next = convmax * base;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001842 if (next > PyLong_BASE)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001843 break;
1844 convmax = next;
1845 ++i;
1846 }
1847 convmultmax_base[base] = convmax;
1848 assert(i > 0);
1849 convwidth_base[base] = i;
1850 }
1851
1852 /* Find length of the string of numeric characters. */
1853 scan = str;
1854 while (_PyLong_DigitValue[Py_CHARMASK(*scan)] < base)
1855 ++scan;
1856
1857 /* Create a long object that can contain the largest possible
1858 * integer with this base and length. Note that there's no
1859 * need to initialize z->ob_digit -- no slot is read up before
1860 * being stored into.
1861 */
1862 size_z = (Py_ssize_t)((scan - str) * log_base_BASE[base]) + 1;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001863 /* Uncomment next line to test exceedingly rare copy code */
1864 /* size_z = 1; */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001865 assert(size_z > 0);
1866 z = _PyLong_New(size_z);
1867 if (z == NULL)
1868 return NULL;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001869 Py_Size(z) = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001870
1871 /* `convwidth` consecutive input digits are treated as a single
1872 * digit in base `convmultmax`.
1873 */
1874 convwidth = convwidth_base[base];
1875 convmultmax = convmultmax_base[base];
1876
1877 /* Work ;-) */
1878 while (str < scan) {
1879 /* grab up to convwidth digits from the input string */
1880 c = (digit)_PyLong_DigitValue[Py_CHARMASK(*str++)];
1881 for (i = 1; i < convwidth && str != scan; ++i, ++str) {
1882 c = (twodigits)(c * base +
1883 _PyLong_DigitValue[Py_CHARMASK(*str)]);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001884 assert(c < PyLong_BASE);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001885 }
1886
1887 convmult = convmultmax;
1888 /* Calculate the shift only if we couldn't get
1889 * convwidth digits.
1890 */
1891 if (i != convwidth) {
1892 convmult = base;
1893 for ( ; i > 1; --i)
1894 convmult *= base;
1895 }
1896
1897 /* Multiply z by convmult, and add c. */
1898 pz = z->ob_digit;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001899 pzstop = pz + Py_Size(z);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001900 for (; pz < pzstop; ++pz) {
1901 c += (twodigits)*pz * convmult;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001902 *pz = (digit)(c & PyLong_MASK);
1903 c >>= PyLong_SHIFT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001904 }
1905 /* carry off the current end? */
1906 if (c) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001907 assert(c < PyLong_BASE);
1908 if (Py_Size(z) < size_z) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001909 *pz = (digit)c;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001910 ++Py_Size(z);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001911 }
1912 else {
1913 PyLongObject *tmp;
1914 /* Extremely rare. Get more space. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001915 assert(Py_Size(z) == size_z);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001916 tmp = _PyLong_New(size_z + 1);
1917 if (tmp == NULL) {
1918 Py_DECREF(z);
1919 return NULL;
1920 }
1921 memcpy(tmp->ob_digit,
1922 z->ob_digit,
1923 sizeof(digit) * size_z);
1924 Py_DECREF(z);
1925 z = tmp;
1926 z->ob_digit[size_z] = (digit)c;
1927 ++size_z;
1928 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001929 }
Tim Petersbf2674b2003-02-02 07:51:32 +00001930 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001931 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001932 if (z == NULL)
1933 return NULL;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001934 if (error_if_nonzero) {
1935 /* reset the base to 0, else the exception message
1936 doesn't make too much sense */
1937 base = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001938 if (Py_Size(z) != 0)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001939 goto onError;
1940 /* there might still be other problems, therefore base
1941 remains zero here for the same reason */
1942 }
Guido van Rossum9e896b32000-04-05 20:11:21 +00001943 if (str == start)
1944 goto onError;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001945 if (sign < 0)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001946 Py_Size(z) = -(Py_Size(z));
Guido van Rossum9e896b32000-04-05 20:11:21 +00001947 if (*str == 'L' || *str == 'l')
1948 str++;
1949 while (*str && isspace(Py_CHARMASK(*str)))
1950 str++;
1951 if (*str != '\0')
1952 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001953 if (pend)
1954 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001955 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001956
1957 onError:
Guido van Rossum9e896b32000-04-05 20:11:21 +00001958 Py_XDECREF(z);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001959 slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200;
Guido van Rossum25236212007-08-22 23:28:23 +00001960 strobj = PyUnicode_FromStringAndSize(orig_str, slen);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001961 if (strobj == NULL)
1962 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001963 PyErr_Format(PyExc_ValueError,
Guido van Rossum25236212007-08-22 23:28:23 +00001964 "invalid literal for int() with base %d: %R",
1965 base, strobj);
1966 Py_DECREF(strobj);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001967 return NULL;
1968}
1969
1970PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001971PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001972{
Walter Dörwald07e14762002-11-06 16:15:14 +00001973 PyObject *result;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001974 char *buffer = (char *)PyMem_MALLOC(length+1);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001975
Walter Dörwald07e14762002-11-06 16:15:14 +00001976 if (buffer == NULL)
1977 return NULL;
1978
1979 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
1980 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001981 return NULL;
1982 }
Walter Dörwald07e14762002-11-06 16:15:14 +00001983 result = PyLong_FromString(buffer, NULL, base);
1984 PyMem_FREE(buffer);
1985 return result;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001986}
1987
Tim Peters9f688bf2000-07-07 15:53:28 +00001988/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001989static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001990 (PyLongObject *, PyLongObject *, PyLongObject **);
Guido van Rossumb43daf72007-08-01 18:08:08 +00001991static PyObject *long_long(PyObject *v);
Tim Peters9f688bf2000-07-07 15:53:28 +00001992static int long_divrem(PyLongObject *, PyLongObject *,
1993 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001994
1995/* Long division with remainder, top-level routine */
1996
Guido van Rossume32e0141992-01-19 16:31:05 +00001997static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001998long_divrem(PyLongObject *a, PyLongObject *b,
1999 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002000{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002001 Py_ssize_t size_a = ABS(Py_Size(a)), size_b = ABS(Py_Size(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002002 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002003
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002004 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002005 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumddefaf32007-01-14 03:31:43 +00002006 "integer division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00002007 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002008 }
2009 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00002010 (size_a == size_b &&
2011 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002012 /* |a| < |b|. */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002013 *pdiv = (PyLongObject*)PyLong_FromLong(0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002014 if (*pdiv == NULL)
2015 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002016 Py_INCREF(a);
2017 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00002018 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002019 }
2020 if (size_b == 1) {
2021 digit rem = 0;
2022 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00002023 if (z == NULL)
2024 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002025 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002026 if (*prem == NULL) {
2027 Py_DECREF(z);
2028 return -1;
2029 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002030 }
Guido van Rossume32e0141992-01-19 16:31:05 +00002031 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002032 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00002033 if (z == NULL)
2034 return -1;
2035 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002036 /* Set the signs.
2037 The quotient z has the sign of a*b;
2038 the remainder r has the sign of a,
2039 so a = b*z + r. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002040 if ((Py_Size(a) < 0) != (Py_Size(b) < 0))
Guido van Rossumddefaf32007-01-14 03:31:43 +00002041 NEGATE(z);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002042 if (Py_Size(a) < 0 && Py_Size(*prem) != 0)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002043 NEGATE(*prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00002044 *pdiv = z;
2045 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002046}
2047
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002048/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002049
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002050static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002051x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002052{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002053 Py_ssize_t size_v = ABS(Py_Size(v1)), size_w = ABS(Py_Size(w1));
2054 digit d = (digit) ((twodigits)PyLong_BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002055 PyLongObject *v = mul1(v1, d);
2056 PyLongObject *w = mul1(w1, d);
2057 PyLongObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002058 Py_ssize_t j, k;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002059
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002060 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002061 Py_XDECREF(v);
2062 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002063 return NULL;
2064 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002065
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002066 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002067 assert(Py_Refcnt(v) == 1); /* Since v will be used as accumulator! */
2068 assert(size_w == ABS(Py_Size(w))); /* That's how d was calculated */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002069
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002070 size_v = ABS(Py_Size(v));
Thomas Wouters477c8d52006-05-27 19:21:47 +00002071 k = size_v - size_w;
2072 a = _PyLong_New(k + 1);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002073
Thomas Wouters477c8d52006-05-27 19:21:47 +00002074 for (j = size_v; a != NULL && k >= 0; --j, --k) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002075 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
2076 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002077 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002078 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002079
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002080 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002081 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002082 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002083 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002084 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002085 if (vj == w->ob_digit[size_w-1])
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002086 q = PyLong_MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002087 else
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002088 q = (((twodigits)vj << PyLong_SHIFT) + v->ob_digit[j-1]) /
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002089 w->ob_digit[size_w-1];
Tim Peters5af4e6c2002-08-12 02:31:19 +00002090
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002091 while (w->ob_digit[size_w-2]*q >
2092 ((
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002093 ((twodigits)vj << PyLong_SHIFT)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002094 + v->ob_digit[j-1]
2095 - q*w->ob_digit[size_w-1]
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002096 ) << PyLong_SHIFT)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002097 + v->ob_digit[j-2])
2098 --q;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002099
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002100 for (i = 0; i < size_w && i+k < size_v; ++i) {
2101 twodigits z = w->ob_digit[i] * q;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002102 digit zz = (digit) (z >> PyLong_SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002103 carry += v->ob_digit[i+k] - z
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002104 + ((twodigits)zz << PyLong_SHIFT);
2105 v->ob_digit[i+k] = (digit)(carry & PyLong_MASK);
Tim Peters7d3a5112000-07-08 04:17:21 +00002106 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002107 carry, PyLong_SHIFT);
Tim Peters7d3a5112000-07-08 04:17:21 +00002108 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002109 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002110
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002111 if (i+k < size_v) {
2112 carry += v->ob_digit[i+k];
2113 v->ob_digit[i+k] = 0;
2114 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002115
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002116 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00002117 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002118 else {
2119 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00002120 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002121 carry = 0;
2122 for (i = 0; i < size_w && i+k < size_v; ++i) {
2123 carry += v->ob_digit[i+k] + w->ob_digit[i];
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002124 v->ob_digit[i+k] = (digit)(carry & PyLong_MASK);
Tim Peters7d3a5112000-07-08 04:17:21 +00002125 carry = Py_ARITHMETIC_RIGHT_SHIFT(
2126 BASE_TWODIGITS_TYPE,
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002127 carry, PyLong_SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002128 }
2129 }
2130 } /* for j, k */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002131
Guido van Rossumc206c761995-01-10 15:23:19 +00002132 if (a == NULL)
2133 *prem = NULL;
2134 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00002135 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00002136 *prem = divrem1(v, d, &d);
2137 /* d receives the (unused) remainder */
2138 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002139 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00002140 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002141 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002142 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002143 Py_DECREF(v);
2144 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002145 return a;
2146}
2147
2148/* Methods */
2149
2150static void
Tim Peters9f688bf2000-07-07 15:53:28 +00002151long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002152{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002153 Py_Type(v)->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002154}
2155
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002156static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002157long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002158{
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002159 return _PyLong_Format(v, 10);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002160}
2161
2162static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002163long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002164{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002165 Py_ssize_t sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002166
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002167 if (Py_Size(a) != Py_Size(b)) {
2168 if (ABS(Py_Size(a)) == 0 && ABS(Py_Size(b)) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002169 sign = 0;
2170 else
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002171 sign = Py_Size(a) - Py_Size(b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002172 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002173 else {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002174 Py_ssize_t i = ABS(Py_Size(a));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002175 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
2176 ;
2177 if (i < 0)
2178 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00002179 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002180 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002181 if (Py_Size(a) < 0)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00002182 sign = -sign;
2183 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002184 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00002185 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002186}
2187
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002188static PyObject *
2189long_richcompare(PyObject *self, PyObject *other, int op)
2190{
2191 PyLongObject *a, *b;
Martin v. Löwis14b6d922007-02-06 21:05:30 +00002192 PyObject *result;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002193 CONVERT_BINOP((PyObject *)self, (PyObject *)other, &a, &b);
Martin v. Löwis14b6d922007-02-06 21:05:30 +00002194 result = Py_CmpToRich(op, long_compare(a, b));
2195 Py_DECREF(a);
2196 Py_DECREF(b);
2197 return result;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002198}
2199
Guido van Rossum9bfef441993-03-29 10:43:31 +00002200static long
Tim Peters9f688bf2000-07-07 15:53:28 +00002201long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002202{
2203 long x;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002204 Py_ssize_t i;
2205 int sign;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002206
2207 /* This is designed so that Python ints and longs with the
2208 same value hash to the same value, otherwise comparisons
2209 of mapping keys will turn out weird */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002210 i = Py_Size(v);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002211 switch(i) {
2212 case -1: return v->ob_digit[0]==1 ? -2 : -v->ob_digit[0];
2213 case 0: return 0;
2214 case 1: return v->ob_digit[0];
2215 }
Guido van Rossum9bfef441993-03-29 10:43:31 +00002216 sign = 1;
2217 x = 0;
2218 if (i < 0) {
2219 sign = -1;
2220 i = -(i);
2221 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002222#define LONG_BIT_PyLong_SHIFT (8*sizeof(long) - PyLong_SHIFT)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002223 while (--i >= 0) {
Neal Norwitzd5a65a72003-02-23 23:11:41 +00002224 /* Force a native long #-bits (32 or 64) circular shift */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002225 x = ((x << PyLong_SHIFT) & ~PyLong_MASK) | ((x >> LONG_BIT_PyLong_SHIFT) & PyLong_MASK);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002226 x += v->ob_digit[i];
2227 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002228#undef LONG_BIT_PyLong_SHIFT
Guido van Rossum9bfef441993-03-29 10:43:31 +00002229 x = x * sign;
2230 if (x == -1)
2231 x = -2;
2232 return x;
2233}
2234
2235
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002236/* Add the absolute values of two long integers. */
2237
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002238static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002239x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002240{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002241 Py_ssize_t size_a = ABS(Py_Size(a)), size_b = ABS(Py_Size(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002242 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002243 int i;
2244 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00002245
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002246 /* Ensure a is the larger of the two: */
2247 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002248 { PyLongObject *temp = a; a = b; b = temp; }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002249 { Py_ssize_t size_temp = size_a;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002250 size_a = size_b;
2251 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002252 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002253 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002254 if (z == NULL)
2255 return NULL;
2256 for (i = 0; i < size_b; ++i) {
2257 carry += a->ob_digit[i] + b->ob_digit[i];
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002258 z->ob_digit[i] = carry & PyLong_MASK;
2259 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002260 }
2261 for (; i < size_a; ++i) {
2262 carry += a->ob_digit[i];
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002263 z->ob_digit[i] = carry & PyLong_MASK;
2264 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002265 }
2266 z->ob_digit[i] = carry;
2267 return long_normalize(z);
2268}
2269
2270/* Subtract the absolute values of two integers. */
2271
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002272static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002273x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002274{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002275 Py_ssize_t size_a = ABS(Py_Size(a)), size_b = ABS(Py_Size(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002276 PyLongObject *z;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002277 Py_ssize_t i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002278 int sign = 1;
2279 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00002280
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002281 /* Ensure a is the larger of the two: */
2282 if (size_a < size_b) {
2283 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002284 { PyLongObject *temp = a; a = b; b = temp; }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002285 { Py_ssize_t size_temp = size_a;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002286 size_a = size_b;
2287 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002288 }
2289 else if (size_a == size_b) {
2290 /* Find highest digit where a and b differ: */
2291 i = size_a;
2292 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
2293 ;
2294 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002295 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002296 if (a->ob_digit[i] < b->ob_digit[i]) {
2297 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002298 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002299 }
2300 size_a = size_b = i+1;
2301 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002302 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002303 if (z == NULL)
2304 return NULL;
2305 for (i = 0; i < size_b; ++i) {
2306 /* The following assumes unsigned arithmetic
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002307 works module 2**N for some N>PyLong_SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002308 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002309 z->ob_digit[i] = borrow & PyLong_MASK;
2310 borrow >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002311 borrow &= 1; /* Keep only one sign bit */
2312 }
2313 for (; i < size_a; ++i) {
2314 borrow = a->ob_digit[i] - borrow;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002315 z->ob_digit[i] = borrow & PyLong_MASK;
2316 borrow >>= PyLong_SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00002317 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002318 }
2319 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002320 if (sign < 0)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002321 NEGATE(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002322 return long_normalize(z);
2323}
2324
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002325static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002326long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002327{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002328 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002329
Neil Schemenauerba872e22001-01-04 01:46:03 +00002330 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2331
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002332 if (ABS(Py_Size(a)) <= 1 && ABS(Py_Size(b)) <= 1) {
Martin v. Löwis14b6d922007-02-06 21:05:30 +00002333 PyObject *result = PyInt_FromLong(MEDIUM_VALUE(a) +
2334 MEDIUM_VALUE(b));
2335 Py_DECREF(a);
2336 Py_DECREF(b);
2337 return result;
2338 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002339 if (Py_Size(a) < 0) {
2340 if (Py_Size(b) < 0) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002341 z = x_add(a, b);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002342 if (z != NULL && Py_Size(z) != 0)
2343 Py_Size(z) = -(Py_Size(z));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002344 }
2345 else
2346 z = x_sub(b, a);
2347 }
2348 else {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002349 if (Py_Size(b) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002350 z = x_sub(a, b);
2351 else
2352 z = x_add(a, b);
2353 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002354 Py_DECREF(a);
2355 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002356 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002357}
2358
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002359static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002360long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002361{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002362 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002363
Neil Schemenauerba872e22001-01-04 01:46:03 +00002364 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2365
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002366 if (ABS(Py_Size(a)) <= 1 && ABS(Py_Size(b)) <= 1) {
Martin v. Löwis14b6d922007-02-06 21:05:30 +00002367 PyObject* r;
2368 r = PyLong_FromLong(MEDIUM_VALUE(a)-MEDIUM_VALUE(b));
2369 Py_DECREF(a);
2370 Py_DECREF(b);
2371 return r;
2372 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002373 if (Py_Size(a) < 0) {
2374 if (Py_Size(b) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002375 z = x_sub(a, b);
2376 else
2377 z = x_add(a, b);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002378 if (z != NULL && Py_Size(z) != 0)
2379 Py_Size(z) = -(Py_Size(z));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002380 }
2381 else {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002382 if (Py_Size(b) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002383 z = x_add(a, b);
2384 else
2385 z = x_sub(a, b);
2386 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002387 Py_DECREF(a);
2388 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002389 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002390}
2391
Tim Peters5af4e6c2002-08-12 02:31:19 +00002392/* Grade school multiplication, ignoring the signs.
2393 * Returns the absolute value of the product, or NULL if error.
2394 */
2395static PyLongObject *
2396x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002397{
Tim Peters5af4e6c2002-08-12 02:31:19 +00002398 PyLongObject *z;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002399 Py_ssize_t size_a = ABS(Py_Size(a));
2400 Py_ssize_t size_b = ABS(Py_Size(b));
Martin v. Löwis18e16552006-02-15 17:27:45 +00002401 Py_ssize_t i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002402
Tim Peters5af4e6c2002-08-12 02:31:19 +00002403 z = _PyLong_New(size_a + size_b);
2404 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002405 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002406
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002407 memset(z->ob_digit, 0, Py_Size(z) * sizeof(digit));
Tim Peters0973b992004-08-29 22:16:50 +00002408 if (a == b) {
2409 /* Efficient squaring per HAC, Algorithm 14.16:
2410 * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
2411 * Gives slightly less than a 2x speedup when a == b,
2412 * via exploiting that each entry in the multiplication
2413 * pyramid appears twice (except for the size_a squares).
2414 */
2415 for (i = 0; i < size_a; ++i) {
2416 twodigits carry;
2417 twodigits f = a->ob_digit[i];
2418 digit *pz = z->ob_digit + (i << 1);
2419 digit *pa = a->ob_digit + i + 1;
2420 digit *paend = a->ob_digit + size_a;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002421
Tim Peters0973b992004-08-29 22:16:50 +00002422 SIGCHECK({
2423 Py_DECREF(z);
2424 return NULL;
2425 })
2426
2427 carry = *pz + f * f;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002428 *pz++ = (digit)(carry & PyLong_MASK);
2429 carry >>= PyLong_SHIFT;
2430 assert(carry <= PyLong_MASK);
Tim Peters0973b992004-08-29 22:16:50 +00002431
2432 /* Now f is added in twice in each column of the
2433 * pyramid it appears. Same as adding f<<1 once.
2434 */
2435 f <<= 1;
2436 while (pa < paend) {
2437 carry += *pz + *pa++ * f;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002438 *pz++ = (digit)(carry & PyLong_MASK);
2439 carry >>= PyLong_SHIFT;
2440 assert(carry <= (PyLong_MASK << 1));
Tim Peters0973b992004-08-29 22:16:50 +00002441 }
2442 if (carry) {
2443 carry += *pz;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002444 *pz++ = (digit)(carry & PyLong_MASK);
2445 carry >>= PyLong_SHIFT;
Tim Peters0973b992004-08-29 22:16:50 +00002446 }
2447 if (carry)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002448 *pz += (digit)(carry & PyLong_MASK);
2449 assert((carry >> PyLong_SHIFT) == 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002450 }
Tim Peters0973b992004-08-29 22:16:50 +00002451 }
2452 else { /* a is not the same as b -- gradeschool long mult */
2453 for (i = 0; i < size_a; ++i) {
2454 twodigits carry = 0;
2455 twodigits f = a->ob_digit[i];
2456 digit *pz = z->ob_digit + i;
2457 digit *pb = b->ob_digit;
2458 digit *pbend = b->ob_digit + size_b;
2459
2460 SIGCHECK({
2461 Py_DECREF(z);
2462 return NULL;
2463 })
2464
2465 while (pb < pbend) {
2466 carry += *pz + *pb++ * f;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002467 *pz++ = (digit)(carry & PyLong_MASK);
2468 carry >>= PyLong_SHIFT;
2469 assert(carry <= PyLong_MASK);
Tim Peters0973b992004-08-29 22:16:50 +00002470 }
2471 if (carry)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002472 *pz += (digit)(carry & PyLong_MASK);
2473 assert((carry >> PyLong_SHIFT) == 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002474 }
2475 }
Tim Peters44121a62002-08-12 06:17:58 +00002476 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002477}
2478
2479/* A helper for Karatsuba multiplication (k_mul).
2480 Takes a long "n" and an integer "size" representing the place to
2481 split, and sets low and high such that abs(n) == (high << size) + low,
2482 viewing the shift as being by digits. The sign bit is ignored, and
2483 the return values are >= 0.
2484 Returns 0 on success, -1 on failure.
2485*/
2486static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002487kmul_split(PyLongObject *n, Py_ssize_t size, PyLongObject **high, PyLongObject **low)
Tim Peters5af4e6c2002-08-12 02:31:19 +00002488{
2489 PyLongObject *hi, *lo;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002490 Py_ssize_t size_lo, size_hi;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002491 const Py_ssize_t size_n = ABS(Py_Size(n));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002492
2493 size_lo = MIN(size_n, size);
2494 size_hi = size_n - size_lo;
2495
2496 if ((hi = _PyLong_New(size_hi)) == NULL)
2497 return -1;
2498 if ((lo = _PyLong_New(size_lo)) == NULL) {
2499 Py_DECREF(hi);
2500 return -1;
2501 }
2502
2503 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
2504 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
2505
2506 *high = long_normalize(hi);
2507 *low = long_normalize(lo);
2508 return 0;
2509}
2510
Tim Peters60004642002-08-12 22:01:34 +00002511static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
2512
Tim Peters5af4e6c2002-08-12 02:31:19 +00002513/* Karatsuba multiplication. Ignores the input signs, and returns the
2514 * absolute value of the product (or NULL if error).
2515 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
2516 */
2517static PyLongObject *
2518k_mul(PyLongObject *a, PyLongObject *b)
2519{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002520 Py_ssize_t asize = ABS(Py_Size(a));
2521 Py_ssize_t bsize = ABS(Py_Size(b));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002522 PyLongObject *ah = NULL;
2523 PyLongObject *al = NULL;
2524 PyLongObject *bh = NULL;
2525 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002526 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00002527 PyLongObject *t1, *t2, *t3;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002528 Py_ssize_t shift; /* the number of digits we split off */
2529 Py_ssize_t i;
Tim Peters738eda72002-08-12 15:08:20 +00002530
Tim Peters5af4e6c2002-08-12 02:31:19 +00002531 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
2532 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
2533 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00002534 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00002535 * By picking X to be a power of 2, "*X" is just shifting, and it's
2536 * been reduced to 3 multiplies on numbers half the size.
2537 */
2538
Tim Petersfc07e562002-08-12 02:54:10 +00002539 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00002540 * is largest.
2541 */
Tim Peters738eda72002-08-12 15:08:20 +00002542 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002543 t1 = a;
2544 a = b;
2545 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00002546
2547 i = asize;
2548 asize = bsize;
2549 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002550 }
2551
2552 /* Use gradeschool math when either number is too small. */
Tim Peters0973b992004-08-29 22:16:50 +00002553 i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF;
2554 if (asize <= i) {
Tim Peters738eda72002-08-12 15:08:20 +00002555 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00002556 return _PyLong_New(0);
2557 else
2558 return x_mul(a, b);
2559 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002560
Tim Peters60004642002-08-12 22:01:34 +00002561 /* If a is small compared to b, splitting on b gives a degenerate
2562 * case with ah==0, and Karatsuba may be (even much) less efficient
2563 * than "grade school" then. However, we can still win, by viewing
2564 * b as a string of "big digits", each of width a->ob_size. That
2565 * leads to a sequence of balanced calls to k_mul.
2566 */
2567 if (2 * asize <= bsize)
2568 return k_lopsided_mul(a, b);
2569
Tim Petersd6974a52002-08-13 20:37:51 +00002570 /* Split a & b into hi & lo pieces. */
Tim Peters738eda72002-08-12 15:08:20 +00002571 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002572 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002573 assert(Py_Size(ah) > 0); /* the split isn't degenerate */
Tim Petersd6974a52002-08-13 20:37:51 +00002574
Tim Peters0973b992004-08-29 22:16:50 +00002575 if (a == b) {
2576 bh = ah;
2577 bl = al;
2578 Py_INCREF(bh);
2579 Py_INCREF(bl);
2580 }
2581 else if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002582
Tim Petersd64c1de2002-08-12 17:36:03 +00002583 /* The plan:
2584 * 1. Allocate result space (asize + bsize digits: that's always
2585 * enough).
2586 * 2. Compute ah*bh, and copy into result at 2*shift.
2587 * 3. Compute al*bl, and copy into result at 0. Note that this
2588 * can't overlap with #2.
2589 * 4. Subtract al*bl from the result, starting at shift. This may
2590 * underflow (borrow out of the high digit), but we don't care:
2591 * we're effectively doing unsigned arithmetic mod
2592 * BASE**(sizea + sizeb), and so long as the *final* result fits,
2593 * borrows and carries out of the high digit can be ignored.
2594 * 5. Subtract ah*bh from the result, starting at shift.
2595 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
2596 * at shift.
2597 */
2598
2599 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00002600 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002601 if (ret == NULL) goto fail;
2602#ifdef Py_DEBUG
2603 /* Fill with trash, to catch reference to uninitialized digits. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002604 memset(ret->ob_digit, 0xDF, Py_Size(ret) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002605#endif
Tim Peters44121a62002-08-12 06:17:58 +00002606
Tim Petersd64c1de2002-08-12 17:36:03 +00002607 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00002608 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002609 assert(Py_Size(t1) >= 0);
2610 assert(2*shift + Py_Size(t1) <= Py_Size(ret));
Tim Peters738eda72002-08-12 15:08:20 +00002611 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002612 Py_Size(t1) * sizeof(digit));
Tim Peters738eda72002-08-12 15:08:20 +00002613
2614 /* Zero-out the digits higher than the ah*bh copy. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002615 i = Py_Size(ret) - 2*shift - Py_Size(t1);
Tim Peters44121a62002-08-12 06:17:58 +00002616 if (i)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002617 memset(ret->ob_digit + 2*shift + Py_Size(t1), 0,
Tim Peters44121a62002-08-12 06:17:58 +00002618 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002619
Tim Petersd64c1de2002-08-12 17:36:03 +00002620 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00002621 if ((t2 = k_mul(al, bl)) == NULL) {
2622 Py_DECREF(t1);
2623 goto fail;
2624 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002625 assert(Py_Size(t2) >= 0);
2626 assert(Py_Size(t2) <= 2*shift); /* no overlap with high digits */
2627 memcpy(ret->ob_digit, t2->ob_digit, Py_Size(t2) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002628
2629 /* Zero out remaining digits. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002630 i = 2*shift - Py_Size(t2); /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002631 if (i)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002632 memset(ret->ob_digit + Py_Size(t2), 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002633
Tim Petersd64c1de2002-08-12 17:36:03 +00002634 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
2635 * because it's fresher in cache.
2636 */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002637 i = Py_Size(ret) - shift; /* # digits after shift */
2638 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, Py_Size(t2));
Tim Peters738eda72002-08-12 15:08:20 +00002639 Py_DECREF(t2);
2640
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002641 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, Py_Size(t1));
Tim Peters738eda72002-08-12 15:08:20 +00002642 Py_DECREF(t1);
2643
Tim Petersd64c1de2002-08-12 17:36:03 +00002644 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002645 if ((t1 = x_add(ah, al)) == NULL) goto fail;
2646 Py_DECREF(ah);
2647 Py_DECREF(al);
2648 ah = al = NULL;
2649
Tim Peters0973b992004-08-29 22:16:50 +00002650 if (a == b) {
2651 t2 = t1;
2652 Py_INCREF(t2);
2653 }
2654 else if ((t2 = x_add(bh, bl)) == NULL) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002655 Py_DECREF(t1);
2656 goto fail;
2657 }
2658 Py_DECREF(bh);
2659 Py_DECREF(bl);
2660 bh = bl = NULL;
2661
Tim Peters738eda72002-08-12 15:08:20 +00002662 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002663 Py_DECREF(t1);
2664 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00002665 if (t3 == NULL) goto fail;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002666 assert(Py_Size(t3) >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002667
Tim Petersd6974a52002-08-13 20:37:51 +00002668 /* Add t3. It's not obvious why we can't run out of room here.
2669 * See the (*) comment after this function.
Tim Petersd8b21732002-08-12 19:30:26 +00002670 */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002671 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, Py_Size(t3));
Tim Peters738eda72002-08-12 15:08:20 +00002672 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002673
Tim Peters5af4e6c2002-08-12 02:31:19 +00002674 return long_normalize(ret);
2675
2676 fail:
2677 Py_XDECREF(ret);
2678 Py_XDECREF(ah);
2679 Py_XDECREF(al);
2680 Py_XDECREF(bh);
2681 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002682 return NULL;
2683}
2684
Tim Petersd6974a52002-08-13 20:37:51 +00002685/* (*) Why adding t3 can't "run out of room" above.
2686
Tim Petersab86c2b2002-08-15 20:06:00 +00002687Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
2688to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00002689
Tim Petersab86c2b2002-08-15 20:06:00 +000026901. For any integer i, i = c(i/2) + f(i/2). In particular,
2691 bsize = c(bsize/2) + f(bsize/2).
26922. shift = f(bsize/2)
26933. asize <= bsize
26944. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
2695 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00002696
Tim Petersab86c2b2002-08-15 20:06:00 +00002697We allocated asize + bsize result digits, and add t3 into them at an offset
2698of shift. This leaves asize+bsize-shift allocated digit positions for t3
2699to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
2700asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00002701
Tim Petersab86c2b2002-08-15 20:06:00 +00002702bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
2703at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00002704
Tim Petersab86c2b2002-08-15 20:06:00 +00002705If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
2706digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
2707most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00002708
Tim Petersab86c2b2002-08-15 20:06:00 +00002709The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00002710
Tim Petersab86c2b2002-08-15 20:06:00 +00002711 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00002712
Tim Petersab86c2b2002-08-15 20:06:00 +00002713and we have asize + c(bsize/2) available digit positions. We need to show
2714this is always enough. An instance of c(bsize/2) cancels out in both, so
2715the question reduces to whether asize digits is enough to hold
2716(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
2717then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
2718asize 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 +00002719digit is enough to hold 2 bits. This is so since PyLong_SHIFT=15 >= 2. If
Tim Petersab86c2b2002-08-15 20:06:00 +00002720asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00002721c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
2722is enough to hold 2 bits. This is so if bsize >= 2, which holds because
2723bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00002724
Tim Peters48d52c02002-08-14 17:07:32 +00002725Note that since there's always enough room for (ah+al)*(bh+bl), and that's
2726clearly >= each of ah*bh and al*bl, there's always enough room to subtract
2727ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00002728*/
2729
Tim Peters60004642002-08-12 22:01:34 +00002730/* b has at least twice the digits of a, and a is big enough that Karatsuba
2731 * would pay off *if* the inputs had balanced sizes. View b as a sequence
2732 * of slices, each with a->ob_size digits, and multiply the slices by a,
2733 * one at a time. This gives k_mul balanced inputs to work with, and is
2734 * also cache-friendly (we compute one double-width slice of the result
2735 * at a time, then move on, never bactracking except for the helpful
2736 * single-width slice overlap between successive partial sums).
2737 */
2738static PyLongObject *
2739k_lopsided_mul(PyLongObject *a, PyLongObject *b)
2740{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002741 const Py_ssize_t asize = ABS(Py_Size(a));
2742 Py_ssize_t bsize = ABS(Py_Size(b));
Martin v. Löwis18e16552006-02-15 17:27:45 +00002743 Py_ssize_t nbdone; /* # of b digits already multiplied */
Tim Peters60004642002-08-12 22:01:34 +00002744 PyLongObject *ret;
2745 PyLongObject *bslice = NULL;
2746
2747 assert(asize > KARATSUBA_CUTOFF);
2748 assert(2 * asize <= bsize);
2749
2750 /* Allocate result space, and zero it out. */
2751 ret = _PyLong_New(asize + bsize);
2752 if (ret == NULL)
2753 return NULL;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002754 memset(ret->ob_digit, 0, Py_Size(ret) * sizeof(digit));
Tim Peters60004642002-08-12 22:01:34 +00002755
2756 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00002757 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00002758 if (bslice == NULL)
2759 goto fail;
2760
2761 nbdone = 0;
2762 while (bsize > 0) {
2763 PyLongObject *product;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002764 const Py_ssize_t nbtouse = MIN(bsize, asize);
Tim Peters60004642002-08-12 22:01:34 +00002765
2766 /* Multiply the next slice of b by a. */
2767 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
2768 nbtouse * sizeof(digit));
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002769 Py_Size(bslice) = nbtouse;
Tim Peters60004642002-08-12 22:01:34 +00002770 product = k_mul(a, bslice);
2771 if (product == NULL)
2772 goto fail;
2773
2774 /* Add into result. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002775 (void)v_iadd(ret->ob_digit + nbdone, Py_Size(ret) - nbdone,
2776 product->ob_digit, Py_Size(product));
Tim Peters60004642002-08-12 22:01:34 +00002777 Py_DECREF(product);
2778
2779 bsize -= nbtouse;
2780 nbdone += nbtouse;
2781 }
2782
2783 Py_DECREF(bslice);
2784 return long_normalize(ret);
2785
2786 fail:
2787 Py_DECREF(ret);
2788 Py_XDECREF(bslice);
2789 return NULL;
2790}
Tim Peters5af4e6c2002-08-12 02:31:19 +00002791
2792static PyObject *
2793long_mul(PyLongObject *v, PyLongObject *w)
2794{
2795 PyLongObject *a, *b, *z;
2796
2797 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002798 Py_INCREF(Py_NotImplemented);
2799 return Py_NotImplemented;
2800 }
2801
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002802 if (ABS(Py_Size(v)) <= 1 && ABS(Py_Size(w)) <= 1) {
Martin v. Löwis14b6d922007-02-06 21:05:30 +00002803 PyObject *r;
2804 r = PyLong_FromLong(MEDIUM_VALUE(v)*MEDIUM_VALUE(w));
2805 Py_DECREF(a);
2806 Py_DECREF(b);
2807 return r;
2808 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00002809
Tim Petersd64c1de2002-08-12 17:36:03 +00002810 z = k_mul(a, b);
Tim Peters9973d742002-08-15 19:41:06 +00002811 /* Negate if exactly one of the inputs is negative. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002812 if (((Py_Size(a) ^ Py_Size(b)) < 0) && z)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002813 NEGATE(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002814 Py_DECREF(a);
2815 Py_DECREF(b);
Tim Peters9973d742002-08-15 19:41:06 +00002816 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002817}
2818
Guido van Rossume32e0141992-01-19 16:31:05 +00002819/* The / and % operators are now defined in terms of divmod().
2820 The expression a mod b has the value a - b*floor(a/b).
2821 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002822 |a| by |b|, with the sign of a. This is also expressed
2823 as a - b*trunc(a/b), if trunc truncates towards zero.
2824 Some examples:
2825 a b a rem b a mod b
2826 13 10 3 3
2827 -13 10 -3 7
2828 13 -10 3 -7
2829 -13 -10 -3 -3
2830 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002831 have different signs. We then subtract one from the 'div'
2832 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002833
Tim Peters47e52ee2004-08-30 02:44:38 +00002834/* Compute
2835 * *pdiv, *pmod = divmod(v, w)
2836 * NULL can be passed for pdiv or pmod, in which case that part of
2837 * the result is simply thrown away. The caller owns a reference to
2838 * each of these it requests (does not pass NULL for).
2839 */
Guido van Rossume32e0141992-01-19 16:31:05 +00002840static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00002841l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00002842 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00002843{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002844 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002845
Guido van Rossume32e0141992-01-19 16:31:05 +00002846 if (long_divrem(v, w, &div, &mod) < 0)
2847 return -1;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002848 if ((Py_Size(mod) < 0 && Py_Size(w) > 0) ||
2849 (Py_Size(mod) > 0 && Py_Size(w) < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002850 PyLongObject *temp;
2851 PyLongObject *one;
2852 temp = (PyLongObject *) long_add(mod, w);
2853 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00002854 mod = temp;
2855 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002856 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002857 return -1;
2858 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002859 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00002860 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002861 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
2862 Py_DECREF(mod);
2863 Py_DECREF(div);
2864 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00002865 return -1;
2866 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002867 Py_DECREF(one);
2868 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002869 div = temp;
2870 }
Tim Peters47e52ee2004-08-30 02:44:38 +00002871 if (pdiv != NULL)
2872 *pdiv = div;
2873 else
2874 Py_DECREF(div);
2875
2876 if (pmod != NULL)
2877 *pmod = mod;
2878 else
2879 Py_DECREF(mod);
2880
Guido van Rossume32e0141992-01-19 16:31:05 +00002881 return 0;
2882}
2883
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002884static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002885long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002886{
Tim Peters47e52ee2004-08-30 02:44:38 +00002887 PyLongObject *a, *b, *div;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002888
2889 CONVERT_BINOP(v, w, &a, &b);
Tim Peters47e52ee2004-08-30 02:44:38 +00002890 if (l_divmod(a, b, &div, NULL) < 0)
2891 div = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002892 Py_DECREF(a);
2893 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002894 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00002895}
2896
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002897static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00002898long_true_divide(PyObject *v, PyObject *w)
2899{
Tim Peterse2a60002001-09-04 06:17:36 +00002900 PyLongObject *a, *b;
2901 double ad, bd;
Thomas Wouters553489a2006-02-01 21:32:04 +00002902 int failed, aexp = -1, bexp = -1;
Tim Peterse2a60002001-09-04 06:17:36 +00002903
2904 CONVERT_BINOP(v, w, &a, &b);
2905 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
2906 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00002907 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
2908 Py_DECREF(a);
2909 Py_DECREF(b);
2910 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00002911 return NULL;
Thomas Wouters553489a2006-02-01 21:32:04 +00002912 /* 'aexp' and 'bexp' were initialized to -1 to silence gcc-4.0.x,
2913 but should really be set correctly after sucessful calls to
2914 _PyLong_AsScaledDouble() */
2915 assert(aexp >= 0 && bexp >= 0);
Tim Peterse2a60002001-09-04 06:17:36 +00002916
2917 if (bd == 0.0) {
2918 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumddefaf32007-01-14 03:31:43 +00002919 "int division or modulo by zero");
Tim Peterse2a60002001-09-04 06:17:36 +00002920 return NULL;
2921 }
2922
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002923 /* True value is very close to ad/bd * 2**(PyLong_SHIFT*(aexp-bexp)) */
Tim Peterse2a60002001-09-04 06:17:36 +00002924 ad /= bd; /* overflow/underflow impossible here */
2925 aexp -= bexp;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002926 if (aexp > INT_MAX / PyLong_SHIFT)
Tim Peterse2a60002001-09-04 06:17:36 +00002927 goto overflow;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002928 else if (aexp < -(INT_MAX / PyLong_SHIFT))
Tim Peterse56ed9b2001-09-06 21:59:14 +00002929 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002930 errno = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002931 ad = ldexp(ad, aexp * PyLong_SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002932 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002933 goto overflow;
2934 return PyFloat_FromDouble(ad);
2935
2936overflow:
2937 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumddefaf32007-01-14 03:31:43 +00002938 "int/int too large for a float");
Tim Peterse2a60002001-09-04 06:17:36 +00002939 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002940
Tim Peters20dab9f2001-09-04 05:31:47 +00002941}
2942
2943static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002944long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002945{
Tim Peters47e52ee2004-08-30 02:44:38 +00002946 PyLongObject *a, *b, *mod;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002947
2948 CONVERT_BINOP(v, w, &a, &b);
2949
Tim Peters47e52ee2004-08-30 02:44:38 +00002950 if (l_divmod(a, b, NULL, &mod) < 0)
2951 mod = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002952 Py_DECREF(a);
2953 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002954 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002955}
2956
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002957static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002958long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002959{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002960 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002961 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002962
2963 CONVERT_BINOP(v, w, &a, &b);
2964
2965 if (l_divmod(a, b, &div, &mod) < 0) {
2966 Py_DECREF(a);
2967 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002968 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002969 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002970 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002971 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002972 PyTuple_SetItem(z, 0, (PyObject *) div);
2973 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002974 }
2975 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002976 Py_DECREF(div);
2977 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002978 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002979 Py_DECREF(a);
2980 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002981 return z;
2982}
2983
Tim Peters47e52ee2004-08-30 02:44:38 +00002984/* pow(v, w, x) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002985static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002986long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002987{
Tim Peters47e52ee2004-08-30 02:44:38 +00002988 PyLongObject *a, *b, *c; /* a,b,c = v,w,x */
2989 int negativeOutput = 0; /* if x<0 return negative output */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002990
Tim Peters47e52ee2004-08-30 02:44:38 +00002991 PyLongObject *z = NULL; /* accumulated result */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002992 Py_ssize_t i, j, k; /* counters */
Tim Peters47e52ee2004-08-30 02:44:38 +00002993 PyLongObject *temp = NULL;
2994
2995 /* 5-ary values. If the exponent is large enough, table is
2996 * precomputed so that table[i] == a**i % c for i in range(32).
2997 */
2998 PyLongObject *table[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2999 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
3000
3001 /* a, b, c = v, w, x */
Neil Schemenauerba872e22001-01-04 01:46:03 +00003002 CONVERT_BINOP(v, w, &a, &b);
Tim Peters47e52ee2004-08-30 02:44:38 +00003003 if (PyLong_Check(x)) {
3004 c = (PyLongObject *)x;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003005 Py_INCREF(x);
3006 }
Tim Peters47e52ee2004-08-30 02:44:38 +00003007 else if (x == Py_None)
3008 c = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003009 else {
3010 Py_DECREF(a);
3011 Py_DECREF(b);
3012 Py_INCREF(Py_NotImplemented);
3013 return Py_NotImplemented;
3014 }
Tim Peters4c483c42001-09-05 06:24:58 +00003015
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003016 if (Py_Size(b) < 0) { /* if exponent is negative */
Tim Peters47e52ee2004-08-30 02:44:38 +00003017 if (c) {
Tim Peters4c483c42001-09-05 06:24:58 +00003018 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
Tim Peters47e52ee2004-08-30 02:44:38 +00003019 "cannot be negative when 3rd argument specified");
Tim Peterscd97da32004-08-30 02:58:59 +00003020 goto Error;
Tim Peters32f453e2001-09-03 08:35:41 +00003021 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00003022 else {
Tim Peters47e52ee2004-08-30 02:44:38 +00003023 /* else return a float. This works because we know
3024 that this calls float_pow() which converts its
3025 arguments to double. */
3026 Py_DECREF(a);
3027 Py_DECREF(b);
3028 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00003029 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00003030 }
Tim Peters47e52ee2004-08-30 02:44:38 +00003031
3032 if (c) {
3033 /* if modulus == 0:
3034 raise ValueError() */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003035 if (Py_Size(c) == 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00003036 PyErr_SetString(PyExc_ValueError,
3037 "pow() 3rd argument cannot be 0");
Tim Peterscd97da32004-08-30 02:58:59 +00003038 goto Error;
Tim Peters47e52ee2004-08-30 02:44:38 +00003039 }
3040
3041 /* if modulus < 0:
3042 negativeOutput = True
3043 modulus = -modulus */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003044 if (Py_Size(c) < 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00003045 negativeOutput = 1;
3046 temp = (PyLongObject *)_PyLong_Copy(c);
3047 if (temp == NULL)
3048 goto Error;
3049 Py_DECREF(c);
3050 c = temp;
3051 temp = NULL;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003052 NEGATE(c);
Tim Peters47e52ee2004-08-30 02:44:38 +00003053 }
3054
3055 /* if modulus == 1:
3056 return 0 */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003057 if ((Py_Size(c) == 1) && (c->ob_digit[0] == 1)) {
Tim Peters47e52ee2004-08-30 02:44:38 +00003058 z = (PyLongObject *)PyLong_FromLong(0L);
3059 goto Done;
3060 }
3061
3062 /* if base < 0:
3063 base = base % modulus
3064 Having the base positive just makes things easier. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003065 if (Py_Size(a) < 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00003066 if (l_divmod(a, c, NULL, &temp) < 0)
Tim Peterscd97da32004-08-30 02:58:59 +00003067 goto Error;
Tim Peters47e52ee2004-08-30 02:44:38 +00003068 Py_DECREF(a);
3069 a = temp;
3070 temp = NULL;
3071 }
3072 }
3073
3074 /* At this point a, b, and c are guaranteed non-negative UNLESS
3075 c is NULL, in which case a may be negative. */
3076
3077 z = (PyLongObject *)PyLong_FromLong(1L);
3078 if (z == NULL)
3079 goto Error;
3080
3081 /* Perform a modular reduction, X = X % c, but leave X alone if c
3082 * is NULL.
3083 */
3084#define REDUCE(X) \
3085 if (c != NULL) { \
3086 if (l_divmod(X, c, NULL, &temp) < 0) \
3087 goto Error; \
3088 Py_XDECREF(X); \
3089 X = temp; \
3090 temp = NULL; \
3091 }
3092
3093 /* Multiply two values, then reduce the result:
3094 result = X*Y % c. If c is NULL, skip the mod. */
3095#define MULT(X, Y, result) \
3096{ \
3097 temp = (PyLongObject *)long_mul(X, Y); \
3098 if (temp == NULL) \
3099 goto Error; \
3100 Py_XDECREF(result); \
3101 result = temp; \
3102 temp = NULL; \
3103 REDUCE(result) \
3104}
3105
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003106 if (Py_Size(b) <= FIVEARY_CUTOFF) {
Tim Peters47e52ee2004-08-30 02:44:38 +00003107 /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
3108 /* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003109 for (i = Py_Size(b) - 1; i >= 0; --i) {
Tim Peters47e52ee2004-08-30 02:44:38 +00003110 digit bi = b->ob_digit[i];
3111
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003112 for (j = 1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
Tim Peters47e52ee2004-08-30 02:44:38 +00003113 MULT(z, z, z)
3114 if (bi & j)
3115 MULT(z, a, z)
3116 }
3117 }
3118 }
3119 else {
3120 /* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */
3121 Py_INCREF(z); /* still holds 1L */
3122 table[0] = z;
3123 for (i = 1; i < 32; ++i)
3124 MULT(table[i-1], a, table[i])
3125
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003126 for (i = Py_Size(b) - 1; i >= 0; --i) {
Tim Peters47e52ee2004-08-30 02:44:38 +00003127 const digit bi = b->ob_digit[i];
3128
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003129 for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
Tim Peters47e52ee2004-08-30 02:44:38 +00003130 const int index = (bi >> j) & 0x1f;
3131 for (k = 0; k < 5; ++k)
3132 MULT(z, z, z)
3133 if (index)
3134 MULT(z, table[index], z)
3135 }
3136 }
3137 }
3138
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003139 if (negativeOutput && (Py_Size(z) != 0)) {
Tim Peters47e52ee2004-08-30 02:44:38 +00003140 temp = (PyLongObject *)long_sub(z, c);
3141 if (temp == NULL)
3142 goto Error;
3143 Py_DECREF(z);
3144 z = temp;
3145 temp = NULL;
3146 }
3147 goto Done;
3148
3149 Error:
3150 if (z != NULL) {
3151 Py_DECREF(z);
3152 z = NULL;
3153 }
3154 /* fall through */
3155 Done:
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003156 if (Py_Size(b) > FIVEARY_CUTOFF) {
Tim Peters47e52ee2004-08-30 02:44:38 +00003157 for (i = 0; i < 32; ++i)
3158 Py_XDECREF(table[i]);
3159 }
Tim Petersde7990b2005-07-17 23:45:23 +00003160 Py_DECREF(a);
3161 Py_DECREF(b);
3162 Py_XDECREF(c);
3163 Py_XDECREF(temp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003164 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003165}
3166
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003167static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003168long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003169{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003170 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003171 PyLongObject *x;
3172 PyLongObject *w;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003173 if (ABS(Py_Size(v)) <=1)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003174 return PyLong_FromLong(-(MEDIUM_VALUE(v)+1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003175 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003176 if (w == NULL)
3177 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003178 x = (PyLongObject *) long_add(v, w);
3179 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003180 if (x == NULL)
3181 return NULL;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003182 Py_Size(x) = -(Py_Size(x));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003183 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003184}
3185
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003186static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003187long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003188{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003189 PyLongObject *z;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003190 if (ABS(Py_Size(v)) <= 1)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003191 return PyLong_FromLong(-MEDIUM_VALUE(v));
Tim Peters69c2de32001-09-11 22:31:33 +00003192 z = (PyLongObject *)_PyLong_Copy(v);
3193 if (z != NULL)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003194 Py_Size(z) = -(Py_Size(v));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003195 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003196}
3197
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003198static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003199long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003200{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003201 if (Py_Size(v) < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003202 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00003203 else
Guido van Rossumb43daf72007-08-01 18:08:08 +00003204 return long_long((PyObject *)v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003205}
3206
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00003207static int
Jack Diederich4dafcc42006-11-28 19:15:13 +00003208long_bool(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00003209{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003210 return ABS(Py_Size(v)) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003211}
3212
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003213static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003214long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003215{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003216 PyLongObject *a, *b;
3217 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003218 long shiftby;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003219 Py_ssize_t newsize, wordshift, loshift, hishift, i, j;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003220 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003221
Neil Schemenauerba872e22001-01-04 01:46:03 +00003222 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
3223
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003224 if (Py_Size(a) < 0) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003225 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00003226 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003227 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003228 if (a1 == NULL)
3229 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003230 a2 = (PyLongObject *) long_rshift(a1, b);
3231 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003232 if (a2 == NULL)
3233 goto rshift_error;
3234 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003235 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003236 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00003237 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00003238
Neil Schemenauerba872e22001-01-04 01:46:03 +00003239 shiftby = PyLong_AsLong((PyObject *)b);
3240 if (shiftby == -1L && PyErr_Occurred())
3241 goto rshift_error;
3242 if (shiftby < 0) {
3243 PyErr_SetString(PyExc_ValueError,
3244 "negative shift count");
3245 goto rshift_error;
3246 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003247 wordshift = shiftby / PyLong_SHIFT;
3248 newsize = ABS(Py_Size(a)) - wordshift;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003249 if (newsize <= 0) {
3250 z = _PyLong_New(0);
3251 Py_DECREF(a);
3252 Py_DECREF(b);
3253 return (PyObject *)z;
3254 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003255 loshift = shiftby % PyLong_SHIFT;
3256 hishift = PyLong_SHIFT - loshift;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003257 lomask = ((digit)1 << hishift) - 1;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003258 himask = PyLong_MASK ^ lomask;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003259 z = _PyLong_New(newsize);
3260 if (z == NULL)
3261 goto rshift_error;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003262 if (Py_Size(a) < 0)
3263 Py_Size(z) = -(Py_Size(z));
Neil Schemenauerba872e22001-01-04 01:46:03 +00003264 for (i = 0, j = wordshift; i < newsize; i++, j++) {
3265 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
3266 if (i+1 < newsize)
3267 z->ob_digit[i] |=
3268 (a->ob_digit[j+1] << hishift) & himask;
3269 }
3270 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003271 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00003272rshift_error:
3273 Py_DECREF(a);
3274 Py_DECREF(b);
3275 return (PyObject *) z;
3276
Guido van Rossumc6913e71991-11-19 20:26:46 +00003277}
3278
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003279static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003280long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003281{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003282 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00003283 PyLongObject *a, *b;
3284 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003285 long shiftby;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003286 Py_ssize_t oldsize, newsize, wordshift, remshift, i, j;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003287 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003288
Neil Schemenauerba872e22001-01-04 01:46:03 +00003289 CONVERT_BINOP(v, w, &a, &b);
3290
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003291 shiftby = PyLong_AsLong((PyObject *)b);
3292 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00003293 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003294 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003295 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00003296 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003297 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003298 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003299 PyErr_SetString(PyExc_ValueError,
3300 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00003301 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003302 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003303 /* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
3304 wordshift = (int)shiftby / PyLong_SHIFT;
3305 remshift = (int)shiftby - wordshift * PyLong_SHIFT;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003306
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003307 oldsize = ABS(Py_Size(a));
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003308 newsize = oldsize + wordshift;
3309 if (remshift)
3310 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003311 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003312 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00003313 goto lshift_error;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003314 if (Py_Size(a) < 0)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003315 NEGATE(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003316 for (i = 0; i < wordshift; i++)
3317 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003318 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003319 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00003320 accum |= (twodigits)a->ob_digit[j] << remshift;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003321 z->ob_digit[i] = (digit)(accum & PyLong_MASK);
3322 accum >>= PyLong_SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003323 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003324 if (remshift)
3325 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003326 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003327 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003328 z = long_normalize(z);
3329lshift_error:
3330 Py_DECREF(a);
3331 Py_DECREF(b);
3332 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003333}
3334
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003335
3336/* Bitwise and/xor/or operations */
3337
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003338static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003339long_bitwise(PyLongObject *a,
3340 int op, /* '&', '|', '^' */
3341 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003342{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003343 digit maska, maskb; /* 0 or PyLong_MASK */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003344 int negz;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003345 Py_ssize_t size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003346 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003347 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00003348 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003349 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003350
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003351 if (Py_Size(a) < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003352 a = (PyLongObject *) long_invert(a);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003353 if (a == NULL)
3354 return NULL;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003355 maska = PyLong_MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003356 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003357 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003358 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003359 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00003360 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003361 if (Py_Size(b) < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003362 b = (PyLongObject *) long_invert(b);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003363 if (b == NULL) {
3364 Py_DECREF(a);
3365 return NULL;
3366 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003367 maskb = PyLong_MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003368 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003369 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003370 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003371 maskb = 0;
3372 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003373
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003374 negz = 0;
3375 switch (op) {
3376 case '^':
3377 if (maska != maskb) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003378 maska ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003379 negz = -1;
3380 }
3381 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00003382 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003383 if (maska && maskb) {
3384 op = '|';
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003385 maska ^= PyLong_MASK;
3386 maskb ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003387 negz = -1;
3388 }
3389 break;
3390 case '|':
3391 if (maska || maskb) {
3392 op = '&';
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003393 maska ^= PyLong_MASK;
3394 maskb ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003395 negz = -1;
3396 }
3397 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003398 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003399
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003400 /* JRH: The original logic here was to allocate the result value (z)
3401 as the longer of the two operands. However, there are some cases
3402 where the result is guaranteed to be shorter than that: AND of two
3403 positives, OR of two negatives: use the shorter number. AND with
3404 mixed signs: use the positive number. OR with mixed signs: use the
3405 negative number. After the transformations above, op will be '&'
3406 iff one of these cases applies, and mask will be non-0 for operands
3407 whose length should be ignored.
3408 */
3409
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003410 size_a = Py_Size(a);
3411 size_b = Py_Size(b);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003412 size_z = op == '&'
3413 ? (maska
3414 ? size_b
3415 : (maskb ? size_a : MIN(size_a, size_b)))
3416 : MAX(size_a, size_b);
3417 z = _PyLong_New(size_z);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003418 if (z == NULL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003419 Py_DECREF(a);
3420 Py_DECREF(b);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003421 return NULL;
3422 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003423
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003424 for (i = 0; i < size_z; ++i) {
3425 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
3426 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
3427 switch (op) {
3428 case '&': z->ob_digit[i] = diga & digb; break;
3429 case '|': z->ob_digit[i] = diga | digb; break;
3430 case '^': z->ob_digit[i] = diga ^ digb; break;
3431 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00003432 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003433
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003434 Py_DECREF(a);
3435 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003436 z = long_normalize(z);
3437 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003438 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003439 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003440 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003441 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003442}
3443
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003444static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003445long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003446{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003447 PyLongObject *a, *b;
3448 PyObject *c;
3449 CONVERT_BINOP(v, w, &a, &b);
3450 c = long_bitwise(a, '&', b);
3451 Py_DECREF(a);
3452 Py_DECREF(b);
3453 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003454}
3455
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003456static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003457long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003458{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003459 PyLongObject *a, *b;
3460 PyObject *c;
3461 CONVERT_BINOP(v, w, &a, &b);
3462 c = long_bitwise(a, '^', b);
3463 Py_DECREF(a);
3464 Py_DECREF(b);
3465 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003466}
3467
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003468static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003469long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003470{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003471 PyLongObject *a, *b;
3472 PyObject *c;
3473 CONVERT_BINOP(v, w, &a, &b);
3474 c = long_bitwise(a, '|', b);
3475 Py_DECREF(a);
3476 Py_DECREF(b);
3477 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00003478}
3479
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003480static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003481long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003482{
Brett Cannonc3647ac2005-04-26 03:45:26 +00003483 if (PyLong_CheckExact(v))
3484 Py_INCREF(v);
3485 else
3486 v = _PyLong_Copy((PyLongObject *)v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003487 return v;
3488}
3489
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003490static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003491long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003492{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00003493 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003494 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00003495 if (result == -1.0 && PyErr_Occurred())
3496 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003497 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003498}
3499
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003500static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00003501long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003502
Tim Peters6d6c1a32001-08-02 04:15:00 +00003503static PyObject *
3504long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3505{
3506 PyObject *x = NULL;
3507 int base = -909; /* unlikely! */
Martin v. Löwis15e62742006-02-27 16:46:16 +00003508 static char *kwlist[] = {"x", "base", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00003509
Guido van Rossumbef14172001-08-29 15:47:46 +00003510 if (type != &PyLong_Type)
3511 return long_subtype_new(type, args, kwds); /* Wimp out */
Guido van Rossumddefaf32007-01-14 03:31:43 +00003512 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
Tim Peters6d6c1a32001-08-02 04:15:00 +00003513 &x, &base))
3514 return NULL;
3515 if (x == NULL)
3516 return PyLong_FromLong(0L);
3517 if (base == -909)
3518 return PyNumber_Long(x);
Neal Norwitzed2b7392007-08-26 04:51:10 +00003519 else if (PyBytes_Check(x)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003520 /* Since PyLong_FromString doesn't have a length parameter,
3521 * check here for possible NULs in the string. */
Neal Norwitzed2b7392007-08-26 04:51:10 +00003522 char *string = PyBytes_AS_STRING(x);
3523 int size = PyBytes_GET_SIZE(x);
Guido van Rossum4581ae52007-05-22 21:56:47 +00003524 if (strlen(string) != size) {
Guido van Rossum25236212007-08-22 23:28:23 +00003525 /* We only see this if there's a null byte in x,
3526 x is a str8 or a bytes, *and* a base is given. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003527 PyErr_Format(PyExc_ValueError,
Guido van Rossum25236212007-08-22 23:28:23 +00003528 "invalid literal for int() with base %d: %R",
3529 base, x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003530 return NULL;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003531 }
Guido van Rossum4581ae52007-05-22 21:56:47 +00003532 return PyLong_FromString(string, NULL, base);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003533 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003534 else if (PyUnicode_Check(x))
3535 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
3536 PyUnicode_GET_SIZE(x),
3537 base);
3538 else {
3539 PyErr_SetString(PyExc_TypeError,
Guido van Rossumddefaf32007-01-14 03:31:43 +00003540 "int() can't convert non-string with explicit base");
Tim Peters6d6c1a32001-08-02 04:15:00 +00003541 return NULL;
3542 }
3543}
3544
Guido van Rossumbef14172001-08-29 15:47:46 +00003545/* Wimpy, slow approach to tp_new calls for subtypes of long:
3546 first create a regular long from whatever arguments we got,
3547 then allocate a subtype instance and initialize it from
3548 the regular long. The regular long is then thrown away.
3549*/
3550static PyObject *
3551long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3552{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003553 PyLongObject *tmp, *newobj;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003554 Py_ssize_t i, n;
Guido van Rossumbef14172001-08-29 15:47:46 +00003555
3556 assert(PyType_IsSubtype(type, &PyLong_Type));
3557 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
3558 if (tmp == NULL)
3559 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00003560 assert(PyLong_CheckExact(tmp));
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003561 n = Py_Size(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003562 if (n < 0)
3563 n = -n;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003564 newobj = (PyLongObject *)type->tp_alloc(type, n);
3565 if (newobj == NULL) {
Raymond Hettingerf4667932003-06-28 20:04:25 +00003566 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003567 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00003568 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003569 assert(PyLong_Check(newobj));
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003570 Py_Size(newobj) = Py_Size(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003571 for (i = 0; i < n; i++)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003572 newobj->ob_digit[i] = tmp->ob_digit[i];
Guido van Rossumbef14172001-08-29 15:47:46 +00003573 Py_DECREF(tmp);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003574 return (PyObject *)newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00003575}
3576
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003577static PyObject *
3578long_getnewargs(PyLongObject *v)
3579{
3580 return Py_BuildValue("(N)", _PyLong_Copy(v));
3581}
3582
Guido van Rossumb43daf72007-08-01 18:08:08 +00003583static PyObject *
3584long_getN(PyLongObject *v, void *context) {
3585 return PyLong_FromLong((intptr_t)context);
3586}
3587
Guido van Rossum2fa33db2007-08-23 22:07:24 +00003588static PyObject *
Eric Smith8c663262007-08-25 02:26:07 +00003589long__format__(PyObject *self, PyObject *args)
3590{
3591 /* when back porting this to 2.6, check type of the format_spec
3592 and call either unicode_long__format__ or
3593 string_long__format__ */
3594 return unicode_long__format__(self, args);
3595}
3596
3597
3598static PyObject *
Guido van Rossum2fa33db2007-08-23 22:07:24 +00003599long_round(PyObject *self, PyObject *args)
3600{
3601#define UNDEF_NDIGITS (-0x7fffffff) /* Unlikely ndigits value */
3602 int ndigits = UNDEF_NDIGITS;
3603 double x;
3604 PyObject *res;
3605
3606 if (!PyArg_ParseTuple(args, "|i", &ndigits))
3607 return NULL;
3608
3609 if (ndigits == UNDEF_NDIGITS)
3610 return long_long(self);
3611
3612 /* If called with two args, defer to float.__round__(). */
3613 x = PyLong_AsDouble(self);
3614 if (x == -1.0 && PyErr_Occurred())
3615 return NULL;
3616 self = PyFloat_FromDouble(x);
3617 if (self == NULL)
3618 return NULL;
3619 res = PyObject_CallMethod(self, "__round__", "i", ndigits);
3620 Py_DECREF(self);
3621 return res;
3622#undef UNDEF_NDIGITS
3623}
3624
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003625static PyMethodDef long_methods[] = {
Guido van Rossumb43daf72007-08-01 18:08:08 +00003626 {"conjugate", (PyCFunction)long_long, METH_NOARGS,
3627 "Returns self, the complex conjugate of any int."},
Guido van Rossum2fa33db2007-08-23 22:07:24 +00003628 {"__trunc__", (PyCFunction)long_long, METH_NOARGS,
3629 "Truncating an Integral returns itself."},
3630 {"__floor__", (PyCFunction)long_long, METH_NOARGS,
3631 "Flooring an Integral returns itself."},
3632 {"__ceil__", (PyCFunction)long_long, METH_NOARGS,
3633 "Ceiling of an Integral returns itself."},
3634 {"__round__", (PyCFunction)long_round, METH_VARARGS,
3635 "Rounding an Integral returns itself.\n"
3636 "Rounding with an ndigits arguments defers to float.__round__."},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003637 {"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
Eric Smith8c663262007-08-25 02:26:07 +00003638 {"__format__", (PyCFunction)long__format__, METH_VARARGS},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003639 {NULL, NULL} /* sentinel */
3640};
3641
Guido van Rossumb43daf72007-08-01 18:08:08 +00003642static PyGetSetDef long_getset[] = {
3643 {"real",
3644 (getter)long_long, (setter)NULL,
3645 "the real part of a complex number",
3646 NULL},
3647 {"imag",
3648 (getter)long_getN, (setter)NULL,
3649 "the imaginary part of a complex number",
3650 (void*)0},
3651 {"numerator",
3652 (getter)long_long, (setter)NULL,
3653 "the numerator of a rational number in lowest terms",
3654 NULL},
3655 {"denominator",
3656 (getter)long_getN, (setter)NULL,
3657 "the denominator of a rational number in lowest terms",
3658 (void*)1},
3659 {NULL} /* Sentinel */
3660};
3661
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003662PyDoc_STRVAR(long_doc,
Guido van Rossumddefaf32007-01-14 03:31:43 +00003663"int(x[, base]) -> integer\n\
Tim Peters6d6c1a32001-08-02 04:15:00 +00003664\n\
Guido van Rossumddefaf32007-01-14 03:31:43 +00003665Convert a string or number to an integer, if possible. A floating\n\
Tim Peters6d6c1a32001-08-02 04:15:00 +00003666point argument will be truncated towards zero (this does not include a\n\
3667string representation of a floating point number!) When converting a\n\
3668string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003669converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00003670
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003671static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00003672 (binaryfunc) long_add, /*nb_add*/
3673 (binaryfunc) long_sub, /*nb_subtract*/
3674 (binaryfunc) long_mul, /*nb_multiply*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003675 long_mod, /*nb_remainder*/
3676 long_divmod, /*nb_divmod*/
3677 long_pow, /*nb_power*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003678 (unaryfunc) long_neg, /*nb_negative*/
Guido van Rossumb43daf72007-08-01 18:08:08 +00003679 (unaryfunc) long_long, /*tp_positive*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003680 (unaryfunc) long_abs, /*tp_absolute*/
Jack Diederich4dafcc42006-11-28 19:15:13 +00003681 (inquiry) long_bool, /*tp_bool*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003682 (unaryfunc) long_invert, /*nb_invert*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003683 long_lshift, /*nb_lshift*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003684 (binaryfunc) long_rshift, /*nb_rshift*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003685 long_and, /*nb_and*/
3686 long_xor, /*nb_xor*/
3687 long_or, /*nb_or*/
Neal Norwitzca810462006-08-29 07:57:59 +00003688 0, /*nb_coerce*/
Guido van Rossumb43daf72007-08-01 18:08:08 +00003689 long_long, /*nb_int*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003690 long_long, /*nb_long*/
3691 long_float, /*nb_float*/
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003692 0, /*nb_oct*/ /* not used */
3693 0, /*nb_hex*/ /* not used */
Guido van Rossum4668b002001-08-08 05:00:18 +00003694 0, /* nb_inplace_add */
3695 0, /* nb_inplace_subtract */
3696 0, /* nb_inplace_multiply */
Guido van Rossum4668b002001-08-08 05:00:18 +00003697 0, /* nb_inplace_remainder */
3698 0, /* nb_inplace_power */
3699 0, /* nb_inplace_lshift */
3700 0, /* nb_inplace_rshift */
3701 0, /* nb_inplace_and */
3702 0, /* nb_inplace_xor */
3703 0, /* nb_inplace_or */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003704 long_div, /* nb_floor_divide */
Guido van Rossum4668b002001-08-08 05:00:18 +00003705 long_true_divide, /* nb_true_divide */
3706 0, /* nb_inplace_floor_divide */
3707 0, /* nb_inplace_true_divide */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003708 long_long, /* nb_index */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003709};
3710
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003711PyTypeObject PyLong_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003712 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003713 "int", /* tp_name */
3714 /* See _PyLong_New for why this isn't
3715 sizeof(PyLongObject) - sizeof(digit) */
3716 sizeof(PyVarObject), /* tp_basicsize */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003717 sizeof(digit), /* tp_itemsize */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003718 long_dealloc, /* tp_dealloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003719 0, /* tp_print */
3720 0, /* tp_getattr */
3721 0, /* tp_setattr */
Guido van Rossum47b9ff62006-08-24 00:41:19 +00003722 0, /* tp_compare */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003723 long_repr, /* tp_repr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003724 &long_as_number, /* tp_as_number */
3725 0, /* tp_as_sequence */
3726 0, /* tp_as_mapping */
3727 (hashfunc)long_hash, /* tp_hash */
3728 0, /* tp_call */
Guido van Rossumddefaf32007-01-14 03:31:43 +00003729 long_repr, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003730 PyObject_GenericGetAttr, /* tp_getattro */
3731 0, /* tp_setattro */
3732 0, /* tp_as_buffer */
Thomas Wouters27d517b2007-02-25 20:39:11 +00003733 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
3734 Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003735 long_doc, /* tp_doc */
3736 0, /* tp_traverse */
3737 0, /* tp_clear */
Guido van Rossum47b9ff62006-08-24 00:41:19 +00003738 long_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003739 0, /* tp_weaklistoffset */
3740 0, /* tp_iter */
3741 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003742 long_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003743 0, /* tp_members */
Guido van Rossumb43daf72007-08-01 18:08:08 +00003744 long_getset, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003745 0, /* tp_base */
3746 0, /* tp_dict */
3747 0, /* tp_descr_get */
3748 0, /* tp_descr_set */
3749 0, /* tp_dictoffset */
3750 0, /* tp_init */
3751 0, /* tp_alloc */
3752 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00003753 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003754};
Guido van Rossumddefaf32007-01-14 03:31:43 +00003755
3756int
3757_PyLong_Init(void)
3758{
3759#if NSMALLNEGINTS + NSMALLPOSINTS > 0
3760 int ival;
3761 PyLongObject *v = small_ints;
3762 for (ival = -NSMALLNEGINTS; ival < 0; ival++, v++) {
3763 PyObject_INIT(v, &PyLong_Type);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003764 Py_Size(v) = -1;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003765 v->ob_digit[0] = -ival;
3766 }
3767 for (; ival < NSMALLPOSINTS; ival++, v++) {
3768 PyObject_INIT(v, &PyLong_Type);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003769 Py_Size(v) = ival ? 1 : 0;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003770 v->ob_digit[0] = ival;
3771 }
3772#endif
3773 return 1;
3774}
3775
3776void
3777PyLong_Fini(void)
3778{
3779#if 0
3780 int i;
3781 /* This is currently not needed; the small integers
3782 are statically allocated */
3783#if NSMALLNEGINTS + NSMALLPOSINTS > 0
3784 PyIntObject **q;
3785
3786 i = NSMALLNEGINTS + NSMALLPOSINTS;
3787 q = small_ints;
3788 while (--i >= 0) {
3789 Py_XDECREF(*q);
3790 *q++ = NULL;
3791 }
3792#endif
3793#endif
3794}