blob: d49752f1c12e94a293977516cf2c48d0425dfac0 [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003/* Long (arbitrary precision) integer object implementation */
4
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00005/* XXX The functional organization of this file is terrible */
6
Guido van Rossumc0b618a1997-05-02 03:12:38 +00007#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00008#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00009
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000010#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011
Tim Peters5af4e6c2002-08-12 02:31:19 +000012/* For long multiplication, use the O(N**2) school algorithm unless
13 * both operands contain more than KARATSUBA_CUTOFF digits (this
Christian Heimes7f39c9f2008-01-25 12:18:43 +000014 * being an internal Python long digit, in base PyLong_BASE).
Tim Peters5af4e6c2002-08-12 02:31:19 +000015 */
Tim Peters0973b992004-08-29 22:16:50 +000016#define KARATSUBA_CUTOFF 70
17#define KARATSUBA_SQUARE_CUTOFF (2 * KARATSUBA_CUTOFF)
Tim Peters5af4e6c2002-08-12 02:31:19 +000018
Tim Peters47e52ee2004-08-30 02:44:38 +000019/* For exponentiation, use the binary left-to-right algorithm
20 * unless the exponent contains more than FIVEARY_CUTOFF digits.
21 * In that case, do 5 bits at a time. The potential drawback is that
22 * a table of 2**5 intermediate results is computed.
23 */
24#define FIVEARY_CUTOFF 8
25
Guido van Rossume32e0141992-01-19 16:31:05 +000026#define ABS(x) ((x) < 0 ? -(x) : (x))
27
Tim Peters5af4e6c2002-08-12 02:31:19 +000028#undef MIN
29#undef MAX
30#define MAX(x, y) ((x) < (y) ? (y) : (x))
31#define MIN(x, y) ((x) > (y) ? (y) : (x))
32
Guido van Rossume32e0141992-01-19 16:31:05 +000033/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000034static PyLongObject *long_normalize(PyLongObject *);
35static PyLongObject *mul1(PyLongObject *, wdigit);
36static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000037static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Guido van Rossume32e0141992-01-19 16:31:05 +000038
Guido van Rossumc0b618a1997-05-02 03:12:38 +000039#define SIGCHECK(PyTryBlock) \
Skip Montanarod581d772002-09-03 20:10:45 +000040 if (--_Py_Ticker < 0) { \
41 _Py_Ticker = _Py_CheckInterval; \
Tim Petersd89fc222006-05-25 22:28:46 +000042 if (PyErr_CheckSignals()) PyTryBlock \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000043 }
44
Guido van Rossumedcc38a1991-05-05 20:09:44 +000045/* Normalize (remove leading zeros from) a long int object.
46 Doesn't attempt to free the storage--in most cases, due to the nature
47 of the algorithms used, this could save at most be one word anyway. */
48
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000050long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000051{
Christian Heimese93237d2007-12-19 02:37:44 +000052 Py_ssize_t j = ABS(Py_SIZE(v));
Martin v. Löwis18e16552006-02-15 17:27:45 +000053 Py_ssize_t i = j;
Tim Peters5af4e6c2002-08-12 02:31:19 +000054
Guido van Rossumedcc38a1991-05-05 20:09:44 +000055 while (i > 0 && v->ob_digit[i-1] == 0)
56 --i;
57 if (i != j)
Christian Heimese93237d2007-12-19 02:37:44 +000058 Py_SIZE(v) = (Py_SIZE(v) < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000059 return v;
60}
61
62/* Allocate a new long int object with size digits.
63 Return NULL and set exception if we run out of memory. */
64
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065PyLongObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000066_PyLong_New(Py_ssize_t size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000067{
Neal Norwitzc6a989a2006-05-10 06:57:58 +000068 if (size > PY_SSIZE_T_MAX) {
Martin v. Löwis18e16552006-02-15 17:27:45 +000069 PyErr_NoMemory();
70 return NULL;
71 }
Christian Heimes4956d2b2008-01-18 19:12:56 +000072 /* coverity[ampersand_in_size] */
Neal Norwitze7d8be82008-07-31 17:17:14 +000073 /* XXX(nnorwitz): This can overflow --
74 PyObject_NEW_VAR / _PyObject_VAR_SIZE need to detect overflow */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000076}
77
Tim Peters64b5ce32001-09-10 20:52:51 +000078PyObject *
79_PyLong_Copy(PyLongObject *src)
80{
81 PyLongObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +000082 Py_ssize_t i;
Tim Peters64b5ce32001-09-10 20:52:51 +000083
84 assert(src != NULL);
85 i = src->ob_size;
86 if (i < 0)
87 i = -(i);
88 result = _PyLong_New(i);
89 if (result != NULL) {
Tim Peters5329cdb2002-03-02 04:18:04 +000090 result->ob_size = src->ob_size;
Tim Peters64b5ce32001-09-10 20:52:51 +000091 while (--i >= 0)
92 result->ob_digit[i] = src->ob_digit[i];
93 }
94 return (PyObject *)result;
95}
96
Guido van Rossumedcc38a1991-05-05 20:09:44 +000097/* Create a new long int object from a C long int */
98
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000100PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000101{
Tim Petersce9de2f2001-06-14 04:56:19 +0000102 PyLongObject *v;
Mark Dickinson27a63252008-04-15 20:51:18 +0000103 unsigned long abs_ival;
Tim Petersce9de2f2001-06-14 04:56:19 +0000104 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
105 int ndigits = 0;
106 int negative = 0;
107
108 if (ival < 0) {
Mark Dickinson27a63252008-04-15 20:51:18 +0000109 /* if LONG_MIN == -LONG_MAX-1 (true on most platforms) then
110 ANSI C says that the result of -ival is undefined when ival
111 == LONG_MIN. Hence the following workaround. */
112 abs_ival = (unsigned long)(-1-ival) + 1;
Tim Petersce9de2f2001-06-14 04:56:19 +0000113 negative = 1;
114 }
Mark Dickinson27a63252008-04-15 20:51:18 +0000115 else {
116 abs_ival = (unsigned long)ival;
117 }
Tim Petersce9de2f2001-06-14 04:56:19 +0000118
119 /* Count the number of Python digits.
120 We used to pick 5 ("big enough for anything"), but that's a
121 waste of time and space given that 5*15 = 75 bits are rarely
122 needed. */
Mark Dickinson27a63252008-04-15 20:51:18 +0000123 t = abs_ival;
Tim Petersce9de2f2001-06-14 04:56:19 +0000124 while (t) {
125 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000126 t >>= PyLong_SHIFT;
Tim Petersce9de2f2001-06-14 04:56:19 +0000127 }
128 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000129 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000130 digit *p = v->ob_digit;
131 v->ob_size = negative ? -ndigits : ndigits;
Mark Dickinson27a63252008-04-15 20:51:18 +0000132 t = abs_ival;
Tim Petersce9de2f2001-06-14 04:56:19 +0000133 while (t) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000134 *p++ = (digit)(t & PyLong_MASK);
135 t >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000136 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000137 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000139}
140
Guido van Rossum53756b11997-01-03 17:14:46 +0000141/* Create a new long int object from a C unsigned long int */
142
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000144PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000145{
Tim Petersce9de2f2001-06-14 04:56:19 +0000146 PyLongObject *v;
147 unsigned long t;
148 int ndigits = 0;
149
150 /* Count the number of Python digits. */
151 t = (unsigned long)ival;
152 while (t) {
153 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000154 t >>= PyLong_SHIFT;
Tim Petersce9de2f2001-06-14 04:56:19 +0000155 }
156 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000157 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000158 digit *p = v->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +0000159 Py_SIZE(v) = ndigits;
Tim Petersce9de2f2001-06-14 04:56:19 +0000160 while (ival) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000161 *p++ = (digit)(ival & PyLong_MASK);
162 ival >>= PyLong_SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000163 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000164 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000166}
167
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000168/* Create a new long int object from a C double */
169
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000172{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000174 double frac;
175 int i, ndig, expo, neg;
176 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000177 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000178 PyErr_SetString(PyExc_OverflowError,
Mark Dickinsonb6467572008-08-04 21:30:09 +0000179 "cannot convert float infinity to integer");
Guido van Rossum1a23c241999-09-27 17:11:52 +0000180 return NULL;
181 }
Christian Heimes8267d1d2008-01-04 00:37:34 +0000182 if (Py_IS_NAN(dval)) {
Mark Dickinsonb6467572008-08-04 21:30:09 +0000183 PyErr_SetString(PyExc_ValueError,
184 "cannot convert float NaN to integer");
185 return NULL;
Christian Heimes8267d1d2008-01-04 00:37:34 +0000186 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000187 if (dval < 0.0) {
188 neg = 1;
189 dval = -dval;
190 }
191 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
192 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 return PyLong_FromLong(0L);
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000194 ndig = (expo-1) / PyLong_SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000196 if (v == NULL)
197 return NULL;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000198 frac = ldexp(frac, (expo-1) % PyLong_SHIFT + 1);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000199 for (i = ndig; --i >= 0; ) {
200 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000201 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000202 frac = frac - (double)bits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000203 frac = ldexp(frac, PyLong_SHIFT);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000204 }
205 if (neg)
Christian Heimese93237d2007-12-19 02:37:44 +0000206 Py_SIZE(v) = -(Py_SIZE(v));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000208}
209
Armin Rigo7ccbca92006-10-04 12:17:45 +0000210/* Checking for overflow in PyLong_AsLong is a PITA since C doesn't define
211 * anything about what happens when a signed integer operation overflows,
212 * and some compilers think they're doing you a favor by being "clever"
213 * then. The bit pattern for the largest postive signed long is
214 * (unsigned long)LONG_MAX, and for the smallest negative signed long
215 * it is abs(LONG_MIN), which we could write -(unsigned long)LONG_MIN.
216 * However, some other compilers warn about applying unary minus to an
217 * unsigned operand. Hence the weird "0-".
218 */
219#define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN)
220#define PY_ABS_SSIZE_T_MIN (0-(size_t)PY_SSIZE_T_MIN)
221
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000222/* Get a C long int from a long int object.
223 Returns -1 and sets an error condition if overflow occurs. */
224
225long
Tim Peters9f688bf2000-07-07 15:53:28 +0000226PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000227{
Guido van Rossumf7531811998-05-26 14:33:37 +0000228 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000230 unsigned long x, prev;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000231 Py_ssize_t i;
232 int sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000233
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 if (vv == NULL || !PyLong_Check(vv)) {
Guido van Rossum7e35d572001-09-15 03:14:32 +0000235 if (vv != NULL && PyInt_Check(vv))
236 return PyInt_AsLong(vv);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000238 return -1;
239 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000241 i = v->ob_size;
242 sign = 1;
243 x = 0;
244 if (i < 0) {
245 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000246 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000247 }
248 while (--i >= 0) {
249 prev = x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000250 x = (x << PyLong_SHIFT) + v->ob_digit[i];
251 if ((x >> PyLong_SHIFT) != prev)
Guido van Rossumf7531811998-05-26 14:33:37 +0000252 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000253 }
Armin Rigo7ccbca92006-10-04 12:17:45 +0000254 /* Haven't lost any bits, but casting to long requires extra care
255 * (see comment above).
256 */
257 if (x <= (unsigned long)LONG_MAX) {
258 return (long)x * sign;
259 }
260 else if (sign < 0 && x == PY_ABS_LONG_MIN) {
261 return LONG_MIN;
262 }
263 /* else overflow */
Guido van Rossumf7531811998-05-26 14:33:37 +0000264
265 overflow:
266 PyErr_SetString(PyExc_OverflowError,
Skip Montanarobafedec2001-09-13 19:05:30 +0000267 "long int too large to convert to int");
Guido van Rossumf7531811998-05-26 14:33:37 +0000268 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000269}
270
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000271/* Get a Py_ssize_t from a long int object.
272 Returns -1 and sets an error condition if overflow occurs. */
273
274Py_ssize_t
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000275PyLong_AsSsize_t(PyObject *vv) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000276 register PyLongObject *v;
277 size_t x, prev;
278 Py_ssize_t i;
279 int sign;
280
281 if (vv == NULL || !PyLong_Check(vv)) {
282 PyErr_BadInternalCall();
283 return -1;
284 }
285 v = (PyLongObject *)vv;
286 i = v->ob_size;
287 sign = 1;
288 x = 0;
289 if (i < 0) {
290 sign = -1;
291 i = -(i);
292 }
293 while (--i >= 0) {
294 prev = x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000295 x = (x << PyLong_SHIFT) + v->ob_digit[i];
296 if ((x >> PyLong_SHIFT) != prev)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000297 goto overflow;
298 }
Armin Rigo7ccbca92006-10-04 12:17:45 +0000299 /* Haven't lost any bits, but casting to a signed type requires
300 * extra care (see comment above).
Martin v. Löwis18e16552006-02-15 17:27:45 +0000301 */
Armin Rigo7ccbca92006-10-04 12:17:45 +0000302 if (x <= (size_t)PY_SSIZE_T_MAX) {
303 return (Py_ssize_t)x * sign;
304 }
305 else if (sign < 0 && x == PY_ABS_SSIZE_T_MIN) {
306 return PY_SSIZE_T_MIN;
307 }
308 /* else overflow */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000309
310 overflow:
311 PyErr_SetString(PyExc_OverflowError,
312 "long int too large to convert to int");
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000313 return -1;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000314}
315
Guido van Rossumd8c80482002-08-13 00:24:58 +0000316/* Get a C unsigned long int from a long int object.
Guido van Rossum53756b11997-01-03 17:14:46 +0000317 Returns -1 and sets an error condition if overflow occurs. */
318
319unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000320PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000321{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000323 unsigned long x, prev;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324 Py_ssize_t i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000325
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326 if (vv == NULL || !PyLong_Check(vv)) {
Martin v. Löwis729d47d2004-09-20 06:17:46 +0000327 if (vv != NULL && PyInt_Check(vv)) {
328 long val = PyInt_AsLong(vv);
329 if (val < 0) {
330 PyErr_SetString(PyExc_OverflowError,
331 "can't convert negative value to unsigned long");
332 return (unsigned long) -1;
333 }
334 return val;
335 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000337 return (unsigned long) -1;
338 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 v = (PyLongObject *)vv;
Christian Heimese93237d2007-12-19 02:37:44 +0000340 i = Py_SIZE(v);
Guido van Rossum53756b11997-01-03 17:14:46 +0000341 x = 0;
342 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000344 "can't convert negative value to unsigned long");
345 return (unsigned long) -1;
346 }
347 while (--i >= 0) {
348 prev = x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000349 x = (x << PyLong_SHIFT) + v->ob_digit[i];
350 if ((x >> PyLong_SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000352 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000353 return (unsigned long) -1;
354 }
355 }
356 return x;
357}
358
Thomas Hellera4ea6032003-04-17 18:55:45 +0000359/* Get a C unsigned long int from a long int object, ignoring the high bits.
360 Returns -1 and sets an error condition if an error occurs. */
361
362unsigned long
363PyLong_AsUnsignedLongMask(PyObject *vv)
364{
365 register PyLongObject *v;
366 unsigned long x;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000367 Py_ssize_t i;
368 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000369
370 if (vv == NULL || !PyLong_Check(vv)) {
Martin v. Löwis729d47d2004-09-20 06:17:46 +0000371 if (vv != NULL && PyInt_Check(vv))
372 return PyInt_AsUnsignedLongMask(vv);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000373 PyErr_BadInternalCall();
374 return (unsigned long) -1;
375 }
376 v = (PyLongObject *)vv;
377 i = v->ob_size;
378 sign = 1;
379 x = 0;
380 if (i < 0) {
381 sign = -1;
382 i = -i;
383 }
384 while (--i >= 0) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000385 x = (x << PyLong_SHIFT) + v->ob_digit[i];
Thomas Hellera4ea6032003-04-17 18:55:45 +0000386 }
387 return x * sign;
388}
389
Tim Peters5b8132f2003-01-31 15:52:05 +0000390int
391_PyLong_Sign(PyObject *vv)
392{
393 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000394
395 assert(v != NULL);
396 assert(PyLong_Check(v));
Tim Peters5b8132f2003-01-31 15:52:05 +0000397
Christian Heimese93237d2007-12-19 02:37:44 +0000398 return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1);
Tim Peters5b8132f2003-01-31 15:52:05 +0000399}
400
Tim Petersbaefd9e2003-01-28 20:37:45 +0000401size_t
402_PyLong_NumBits(PyObject *vv)
403{
404 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000405 size_t result = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000406 Py_ssize_t ndigits;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000407
408 assert(v != NULL);
409 assert(PyLong_Check(v));
Christian Heimese93237d2007-12-19 02:37:44 +0000410 ndigits = ABS(Py_SIZE(v));
Tim Petersbaefd9e2003-01-28 20:37:45 +0000411 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
412 if (ndigits > 0) {
Tim Petersbaefd9e2003-01-28 20:37:45 +0000413 digit msd = v->ob_digit[ndigits - 1];
414
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000415 result = (ndigits - 1) * PyLong_SHIFT;
416 if (result / PyLong_SHIFT != (size_t)(ndigits - 1))
Tim Petersbaefd9e2003-01-28 20:37:45 +0000417 goto Overflow;
418 do {
419 ++result;
420 if (result == 0)
421 goto Overflow;
422 msd >>= 1;
423 } while (msd);
424 }
425 return result;
426
427Overflow:
428 PyErr_SetString(PyExc_OverflowError, "long has too many bits "
429 "to express in a platform size_t");
430 return (size_t)-1;
431}
432
Tim Peters2a9b3672001-06-11 21:23:58 +0000433PyObject *
434_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
435 int little_endian, int is_signed)
436{
437 const unsigned char* pstartbyte;/* LSB of bytes */
438 int incr; /* direction to move pstartbyte */
439 const unsigned char* pendbyte; /* MSB of bytes */
440 size_t numsignificantbytes; /* number of bytes that matter */
441 size_t ndigits; /* number of Python long digits */
442 PyLongObject* v; /* result */
443 int idigit = 0; /* next free index in v->ob_digit */
444
445 if (n == 0)
446 return PyLong_FromLong(0L);
447
448 if (little_endian) {
449 pstartbyte = bytes;
450 pendbyte = bytes + n - 1;
451 incr = 1;
452 }
453 else {
454 pstartbyte = bytes + n - 1;
455 pendbyte = bytes;
456 incr = -1;
457 }
458
459 if (is_signed)
460 is_signed = *pendbyte >= 0x80;
461
462 /* Compute numsignificantbytes. This consists of finding the most
463 significant byte. Leading 0 bytes are insignficant if the number
464 is positive, and leading 0xff bytes if negative. */
465 {
466 size_t i;
467 const unsigned char* p = pendbyte;
468 const int pincr = -incr; /* search MSB to LSB */
469 const unsigned char insignficant = is_signed ? 0xff : 0x00;
470
471 for (i = 0; i < n; ++i, p += pincr) {
472 if (*p != insignficant)
473 break;
474 }
475 numsignificantbytes = n - i;
476 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
477 actually has 2 significant bytes. OTOH, 0xff0001 ==
478 -0x00ffff, so we wouldn't *need* to bump it there; but we
479 do for 0xffff = -0x0001. To be safe without bothering to
480 check every case, bump it regardless. */
481 if (is_signed && numsignificantbytes < n)
482 ++numsignificantbytes;
483 }
484
485 /* How many Python long digits do we need? We have
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000486 8*numsignificantbytes bits, and each Python long digit has PyLong_SHIFT
Tim Peters2a9b3672001-06-11 21:23:58 +0000487 bits, so it's the ceiling of the quotient. */
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000488 ndigits = (numsignificantbytes * 8 + PyLong_SHIFT - 1) / PyLong_SHIFT;
Tim Peters2a9b3672001-06-11 21:23:58 +0000489 if (ndigits > (size_t)INT_MAX)
490 return PyErr_NoMemory();
491 v = _PyLong_New((int)ndigits);
492 if (v == NULL)
493 return NULL;
494
495 /* Copy the bits over. The tricky parts are computing 2's-comp on
496 the fly for signed numbers, and dealing with the mismatch between
497 8-bit bytes and (probably) 15-bit Python digits.*/
498 {
499 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000500 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000501 twodigits accum = 0; /* sliding register */
502 unsigned int accumbits = 0; /* number of bits in accum */
503 const unsigned char* p = pstartbyte;
504
505 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000506 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000507 /* Compute correction for 2's comp, if needed. */
508 if (is_signed) {
509 thisbyte = (0xff ^ thisbyte) + carry;
510 carry = thisbyte >> 8;
511 thisbyte &= 0xff;
512 }
513 /* Because we're going LSB to MSB, thisbyte is
514 more significant than what's already in accum,
515 so needs to be prepended to accum. */
Mark Dickinson76eb7892009-01-24 15:42:34 +0000516 accum |= (twodigits)thisbyte << accumbits;
Tim Peters2a9b3672001-06-11 21:23:58 +0000517 accumbits += 8;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000518 if (accumbits >= PyLong_SHIFT) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000519 /* There's enough to fill a Python digit. */
520 assert(idigit < (int)ndigits);
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000521 v->ob_digit[idigit] = (digit)(accum & PyLong_MASK);
Tim Peters2a9b3672001-06-11 21:23:58 +0000522 ++idigit;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000523 accum >>= PyLong_SHIFT;
524 accumbits -= PyLong_SHIFT;
525 assert(accumbits < PyLong_SHIFT);
Tim Peters2a9b3672001-06-11 21:23:58 +0000526 }
527 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000528 assert(accumbits < PyLong_SHIFT);
Tim Peters2a9b3672001-06-11 21:23:58 +0000529 if (accumbits) {
530 assert(idigit < (int)ndigits);
531 v->ob_digit[idigit] = (digit)accum;
532 ++idigit;
533 }
534 }
535
Christian Heimese93237d2007-12-19 02:37:44 +0000536 Py_SIZE(v) = is_signed ? -idigit : idigit;
Tim Peters2a9b3672001-06-11 21:23:58 +0000537 return (PyObject *)long_normalize(v);
538}
539
540int
541_PyLong_AsByteArray(PyLongObject* v,
542 unsigned char* bytes, size_t n,
543 int little_endian, int is_signed)
544{
Mark Dickinson76eb7892009-01-24 15:42:34 +0000545 Py_ssize_t i; /* index into v->ob_digit */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000546 Py_ssize_t ndigits; /* |v->ob_size| */
Tim Peters2a9b3672001-06-11 21:23:58 +0000547 twodigits accum; /* sliding register */
548 unsigned int accumbits; /* # bits in accum */
549 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
Mark Dickinsone72bab32009-01-25 22:20:39 +0000550 digit carry; /* for computing 2's-comp */
Tim Peters2a9b3672001-06-11 21:23:58 +0000551 size_t j; /* # bytes filled */
552 unsigned char* p; /* pointer to next byte in bytes */
553 int pincr; /* direction to move p */
554
555 assert(v != NULL && PyLong_Check(v));
556
Christian Heimese93237d2007-12-19 02:37:44 +0000557 if (Py_SIZE(v) < 0) {
558 ndigits = -(Py_SIZE(v));
Tim Peters2a9b3672001-06-11 21:23:58 +0000559 if (!is_signed) {
560 PyErr_SetString(PyExc_TypeError,
561 "can't convert negative long to unsigned");
562 return -1;
563 }
564 do_twos_comp = 1;
565 }
566 else {
Christian Heimese93237d2007-12-19 02:37:44 +0000567 ndigits = Py_SIZE(v);
Tim Peters2a9b3672001-06-11 21:23:58 +0000568 do_twos_comp = 0;
569 }
570
571 if (little_endian) {
572 p = bytes;
573 pincr = 1;
574 }
575 else {
576 p = bytes + n - 1;
577 pincr = -1;
578 }
579
Tim Peters898cf852001-06-13 20:50:08 +0000580 /* Copy over all the Python digits.
581 It's crucial that every Python digit except for the MSD contribute
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000582 exactly PyLong_SHIFT bits to the total, so first assert that the long is
Tim Peters898cf852001-06-13 20:50:08 +0000583 normalized. */
584 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000585 j = 0;
586 accum = 0;
587 accumbits = 0;
588 carry = do_twos_comp ? 1 : 0;
589 for (i = 0; i < ndigits; ++i) {
Mark Dickinson76eb7892009-01-24 15:42:34 +0000590 digit thisdigit = v->ob_digit[i];
Tim Peters2a9b3672001-06-11 21:23:58 +0000591 if (do_twos_comp) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000592 thisdigit = (thisdigit ^ PyLong_MASK) + carry;
593 carry = thisdigit >> PyLong_SHIFT;
594 thisdigit &= PyLong_MASK;
Tim Peters2a9b3672001-06-11 21:23:58 +0000595 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000596 /* Because we're going LSB to MSB, thisdigit is more
597 significant than what's already in accum, so needs to be
598 prepended to accum. */
Mark Dickinson76eb7892009-01-24 15:42:34 +0000599 accum |= (twodigits)thisdigit << accumbits;
Tim Peters8bc84b42001-06-12 19:17:03 +0000600
Tim Petersede05092001-06-14 08:53:38 +0000601 /* The most-significant digit may be (probably is) at least
602 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000603 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000604 /* Count # of sign bits -- they needn't be stored,
605 * although for signed conversion we need later to
Mark Dickinson76eb7892009-01-24 15:42:34 +0000606 * make sure at least one sign bit gets stored. */
607 digit s = do_twos_comp ? thisdigit ^ PyLong_MASK :
608 thisdigit;
609 while (s != 0) {
610 s >>= 1;
611 accumbits++;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000612 }
Tim Peters7a3bfc32001-06-12 01:22:22 +0000613 }
Mark Dickinson76eb7892009-01-24 15:42:34 +0000614 else
615 accumbits += PyLong_SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000616
Tim Peters2a9b3672001-06-11 21:23:58 +0000617 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000618 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000619 if (j >= n)
620 goto Overflow;
621 ++j;
622 *p = (unsigned char)(accum & 0xff);
623 p += pincr;
624 accumbits -= 8;
625 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000626 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000627 }
628
629 /* Store the straggler (if any). */
630 assert(accumbits < 8);
631 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000632 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000633 if (j >= n)
634 goto Overflow;
635 ++j;
636 if (do_twos_comp) {
637 /* Fill leading bits of the byte with sign bits
638 (appropriately pretending that the long had an
639 infinite supply of sign bits). */
640 accum |= (~(twodigits)0) << accumbits;
641 }
642 *p = (unsigned char)(accum & 0xff);
643 p += pincr;
644 }
Tim Peters05607ad2001-06-13 21:01:27 +0000645 else if (j == n && n > 0 && is_signed) {
646 /* The main loop filled the byte array exactly, so the code
647 just above didn't get to ensure there's a sign bit, and the
648 loop below wouldn't add one either. Make sure a sign bit
649 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000650 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000651 int sign_bit_set = msb >= 0x80;
652 assert(accumbits == 0);
653 if (sign_bit_set == do_twos_comp)
654 return 0;
655 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000656 goto Overflow;
657 }
Tim Peters05607ad2001-06-13 21:01:27 +0000658
659 /* Fill remaining bytes with copies of the sign bit. */
660 {
661 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
662 for ( ; j < n; ++j, p += pincr)
663 *p = signbyte;
664 }
665
Tim Peters2a9b3672001-06-11 21:23:58 +0000666 return 0;
667
668Overflow:
669 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
670 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000671
Tim Peters2a9b3672001-06-11 21:23:58 +0000672}
673
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000674double
675_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
676{
677/* NBITS_WANTED should be > the number of bits in a double's precision,
678 but small enough so that 2**NBITS_WANTED is within the normal double
679 range. nbitsneeded is set to 1 less than that because the most-significant
680 Python digit contains at least 1 significant bit, but we don't want to
681 bother counting them (catering to the worst case cheaply).
682
683 57 is one more than VAX-D double precision; I (Tim) don't know of a double
684 format with more precision than that; it's 1 larger so that we add in at
685 least one round bit to stand in for the ignored least-significant bits.
686*/
687#define NBITS_WANTED 57
688 PyLongObject *v;
689 double x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000690 const double multiplier = (double)(1L << PyLong_SHIFT);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000691 Py_ssize_t i;
692 int sign;
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000693 int nbitsneeded;
694
695 if (vv == NULL || !PyLong_Check(vv)) {
696 PyErr_BadInternalCall();
697 return -1;
698 }
699 v = (PyLongObject *)vv;
Christian Heimese93237d2007-12-19 02:37:44 +0000700 i = Py_SIZE(v);
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000701 sign = 1;
702 if (i < 0) {
703 sign = -1;
704 i = -(i);
705 }
706 else if (i == 0) {
707 *exponent = 0;
708 return 0.0;
709 }
710 --i;
711 x = (double)v->ob_digit[i];
712 nbitsneeded = NBITS_WANTED - 1;
713 /* Invariant: i Python digits remain unaccounted for. */
714 while (i > 0 && nbitsneeded > 0) {
715 --i;
716 x = x * multiplier + (double)v->ob_digit[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000717 nbitsneeded -= PyLong_SHIFT;
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000718 }
719 /* There are i digits we didn't shift in. Pretending they're all
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000720 zeroes, the true value is x * 2**(i*PyLong_SHIFT). */
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000721 *exponent = i;
722 assert(x > 0.0);
723 return x * sign;
724#undef NBITS_WANTED
725}
726
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000727/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000728
729double
Tim Peters9f688bf2000-07-07 15:53:28 +0000730PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000731{
Thomas Wouters553489a2006-02-01 21:32:04 +0000732 int e = -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000733 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000734
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 if (vv == NULL || !PyLong_Check(vv)) {
736 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000737 return -1;
738 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000739 x = _PyLong_AsScaledDouble(vv, &e);
740 if (x == -1.0 && PyErr_Occurred())
741 return -1.0;
Thomas Wouters553489a2006-02-01 21:32:04 +0000742 /* 'e' initialized to -1 to silence gcc-4.0.x, but it should be
743 set correctly after a successful _PyLong_AsScaledDouble() call */
744 assert(e >= 0);
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000745 if (e > INT_MAX / PyLong_SHIFT)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000746 goto overflow;
747 errno = 0;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000748 x = ldexp(x, e * PyLong_SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000749 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000750 goto overflow;
751 return x;
752
753overflow:
754 PyErr_SetString(PyExc_OverflowError,
755 "long int too large to convert to float");
756 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000757}
758
Guido van Rossum78694d91998-09-18 14:14:13 +0000759/* Create a new long (or int) object from a C pointer */
760
761PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000762PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000763{
Tim Peters70128a12001-06-16 08:48:40 +0000764#if SIZEOF_VOID_P <= SIZEOF_LONG
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000765 if ((long)p < 0)
766 return PyLong_FromUnsignedLong((unsigned long)p);
Guido van Rossum78694d91998-09-18 14:14:13 +0000767 return PyInt_FromLong((long)p);
768#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000769
Tim Peters70128a12001-06-16 08:48:40 +0000770#ifndef HAVE_LONG_LONG
771# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
772#endif
773#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000774# error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000775#endif
776 /* optimize null pointers */
777 if (p == NULL)
778 return PyInt_FromLong(0);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000779 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000780
781#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000782}
783
784/* Get a C pointer from a long object (or an int object in some cases) */
785
786void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000787PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000788{
789 /* This function will allow int or long objects. If vv is neither,
790 then the PyLong_AsLong*() functions will raise the exception:
791 PyExc_SystemError, "bad argument to internal function"
792 */
Tim Peters70128a12001-06-16 08:48:40 +0000793#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000794 long x;
795
Tim Peters70128a12001-06-16 08:48:40 +0000796 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000797 x = PyInt_AS_LONG(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000798 else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
Guido van Rossum78694d91998-09-18 14:14:13 +0000799 x = PyLong_AsLong(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000800 else
801 x = PyLong_AsUnsignedLong(vv);
Guido van Rossum78694d91998-09-18 14:14:13 +0000802#else
Tim Peters70128a12001-06-16 08:48:40 +0000803
804#ifndef HAVE_LONG_LONG
805# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
806#endif
807#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000808# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000809#endif
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000810 PY_LONG_LONG x;
Guido van Rossum78694d91998-09-18 14:14:13 +0000811
Tim Peters70128a12001-06-16 08:48:40 +0000812 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000813 x = PyInt_AS_LONG(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000814 else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
Guido van Rossum78694d91998-09-18 14:14:13 +0000815 x = PyLong_AsLongLong(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000816 else
817 x = PyLong_AsUnsignedLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000818
819#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000820
821 if (x == -1 && PyErr_Occurred())
822 return NULL;
823 return (void *)x;
824}
825
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000826#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000827
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000828/* Initial PY_LONG_LONG support by Chris Herborth (chrish@qnx.com), later
Tim Petersd1a7da62001-06-13 00:35:57 +0000829 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000830 */
831
Tim Peterscf37dfc2001-06-14 18:42:50 +0000832#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000833
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000834/* Create a new long int object from a C PY_LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000835
836PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000837PyLong_FromLongLong(PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000838{
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000839 PyLongObject *v;
Mark Dickinson27a63252008-04-15 20:51:18 +0000840 unsigned PY_LONG_LONG abs_ival;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000841 unsigned PY_LONG_LONG t; /* unsigned so >> doesn't propagate sign bit */
842 int ndigits = 0;
843 int negative = 0;
844
845 if (ival < 0) {
Mark Dickinson27a63252008-04-15 20:51:18 +0000846 /* avoid signed overflow on negation; see comments
847 in PyLong_FromLong above. */
848 abs_ival = (unsigned PY_LONG_LONG)(-1-ival) + 1;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000849 negative = 1;
850 }
Mark Dickinson27a63252008-04-15 20:51:18 +0000851 else {
852 abs_ival = (unsigned PY_LONG_LONG)ival;
853 }
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000854
855 /* Count the number of Python digits.
856 We used to pick 5 ("big enough for anything"), but that's a
857 waste of time and space given that 5*15 = 75 bits are rarely
858 needed. */
Mark Dickinson27a63252008-04-15 20:51:18 +0000859 t = abs_ival;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000860 while (t) {
861 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000862 t >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000863 }
864 v = _PyLong_New(ndigits);
865 if (v != NULL) {
866 digit *p = v->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +0000867 Py_SIZE(v) = negative ? -ndigits : ndigits;
Mark Dickinson27a63252008-04-15 20:51:18 +0000868 t = abs_ival;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000869 while (t) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000870 *p++ = (digit)(t & PyLong_MASK);
871 t >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000872 }
873 }
874 return (PyObject *)v;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000875}
876
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000877/* Create a new long int object from a C unsigned PY_LONG_LONG int. */
Tim Petersd1a7da62001-06-13 00:35:57 +0000878
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000879PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000880PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000881{
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000882 PyLongObject *v;
883 unsigned PY_LONG_LONG t;
884 int ndigits = 0;
885
886 /* Count the number of Python digits. */
887 t = (unsigned PY_LONG_LONG)ival;
888 while (t) {
889 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000890 t >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000891 }
892 v = _PyLong_New(ndigits);
893 if (v != NULL) {
894 digit *p = v->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +0000895 Py_SIZE(v) = ndigits;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000896 while (ival) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000897 *p++ = (digit)(ival & PyLong_MASK);
898 ival >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000899 }
900 }
901 return (PyObject *)v;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000902}
903
Martin v. Löwis18e16552006-02-15 17:27:45 +0000904/* Create a new long int object from a C Py_ssize_t. */
905
906PyObject *
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000907PyLong_FromSsize_t(Py_ssize_t ival)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000908{
909 Py_ssize_t bytes = ival;
910 int one = 1;
911 return _PyLong_FromByteArray(
912 (unsigned char *)&bytes,
Kristján Valur Jónssonf0303942007-05-03 20:27:03 +0000913 SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 1);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000914}
915
916/* Create a new long int object from a C size_t. */
917
918PyObject *
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000919PyLong_FromSize_t(size_t ival)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000920{
921 size_t bytes = ival;
922 int one = 1;
923 return _PyLong_FromByteArray(
924 (unsigned char *)&bytes,
925 SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0);
926}
927
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000928/* Get a C PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000929 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000930
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000931PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000932PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000933{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000934 PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +0000935 int one = 1;
936 int res;
937
Tim Petersd38b1c72001-09-30 05:09:37 +0000938 if (vv == NULL) {
939 PyErr_BadInternalCall();
940 return -1;
941 }
942 if (!PyLong_Check(vv)) {
Martin v. Löwis6ce7ed22005-03-03 12:26:35 +0000943 PyNumberMethods *nb;
944 PyObject *io;
Tim Petersd38b1c72001-09-30 05:09:37 +0000945 if (PyInt_Check(vv))
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000946 return (PY_LONG_LONG)PyInt_AsLong(vv);
Martin v. Löwis6ce7ed22005-03-03 12:26:35 +0000947 if ((nb = vv->ob_type->tp_as_number) == NULL ||
948 nb->nb_int == NULL) {
949 PyErr_SetString(PyExc_TypeError, "an integer is required");
950 return -1;
951 }
952 io = (*nb->nb_int) (vv);
953 if (io == NULL)
954 return -1;
955 if (PyInt_Check(io)) {
956 bytes = PyInt_AsLong(io);
957 Py_DECREF(io);
958 return bytes;
959 }
960 if (PyLong_Check(io)) {
961 bytes = PyLong_AsLongLong(io);
962 Py_DECREF(io);
963 return bytes;
964 }
965 Py_DECREF(io);
966 PyErr_SetString(PyExc_TypeError, "integer conversion failed");
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000967 return -1;
968 }
969
Tim Petersd1a7da62001-06-13 00:35:57 +0000970 res = _PyLong_AsByteArray(
971 (PyLongObject *)vv, (unsigned char *)&bytes,
972 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000973
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000974 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000975 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000976 return (PY_LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000977 else
978 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000979}
980
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000981/* Get a C unsigned PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000982 Return -1 and set an error if overflow occurs. */
983
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000984unsigned PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000985PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000986{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000987 unsigned PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +0000988 int one = 1;
989 int res;
990
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000991 if (vv == NULL || !PyLong_Check(vv)) {
992 PyErr_BadInternalCall();
Skip Montanaro429433b2006-04-18 00:35:43 +0000993 return (unsigned PY_LONG_LONG)-1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000994 }
995
Tim Petersd1a7da62001-06-13 00:35:57 +0000996 res = _PyLong_AsByteArray(
997 (PyLongObject *)vv, (unsigned char *)&bytes,
998 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000999
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001000 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +00001001 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001002 return (unsigned PY_LONG_LONG)res;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +00001003 else
1004 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001005}
Tim Petersd1a7da62001-06-13 00:35:57 +00001006
Thomas Hellera4ea6032003-04-17 18:55:45 +00001007/* Get a C unsigned long int from a long int object, ignoring the high bits.
1008 Returns -1 and sets an error condition if an error occurs. */
1009
1010unsigned PY_LONG_LONG
1011PyLong_AsUnsignedLongLongMask(PyObject *vv)
1012{
1013 register PyLongObject *v;
1014 unsigned PY_LONG_LONG x;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001015 Py_ssize_t i;
1016 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001017
1018 if (vv == NULL || !PyLong_Check(vv)) {
1019 PyErr_BadInternalCall();
1020 return (unsigned long) -1;
1021 }
1022 v = (PyLongObject *)vv;
1023 i = v->ob_size;
1024 sign = 1;
1025 x = 0;
1026 if (i < 0) {
1027 sign = -1;
1028 i = -i;
1029 }
1030 while (--i >= 0) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001031 x = (x << PyLong_SHIFT) + v->ob_digit[i];
Thomas Hellera4ea6032003-04-17 18:55:45 +00001032 }
1033 return x * sign;
1034}
Tim Petersd1a7da62001-06-13 00:35:57 +00001035#undef IS_LITTLE_ENDIAN
1036
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001037#endif /* HAVE_LONG_LONG */
1038
Neil Schemenauerba872e22001-01-04 01:46:03 +00001039
1040static int
1041convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001042 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001043 *a = (PyLongObject *) v;
1044 Py_INCREF(v);
1045 }
1046 else if (PyInt_Check(v)) {
1047 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
1048 }
1049 else {
1050 return 0;
1051 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001052 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001053 *b = (PyLongObject *) w;
1054 Py_INCREF(w);
1055 }
1056 else if (PyInt_Check(w)) {
1057 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
1058 }
1059 else {
1060 Py_DECREF(*a);
1061 return 0;
1062 }
1063 return 1;
1064}
1065
1066#define CONVERT_BINOP(v, w, a, b) \
1067 if (!convert_binop(v, w, a, b)) { \
1068 Py_INCREF(Py_NotImplemented); \
1069 return Py_NotImplemented; \
1070 }
1071
Tim Peters877a2122002-08-12 05:09:36 +00001072/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
1073 * is modified in place, by adding y to it. Carries are propagated as far as
1074 * x[m-1], and the remaining carry (0 or 1) is returned.
1075 */
1076static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001077v_iadd(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
Tim Peters877a2122002-08-12 05:09:36 +00001078{
Mark Dickinson76eb7892009-01-24 15:42:34 +00001079 Py_ssize_t i;
Tim Peters877a2122002-08-12 05:09:36 +00001080 digit carry = 0;
1081
1082 assert(m >= n);
1083 for (i = 0; i < n; ++i) {
1084 carry += x[i] + y[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001085 x[i] = carry & PyLong_MASK;
1086 carry >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001087 assert((carry & 1) == carry);
1088 }
1089 for (; carry && i < m; ++i) {
1090 carry += x[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001091 x[i] = carry & PyLong_MASK;
1092 carry >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001093 assert((carry & 1) == carry);
1094 }
1095 return carry;
1096}
1097
1098/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
1099 * is modified in place, by subtracting y from it. Borrows are propagated as
1100 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
1101 */
1102static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001103v_isub(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
Tim Peters877a2122002-08-12 05:09:36 +00001104{
Mark Dickinson76eb7892009-01-24 15:42:34 +00001105 Py_ssize_t i;
Tim Peters877a2122002-08-12 05:09:36 +00001106 digit borrow = 0;
1107
1108 assert(m >= n);
1109 for (i = 0; i < n; ++i) {
1110 borrow = x[i] - y[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001111 x[i] = borrow & PyLong_MASK;
1112 borrow >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001113 borrow &= 1; /* keep only 1 sign bit */
1114 }
1115 for (; borrow && i < m; ++i) {
1116 borrow = x[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001117 x[i] = borrow & PyLong_MASK;
1118 borrow >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001119 borrow &= 1;
1120 }
1121 return borrow;
1122}
Neil Schemenauerba872e22001-01-04 01:46:03 +00001123
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001124/* Multiply by a single digit, ignoring the sign. */
1125
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001127mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001128{
1129 return muladd1(a, n, (digit)0);
1130}
1131
1132/* Multiply by a single digit and add a single digit, ignoring the sign. */
1133
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001134static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001135muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001136{
Christian Heimese93237d2007-12-19 02:37:44 +00001137 Py_ssize_t size_a = ABS(Py_SIZE(a));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139 twodigits carry = extra;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001140 Py_ssize_t i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001141
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001142 if (z == NULL)
1143 return NULL;
1144 for (i = 0; i < size_a; ++i) {
1145 carry += (twodigits)a->ob_digit[i] * n;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001146 z->ob_digit[i] = (digit) (carry & PyLong_MASK);
1147 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001148 }
Guido van Rossum2095d241997-04-09 19:41:24 +00001149 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001150 return long_normalize(z);
1151}
1152
Tim Peters212e6142001-07-14 12:23:19 +00001153/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
1154 in pout, and returning the remainder. pin and pout point at the LSD.
1155 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
Eric Smith5e527eb2008-02-10 01:36:53 +00001156 _PyLong_Format, but that should be done with great care since longs are
Tim Peters212e6142001-07-14 12:23:19 +00001157 immutable. */
1158
1159static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001160inplace_divrem1(digit *pout, digit *pin, Py_ssize_t size, digit n)
Tim Peters212e6142001-07-14 12:23:19 +00001161{
1162 twodigits rem = 0;
1163
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001164 assert(n > 0 && n <= PyLong_MASK);
Tim Peters212e6142001-07-14 12:23:19 +00001165 pin += size;
1166 pout += size;
1167 while (--size >= 0) {
1168 digit hi;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001169 rem = (rem << PyLong_SHIFT) + *--pin;
Tim Peters212e6142001-07-14 12:23:19 +00001170 *--pout = hi = (digit)(rem / n);
Mark Dickinson76eb7892009-01-24 15:42:34 +00001171 rem -= (twodigits)hi * n;
Tim Peters212e6142001-07-14 12:23:19 +00001172 }
1173 return (digit)rem;
1174}
1175
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001176/* Divide a long integer by a digit, returning both the quotient
1177 (as function result) and the remainder (through *prem).
1178 The sign of a is ignored; n should not be zero. */
1179
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001180static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +00001181divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001182{
Christian Heimese93237d2007-12-19 02:37:44 +00001183 const Py_ssize_t size = ABS(Py_SIZE(a));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001185
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001186 assert(n > 0 && n <= PyLong_MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001188 if (z == NULL)
1189 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +00001190 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001191 return long_normalize(z);
1192}
1193
Eric Smith5e527eb2008-02-10 01:36:53 +00001194/* Convert the long to a string object with given base,
1195 appending a base prefix of 0[box] if base is 2, 8 or 16.
1196 Add a trailing "L" if addL is non-zero.
1197 If newstyle is zero, then use the pre-2.6 behavior of octal having
1198 a leading "0", instead of the prefix "0o" */
1199PyAPI_FUNC(PyObject *)
1200_PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001201{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 register PyLongObject *a = (PyLongObject *)aa;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001203 PyStringObject *str;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001204 Py_ssize_t i, j, sz;
Neal Norwitzc09efa82006-07-23 07:53:14 +00001205 Py_ssize_t size_a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001206 char *p;
1207 int bits;
1208 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +00001209
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210 if (a == NULL || !PyLong_Check(a)) {
1211 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +00001212 return NULL;
1213 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001214 assert(base >= 2 && base <= 36);
Christian Heimese93237d2007-12-19 02:37:44 +00001215 size_a = ABS(Py_SIZE(a));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001216
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001217 /* Compute a rough upper bound for the length of the string */
1218 i = base;
1219 bits = 0;
1220 while (i > 1) {
1221 ++bits;
1222 i >>= 1;
1223 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001224 i = 5 + (addL ? 1 : 0);
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001225 j = size_a*PyLong_SHIFT + bits-1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001226 sz = i + j / bits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001227 if (j / PyLong_SHIFT < size_a || sz < i) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00001228 PyErr_SetString(PyExc_OverflowError,
1229 "long is too large to format");
1230 return NULL;
1231 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001232 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001233 if (str == NULL)
1234 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001235 p = PyString_AS_STRING(str) + sz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001236 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +00001237 if (addL)
1238 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001239 if (a->ob_size < 0)
1240 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +00001241
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001242 if (a->ob_size == 0) {
1243 *--p = '0';
1244 }
1245 else if ((base & (base - 1)) == 0) {
1246 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +00001247 twodigits accum = 0;
1248 int accumbits = 0; /* # of bits in accum */
1249 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001250 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +00001251 while ((i >>= 1) > 1)
1252 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +00001253
1254 for (i = 0; i < size_a; ++i) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00001255 accum |= (twodigits)a->ob_digit[i] << accumbits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001256 accumbits += PyLong_SHIFT;
Tim Peters586b2e32001-07-15 09:11:14 +00001257 assert(accumbits >= basebits);
1258 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001259 char cdigit = (char)(accum & (base - 1));
Raymond Hettinger3296e692005-06-29 23:29:56 +00001260 cdigit += (cdigit < 10) ? '0' : 'a'-10;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001261 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001262 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +00001263 accumbits -= basebits;
1264 accum >>= basebits;
1265 } while (i < size_a-1 ? accumbits >= basebits :
1266 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001267 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001268 }
1269 else {
Tim Petersfad225f2001-07-13 02:59:26 +00001270 /* Not 0, and base not a power of 2. Divide repeatedly by
1271 base, but for speed use the highest power of base that
1272 fits in a digit. */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001273 Py_ssize_t size = size_a;
Tim Peters212e6142001-07-14 12:23:19 +00001274 digit *pin = a->ob_digit;
1275 PyLongObject *scratch;
1276 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +00001277 digit powbase = base; /* powbase == base ** power */
1278 int power = 1;
1279 for (;;) {
1280 unsigned long newpow = powbase * (unsigned long)base;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001281 if (newpow >> PyLong_SHIFT) /* doesn't fit in a digit */
Tim Petersfad225f2001-07-13 02:59:26 +00001282 break;
1283 powbase = (digit)newpow;
1284 ++power;
1285 }
Tim Peters212e6142001-07-14 12:23:19 +00001286
1287 /* Get a scratch area for repeated division. */
1288 scratch = _PyLong_New(size);
1289 if (scratch == NULL) {
1290 Py_DECREF(str);
1291 return NULL;
1292 }
1293
1294 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001295 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001296 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +00001297 digit rem = inplace_divrem1(scratch->ob_digit,
1298 pin, size, powbase);
1299 pin = scratch->ob_digit; /* no need to use a again */
1300 if (pin[size - 1] == 0)
1301 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001302 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +00001303 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001304 Py_DECREF(str);
1305 return NULL;
1306 })
Tim Peters212e6142001-07-14 12:23:19 +00001307
1308 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001309 assert(ntostore > 0);
1310 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001311 digit nextrem = (digit)(rem / base);
1312 char c = (char)(rem - nextrem * base);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001313 assert(p > PyString_AS_STRING(str));
Raymond Hettinger3296e692005-06-29 23:29:56 +00001314 c += (c < 10) ? '0' : 'a'-10;
Tim Petersfad225f2001-07-13 02:59:26 +00001315 *--p = c;
1316 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001317 --ntostore;
1318 /* Termination is a bit delicate: must not
1319 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001320 remaining quotient and rem are both 0. */
1321 } while (ntostore && (size || rem));
1322 } while (size != 0);
1323 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001324 }
1325
Eric Smith5e527eb2008-02-10 01:36:53 +00001326 if (base == 2) {
1327 *--p = 'b';
1328 *--p = '0';
1329 }
1330 else if (base == 8) {
1331 if (newstyle) {
1332 *--p = 'o';
Guido van Rossum2c475421992-08-14 15:13:07 +00001333 *--p = '0';
Eric Smith5e527eb2008-02-10 01:36:53 +00001334 }
1335 else
1336 if (size_a != 0)
1337 *--p = '0';
Guido van Rossum2c475421992-08-14 15:13:07 +00001338 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001339 else if (base == 16) {
1340 *--p = 'x';
1341 *--p = '0';
1342 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001343 else if (base != 10) {
1344 *--p = '#';
1345 *--p = '0' + base%10;
1346 if (base > 10)
1347 *--p = '0' + base/10;
1348 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001349 if (sign)
1350 *--p = sign;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001351 if (p != PyString_AS_STRING(str)) {
1352 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001353 assert(p > q);
1354 do {
1355 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001356 q--;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001357 _PyString_Resize((PyObject **)&str,
1358 (Py_ssize_t) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001359 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001361}
1362
Tim Petersda53afa2006-05-25 17:34:03 +00001363/* Table of digit values for 8-bit string -> integer conversion.
1364 * '0' maps to 0, ..., '9' maps to 9.
1365 * 'a' and 'A' map to 10, ..., 'z' and 'Z' map to 35.
1366 * All other indices map to 37.
1367 * Note that when converting a base B string, a char c is a legitimate
1368 * base B digit iff _PyLong_DigitValue[Py_CHARMASK(c)] < B.
1369 */
1370int _PyLong_DigitValue[256] = {
Tim Peters696cf432006-05-24 21:10:40 +00001371 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1372 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1373 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1374 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 37, 37, 37, 37, 37, 37,
1375 37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1376 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
1377 37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1378 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
1379 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1380 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1381 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1382 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1383 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1384 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1385 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1386 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
Tim Peters696cf432006-05-24 21:10:40 +00001387};
1388
1389/* *str points to the first digit in a string of base `base` digits. base
Tim Petersbf2674b2003-02-02 07:51:32 +00001390 * is a power of 2 (2, 4, 8, 16, or 32). *str is set to point to the first
1391 * non-digit (which may be *str!). A normalized long is returned.
1392 * The point to this routine is that it takes time linear in the number of
1393 * string characters.
1394 */
1395static PyLongObject *
1396long_from_binary_base(char **str, int base)
1397{
1398 char *p = *str;
1399 char *start = p;
1400 int bits_per_char;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001401 Py_ssize_t n;
Tim Petersbf2674b2003-02-02 07:51:32 +00001402 PyLongObject *z;
1403 twodigits accum;
1404 int bits_in_accum;
1405 digit *pdigit;
1406
1407 assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
1408 n = base;
1409 for (bits_per_char = -1; n; ++bits_per_char)
1410 n >>= 1;
1411 /* n <- total # of bits needed, while setting p to end-of-string */
1412 n = 0;
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001413 while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base)
Tim Petersbf2674b2003-02-02 07:51:32 +00001414 ++p;
Tim Petersbf2674b2003-02-02 07:51:32 +00001415 *str = p;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001416 /* n <- # of Python digits needed, = ceiling(n/PyLong_SHIFT). */
1417 n = (p - start) * bits_per_char + PyLong_SHIFT - 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001418 if (n / bits_per_char < p - start) {
Tim Peters1a3b19a2003-02-02 17:33:53 +00001419 PyErr_SetString(PyExc_ValueError,
1420 "long string too large to convert");
1421 return NULL;
1422 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001423 n = n / PyLong_SHIFT;
Tim Petersbf2674b2003-02-02 07:51:32 +00001424 z = _PyLong_New(n);
1425 if (z == NULL)
1426 return NULL;
1427 /* Read string from right, and fill in long from left; i.e.,
1428 * from least to most significant in both.
1429 */
1430 accum = 0;
1431 bits_in_accum = 0;
1432 pdigit = z->ob_digit;
1433 while (--p >= start) {
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001434 int k = _PyLong_DigitValue[Py_CHARMASK(*p)];
Tim Petersc7bc0b92003-05-05 20:39:43 +00001435 assert(k >= 0 && k < base);
Mark Dickinson76eb7892009-01-24 15:42:34 +00001436 accum |= (twodigits)k << bits_in_accum;
Tim Petersbf2674b2003-02-02 07:51:32 +00001437 bits_in_accum += bits_per_char;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001438 if (bits_in_accum >= PyLong_SHIFT) {
1439 *pdigit++ = (digit)(accum & PyLong_MASK);
Mark Dickinson76eb7892009-01-24 15:42:34 +00001440 assert(pdigit - z->ob_digit <= n);
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001441 accum >>= PyLong_SHIFT;
1442 bits_in_accum -= PyLong_SHIFT;
1443 assert(bits_in_accum < PyLong_SHIFT);
Tim Petersbf2674b2003-02-02 07:51:32 +00001444 }
1445 }
1446 if (bits_in_accum) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001447 assert(bits_in_accum <= PyLong_SHIFT);
Tim Petersbf2674b2003-02-02 07:51:32 +00001448 *pdigit++ = (digit)accum;
Mark Dickinson76eb7892009-01-24 15:42:34 +00001449 assert(pdigit - z->ob_digit <= n);
Tim Petersbf2674b2003-02-02 07:51:32 +00001450 }
1451 while (pdigit - z->ob_digit < n)
1452 *pdigit++ = 0;
1453 return long_normalize(z);
1454}
1455
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001456PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001457PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001458{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001459 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001460 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001461 PyLongObject *z;
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001462 PyObject *strobj, *strrepr;
1463 Py_ssize_t slen;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001464
Guido van Rossum472c04f1996-12-05 21:57:21 +00001465 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001467 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001468 return NULL;
1469 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001470 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001471 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001472 if (*str == '+')
1473 ++str;
1474 else if (*str == '-') {
1475 ++str;
1476 sign = -1;
1477 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001478 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001479 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001480 if (base == 0) {
Eric Smith9ff19b52008-03-17 17:32:20 +00001481 /* No base given. Deduce the base from the contents
1482 of the string */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001483 if (str[0] != '0')
1484 base = 10;
1485 else if (str[1] == 'x' || str[1] == 'X')
1486 base = 16;
Eric Smith9ff19b52008-03-17 17:32:20 +00001487 else if (str[1] == 'o' || str[1] == 'O')
1488 base = 8;
1489 else if (str[1] == 'b' || str[1] == 'B')
1490 base = 2;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001491 else
Eric Smith9ff19b52008-03-17 17:32:20 +00001492 /* "old" (C-style) octal literal, still valid in
1493 2.x, although illegal in 3.x */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001494 base = 8;
1495 }
Eric Smith9ff19b52008-03-17 17:32:20 +00001496 /* Whether or not we were deducing the base, skip leading chars
1497 as needed */
1498 if (str[0] == '0' &&
1499 ((base == 16 && (str[1] == 'x' || str[1] == 'X')) ||
1500 (base == 8 && (str[1] == 'o' || str[1] == 'O')) ||
1501 (base == 2 && (str[1] == 'b' || str[1] == 'B'))))
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001502 str += 2;
Tim Peters696cf432006-05-24 21:10:40 +00001503
Guido van Rossume6762971998-06-22 03:54:46 +00001504 start = str;
Tim Petersbf2674b2003-02-02 07:51:32 +00001505 if ((base & (base - 1)) == 0)
1506 z = long_from_binary_base(&str, base);
1507 else {
Tim Peters696cf432006-05-24 21:10:40 +00001508/***
1509Binary bases can be converted in time linear in the number of digits, because
1510Python's representation base is binary. Other bases (including decimal!) use
1511the simple quadratic-time algorithm below, complicated by some speed tricks.
Tim Peters5af4e6c2002-08-12 02:31:19 +00001512
Tim Peters696cf432006-05-24 21:10:40 +00001513First some math: the largest integer that can be expressed in N base-B digits
1514is B**N-1. Consequently, if we have an N-digit input in base B, the worst-
1515case number of Python digits needed to hold it is the smallest integer n s.t.
1516
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001517 PyLong_BASE**n-1 >= B**N-1 [or, adding 1 to both sides]
1518 PyLong_BASE**n >= B**N [taking logs to base PyLong_BASE]
1519 n >= log(B**N)/log(PyLong_BASE) = N * log(B)/log(PyLong_BASE)
Tim Peters696cf432006-05-24 21:10:40 +00001520
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001521The static array log_base_PyLong_BASE[base] == log(base)/log(PyLong_BASE) so we can compute
Tim Peters696cf432006-05-24 21:10:40 +00001522this quickly. A Python long with that much space is reserved near the start,
1523and the result is computed into it.
1524
1525The input string is actually treated as being in base base**i (i.e., i digits
1526are processed at a time), where two more static arrays hold:
1527
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001528 convwidth_base[base] = the largest integer i such that base**i <= PyLong_BASE
Tim Peters696cf432006-05-24 21:10:40 +00001529 convmultmax_base[base] = base ** convwidth_base[base]
1530
1531The first of these is the largest i such that i consecutive input digits
1532must fit in a single Python digit. The second is effectively the input
1533base we're really using.
1534
1535Viewing the input as a sequence <c0, c1, ..., c_n-1> of digits in base
1536convmultmax_base[base], the result is "simply"
1537
1538 (((c0*B + c1)*B + c2)*B + c3)*B + ... ))) + c_n-1
1539
1540where B = convmultmax_base[base].
Tim Peters9faa3ed2006-05-30 15:53:34 +00001541
1542Error analysis: as above, the number of Python digits `n` needed is worst-
1543case
1544
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001545 n >= N * log(B)/log(PyLong_BASE)
Tim Peters9faa3ed2006-05-30 15:53:34 +00001546
1547where `N` is the number of input digits in base `B`. This is computed via
1548
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001549 size_z = (Py_ssize_t)((scan - str) * log_base_PyLong_BASE[base]) + 1;
Tim Peters9faa3ed2006-05-30 15:53:34 +00001550
1551below. Two numeric concerns are how much space this can waste, and whether
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001552the computed result can be too small. To be concrete, assume PyLong_BASE = 2**15,
Tim Peters9faa3ed2006-05-30 15:53:34 +00001553which is the default (and it's unlikely anyone changes that).
1554
1555Waste isn't a problem: provided the first input digit isn't 0, the difference
1556between the worst-case input with N digits and the smallest input with N
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001557digits is about a factor of B, but B is small compared to PyLong_BASE so at most
Tim Peters9faa3ed2006-05-30 15:53:34 +00001558one allocated Python digit can remain unused on that count. If
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001559N*log(B)/log(PyLong_BASE) is mathematically an exact integer, then truncating that
Tim Peters9faa3ed2006-05-30 15:53:34 +00001560and adding 1 returns a result 1 larger than necessary. However, that can't
1561happen: whenever B is a power of 2, long_from_binary_base() is called
1562instead, and it's impossible for B**i to be an integer power of 2**15 when
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001563B is not a power of 2 (i.e., it's impossible for N*log(B)/log(PyLong_BASE) to be
Tim Peters9faa3ed2006-05-30 15:53:34 +00001564an exact integer when B is not a power of 2, since B**i has a prime factor
1565other than 2 in that case, but (2**15)**j's only prime factor is 2).
1566
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001567The computed result can be too small if the true value of N*log(B)/log(PyLong_BASE)
Tim Peters9faa3ed2006-05-30 15:53:34 +00001568is a little bit larger than an exact integer, but due to roundoff errors (in
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001569computing log(B), log(PyLong_BASE), their quotient, and/or multiplying that by N)
Tim Peters9faa3ed2006-05-30 15:53:34 +00001570yields a numeric result a little less than that integer. Unfortunately, "how
1571close can a transcendental function get to an integer over some range?"
1572questions are generally theoretically intractable. Computer analysis via
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001573continued fractions is practical: expand log(B)/log(PyLong_BASE) via continued
Tim Peters9faa3ed2006-05-30 15:53:34 +00001574fractions, giving a sequence i/j of "the best" rational approximations. Then
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001575j*log(B)/log(PyLong_BASE) is approximately equal to (the integer) i. This shows that
Tim Peters9faa3ed2006-05-30 15:53:34 +00001576we can get very close to being in trouble, but very rarely. For example,
157776573 is a denominator in one of the continued-fraction approximations to
1578log(10)/log(2**15), and indeed:
1579
1580 >>> log(10)/log(2**15)*76573
1581 16958.000000654003
1582
1583is very close to an integer. If we were working with IEEE single-precision,
1584rounding errors could kill us. Finding worst cases in IEEE double-precision
1585requires better-than-double-precision log() functions, and Tim didn't bother.
1586Instead the code checks to see whether the allocated space is enough as each
1587new Python digit is added, and copies the whole thing to a larger long if not.
1588This should happen extremely rarely, and in fact I don't have a test case
1589that triggers it(!). Instead the code was tested by artificially allocating
1590just 1 digit at the start, so that the copying code was exercised for every
1591digit beyond the first.
Tim Peters696cf432006-05-24 21:10:40 +00001592***/
1593 register twodigits c; /* current input character */
1594 Py_ssize_t size_z;
1595 int i;
1596 int convwidth;
1597 twodigits convmultmax, convmult;
1598 digit *pz, *pzstop;
1599 char* scan;
1600
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001601 static double log_base_PyLong_BASE[37] = {0.0e0,};
Tim Peters696cf432006-05-24 21:10:40 +00001602 static int convwidth_base[37] = {0,};
1603 static twodigits convmultmax_base[37] = {0,};
1604
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001605 if (log_base_PyLong_BASE[base] == 0.0) {
Tim Peters696cf432006-05-24 21:10:40 +00001606 twodigits convmax = base;
1607 int i = 1;
1608
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001609 log_base_PyLong_BASE[base] = log((double)base) /
1610 log((double)PyLong_BASE);
Tim Peters696cf432006-05-24 21:10:40 +00001611 for (;;) {
1612 twodigits next = convmax * base;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001613 if (next > PyLong_BASE)
Tim Peters696cf432006-05-24 21:10:40 +00001614 break;
1615 convmax = next;
1616 ++i;
1617 }
1618 convmultmax_base[base] = convmax;
1619 assert(i > 0);
1620 convwidth_base[base] = i;
1621 }
1622
1623 /* Find length of the string of numeric characters. */
1624 scan = str;
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001625 while (_PyLong_DigitValue[Py_CHARMASK(*scan)] < base)
Tim Peters696cf432006-05-24 21:10:40 +00001626 ++scan;
1627
1628 /* Create a long object that can contain the largest possible
1629 * integer with this base and length. Note that there's no
1630 * need to initialize z->ob_digit -- no slot is read up before
1631 * being stored into.
1632 */
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001633 size_z = (Py_ssize_t)((scan - str) * log_base_PyLong_BASE[base]) + 1;
Tim Peters9faa3ed2006-05-30 15:53:34 +00001634 /* Uncomment next line to test exceedingly rare copy code */
1635 /* size_z = 1; */
Tim Peters696cf432006-05-24 21:10:40 +00001636 assert(size_z > 0);
1637 z = _PyLong_New(size_z);
1638 if (z == NULL)
1639 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001640 Py_SIZE(z) = 0;
Tim Peters696cf432006-05-24 21:10:40 +00001641
1642 /* `convwidth` consecutive input digits are treated as a single
1643 * digit in base `convmultmax`.
1644 */
1645 convwidth = convwidth_base[base];
1646 convmultmax = convmultmax_base[base];
1647
1648 /* Work ;-) */
1649 while (str < scan) {
1650 /* grab up to convwidth digits from the input string */
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001651 c = (digit)_PyLong_DigitValue[Py_CHARMASK(*str++)];
Tim Peters696cf432006-05-24 21:10:40 +00001652 for (i = 1; i < convwidth && str != scan; ++i, ++str) {
1653 c = (twodigits)(c * base +
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001654 _PyLong_DigitValue[Py_CHARMASK(*str)]);
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001655 assert(c < PyLong_BASE);
Tim Peters696cf432006-05-24 21:10:40 +00001656 }
1657
1658 convmult = convmultmax;
1659 /* Calculate the shift only if we couldn't get
1660 * convwidth digits.
1661 */
1662 if (i != convwidth) {
1663 convmult = base;
1664 for ( ; i > 1; --i)
1665 convmult *= base;
1666 }
1667
1668 /* Multiply z by convmult, and add c. */
1669 pz = z->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +00001670 pzstop = pz + Py_SIZE(z);
Tim Peters696cf432006-05-24 21:10:40 +00001671 for (; pz < pzstop; ++pz) {
1672 c += (twodigits)*pz * convmult;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001673 *pz = (digit)(c & PyLong_MASK);
1674 c >>= PyLong_SHIFT;
Tim Peters696cf432006-05-24 21:10:40 +00001675 }
1676 /* carry off the current end? */
1677 if (c) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001678 assert(c < PyLong_BASE);
Christian Heimese93237d2007-12-19 02:37:44 +00001679 if (Py_SIZE(z) < size_z) {
Tim Peters9faa3ed2006-05-30 15:53:34 +00001680 *pz = (digit)c;
Christian Heimese93237d2007-12-19 02:37:44 +00001681 ++Py_SIZE(z);
Tim Peters9faa3ed2006-05-30 15:53:34 +00001682 }
1683 else {
1684 PyLongObject *tmp;
1685 /* Extremely rare. Get more space. */
Christian Heimese93237d2007-12-19 02:37:44 +00001686 assert(Py_SIZE(z) == size_z);
Tim Peters9faa3ed2006-05-30 15:53:34 +00001687 tmp = _PyLong_New(size_z + 1);
1688 if (tmp == NULL) {
1689 Py_DECREF(z);
1690 return NULL;
1691 }
1692 memcpy(tmp->ob_digit,
1693 z->ob_digit,
1694 sizeof(digit) * size_z);
1695 Py_DECREF(z);
1696 z = tmp;
1697 z->ob_digit[size_z] = (digit)c;
1698 ++size_z;
1699 }
Tim Peters696cf432006-05-24 21:10:40 +00001700 }
Tim Petersbf2674b2003-02-02 07:51:32 +00001701 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001702 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001703 if (z == NULL)
1704 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001705 if (str == start)
1706 goto onError;
Tim Peters696cf432006-05-24 21:10:40 +00001707 if (sign < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001708 Py_SIZE(z) = -(Py_SIZE(z));
Guido van Rossum9e896b32000-04-05 20:11:21 +00001709 if (*str == 'L' || *str == 'l')
1710 str++;
1711 while (*str && isspace(Py_CHARMASK(*str)))
1712 str++;
1713 if (*str != '\0')
1714 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001715 if (pend)
1716 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001717 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001718
1719 onError:
Guido van Rossum9e896b32000-04-05 20:11:21 +00001720 Py_XDECREF(z);
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001721 slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001722 strobj = PyString_FromStringAndSize(orig_str, slen);
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001723 if (strobj == NULL)
1724 return NULL;
1725 strrepr = PyObject_Repr(strobj);
1726 Py_DECREF(strobj);
1727 if (strrepr == NULL)
1728 return NULL;
1729 PyErr_Format(PyExc_ValueError,
1730 "invalid literal for long() with base %d: %s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001731 base, PyString_AS_STRING(strrepr));
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001732 Py_DECREF(strrepr);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001733 return NULL;
1734}
1735
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001736#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001737PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001738PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001739{
Walter Dörwald07e14762002-11-06 16:15:14 +00001740 PyObject *result;
Anthony Baxter377be112006-04-11 06:54:30 +00001741 char *buffer = (char *)PyMem_MALLOC(length+1);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001742
Walter Dörwald07e14762002-11-06 16:15:14 +00001743 if (buffer == NULL)
1744 return NULL;
1745
1746 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
1747 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001748 return NULL;
1749 }
Walter Dörwald07e14762002-11-06 16:15:14 +00001750 result = PyLong_FromString(buffer, NULL, base);
1751 PyMem_FREE(buffer);
1752 return result;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001753}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001754#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001755
Tim Peters9f688bf2000-07-07 15:53:28 +00001756/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001757static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001758 (PyLongObject *, PyLongObject *, PyLongObject **);
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001759static PyObject *long_long(PyObject *v);
Tim Peters9f688bf2000-07-07 15:53:28 +00001760static int long_divrem(PyLongObject *, PyLongObject *,
1761 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001762
1763/* Long division with remainder, top-level routine */
1764
Guido van Rossume32e0141992-01-19 16:31:05 +00001765static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001766long_divrem(PyLongObject *a, PyLongObject *b,
1767 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001768{
Christian Heimese93237d2007-12-19 02:37:44 +00001769 Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001770 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001771
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001772 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001773 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001774 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001775 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001776 }
1777 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001778 (size_a == size_b &&
1779 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001780 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001781 *pdiv = _PyLong_New(0);
Georg Brandlc02e1312007-04-11 17:16:24 +00001782 if (*pdiv == NULL)
1783 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001784 Py_INCREF(a);
1785 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001786 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001787 }
1788 if (size_b == 1) {
1789 digit rem = 0;
1790 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001791 if (z == NULL)
1792 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001793 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Georg Brandlc02e1312007-04-11 17:16:24 +00001794 if (*prem == NULL) {
1795 Py_DECREF(z);
1796 return -1;
1797 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001798 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001799 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001800 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001801 if (z == NULL)
1802 return -1;
1803 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001804 /* Set the signs.
1805 The quotient z has the sign of a*b;
1806 the remainder r has the sign of a,
1807 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001808 if ((a->ob_size < 0) != (b->ob_size < 0))
1809 z->ob_size = -(z->ob_size);
1810 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1811 (*prem)->ob_size = -((*prem)->ob_size);
1812 *pdiv = z;
1813 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001814}
1815
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001816/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001817
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001818static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001819x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001820{
Christian Heimese93237d2007-12-19 02:37:44 +00001821 Py_ssize_t size_v = ABS(Py_SIZE(v1)), size_w = ABS(Py_SIZE(w1));
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001822 digit d = (digit) ((twodigits)PyLong_BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001823 PyLongObject *v = mul1(v1, d);
1824 PyLongObject *w = mul1(w1, d);
1825 PyLongObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001826 Py_ssize_t j, k;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001827
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001828 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001829 Py_XDECREF(v);
1830 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001831 return NULL;
1832 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001833
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001834 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Christian Heimese93237d2007-12-19 02:37:44 +00001835 assert(Py_REFCNT(v) == 1); /* Since v will be used as accumulator! */
1836 assert(size_w == ABS(Py_SIZE(w))); /* That's how d was calculated */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001837
Christian Heimese93237d2007-12-19 02:37:44 +00001838 size_v = ABS(Py_SIZE(v));
Neal Norwitzc6a989a2006-05-10 06:57:58 +00001839 k = size_v - size_w;
1840 a = _PyLong_New(k + 1);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001841
Neal Norwitzc6a989a2006-05-10 06:57:58 +00001842 for (j = size_v; a != NULL && k >= 0; --j, --k) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001843 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1844 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001845 stwodigits carry = 0;
Mark Dickinson76eb7892009-01-24 15:42:34 +00001846 Py_ssize_t i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001847
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001848 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001849 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001850 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001851 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001852 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001853 if (vj == w->ob_digit[size_w-1])
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001854 q = PyLong_MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001855 else
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001856 q = (((twodigits)vj << PyLong_SHIFT) + v->ob_digit[j-1]) /
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001857 w->ob_digit[size_w-1];
Tim Peters5af4e6c2002-08-12 02:31:19 +00001858
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001859 while (w->ob_digit[size_w-2]*q >
1860 ((
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001861 ((twodigits)vj << PyLong_SHIFT)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001862 + v->ob_digit[j-1]
1863 - q*w->ob_digit[size_w-1]
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001864 ) << PyLong_SHIFT)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001865 + v->ob_digit[j-2])
1866 --q;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001867
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001868 for (i = 0; i < size_w && i+k < size_v; ++i) {
1869 twodigits z = w->ob_digit[i] * q;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001870 digit zz = (digit) (z >> PyLong_SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001871 carry += v->ob_digit[i+k] - z
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001872 + ((twodigits)zz << PyLong_SHIFT);
1873 v->ob_digit[i+k] = (digit)(carry & PyLong_MASK);
1874 carry = Py_ARITHMETIC_RIGHT_SHIFT(PyLong_BASE_TWODIGITS_TYPE,
1875 carry, PyLong_SHIFT);
Tim Peters7d3a5112000-07-08 04:17:21 +00001876 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001877 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001878
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001879 if (i+k < size_v) {
1880 carry += v->ob_digit[i+k];
1881 v->ob_digit[i+k] = 0;
1882 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001883
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001884 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001885 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001886 else {
1887 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001888 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001889 carry = 0;
1890 for (i = 0; i < size_w && i+k < size_v; ++i) {
1891 carry += v->ob_digit[i+k] + w->ob_digit[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001892 v->ob_digit[i+k] = (digit)(carry & PyLong_MASK);
Tim Peters7d3a5112000-07-08 04:17:21 +00001893 carry = Py_ARITHMETIC_RIGHT_SHIFT(
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001894 PyLong_BASE_TWODIGITS_TYPE,
1895 carry, PyLong_SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001896 }
1897 }
1898 } /* for j, k */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001899
Guido van Rossumc206c761995-01-10 15:23:19 +00001900 if (a == NULL)
1901 *prem = NULL;
1902 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001903 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001904 *prem = divrem1(v, d, &d);
1905 /* d receives the (unused) remainder */
1906 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001907 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001908 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001909 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001910 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001911 Py_DECREF(v);
1912 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001913 return a;
1914}
1915
1916/* Methods */
1917
1918static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001919long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001920{
Christian Heimese93237d2007-12-19 02:37:44 +00001921 Py_TYPE(v)->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001922}
1923
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001924static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001925long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001926{
Eric Smith5e527eb2008-02-10 01:36:53 +00001927 return _PyLong_Format(v, 10, 1, 0);
Fred Drake121ee271999-12-23 15:41:28 +00001928}
1929
1930static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001931long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001932{
Eric Smith5e527eb2008-02-10 01:36:53 +00001933 return _PyLong_Format(v, 10, 0, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001934}
1935
1936static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001937long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001938{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001939 Py_ssize_t sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001940
Christian Heimese93237d2007-12-19 02:37:44 +00001941 if (Py_SIZE(a) != Py_SIZE(b)) {
1942 if (ABS(Py_SIZE(a)) == 0 && ABS(Py_SIZE(b)) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001943 sign = 0;
1944 else
Christian Heimese93237d2007-12-19 02:37:44 +00001945 sign = Py_SIZE(a) - Py_SIZE(b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001946 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001947 else {
Christian Heimese93237d2007-12-19 02:37:44 +00001948 Py_ssize_t i = ABS(Py_SIZE(a));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001949 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1950 ;
1951 if (i < 0)
1952 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001953 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001954 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Christian Heimese93237d2007-12-19 02:37:44 +00001955 if (Py_SIZE(a) < 0)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001956 sign = -sign;
1957 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001958 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001959 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001960}
1961
Guido van Rossum9bfef441993-03-29 10:43:31 +00001962static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001963long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001964{
Mark Dickinson24058542009-01-26 21:43:42 +00001965 unsigned long x;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001966 Py_ssize_t i;
1967 int sign;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001968
1969 /* This is designed so that Python ints and longs with the
1970 same value hash to the same value, otherwise comparisons
1971 of mapping keys will turn out weird */
1972 i = v->ob_size;
1973 sign = 1;
1974 x = 0;
1975 if (i < 0) {
1976 sign = -1;
1977 i = -(i);
1978 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001979#define LONG_BIT_PyLong_SHIFT (8*sizeof(long) - PyLong_SHIFT)
Mark Dickinson24058542009-01-26 21:43:42 +00001980 /* The following loop produces a C unsigned long x such that x is
1981 congruent to the absolute value of v modulo ULONG_MAX. The
Facundo Batistad544df72007-09-19 15:10:06 +00001982 resulting x is nonzero if and only if v is. */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001983 while (--i >= 0) {
Neal Norwitzd5a65a72003-02-23 23:11:41 +00001984 /* Force a native long #-bits (32 or 64) circular shift */
Mark Dickinson24058542009-01-26 21:43:42 +00001985 x = ((x << PyLong_SHIFT) & ~PyLong_MASK) |
1986 ((x >> LONG_BIT_PyLong_SHIFT) & PyLong_MASK);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001987 x += v->ob_digit[i];
Mark Dickinson24058542009-01-26 21:43:42 +00001988 /* If the addition above overflowed we compensate by
1989 incrementing. This preserves the value modulo
1990 ULONG_MAX. */
1991 if (x < v->ob_digit[i])
Facundo Batistad544df72007-09-19 15:10:06 +00001992 x++;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001993 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001994#undef LONG_BIT_PyLong_SHIFT
Guido van Rossum9bfef441993-03-29 10:43:31 +00001995 x = x * sign;
1996 if (x == -1)
1997 x = -2;
1998 return x;
1999}
2000
2001
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002002/* Add the absolute values of two long integers. */
2003
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002004static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002005x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002006{
Christian Heimese93237d2007-12-19 02:37:44 +00002007 Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002008 PyLongObject *z;
Mark Dickinson76eb7892009-01-24 15:42:34 +00002009 Py_ssize_t i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002010 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00002011
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002012 /* Ensure a is the larger of the two: */
2013 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002014 { PyLongObject *temp = a; a = b; b = temp; }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002015 { Py_ssize_t size_temp = size_a;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002016 size_a = size_b;
2017 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002018 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002019 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002020 if (z == NULL)
2021 return NULL;
2022 for (i = 0; i < size_b; ++i) {
2023 carry += a->ob_digit[i] + b->ob_digit[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002024 z->ob_digit[i] = carry & PyLong_MASK;
2025 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002026 }
2027 for (; i < size_a; ++i) {
2028 carry += a->ob_digit[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002029 z->ob_digit[i] = carry & PyLong_MASK;
2030 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002031 }
2032 z->ob_digit[i] = carry;
2033 return long_normalize(z);
2034}
2035
2036/* Subtract the absolute values of two integers. */
2037
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002038static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002039x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002040{
Christian Heimese93237d2007-12-19 02:37:44 +00002041 Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002042 PyLongObject *z;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002043 Py_ssize_t i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002044 int sign = 1;
2045 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00002046
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002047 /* Ensure a is the larger of the two: */
2048 if (size_a < size_b) {
2049 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002050 { PyLongObject *temp = a; a = b; b = temp; }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002051 { Py_ssize_t size_temp = size_a;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002052 size_a = size_b;
2053 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002054 }
2055 else if (size_a == size_b) {
2056 /* Find highest digit where a and b differ: */
2057 i = size_a;
2058 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
2059 ;
2060 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002061 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002062 if (a->ob_digit[i] < b->ob_digit[i]) {
2063 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002064 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002065 }
2066 size_a = size_b = i+1;
2067 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002068 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002069 if (z == NULL)
2070 return NULL;
2071 for (i = 0; i < size_b; ++i) {
2072 /* The following assumes unsigned arithmetic
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002073 works module 2**N for some N>PyLong_SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002074 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002075 z->ob_digit[i] = borrow & PyLong_MASK;
2076 borrow >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002077 borrow &= 1; /* Keep only one sign bit */
2078 }
2079 for (; i < size_a; ++i) {
2080 borrow = a->ob_digit[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002081 z->ob_digit[i] = borrow & PyLong_MASK;
2082 borrow >>= PyLong_SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00002083 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002084 }
2085 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002086 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002087 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002088 return long_normalize(z);
2089}
2090
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002091static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002092long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002093{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002094 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002095
Neil Schemenauerba872e22001-01-04 01:46:03 +00002096 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2097
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002098 if (a->ob_size < 0) {
2099 if (b->ob_size < 0) {
2100 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002101 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002102 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002103 }
2104 else
2105 z = x_sub(b, a);
2106 }
2107 else {
2108 if (b->ob_size < 0)
2109 z = x_sub(a, b);
2110 else
2111 z = x_add(a, b);
2112 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002113 Py_DECREF(a);
2114 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002115 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002116}
2117
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002118static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002119long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002120{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002121 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002122
Neil Schemenauerba872e22001-01-04 01:46:03 +00002123 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2124
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002125 if (a->ob_size < 0) {
2126 if (b->ob_size < 0)
2127 z = x_sub(a, b);
2128 else
2129 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002130 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002131 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002132 }
2133 else {
2134 if (b->ob_size < 0)
2135 z = x_add(a, b);
2136 else
2137 z = x_sub(a, b);
2138 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002139 Py_DECREF(a);
2140 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002141 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002142}
2143
Tim Peters5af4e6c2002-08-12 02:31:19 +00002144/* Grade school multiplication, ignoring the signs.
2145 * Returns the absolute value of the product, or NULL if error.
2146 */
2147static PyLongObject *
2148x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002149{
Tim Peters5af4e6c2002-08-12 02:31:19 +00002150 PyLongObject *z;
Christian Heimese93237d2007-12-19 02:37:44 +00002151 Py_ssize_t size_a = ABS(Py_SIZE(a));
2152 Py_ssize_t size_b = ABS(Py_SIZE(b));
Martin v. Löwis18e16552006-02-15 17:27:45 +00002153 Py_ssize_t i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002154
Tim Peters5af4e6c2002-08-12 02:31:19 +00002155 z = _PyLong_New(size_a + size_b);
2156 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002157 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002158
Christian Heimese93237d2007-12-19 02:37:44 +00002159 memset(z->ob_digit, 0, Py_SIZE(z) * sizeof(digit));
Tim Peters0973b992004-08-29 22:16:50 +00002160 if (a == b) {
2161 /* Efficient squaring per HAC, Algorithm 14.16:
2162 * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
2163 * Gives slightly less than a 2x speedup when a == b,
2164 * via exploiting that each entry in the multiplication
2165 * pyramid appears twice (except for the size_a squares).
2166 */
2167 for (i = 0; i < size_a; ++i) {
2168 twodigits carry;
2169 twodigits f = a->ob_digit[i];
2170 digit *pz = z->ob_digit + (i << 1);
2171 digit *pa = a->ob_digit + i + 1;
2172 digit *paend = a->ob_digit + size_a;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002173
Tim Peters0973b992004-08-29 22:16:50 +00002174 SIGCHECK({
2175 Py_DECREF(z);
2176 return NULL;
2177 })
2178
2179 carry = *pz + f * f;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002180 *pz++ = (digit)(carry & PyLong_MASK);
2181 carry >>= PyLong_SHIFT;
2182 assert(carry <= PyLong_MASK);
Tim Peters0973b992004-08-29 22:16:50 +00002183
2184 /* Now f is added in twice in each column of the
2185 * pyramid it appears. Same as adding f<<1 once.
2186 */
2187 f <<= 1;
2188 while (pa < paend) {
2189 carry += *pz + *pa++ * f;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002190 *pz++ = (digit)(carry & PyLong_MASK);
2191 carry >>= PyLong_SHIFT;
2192 assert(carry <= (PyLong_MASK << 1));
Tim Peters0973b992004-08-29 22:16:50 +00002193 }
2194 if (carry) {
2195 carry += *pz;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002196 *pz++ = (digit)(carry & PyLong_MASK);
2197 carry >>= PyLong_SHIFT;
Tim Peters0973b992004-08-29 22:16:50 +00002198 }
2199 if (carry)
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002200 *pz += (digit)(carry & PyLong_MASK);
2201 assert((carry >> PyLong_SHIFT) == 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002202 }
Tim Peters0973b992004-08-29 22:16:50 +00002203 }
2204 else { /* a is not the same as b -- gradeschool long mult */
2205 for (i = 0; i < size_a; ++i) {
2206 twodigits carry = 0;
2207 twodigits f = a->ob_digit[i];
2208 digit *pz = z->ob_digit + i;
2209 digit *pb = b->ob_digit;
2210 digit *pbend = b->ob_digit + size_b;
2211
2212 SIGCHECK({
2213 Py_DECREF(z);
2214 return NULL;
2215 })
2216
2217 while (pb < pbend) {
2218 carry += *pz + *pb++ * f;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002219 *pz++ = (digit)(carry & PyLong_MASK);
2220 carry >>= PyLong_SHIFT;
2221 assert(carry <= PyLong_MASK);
Tim Peters0973b992004-08-29 22:16:50 +00002222 }
2223 if (carry)
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002224 *pz += (digit)(carry & PyLong_MASK);
2225 assert((carry >> PyLong_SHIFT) == 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002226 }
2227 }
Tim Peters44121a62002-08-12 06:17:58 +00002228 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002229}
2230
2231/* A helper for Karatsuba multiplication (k_mul).
2232 Takes a long "n" and an integer "size" representing the place to
2233 split, and sets low and high such that abs(n) == (high << size) + low,
2234 viewing the shift as being by digits. The sign bit is ignored, and
2235 the return values are >= 0.
2236 Returns 0 on success, -1 on failure.
2237*/
2238static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002239kmul_split(PyLongObject *n, Py_ssize_t size, PyLongObject **high, PyLongObject **low)
Tim Peters5af4e6c2002-08-12 02:31:19 +00002240{
2241 PyLongObject *hi, *lo;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002242 Py_ssize_t size_lo, size_hi;
Christian Heimese93237d2007-12-19 02:37:44 +00002243 const Py_ssize_t size_n = ABS(Py_SIZE(n));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002244
2245 size_lo = MIN(size_n, size);
2246 size_hi = size_n - size_lo;
2247
2248 if ((hi = _PyLong_New(size_hi)) == NULL)
2249 return -1;
2250 if ((lo = _PyLong_New(size_lo)) == NULL) {
2251 Py_DECREF(hi);
2252 return -1;
2253 }
2254
2255 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
2256 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
2257
2258 *high = long_normalize(hi);
2259 *low = long_normalize(lo);
2260 return 0;
2261}
2262
Tim Peters60004642002-08-12 22:01:34 +00002263static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
2264
Tim Peters5af4e6c2002-08-12 02:31:19 +00002265/* Karatsuba multiplication. Ignores the input signs, and returns the
2266 * absolute value of the product (or NULL if error).
2267 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
2268 */
2269static PyLongObject *
2270k_mul(PyLongObject *a, PyLongObject *b)
2271{
Christian Heimese93237d2007-12-19 02:37:44 +00002272 Py_ssize_t asize = ABS(Py_SIZE(a));
2273 Py_ssize_t bsize = ABS(Py_SIZE(b));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002274 PyLongObject *ah = NULL;
2275 PyLongObject *al = NULL;
2276 PyLongObject *bh = NULL;
2277 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002278 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00002279 PyLongObject *t1, *t2, *t3;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002280 Py_ssize_t shift; /* the number of digits we split off */
2281 Py_ssize_t i;
Tim Peters738eda72002-08-12 15:08:20 +00002282
Tim Peters5af4e6c2002-08-12 02:31:19 +00002283 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
2284 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
2285 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00002286 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00002287 * By picking X to be a power of 2, "*X" is just shifting, and it's
2288 * been reduced to 3 multiplies on numbers half the size.
2289 */
2290
Tim Petersfc07e562002-08-12 02:54:10 +00002291 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00002292 * is largest.
2293 */
Tim Peters738eda72002-08-12 15:08:20 +00002294 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002295 t1 = a;
2296 a = b;
2297 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00002298
2299 i = asize;
2300 asize = bsize;
2301 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002302 }
2303
2304 /* Use gradeschool math when either number is too small. */
Tim Peters0973b992004-08-29 22:16:50 +00002305 i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF;
2306 if (asize <= i) {
Tim Peters738eda72002-08-12 15:08:20 +00002307 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00002308 return _PyLong_New(0);
2309 else
2310 return x_mul(a, b);
2311 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002312
Tim Peters60004642002-08-12 22:01:34 +00002313 /* If a is small compared to b, splitting on b gives a degenerate
2314 * case with ah==0, and Karatsuba may be (even much) less efficient
2315 * than "grade school" then. However, we can still win, by viewing
2316 * b as a string of "big digits", each of width a->ob_size. That
2317 * leads to a sequence of balanced calls to k_mul.
2318 */
2319 if (2 * asize <= bsize)
2320 return k_lopsided_mul(a, b);
2321
Tim Petersd6974a52002-08-13 20:37:51 +00002322 /* Split a & b into hi & lo pieces. */
Tim Peters738eda72002-08-12 15:08:20 +00002323 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002324 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
Christian Heimese93237d2007-12-19 02:37:44 +00002325 assert(Py_SIZE(ah) > 0); /* the split isn't degenerate */
Tim Petersd6974a52002-08-13 20:37:51 +00002326
Tim Peters0973b992004-08-29 22:16:50 +00002327 if (a == b) {
2328 bh = ah;
2329 bl = al;
2330 Py_INCREF(bh);
2331 Py_INCREF(bl);
2332 }
2333 else if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002334
Tim Petersd64c1de2002-08-12 17:36:03 +00002335 /* The plan:
2336 * 1. Allocate result space (asize + bsize digits: that's always
2337 * enough).
2338 * 2. Compute ah*bh, and copy into result at 2*shift.
2339 * 3. Compute al*bl, and copy into result at 0. Note that this
2340 * can't overlap with #2.
2341 * 4. Subtract al*bl from the result, starting at shift. This may
2342 * underflow (borrow out of the high digit), but we don't care:
2343 * we're effectively doing unsigned arithmetic mod
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002344 * PyLong_BASE**(sizea + sizeb), and so long as the *final* result fits,
Tim Petersd64c1de2002-08-12 17:36:03 +00002345 * borrows and carries out of the high digit can be ignored.
2346 * 5. Subtract ah*bh from the result, starting at shift.
2347 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
2348 * at shift.
2349 */
2350
2351 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00002352 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002353 if (ret == NULL) goto fail;
2354#ifdef Py_DEBUG
2355 /* Fill with trash, to catch reference to uninitialized digits. */
Christian Heimese93237d2007-12-19 02:37:44 +00002356 memset(ret->ob_digit, 0xDF, Py_SIZE(ret) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002357#endif
Tim Peters44121a62002-08-12 06:17:58 +00002358
Tim Petersd64c1de2002-08-12 17:36:03 +00002359 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00002360 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
Christian Heimese93237d2007-12-19 02:37:44 +00002361 assert(Py_SIZE(t1) >= 0);
2362 assert(2*shift + Py_SIZE(t1) <= Py_SIZE(ret));
Tim Peters738eda72002-08-12 15:08:20 +00002363 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
Christian Heimese93237d2007-12-19 02:37:44 +00002364 Py_SIZE(t1) * sizeof(digit));
Tim Peters738eda72002-08-12 15:08:20 +00002365
2366 /* Zero-out the digits higher than the ah*bh copy. */
Christian Heimese93237d2007-12-19 02:37:44 +00002367 i = Py_SIZE(ret) - 2*shift - Py_SIZE(t1);
Tim Peters44121a62002-08-12 06:17:58 +00002368 if (i)
Christian Heimese93237d2007-12-19 02:37:44 +00002369 memset(ret->ob_digit + 2*shift + Py_SIZE(t1), 0,
Tim Peters44121a62002-08-12 06:17:58 +00002370 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002371
Tim Petersd64c1de2002-08-12 17:36:03 +00002372 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00002373 if ((t2 = k_mul(al, bl)) == NULL) {
2374 Py_DECREF(t1);
2375 goto fail;
2376 }
Christian Heimese93237d2007-12-19 02:37:44 +00002377 assert(Py_SIZE(t2) >= 0);
2378 assert(Py_SIZE(t2) <= 2*shift); /* no overlap with high digits */
2379 memcpy(ret->ob_digit, t2->ob_digit, Py_SIZE(t2) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002380
2381 /* Zero out remaining digits. */
Christian Heimese93237d2007-12-19 02:37:44 +00002382 i = 2*shift - Py_SIZE(t2); /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002383 if (i)
Christian Heimese93237d2007-12-19 02:37:44 +00002384 memset(ret->ob_digit + Py_SIZE(t2), 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002385
Tim Petersd64c1de2002-08-12 17:36:03 +00002386 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
2387 * because it's fresher in cache.
2388 */
Christian Heimese93237d2007-12-19 02:37:44 +00002389 i = Py_SIZE(ret) - shift; /* # digits after shift */
2390 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, Py_SIZE(t2));
Tim Peters738eda72002-08-12 15:08:20 +00002391 Py_DECREF(t2);
2392
Christian Heimese93237d2007-12-19 02:37:44 +00002393 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, Py_SIZE(t1));
Tim Peters738eda72002-08-12 15:08:20 +00002394 Py_DECREF(t1);
2395
Tim Petersd64c1de2002-08-12 17:36:03 +00002396 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002397 if ((t1 = x_add(ah, al)) == NULL) goto fail;
2398 Py_DECREF(ah);
2399 Py_DECREF(al);
2400 ah = al = NULL;
2401
Tim Peters0973b992004-08-29 22:16:50 +00002402 if (a == b) {
2403 t2 = t1;
2404 Py_INCREF(t2);
2405 }
2406 else if ((t2 = x_add(bh, bl)) == NULL) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002407 Py_DECREF(t1);
2408 goto fail;
2409 }
2410 Py_DECREF(bh);
2411 Py_DECREF(bl);
2412 bh = bl = NULL;
2413
Tim Peters738eda72002-08-12 15:08:20 +00002414 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002415 Py_DECREF(t1);
2416 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00002417 if (t3 == NULL) goto fail;
Christian Heimese93237d2007-12-19 02:37:44 +00002418 assert(Py_SIZE(t3) >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002419
Tim Petersd6974a52002-08-13 20:37:51 +00002420 /* Add t3. It's not obvious why we can't run out of room here.
2421 * See the (*) comment after this function.
Tim Petersd8b21732002-08-12 19:30:26 +00002422 */
Christian Heimese93237d2007-12-19 02:37:44 +00002423 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, Py_SIZE(t3));
Tim Peters738eda72002-08-12 15:08:20 +00002424 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002425
Tim Peters5af4e6c2002-08-12 02:31:19 +00002426 return long_normalize(ret);
2427
2428 fail:
2429 Py_XDECREF(ret);
2430 Py_XDECREF(ah);
2431 Py_XDECREF(al);
2432 Py_XDECREF(bh);
2433 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002434 return NULL;
2435}
2436
Tim Petersd6974a52002-08-13 20:37:51 +00002437/* (*) Why adding t3 can't "run out of room" above.
2438
Tim Petersab86c2b2002-08-15 20:06:00 +00002439Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
2440to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00002441
Tim Petersab86c2b2002-08-15 20:06:00 +000024421. For any integer i, i = c(i/2) + f(i/2). In particular,
2443 bsize = c(bsize/2) + f(bsize/2).
24442. shift = f(bsize/2)
24453. asize <= bsize
24464. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
2447 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00002448
Tim Petersab86c2b2002-08-15 20:06:00 +00002449We allocated asize + bsize result digits, and add t3 into them at an offset
2450of shift. This leaves asize+bsize-shift allocated digit positions for t3
2451to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
2452asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00002453
Tim Petersab86c2b2002-08-15 20:06:00 +00002454bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
2455at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00002456
Tim Petersab86c2b2002-08-15 20:06:00 +00002457If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
2458digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
2459most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00002460
Tim Petersab86c2b2002-08-15 20:06:00 +00002461The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00002462
Tim Petersab86c2b2002-08-15 20:06:00 +00002463 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00002464
Tim Petersab86c2b2002-08-15 20:06:00 +00002465and we have asize + c(bsize/2) available digit positions. We need to show
2466this is always enough. An instance of c(bsize/2) cancels out in both, so
2467the question reduces to whether asize digits is enough to hold
2468(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
2469then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
2470asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002471digit is enough to hold 2 bits. This is so since PyLong_SHIFT=15 >= 2. If
Tim Petersab86c2b2002-08-15 20:06:00 +00002472asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00002473c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
2474is enough to hold 2 bits. This is so if bsize >= 2, which holds because
2475bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00002476
Tim Peters48d52c02002-08-14 17:07:32 +00002477Note that since there's always enough room for (ah+al)*(bh+bl), and that's
2478clearly >= each of ah*bh and al*bl, there's always enough room to subtract
2479ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00002480*/
2481
Tim Peters60004642002-08-12 22:01:34 +00002482/* b has at least twice the digits of a, and a is big enough that Karatsuba
2483 * would pay off *if* the inputs had balanced sizes. View b as a sequence
2484 * of slices, each with a->ob_size digits, and multiply the slices by a,
2485 * one at a time. This gives k_mul balanced inputs to work with, and is
2486 * also cache-friendly (we compute one double-width slice of the result
2487 * at a time, then move on, never bactracking except for the helpful
2488 * single-width slice overlap between successive partial sums).
2489 */
2490static PyLongObject *
2491k_lopsided_mul(PyLongObject *a, PyLongObject *b)
2492{
Christian Heimese93237d2007-12-19 02:37:44 +00002493 const Py_ssize_t asize = ABS(Py_SIZE(a));
2494 Py_ssize_t bsize = ABS(Py_SIZE(b));
Martin v. Löwis18e16552006-02-15 17:27:45 +00002495 Py_ssize_t nbdone; /* # of b digits already multiplied */
Tim Peters60004642002-08-12 22:01:34 +00002496 PyLongObject *ret;
2497 PyLongObject *bslice = NULL;
2498
2499 assert(asize > KARATSUBA_CUTOFF);
2500 assert(2 * asize <= bsize);
2501
2502 /* Allocate result space, and zero it out. */
2503 ret = _PyLong_New(asize + bsize);
2504 if (ret == NULL)
2505 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00002506 memset(ret->ob_digit, 0, Py_SIZE(ret) * sizeof(digit));
Tim Peters60004642002-08-12 22:01:34 +00002507
2508 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00002509 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00002510 if (bslice == NULL)
2511 goto fail;
2512
2513 nbdone = 0;
2514 while (bsize > 0) {
2515 PyLongObject *product;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002516 const Py_ssize_t nbtouse = MIN(bsize, asize);
Tim Peters60004642002-08-12 22:01:34 +00002517
2518 /* Multiply the next slice of b by a. */
2519 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
2520 nbtouse * sizeof(digit));
Christian Heimese93237d2007-12-19 02:37:44 +00002521 Py_SIZE(bslice) = nbtouse;
Tim Peters60004642002-08-12 22:01:34 +00002522 product = k_mul(a, bslice);
2523 if (product == NULL)
2524 goto fail;
2525
2526 /* Add into result. */
Christian Heimese93237d2007-12-19 02:37:44 +00002527 (void)v_iadd(ret->ob_digit + nbdone, Py_SIZE(ret) - nbdone,
2528 product->ob_digit, Py_SIZE(product));
Tim Peters60004642002-08-12 22:01:34 +00002529 Py_DECREF(product);
2530
2531 bsize -= nbtouse;
2532 nbdone += nbtouse;
2533 }
2534
2535 Py_DECREF(bslice);
2536 return long_normalize(ret);
2537
2538 fail:
2539 Py_DECREF(ret);
2540 Py_XDECREF(bslice);
2541 return NULL;
2542}
Tim Peters5af4e6c2002-08-12 02:31:19 +00002543
2544static PyObject *
2545long_mul(PyLongObject *v, PyLongObject *w)
2546{
2547 PyLongObject *a, *b, *z;
2548
2549 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002550 Py_INCREF(Py_NotImplemented);
2551 return Py_NotImplemented;
2552 }
2553
Tim Petersd64c1de2002-08-12 17:36:03 +00002554 z = k_mul(a, b);
Tim Peters9973d742002-08-15 19:41:06 +00002555 /* Negate if exactly one of the inputs is negative. */
2556 if (((a->ob_size ^ b->ob_size) < 0) && z)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002557 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002558 Py_DECREF(a);
2559 Py_DECREF(b);
Tim Peters9973d742002-08-15 19:41:06 +00002560 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002561}
2562
Guido van Rossume32e0141992-01-19 16:31:05 +00002563/* The / and % operators are now defined in terms of divmod().
2564 The expression a mod b has the value a - b*floor(a/b).
2565 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002566 |a| by |b|, with the sign of a. This is also expressed
2567 as a - b*trunc(a/b), if trunc truncates towards zero.
2568 Some examples:
2569 a b a rem b a mod b
2570 13 10 3 3
2571 -13 10 -3 7
2572 13 -10 3 -7
2573 -13 -10 -3 -3
2574 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002575 have different signs. We then subtract one from the 'div'
2576 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002577
Tim Peters47e52ee2004-08-30 02:44:38 +00002578/* Compute
2579 * *pdiv, *pmod = divmod(v, w)
2580 * NULL can be passed for pdiv or pmod, in which case that part of
2581 * the result is simply thrown away. The caller owns a reference to
2582 * each of these it requests (does not pass NULL for).
2583 */
Guido van Rossume32e0141992-01-19 16:31:05 +00002584static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00002585l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00002586 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00002587{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002588 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002589
Guido van Rossume32e0141992-01-19 16:31:05 +00002590 if (long_divrem(v, w, &div, &mod) < 0)
2591 return -1;
Christian Heimese93237d2007-12-19 02:37:44 +00002592 if ((Py_SIZE(mod) < 0 && Py_SIZE(w) > 0) ||
2593 (Py_SIZE(mod) > 0 && Py_SIZE(w) < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002594 PyLongObject *temp;
2595 PyLongObject *one;
2596 temp = (PyLongObject *) long_add(mod, w);
2597 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00002598 mod = temp;
2599 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002600 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002601 return -1;
2602 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002603 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00002604 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002605 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
2606 Py_DECREF(mod);
2607 Py_DECREF(div);
2608 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00002609 return -1;
2610 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002611 Py_DECREF(one);
2612 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002613 div = temp;
2614 }
Tim Peters47e52ee2004-08-30 02:44:38 +00002615 if (pdiv != NULL)
2616 *pdiv = div;
2617 else
2618 Py_DECREF(div);
2619
2620 if (pmod != NULL)
2621 *pmod = mod;
2622 else
2623 Py_DECREF(mod);
2624
Guido van Rossume32e0141992-01-19 16:31:05 +00002625 return 0;
2626}
2627
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002628static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002629long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002630{
Tim Peters47e52ee2004-08-30 02:44:38 +00002631 PyLongObject *a, *b, *div;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002632
2633 CONVERT_BINOP(v, w, &a, &b);
Tim Peters47e52ee2004-08-30 02:44:38 +00002634 if (l_divmod(a, b, &div, NULL) < 0)
2635 div = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002636 Py_DECREF(a);
2637 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002638 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00002639}
2640
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002641static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00002642long_classic_div(PyObject *v, PyObject *w)
2643{
Tim Peters47e52ee2004-08-30 02:44:38 +00002644 PyLongObject *a, *b, *div;
Guido van Rossum393661d2001-08-31 17:40:15 +00002645
2646 CONVERT_BINOP(v, w, &a, &b);
Guido van Rossum393661d2001-08-31 17:40:15 +00002647 if (Py_DivisionWarningFlag &&
2648 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
2649 div = NULL;
Tim Peters47e52ee2004-08-30 02:44:38 +00002650 else if (l_divmod(a, b, &div, NULL) < 0)
Guido van Rossum393661d2001-08-31 17:40:15 +00002651 div = NULL;
Guido van Rossum393661d2001-08-31 17:40:15 +00002652 Py_DECREF(a);
2653 Py_DECREF(b);
2654 return (PyObject *)div;
2655}
2656
2657static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00002658long_true_divide(PyObject *v, PyObject *w)
2659{
Tim Peterse2a60002001-09-04 06:17:36 +00002660 PyLongObject *a, *b;
2661 double ad, bd;
Thomas Wouters553489a2006-02-01 21:32:04 +00002662 int failed, aexp = -1, bexp = -1;
Tim Peterse2a60002001-09-04 06:17:36 +00002663
2664 CONVERT_BINOP(v, w, &a, &b);
2665 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
2666 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00002667 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
2668 Py_DECREF(a);
2669 Py_DECREF(b);
2670 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00002671 return NULL;
Thomas Wouters553489a2006-02-01 21:32:04 +00002672 /* 'aexp' and 'bexp' were initialized to -1 to silence gcc-4.0.x,
2673 but should really be set correctly after sucessful calls to
2674 _PyLong_AsScaledDouble() */
2675 assert(aexp >= 0 && bexp >= 0);
Tim Peterse2a60002001-09-04 06:17:36 +00002676
2677 if (bd == 0.0) {
2678 PyErr_SetString(PyExc_ZeroDivisionError,
2679 "long division or modulo by zero");
2680 return NULL;
2681 }
2682
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002683 /* True value is very close to ad/bd * 2**(PyLong_SHIFT*(aexp-bexp)) */
Tim Peterse2a60002001-09-04 06:17:36 +00002684 ad /= bd; /* overflow/underflow impossible here */
2685 aexp -= bexp;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002686 if (aexp > INT_MAX / PyLong_SHIFT)
Tim Peterse2a60002001-09-04 06:17:36 +00002687 goto overflow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002688 else if (aexp < -(INT_MAX / PyLong_SHIFT))
Tim Peterse56ed9b2001-09-06 21:59:14 +00002689 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002690 errno = 0;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002691 ad = ldexp(ad, aexp * PyLong_SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002692 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002693 goto overflow;
2694 return PyFloat_FromDouble(ad);
2695
2696overflow:
2697 PyErr_SetString(PyExc_OverflowError,
2698 "long/long too large for a float");
2699 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002700
Tim Peters20dab9f2001-09-04 05:31:47 +00002701}
2702
2703static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002704long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002705{
Tim Peters47e52ee2004-08-30 02:44:38 +00002706 PyLongObject *a, *b, *mod;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002707
2708 CONVERT_BINOP(v, w, &a, &b);
2709
Tim Peters47e52ee2004-08-30 02:44:38 +00002710 if (l_divmod(a, b, NULL, &mod) < 0)
2711 mod = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002712 Py_DECREF(a);
2713 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002714 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002715}
2716
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002717static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002718long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002719{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002720 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002721 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002722
2723 CONVERT_BINOP(v, w, &a, &b);
2724
2725 if (l_divmod(a, b, &div, &mod) < 0) {
2726 Py_DECREF(a);
2727 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002728 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002729 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002730 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002731 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002732 PyTuple_SetItem(z, 0, (PyObject *) div);
2733 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002734 }
2735 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002736 Py_DECREF(div);
2737 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002738 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002739 Py_DECREF(a);
2740 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002741 return z;
2742}
2743
Tim Peters47e52ee2004-08-30 02:44:38 +00002744/* pow(v, w, x) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002745static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002746long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002747{
Tim Peters47e52ee2004-08-30 02:44:38 +00002748 PyLongObject *a, *b, *c; /* a,b,c = v,w,x */
2749 int negativeOutput = 0; /* if x<0 return negative output */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002750
Tim Peters47e52ee2004-08-30 02:44:38 +00002751 PyLongObject *z = NULL; /* accumulated result */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002752 Py_ssize_t i, j, k; /* counters */
Tim Peters47e52ee2004-08-30 02:44:38 +00002753 PyLongObject *temp = NULL;
2754
2755 /* 5-ary values. If the exponent is large enough, table is
2756 * precomputed so that table[i] == a**i % c for i in range(32).
2757 */
2758 PyLongObject *table[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2759 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
2760
2761 /* a, b, c = v, w, x */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002762 CONVERT_BINOP(v, w, &a, &b);
Tim Peters47e52ee2004-08-30 02:44:38 +00002763 if (PyLong_Check(x)) {
2764 c = (PyLongObject *)x;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002765 Py_INCREF(x);
2766 }
Tim Petersde7990b2005-07-17 23:45:23 +00002767 else if (PyInt_Check(x)) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002768 c = (PyLongObject *)PyLong_FromLong(PyInt_AS_LONG(x));
Tim Petersde7990b2005-07-17 23:45:23 +00002769 if (c == NULL)
2770 goto Error;
2771 }
Tim Peters47e52ee2004-08-30 02:44:38 +00002772 else if (x == Py_None)
2773 c = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002774 else {
2775 Py_DECREF(a);
2776 Py_DECREF(b);
2777 Py_INCREF(Py_NotImplemented);
2778 return Py_NotImplemented;
2779 }
Tim Peters4c483c42001-09-05 06:24:58 +00002780
Christian Heimese93237d2007-12-19 02:37:44 +00002781 if (Py_SIZE(b) < 0) { /* if exponent is negative */
Tim Peters47e52ee2004-08-30 02:44:38 +00002782 if (c) {
Tim Peters4c483c42001-09-05 06:24:58 +00002783 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
Tim Peters47e52ee2004-08-30 02:44:38 +00002784 "cannot be negative when 3rd argument specified");
Tim Peterscd97da32004-08-30 02:58:59 +00002785 goto Error;
Tim Peters32f453e2001-09-03 08:35:41 +00002786 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002787 else {
Tim Peters47e52ee2004-08-30 02:44:38 +00002788 /* else return a float. This works because we know
2789 that this calls float_pow() which converts its
2790 arguments to double. */
2791 Py_DECREF(a);
2792 Py_DECREF(b);
2793 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002794 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002795 }
Tim Peters47e52ee2004-08-30 02:44:38 +00002796
2797 if (c) {
2798 /* if modulus == 0:
2799 raise ValueError() */
Christian Heimese93237d2007-12-19 02:37:44 +00002800 if (Py_SIZE(c) == 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002801 PyErr_SetString(PyExc_ValueError,
2802 "pow() 3rd argument cannot be 0");
Tim Peterscd97da32004-08-30 02:58:59 +00002803 goto Error;
Tim Peters47e52ee2004-08-30 02:44:38 +00002804 }
2805
2806 /* if modulus < 0:
2807 negativeOutput = True
2808 modulus = -modulus */
Christian Heimese93237d2007-12-19 02:37:44 +00002809 if (Py_SIZE(c) < 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002810 negativeOutput = 1;
2811 temp = (PyLongObject *)_PyLong_Copy(c);
2812 if (temp == NULL)
2813 goto Error;
2814 Py_DECREF(c);
2815 c = temp;
2816 temp = NULL;
2817 c->ob_size = - c->ob_size;
2818 }
2819
2820 /* if modulus == 1:
2821 return 0 */
Christian Heimese93237d2007-12-19 02:37:44 +00002822 if ((Py_SIZE(c) == 1) && (c->ob_digit[0] == 1)) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002823 z = (PyLongObject *)PyLong_FromLong(0L);
2824 goto Done;
2825 }
2826
2827 /* if base < 0:
2828 base = base % modulus
2829 Having the base positive just makes things easier. */
Christian Heimese93237d2007-12-19 02:37:44 +00002830 if (Py_SIZE(a) < 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002831 if (l_divmod(a, c, NULL, &temp) < 0)
Tim Peterscd97da32004-08-30 02:58:59 +00002832 goto Error;
Tim Peters47e52ee2004-08-30 02:44:38 +00002833 Py_DECREF(a);
2834 a = temp;
2835 temp = NULL;
2836 }
2837 }
2838
2839 /* At this point a, b, and c are guaranteed non-negative UNLESS
2840 c is NULL, in which case a may be negative. */
2841
2842 z = (PyLongObject *)PyLong_FromLong(1L);
2843 if (z == NULL)
2844 goto Error;
2845
2846 /* Perform a modular reduction, X = X % c, but leave X alone if c
2847 * is NULL.
2848 */
2849#define REDUCE(X) \
2850 if (c != NULL) { \
2851 if (l_divmod(X, c, NULL, &temp) < 0) \
2852 goto Error; \
2853 Py_XDECREF(X); \
2854 X = temp; \
2855 temp = NULL; \
2856 }
2857
2858 /* Multiply two values, then reduce the result:
2859 result = X*Y % c. If c is NULL, skip the mod. */
2860#define MULT(X, Y, result) \
2861{ \
2862 temp = (PyLongObject *)long_mul(X, Y); \
2863 if (temp == NULL) \
2864 goto Error; \
2865 Py_XDECREF(result); \
2866 result = temp; \
2867 temp = NULL; \
2868 REDUCE(result) \
2869}
2870
Christian Heimese93237d2007-12-19 02:37:44 +00002871 if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002872 /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
2873 /* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf */
Christian Heimese93237d2007-12-19 02:37:44 +00002874 for (i = Py_SIZE(b) - 1; i >= 0; --i) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002875 digit bi = b->ob_digit[i];
2876
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002877 for (j = 1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002878 MULT(z, z, z)
2879 if (bi & j)
2880 MULT(z, a, z)
2881 }
2882 }
2883 }
2884 else {
2885 /* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */
2886 Py_INCREF(z); /* still holds 1L */
2887 table[0] = z;
2888 for (i = 1; i < 32; ++i)
2889 MULT(table[i-1], a, table[i])
2890
Christian Heimese93237d2007-12-19 02:37:44 +00002891 for (i = Py_SIZE(b) - 1; i >= 0; --i) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002892 const digit bi = b->ob_digit[i];
2893
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002894 for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002895 const int index = (bi >> j) & 0x1f;
2896 for (k = 0; k < 5; ++k)
2897 MULT(z, z, z)
2898 if (index)
2899 MULT(z, table[index], z)
2900 }
2901 }
2902 }
2903
Christian Heimese93237d2007-12-19 02:37:44 +00002904 if (negativeOutput && (Py_SIZE(z) != 0)) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002905 temp = (PyLongObject *)long_sub(z, c);
2906 if (temp == NULL)
2907 goto Error;
2908 Py_DECREF(z);
2909 z = temp;
2910 temp = NULL;
2911 }
2912 goto Done;
2913
2914 Error:
2915 if (z != NULL) {
2916 Py_DECREF(z);
2917 z = NULL;
2918 }
2919 /* fall through */
2920 Done:
Christian Heimese93237d2007-12-19 02:37:44 +00002921 if (Py_SIZE(b) > FIVEARY_CUTOFF) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002922 for (i = 0; i < 32; ++i)
2923 Py_XDECREF(table[i]);
2924 }
Tim Petersde7990b2005-07-17 23:45:23 +00002925 Py_DECREF(a);
2926 Py_DECREF(b);
2927 Py_XDECREF(c);
2928 Py_XDECREF(temp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002929 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002930}
2931
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002932static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002933long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002934{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002935 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002936 PyLongObject *x;
2937 PyLongObject *w;
2938 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002939 if (w == NULL)
2940 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002941 x = (PyLongObject *) long_add(v, w);
2942 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002943 if (x == NULL)
2944 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00002945 Py_SIZE(x) = -(Py_SIZE(x));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002946 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002947}
2948
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002949static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002950long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002951{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002952 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002953 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002954 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002955 Py_INCREF(v);
2956 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002957 }
Tim Peters69c2de32001-09-11 22:31:33 +00002958 z = (PyLongObject *)_PyLong_Copy(v);
2959 if (z != NULL)
2960 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002961 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002962}
2963
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002964static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002965long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002966{
2967 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002968 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002969 else
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00002970 return long_long((PyObject *)v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002971}
2972
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002973static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002974long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002975{
Christian Heimese93237d2007-12-19 02:37:44 +00002976 return ABS(Py_SIZE(v)) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002977}
2978
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002979static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002980long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002981{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002982 PyLongObject *a, *b;
2983 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002984 long shiftby;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002985 Py_ssize_t newsize, wordshift, loshift, hishift, i, j;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002986 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002987
Neil Schemenauerba872e22001-01-04 01:46:03 +00002988 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2989
Christian Heimese93237d2007-12-19 02:37:44 +00002990 if (Py_SIZE(a) < 0) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002991 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002992 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002993 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002994 if (a1 == NULL)
2995 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002996 a2 = (PyLongObject *) long_rshift(a1, b);
2997 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002998 if (a2 == NULL)
2999 goto rshift_error;
3000 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003001 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003002 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00003003 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00003004
Neil Schemenauerba872e22001-01-04 01:46:03 +00003005 shiftby = PyLong_AsLong((PyObject *)b);
3006 if (shiftby == -1L && PyErr_Occurred())
3007 goto rshift_error;
3008 if (shiftby < 0) {
3009 PyErr_SetString(PyExc_ValueError,
3010 "negative shift count");
3011 goto rshift_error;
3012 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003013 wordshift = shiftby / PyLong_SHIFT;
Christian Heimese93237d2007-12-19 02:37:44 +00003014 newsize = ABS(Py_SIZE(a)) - wordshift;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003015 if (newsize <= 0) {
3016 z = _PyLong_New(0);
3017 Py_DECREF(a);
3018 Py_DECREF(b);
3019 return (PyObject *)z;
3020 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003021 loshift = shiftby % PyLong_SHIFT;
3022 hishift = PyLong_SHIFT - loshift;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003023 lomask = ((digit)1 << hishift) - 1;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003024 himask = PyLong_MASK ^ lomask;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003025 z = _PyLong_New(newsize);
3026 if (z == NULL)
3027 goto rshift_error;
Christian Heimese93237d2007-12-19 02:37:44 +00003028 if (Py_SIZE(a) < 0)
3029 Py_SIZE(z) = -(Py_SIZE(z));
Neil Schemenauerba872e22001-01-04 01:46:03 +00003030 for (i = 0, j = wordshift; i < newsize; i++, j++) {
3031 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
3032 if (i+1 < newsize)
3033 z->ob_digit[i] |=
3034 (a->ob_digit[j+1] << hishift) & himask;
3035 }
3036 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003037 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00003038rshift_error:
3039 Py_DECREF(a);
3040 Py_DECREF(b);
3041 return (PyObject *) z;
3042
Guido van Rossumc6913e71991-11-19 20:26:46 +00003043}
3044
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003045static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003046long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003047{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003048 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00003049 PyLongObject *a, *b;
3050 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003051 long shiftby;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003052 Py_ssize_t oldsize, newsize, wordshift, remshift, i, j;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003053 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003054
Neil Schemenauerba872e22001-01-04 01:46:03 +00003055 CONVERT_BINOP(v, w, &a, &b);
3056
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003057 shiftby = PyLong_AsLong((PyObject *)b);
3058 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00003059 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003060 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003061 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00003062 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003063 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003064 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003065 PyErr_SetString(PyExc_ValueError,
3066 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00003067 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003068 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003069 /* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
3070 wordshift = (int)shiftby / PyLong_SHIFT;
3071 remshift = (int)shiftby - wordshift * PyLong_SHIFT;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003072
3073 oldsize = ABS(a->ob_size);
3074 newsize = oldsize + wordshift;
3075 if (remshift)
3076 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003077 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003078 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00003079 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003080 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003081 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003082 for (i = 0; i < wordshift; i++)
3083 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003084 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003085 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00003086 accum |= (twodigits)a->ob_digit[j] << remshift;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003087 z->ob_digit[i] = (digit)(accum & PyLong_MASK);
3088 accum >>= PyLong_SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003089 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003090 if (remshift)
3091 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003092 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003093 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003094 z = long_normalize(z);
3095lshift_error:
3096 Py_DECREF(a);
3097 Py_DECREF(b);
3098 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003099}
3100
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003101
3102/* Bitwise and/xor/or operations */
3103
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003104static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003105long_bitwise(PyLongObject *a,
3106 int op, /* '&', '|', '^' */
3107 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003108{
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003109 digit maska, maskb; /* 0 or PyLong_MASK */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003110 int negz;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003111 Py_ssize_t size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003112 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003113 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00003114 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003115 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003116
Christian Heimese93237d2007-12-19 02:37:44 +00003117 if (Py_SIZE(a) < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003118 a = (PyLongObject *) long_invert(a);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003119 if (a == NULL)
3120 return NULL;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003121 maska = PyLong_MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003122 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003123 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003124 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003125 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00003126 }
Christian Heimese93237d2007-12-19 02:37:44 +00003127 if (Py_SIZE(b) < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003128 b = (PyLongObject *) long_invert(b);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003129 if (b == NULL) {
3130 Py_DECREF(a);
3131 return NULL;
3132 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003133 maskb = PyLong_MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003134 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003135 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003136 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003137 maskb = 0;
3138 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003139
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003140 negz = 0;
3141 switch (op) {
3142 case '^':
3143 if (maska != maskb) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003144 maska ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003145 negz = -1;
3146 }
3147 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00003148 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003149 if (maska && maskb) {
3150 op = '|';
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003151 maska ^= PyLong_MASK;
3152 maskb ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003153 negz = -1;
3154 }
3155 break;
3156 case '|':
3157 if (maska || maskb) {
3158 op = '&';
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003159 maska ^= PyLong_MASK;
3160 maskb ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003161 negz = -1;
3162 }
3163 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003164 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003165
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003166 /* JRH: The original logic here was to allocate the result value (z)
3167 as the longer of the two operands. However, there are some cases
3168 where the result is guaranteed to be shorter than that: AND of two
3169 positives, OR of two negatives: use the shorter number. AND with
3170 mixed signs: use the positive number. OR with mixed signs: use the
3171 negative number. After the transformations above, op will be '&'
3172 iff one of these cases applies, and mask will be non-0 for operands
3173 whose length should be ignored.
3174 */
3175
Christian Heimese93237d2007-12-19 02:37:44 +00003176 size_a = Py_SIZE(a);
3177 size_b = Py_SIZE(b);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003178 size_z = op == '&'
3179 ? (maska
3180 ? size_b
3181 : (maskb ? size_a : MIN(size_a, size_b)))
3182 : MAX(size_a, size_b);
3183 z = _PyLong_New(size_z);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003184 if (z == NULL) {
Neal Norwitzef02b9e2006-07-16 02:00:32 +00003185 Py_DECREF(a);
3186 Py_DECREF(b);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003187 return NULL;
3188 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003189
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003190 for (i = 0; i < size_z; ++i) {
3191 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
3192 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
3193 switch (op) {
3194 case '&': z->ob_digit[i] = diga & digb; break;
3195 case '|': z->ob_digit[i] = diga | digb; break;
3196 case '^': z->ob_digit[i] = diga ^ digb; break;
3197 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00003198 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003199
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003200 Py_DECREF(a);
3201 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003202 z = long_normalize(z);
3203 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003204 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003205 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003206 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003207 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003208}
3209
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003210static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003211long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003212{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003213 PyLongObject *a, *b;
3214 PyObject *c;
3215 CONVERT_BINOP(v, w, &a, &b);
3216 c = long_bitwise(a, '&', b);
3217 Py_DECREF(a);
3218 Py_DECREF(b);
3219 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003220}
3221
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003222static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003223long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003224{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003225 PyLongObject *a, *b;
3226 PyObject *c;
3227 CONVERT_BINOP(v, w, &a, &b);
3228 c = long_bitwise(a, '^', b);
3229 Py_DECREF(a);
3230 Py_DECREF(b);
3231 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003232}
3233
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003234static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003235long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003236{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003237 PyLongObject *a, *b;
3238 PyObject *c;
3239 CONVERT_BINOP(v, w, &a, &b);
3240 c = long_bitwise(a, '|', b);
3241 Py_DECREF(a);
3242 Py_DECREF(b);
3243 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00003244}
3245
Guido van Rossum234f9421993-06-17 12:35:49 +00003246static int
Tim Peters9f688bf2000-07-07 15:53:28 +00003247long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00003248{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003249 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00003250 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Georg Brandlc02e1312007-04-11 17:16:24 +00003251 if (*pw == NULL)
3252 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003253 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00003254 return 0;
3255 }
Guido van Rossum1952e382001-09-19 01:25:16 +00003256 else if (PyLong_Check(*pw)) {
3257 Py_INCREF(*pv);
3258 Py_INCREF(*pw);
3259 return 0;
3260 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00003261 return 1; /* Can't do it */
3262}
3263
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003264static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003265long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003266{
Brett Cannonc3647ac2005-04-26 03:45:26 +00003267 if (PyLong_CheckExact(v))
3268 Py_INCREF(v);
3269 else
3270 v = _PyLong_Copy((PyLongObject *)v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003271 return v;
3272}
3273
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003274static PyObject *
Walter Dörwaldf1715402002-11-19 20:49:15 +00003275long_int(PyObject *v)
3276{
3277 long x;
3278 x = PyLong_AsLong(v);
3279 if (PyErr_Occurred()) {
3280 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
3281 PyErr_Clear();
3282 if (PyLong_CheckExact(v)) {
3283 Py_INCREF(v);
3284 return v;
3285 }
3286 else
3287 return _PyLong_Copy((PyLongObject *)v);
3288 }
3289 else
3290 return NULL;
3291 }
3292 return PyInt_FromLong(x);
3293}
3294
3295static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003296long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003297{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00003298 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003299 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00003300 if (result == -1.0 && PyErr_Occurred())
3301 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003302 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003303}
3304
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003305static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003306long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003307{
Eric Smith5e527eb2008-02-10 01:36:53 +00003308 return _PyLong_Format(v, 8, 1, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003309}
3310
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003311static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003312long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003313{
Eric Smith5e527eb2008-02-10 01:36:53 +00003314 return _PyLong_Format(v, 16, 1, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003315}
Jeremy Hylton938ace62002-07-17 16:30:39 +00003316
3317static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00003318long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003319
Tim Peters6d6c1a32001-08-02 04:15:00 +00003320static PyObject *
3321long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3322{
3323 PyObject *x = NULL;
3324 int base = -909; /* unlikely! */
Martin v. Löwis15e62742006-02-27 16:46:16 +00003325 static char *kwlist[] = {"x", "base", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00003326
Guido van Rossumbef14172001-08-29 15:47:46 +00003327 if (type != &PyLong_Type)
3328 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003329 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
3330 &x, &base))
3331 return NULL;
3332 if (x == NULL)
3333 return PyLong_FromLong(0L);
3334 if (base == -909)
3335 return PyNumber_Long(x);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003336 else if (PyString_Check(x)) {
Georg Brandl00cd8182007-03-06 18:41:12 +00003337 /* Since PyLong_FromString doesn't have a length parameter,
3338 * check here for possible NULs in the string. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003339 char *string = PyString_AS_STRING(x);
3340 if (strlen(string) != PyString_Size(x)) {
Georg Brandl00cd8182007-03-06 18:41:12 +00003341 /* create a repr() of the input string,
3342 * just like PyLong_FromString does. */
3343 PyObject *srepr;
3344 srepr = PyObject_Repr(x);
3345 if (srepr == NULL)
3346 return NULL;
3347 PyErr_Format(PyExc_ValueError,
3348 "invalid literal for long() with base %d: %s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003349 base, PyString_AS_STRING(srepr));
Georg Brandl00cd8182007-03-06 18:41:12 +00003350 Py_DECREF(srepr);
3351 return NULL;
3352 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003353 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Georg Brandl00cd8182007-03-06 18:41:12 +00003354 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003355#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00003356 else if (PyUnicode_Check(x))
3357 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
3358 PyUnicode_GET_SIZE(x),
3359 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003360#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003361 else {
3362 PyErr_SetString(PyExc_TypeError,
3363 "long() can't convert non-string with explicit base");
3364 return NULL;
3365 }
3366}
3367
Guido van Rossumbef14172001-08-29 15:47:46 +00003368/* Wimpy, slow approach to tp_new calls for subtypes of long:
3369 first create a regular long from whatever arguments we got,
3370 then allocate a subtype instance and initialize it from
3371 the regular long. The regular long is then thrown away.
3372*/
3373static PyObject *
3374long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3375{
Anthony Baxter377be112006-04-11 06:54:30 +00003376 PyLongObject *tmp, *newobj;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003377 Py_ssize_t i, n;
Guido van Rossumbef14172001-08-29 15:47:46 +00003378
3379 assert(PyType_IsSubtype(type, &PyLong_Type));
3380 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
3381 if (tmp == NULL)
3382 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00003383 assert(PyLong_CheckExact(tmp));
Christian Heimese93237d2007-12-19 02:37:44 +00003384 n = Py_SIZE(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003385 if (n < 0)
3386 n = -n;
Anthony Baxter377be112006-04-11 06:54:30 +00003387 newobj = (PyLongObject *)type->tp_alloc(type, n);
3388 if (newobj == NULL) {
Raymond Hettingerf4667932003-06-28 20:04:25 +00003389 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003390 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00003391 }
Anthony Baxter377be112006-04-11 06:54:30 +00003392 assert(PyLong_Check(newobj));
Christian Heimese93237d2007-12-19 02:37:44 +00003393 Py_SIZE(newobj) = Py_SIZE(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003394 for (i = 0; i < n; i++)
Anthony Baxter377be112006-04-11 06:54:30 +00003395 newobj->ob_digit[i] = tmp->ob_digit[i];
Guido van Rossumbef14172001-08-29 15:47:46 +00003396 Py_DECREF(tmp);
Anthony Baxter377be112006-04-11 06:54:30 +00003397 return (PyObject *)newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00003398}
3399
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003400static PyObject *
3401long_getnewargs(PyLongObject *v)
3402{
3403 return Py_BuildValue("(N)", _PyLong_Copy(v));
3404}
3405
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003406static PyObject *
3407long_getN(PyLongObject *v, void *context) {
Jeffrey Yasskin5de250e2008-03-18 01:09:59 +00003408 return PyLong_FromLong((Py_intptr_t)context);
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003409}
3410
Eric Smitha9f7d622008-02-17 19:46:49 +00003411static PyObject *
3412long__format__(PyObject *self, PyObject *args)
3413{
3414 PyObject *format_spec;
3415
3416 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
3417 return NULL;
Christian Heimes593daf52008-05-26 12:51:38 +00003418 if (PyBytes_Check(format_spec))
Eric Smithdc13b792008-05-30 18:10:04 +00003419 return _PyLong_FormatAdvanced(self,
3420 PyBytes_AS_STRING(format_spec),
3421 PyBytes_GET_SIZE(format_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00003422 if (PyUnicode_Check(format_spec)) {
3423 /* Convert format_spec to a str */
Eric Smithdc13b792008-05-30 18:10:04 +00003424 PyObject *result;
3425 PyObject *str_spec = PyObject_Str(format_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00003426
Eric Smithdc13b792008-05-30 18:10:04 +00003427 if (str_spec == NULL)
3428 return NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +00003429
Eric Smithdc13b792008-05-30 18:10:04 +00003430 result = _PyLong_FormatAdvanced(self,
3431 PyBytes_AS_STRING(str_spec),
3432 PyBytes_GET_SIZE(str_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00003433
Eric Smithdc13b792008-05-30 18:10:04 +00003434 Py_DECREF(str_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00003435 return result;
3436 }
3437 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
3438 return NULL;
3439}
3440
Robert Schuppenies51df0642008-06-01 16:16:17 +00003441static PyObject *
3442long_sizeof(PyLongObject *v)
3443{
3444 Py_ssize_t res;
3445
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00003446 res = v->ob_type->tp_basicsize;
Robert Schuppenies51df0642008-06-01 16:16:17 +00003447 if (v->ob_size != 0)
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00003448 res += abs(v->ob_size) * sizeof(digit);
Robert Schuppenies51df0642008-06-01 16:16:17 +00003449 return PyInt_FromSsize_t(res);
3450}
3451
Christian Heimes6f341092008-04-18 23:13:07 +00003452#if 0
3453static PyObject *
3454long_is_finite(PyObject *v)
3455{
3456 Py_RETURN_TRUE;
3457}
3458#endif
3459
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003460static PyMethodDef long_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003461 {"conjugate", (PyCFunction)long_long, METH_NOARGS,
3462 "Returns self, the complex conjugate of any long."},
Christian Heimes6f341092008-04-18 23:13:07 +00003463#if 0
3464 {"is_finite", (PyCFunction)long_is_finite, METH_NOARGS,
3465 "Returns always True."},
3466#endif
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003467 {"__trunc__", (PyCFunction)long_long, METH_NOARGS,
3468 "Truncating an Integral returns itself."},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003469 {"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
Eric Smitha9f7d622008-02-17 19:46:49 +00003470 {"__format__", (PyCFunction)long__format__, METH_VARARGS},
Robert Schuppenies51df0642008-06-01 16:16:17 +00003471 {"__sizeof__", (PyCFunction)long_sizeof, METH_NOARGS,
Georg Brandl7a6de8b2008-06-01 16:42:16 +00003472 "Returns size in memory, in bytes"},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003473 {NULL, NULL} /* sentinel */
3474};
3475
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003476static PyGetSetDef long_getset[] = {
3477 {"real",
3478 (getter)long_long, (setter)NULL,
3479 "the real part of a complex number",
3480 NULL},
3481 {"imag",
3482 (getter)long_getN, (setter)NULL,
3483 "the imaginary part of a complex number",
3484 (void*)0},
3485 {"numerator",
3486 (getter)long_long, (setter)NULL,
3487 "the numerator of a rational number in lowest terms",
3488 NULL},
3489 {"denominator",
3490 (getter)long_getN, (setter)NULL,
3491 "the denominator of a rational number in lowest terms",
3492 (void*)1},
3493 {NULL} /* Sentinel */
3494};
3495
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003496PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00003497"long(x[, base]) -> integer\n\
3498\n\
3499Convert a string or number to a long integer, if possible. A floating\n\
3500point argument will be truncated towards zero (this does not include a\n\
3501string representation of a floating point number!) When converting a\n\
3502string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003503converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00003504
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003505static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00003506 (binaryfunc) long_add, /*nb_add*/
3507 (binaryfunc) long_sub, /*nb_subtract*/
3508 (binaryfunc) long_mul, /*nb_multiply*/
Georg Brandl347b3002006-03-30 11:57:00 +00003509 long_classic_div, /*nb_divide*/
3510 long_mod, /*nb_remainder*/
3511 long_divmod, /*nb_divmod*/
3512 long_pow, /*nb_power*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003513 (unaryfunc) long_neg, /*nb_negative*/
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003514 (unaryfunc) long_long, /*tp_positive*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003515 (unaryfunc) long_abs, /*tp_absolute*/
3516 (inquiry) long_nonzero, /*tp_nonzero*/
3517 (unaryfunc) long_invert, /*nb_invert*/
Georg Brandl347b3002006-03-30 11:57:00 +00003518 long_lshift, /*nb_lshift*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003519 (binaryfunc) long_rshift, /*nb_rshift*/
Georg Brandl347b3002006-03-30 11:57:00 +00003520 long_and, /*nb_and*/
3521 long_xor, /*nb_xor*/
3522 long_or, /*nb_or*/
3523 long_coerce, /*nb_coerce*/
3524 long_int, /*nb_int*/
3525 long_long, /*nb_long*/
3526 long_float, /*nb_float*/
3527 long_oct, /*nb_oct*/
3528 long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00003529 0, /* nb_inplace_add */
3530 0, /* nb_inplace_subtract */
3531 0, /* nb_inplace_multiply */
3532 0, /* nb_inplace_divide */
3533 0, /* nb_inplace_remainder */
3534 0, /* nb_inplace_power */
3535 0, /* nb_inplace_lshift */
3536 0, /* nb_inplace_rshift */
3537 0, /* nb_inplace_and */
3538 0, /* nb_inplace_xor */
3539 0, /* nb_inplace_or */
Georg Brandl347b3002006-03-30 11:57:00 +00003540 long_div, /* nb_floor_divide */
Guido van Rossum4668b002001-08-08 05:00:18 +00003541 long_true_divide, /* nb_true_divide */
3542 0, /* nb_inplace_floor_divide */
3543 0, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003544 long_long, /* nb_index */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003545};
3546
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003547PyTypeObject PyLong_Type = {
3548 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003549 0, /* ob_size */
3550 "long", /* tp_name */
3551 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
3552 sizeof(digit), /* tp_itemsize */
Georg Brandl347b3002006-03-30 11:57:00 +00003553 long_dealloc, /* tp_dealloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003554 0, /* tp_print */
3555 0, /* tp_getattr */
3556 0, /* tp_setattr */
3557 (cmpfunc)long_compare, /* tp_compare */
Georg Brandl347b3002006-03-30 11:57:00 +00003558 long_repr, /* tp_repr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003559 &long_as_number, /* tp_as_number */
3560 0, /* tp_as_sequence */
3561 0, /* tp_as_mapping */
3562 (hashfunc)long_hash, /* tp_hash */
3563 0, /* tp_call */
Georg Brandl347b3002006-03-30 11:57:00 +00003564 long_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003565 PyObject_GenericGetAttr, /* tp_getattro */
3566 0, /* tp_setattro */
3567 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00003568 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00003569 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003570 long_doc, /* tp_doc */
3571 0, /* tp_traverse */
3572 0, /* tp_clear */
3573 0, /* tp_richcompare */
3574 0, /* tp_weaklistoffset */
3575 0, /* tp_iter */
3576 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003577 long_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003578 0, /* tp_members */
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003579 long_getset, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003580 0, /* tp_base */
3581 0, /* tp_dict */
3582 0, /* tp_descr_get */
3583 0, /* tp_descr_set */
3584 0, /* tp_dictoffset */
3585 0, /* tp_init */
3586 0, /* tp_alloc */
3587 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00003588 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003589};