blob: 6e337d032cdbca32abbe4f4012ecfe45bfa9e6fe [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
2/* Long (arbitrary precision) integer object implementation */
3
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004/* XXX The functional organization of this file is terrible */
5
Guido van Rossumc0b618a1997-05-02 03:12:38 +00006#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00007#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008
Guido van Rossumedcc38a1991-05-05 20:09:44 +00009#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000010#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011
Guido van Rossume32e0141992-01-19 16:31:05 +000012#define ABS(x) ((x) < 0 ? -(x) : (x))
13
14/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000015static PyLongObject *long_normalize(PyLongObject *);
16static PyLongObject *mul1(PyLongObject *, wdigit);
17static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000018static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Tim Peters9f688bf2000-07-07 15:53:28 +000019static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000020
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000021static int ticker; /* XXX Could be shared with ceval? */
22
Guido van Rossumc0b618a1997-05-02 03:12:38 +000023#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000024 if (--ticker < 0) { \
25 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000026 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000027 }
28
Guido van Rossumedcc38a1991-05-05 20:09:44 +000029/* Normalize (remove leading zeros from) a long int object.
30 Doesn't attempt to free the storage--in most cases, due to the nature
31 of the algorithms used, this could save at most be one word anyway. */
32
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000034long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000035{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000036 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037 register int i = j;
38
39 while (i > 0 && v->ob_digit[i-1] == 0)
40 --i;
41 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000042 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000043 return v;
44}
45
46/* Allocate a new long int object with size digits.
47 Return NULL and set exception if we run out of memory. */
48
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000050_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000051{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000053}
54
55/* Create a new long int object from a C long int */
56
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000058PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000059{
Tim Petersce9de2f2001-06-14 04:56:19 +000060 PyLongObject *v;
61 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
62 int ndigits = 0;
63 int negative = 0;
64
65 if (ival < 0) {
66 ival = -ival;
67 negative = 1;
68 }
69
70 /* Count the number of Python digits.
71 We used to pick 5 ("big enough for anything"), but that's a
72 waste of time and space given that 5*15 = 75 bits are rarely
73 needed. */
74 t = (unsigned long)ival;
75 while (t) {
76 ++ndigits;
77 t >>= SHIFT;
78 }
79 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000080 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +000081 digit *p = v->ob_digit;
82 v->ob_size = negative ? -ndigits : ndigits;
83 t = (unsigned long)ival;
84 while (t) {
85 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +000086 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000087 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +000088 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000090}
91
Guido van Rossum53756b11997-01-03 17:14:46 +000092/* Create a new long int object from a C unsigned long int */
93
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000095PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +000096{
Tim Petersce9de2f2001-06-14 04:56:19 +000097 PyLongObject *v;
98 unsigned long t;
99 int ndigits = 0;
100
101 /* Count the number of Python digits. */
102 t = (unsigned long)ival;
103 while (t) {
104 ++ndigits;
105 t >>= SHIFT;
106 }
107 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000108 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000109 digit *p = v->ob_digit;
110 v->ob_size = ndigits;
111 while (ival) {
112 *p++ = (digit)(ival & MASK);
113 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000114 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000115 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000117}
118
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000119/* Create a new long int object from a C double */
120
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000123{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000124 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000125 double frac;
126 int i, ndig, expo, neg;
127 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000128 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000129 PyErr_SetString(PyExc_OverflowError,
130 "cannot convert float infinity to long");
131 return NULL;
132 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000133 if (dval < 0.0) {
134 neg = 1;
135 dval = -dval;
136 }
137 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
138 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000140 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000142 if (v == NULL)
143 return NULL;
144 frac = ldexp(frac, (expo-1) % SHIFT + 1);
145 for (i = ndig; --i >= 0; ) {
146 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000147 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000148 frac = frac - (double)bits;
149 frac = ldexp(frac, SHIFT);
150 }
151 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000152 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000154}
155
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000156/* Get a C long int from a long int object.
157 Returns -1 and sets an error condition if overflow occurs. */
158
159long
Tim Peters9f688bf2000-07-07 15:53:28 +0000160PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000161{
Guido van Rossumf7531811998-05-26 14:33:37 +0000162 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000164 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000165 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000166
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 if (vv == NULL || !PyLong_Check(vv)) {
168 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000169 return -1;
170 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000172 i = v->ob_size;
173 sign = 1;
174 x = 0;
175 if (i < 0) {
176 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000177 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000178 }
179 while (--i >= 0) {
180 prev = x;
181 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000182 if ((x >> SHIFT) != prev)
183 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000184 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000185 /* Haven't lost any bits, but if the sign bit is set we're in
186 * trouble *unless* this is the min negative number. So,
187 * trouble iff sign bit set && (positive || some bit set other
188 * than the sign bit).
189 */
190 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
191 goto overflow;
192 return (long)x * sign;
193
194 overflow:
195 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000196 "long int too large to convert");
Guido van Rossumf7531811998-05-26 14:33:37 +0000197 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000198}
199
Guido van Rossum53756b11997-01-03 17:14:46 +0000200/* Get a C long int from a long int object.
201 Returns -1 and sets an error condition if overflow occurs. */
202
203unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000204PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000205{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000207 unsigned long x, prev;
208 int i;
209
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 if (vv == NULL || !PyLong_Check(vv)) {
211 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000212 return (unsigned long) -1;
213 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000215 i = v->ob_size;
216 x = 0;
217 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000218 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000219 "can't convert negative value to unsigned long");
220 return (unsigned long) -1;
221 }
222 while (--i >= 0) {
223 prev = x;
224 x = (x << SHIFT) + v->ob_digit[i];
225 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000227 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000228 return (unsigned long) -1;
229 }
230 }
231 return x;
232}
233
Tim Peters2a9b3672001-06-11 21:23:58 +0000234PyObject *
235_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
236 int little_endian, int is_signed)
237{
238 const unsigned char* pstartbyte;/* LSB of bytes */
239 int incr; /* direction to move pstartbyte */
240 const unsigned char* pendbyte; /* MSB of bytes */
241 size_t numsignificantbytes; /* number of bytes that matter */
242 size_t ndigits; /* number of Python long digits */
243 PyLongObject* v; /* result */
244 int idigit = 0; /* next free index in v->ob_digit */
245
246 if (n == 0)
247 return PyLong_FromLong(0L);
248
249 if (little_endian) {
250 pstartbyte = bytes;
251 pendbyte = bytes + n - 1;
252 incr = 1;
253 }
254 else {
255 pstartbyte = bytes + n - 1;
256 pendbyte = bytes;
257 incr = -1;
258 }
259
260 if (is_signed)
261 is_signed = *pendbyte >= 0x80;
262
263 /* Compute numsignificantbytes. This consists of finding the most
264 significant byte. Leading 0 bytes are insignficant if the number
265 is positive, and leading 0xff bytes if negative. */
266 {
267 size_t i;
268 const unsigned char* p = pendbyte;
269 const int pincr = -incr; /* search MSB to LSB */
270 const unsigned char insignficant = is_signed ? 0xff : 0x00;
271
272 for (i = 0; i < n; ++i, p += pincr) {
273 if (*p != insignficant)
274 break;
275 }
276 numsignificantbytes = n - i;
277 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
278 actually has 2 significant bytes. OTOH, 0xff0001 ==
279 -0x00ffff, so we wouldn't *need* to bump it there; but we
280 do for 0xffff = -0x0001. To be safe without bothering to
281 check every case, bump it regardless. */
282 if (is_signed && numsignificantbytes < n)
283 ++numsignificantbytes;
284 }
285
286 /* How many Python long digits do we need? We have
287 8*numsignificantbytes bits, and each Python long digit has SHIFT
288 bits, so it's the ceiling of the quotient. */
289 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
290 if (ndigits > (size_t)INT_MAX)
291 return PyErr_NoMemory();
292 v = _PyLong_New((int)ndigits);
293 if (v == NULL)
294 return NULL;
295
296 /* Copy the bits over. The tricky parts are computing 2's-comp on
297 the fly for signed numbers, and dealing with the mismatch between
298 8-bit bytes and (probably) 15-bit Python digits.*/
299 {
300 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000301 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000302 twodigits accum = 0; /* sliding register */
303 unsigned int accumbits = 0; /* number of bits in accum */
304 const unsigned char* p = pstartbyte;
305
306 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000307 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000308 /* Compute correction for 2's comp, if needed. */
309 if (is_signed) {
310 thisbyte = (0xff ^ thisbyte) + carry;
311 carry = thisbyte >> 8;
312 thisbyte &= 0xff;
313 }
314 /* Because we're going LSB to MSB, thisbyte is
315 more significant than what's already in accum,
316 so needs to be prepended to accum. */
317 accum |= thisbyte << accumbits;
318 accumbits += 8;
319 if (accumbits >= SHIFT) {
320 /* There's enough to fill a Python digit. */
321 assert(idigit < (int)ndigits);
322 v->ob_digit[idigit] = (digit)(accum & MASK);
323 ++idigit;
324 accum >>= SHIFT;
325 accumbits -= SHIFT;
326 assert(accumbits < SHIFT);
327 }
328 }
329 assert(accumbits < SHIFT);
330 if (accumbits) {
331 assert(idigit < (int)ndigits);
332 v->ob_digit[idigit] = (digit)accum;
333 ++idigit;
334 }
335 }
336
337 v->ob_size = is_signed ? -idigit : idigit;
338 return (PyObject *)long_normalize(v);
339}
340
341int
342_PyLong_AsByteArray(PyLongObject* v,
343 unsigned char* bytes, size_t n,
344 int little_endian, int is_signed)
345{
346 int i; /* index into v->ob_digit */
347 int ndigits; /* |v->ob_size| */
348 twodigits accum; /* sliding register */
349 unsigned int accumbits; /* # bits in accum */
350 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
351 twodigits carry; /* for computing 2's-comp */
352 size_t j; /* # bytes filled */
353 unsigned char* p; /* pointer to next byte in bytes */
354 int pincr; /* direction to move p */
355
356 assert(v != NULL && PyLong_Check(v));
357
358 if (v->ob_size < 0) {
359 ndigits = -(v->ob_size);
360 if (!is_signed) {
361 PyErr_SetString(PyExc_TypeError,
362 "can't convert negative long to unsigned");
363 return -1;
364 }
365 do_twos_comp = 1;
366 }
367 else {
368 ndigits = v->ob_size;
369 do_twos_comp = 0;
370 }
371
372 if (little_endian) {
373 p = bytes;
374 pincr = 1;
375 }
376 else {
377 p = bytes + n - 1;
378 pincr = -1;
379 }
380
Tim Peters898cf852001-06-13 20:50:08 +0000381 /* Copy over all the Python digits.
382 It's crucial that every Python digit except for the MSD contribute
383 exactly SHIFT bits to the total, so first assert that the long is
384 normalized. */
385 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000386 j = 0;
387 accum = 0;
388 accumbits = 0;
389 carry = do_twos_comp ? 1 : 0;
390 for (i = 0; i < ndigits; ++i) {
391 twodigits thisdigit = v->ob_digit[i];
392 if (do_twos_comp) {
393 thisdigit = (thisdigit ^ MASK) + carry;
394 carry = thisdigit >> SHIFT;
395 thisdigit &= MASK;
396 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000397 /* Because we're going LSB to MSB, thisdigit is more
398 significant than what's already in accum, so needs to be
399 prepended to accum. */
400 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000401 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000402
Tim Petersede05092001-06-14 08:53:38 +0000403 /* The most-significant digit may be (probably is) at least
404 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000405 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000406 /* Count # of sign bits -- they needn't be stored,
407 * although for signed conversion we need later to
408 * make sure at least one sign bit gets stored.
409 * First shift conceptual sign bit to real sign bit.
410 */
411 stwodigits s = (stwodigits)(thisdigit <<
412 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000413 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000414 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000415 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000416 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000417 }
Tim Petersede05092001-06-14 08:53:38 +0000418 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000419 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000420
Tim Peters2a9b3672001-06-11 21:23:58 +0000421 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000422 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000423 if (j >= n)
424 goto Overflow;
425 ++j;
426 *p = (unsigned char)(accum & 0xff);
427 p += pincr;
428 accumbits -= 8;
429 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000430 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000431 }
432
433 /* Store the straggler (if any). */
434 assert(accumbits < 8);
435 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000436 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000437 if (j >= n)
438 goto Overflow;
439 ++j;
440 if (do_twos_comp) {
441 /* Fill leading bits of the byte with sign bits
442 (appropriately pretending that the long had an
443 infinite supply of sign bits). */
444 accum |= (~(twodigits)0) << accumbits;
445 }
446 *p = (unsigned char)(accum & 0xff);
447 p += pincr;
448 }
Tim Peters05607ad2001-06-13 21:01:27 +0000449 else if (j == n && n > 0 && is_signed) {
450 /* The main loop filled the byte array exactly, so the code
451 just above didn't get to ensure there's a sign bit, and the
452 loop below wouldn't add one either. Make sure a sign bit
453 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000454 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000455 int sign_bit_set = msb >= 0x80;
456 assert(accumbits == 0);
457 if (sign_bit_set == do_twos_comp)
458 return 0;
459 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000460 goto Overflow;
461 }
Tim Peters05607ad2001-06-13 21:01:27 +0000462
463 /* Fill remaining bytes with copies of the sign bit. */
464 {
465 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
466 for ( ; j < n; ++j, p += pincr)
467 *p = signbyte;
468 }
469
Tim Peters2a9b3672001-06-11 21:23:58 +0000470 return 0;
471
472Overflow:
473 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
474 return -1;
475
476}
477
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000478/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000479
480double
Tim Peters9f688bf2000-07-07 15:53:28 +0000481PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000482{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000484 double x;
485 double multiplier = (double) (1L << SHIFT);
486 int i, sign;
487
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 if (vv == NULL || !PyLong_Check(vv)) {
489 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000490 return -1;
491 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000493 i = v->ob_size;
494 sign = 1;
495 x = 0.0;
496 if (i < 0) {
497 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000498 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000499 }
500 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000501 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000502 }
503 return x * sign;
504}
505
Guido van Rossum78694d91998-09-18 14:14:13 +0000506/* Create a new long (or int) object from a C pointer */
507
508PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000509PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000510{
Tim Peters70128a12001-06-16 08:48:40 +0000511#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000512 return PyInt_FromLong((long)p);
513#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000514
Tim Peters70128a12001-06-16 08:48:40 +0000515#ifndef HAVE_LONG_LONG
516# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
517#endif
518#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
519# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
520#endif
521 /* optimize null pointers */
522 if (p == NULL)
523 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000524 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000525
526#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000527}
528
529/* Get a C pointer from a long object (or an int object in some cases) */
530
531void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000532PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000533{
534 /* This function will allow int or long objects. If vv is neither,
535 then the PyLong_AsLong*() functions will raise the exception:
536 PyExc_SystemError, "bad argument to internal function"
537 */
Tim Peters70128a12001-06-16 08:48:40 +0000538#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000539 long x;
540
Tim Peters70128a12001-06-16 08:48:40 +0000541 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000542 x = PyInt_AS_LONG(vv);
543 else
544 x = PyLong_AsLong(vv);
545#else
Tim Peters70128a12001-06-16 08:48:40 +0000546
547#ifndef HAVE_LONG_LONG
548# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
549#endif
550#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
551# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
552#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000553 LONG_LONG x;
554
Tim Peters70128a12001-06-16 08:48:40 +0000555 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000556 x = PyInt_AS_LONG(vv);
557 else
558 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000559
560#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000561
562 if (x == -1 && PyErr_Occurred())
563 return NULL;
564 return (void *)x;
565}
566
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000567#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000568
569/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
570 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000571 */
572
Tim Peterscf37dfc2001-06-14 18:42:50 +0000573#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000574
575/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000576
577PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000578PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000579{
Tim Petersd1a7da62001-06-13 00:35:57 +0000580 LONG_LONG bytes = ival;
581 int one = 1;
582 return _PyLong_FromByteArray(
583 (unsigned char *)&bytes,
584 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000585}
586
Tim Petersd1a7da62001-06-13 00:35:57 +0000587/* Create a new long int object from a C unsigned LONG_LONG int. */
588
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000589PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000590PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000591{
Tim Petersd1a7da62001-06-13 00:35:57 +0000592 unsigned LONG_LONG bytes = ival;
593 int one = 1;
594 return _PyLong_FromByteArray(
595 (unsigned char *)&bytes,
596 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000597}
598
Guido van Rossum3293b071998-08-25 16:07:15 +0000599/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000600 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000601
Guido van Rossum3293b071998-08-25 16:07:15 +0000602LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000603PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000604{
Tim Petersd1a7da62001-06-13 00:35:57 +0000605 LONG_LONG bytes;
606 int one = 1;
607 int res;
608
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000609 if (vv == NULL || !PyLong_Check(vv)) {
610 PyErr_BadInternalCall();
611 return -1;
612 }
613
Tim Petersd1a7da62001-06-13 00:35:57 +0000614 res = _PyLong_AsByteArray(
615 (PyLongObject *)vv, (unsigned char *)&bytes,
616 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000617
Tim Peters9cb0c382001-06-13 20:45:17 +0000618 return res < 0 ? (LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000619}
620
Tim Petersd1a7da62001-06-13 00:35:57 +0000621/* Get a C unsigned LONG_LONG int from a long int object.
622 Return -1 and set an error if overflow occurs. */
623
Guido van Rossum3293b071998-08-25 16:07:15 +0000624unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000625PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000626{
Tim Petersd1a7da62001-06-13 00:35:57 +0000627 unsigned LONG_LONG bytes;
628 int one = 1;
629 int res;
630
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000631 if (vv == NULL || !PyLong_Check(vv)) {
632 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000633 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000634 }
635
Tim Petersd1a7da62001-06-13 00:35:57 +0000636 res = _PyLong_AsByteArray(
637 (PyLongObject *)vv, (unsigned char *)&bytes,
638 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000639
Tim Peters9cb0c382001-06-13 20:45:17 +0000640 return res < 0 ? (unsigned LONG_LONG)res : bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000641}
Tim Petersd1a7da62001-06-13 00:35:57 +0000642
643#undef IS_LITTLE_ENDIAN
644
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000645#endif /* HAVE_LONG_LONG */
646
Neil Schemenauerba872e22001-01-04 01:46:03 +0000647
648static int
649convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
650 if (PyLong_Check(v)) {
651 *a = (PyLongObject *) v;
652 Py_INCREF(v);
653 }
654 else if (PyInt_Check(v)) {
655 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
656 }
657 else {
658 return 0;
659 }
660 if (PyLong_Check(w)) {
661 *b = (PyLongObject *) w;
662 Py_INCREF(w);
663 }
664 else if (PyInt_Check(w)) {
665 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
666 }
667 else {
668 Py_DECREF(*a);
669 return 0;
670 }
671 return 1;
672}
673
674#define CONVERT_BINOP(v, w, a, b) \
675 if (!convert_binop(v, w, a, b)) { \
676 Py_INCREF(Py_NotImplemented); \
677 return Py_NotImplemented; \
678 }
679
680
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000681/* Multiply by a single digit, ignoring the sign. */
682
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000684mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000685{
686 return muladd1(a, n, (digit)0);
687}
688
689/* Multiply by a single digit and add a single digit, ignoring the sign. */
690
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000692muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000693{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000694 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000696 twodigits carry = extra;
697 int i;
698
699 if (z == NULL)
700 return NULL;
701 for (i = 0; i < size_a; ++i) {
702 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000703 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000704 carry >>= SHIFT;
705 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000706 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000707 return long_normalize(z);
708}
709
Tim Peters212e6142001-07-14 12:23:19 +0000710/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
711 in pout, and returning the remainder. pin and pout point at the LSD.
712 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
713 long_format, but that should be done with great care since longs are
714 immutable. */
715
716static digit
717inplace_divrem1(digit *pout, digit *pin, int size, digit n)
718{
719 twodigits rem = 0;
720
721 assert(n > 0 && n <= MASK);
722 pin += size;
723 pout += size;
724 while (--size >= 0) {
725 digit hi;
726 rem = (rem << SHIFT) + *--pin;
727 *--pout = hi = (digit)(rem / n);
728 rem -= hi * n;
729 }
730 return (digit)rem;
731}
732
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000733/* Divide a long integer by a digit, returning both the quotient
734 (as function result) and the remainder (through *prem).
735 The sign of a is ignored; n should not be zero. */
736
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000738divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000739{
Tim Peters212e6142001-07-14 12:23:19 +0000740 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000742
743 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000744 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000745 if (z == NULL)
746 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000747 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000748 return long_normalize(z);
749}
750
751/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000752 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000753 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000754
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000756long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000757{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000758 register PyLongObject *a = (PyLongObject *)aa;
759 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000760 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000761 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000762 char *p;
763 int bits;
764 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000765
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 if (a == NULL || !PyLong_Check(a)) {
767 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000768 return NULL;
769 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000770 assert(base >= 2 && base <= 36);
771
772 /* Compute a rough upper bound for the length of the string */
773 i = base;
774 bits = 0;
775 while (i > 1) {
776 ++bits;
777 i >>= 1;
778 }
Fred Drake121ee271999-12-23 15:41:28 +0000779 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000780 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000781 if (str == NULL)
782 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000784 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000785 if (addL)
786 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000787 if (a->ob_size < 0)
788 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000789
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000790 if (a->ob_size == 0) {
791 *--p = '0';
792 }
793 else if ((base & (base - 1)) == 0) {
794 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000795 twodigits accum = 0;
796 int accumbits = 0; /* # of bits in accum */
797 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000798 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000799 while ((i >>= 1) > 1)
800 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000801
802 for (i = 0; i < size_a; ++i) {
803 accum |= a->ob_digit[i] << accumbits;
804 accumbits += SHIFT;
805 assert(accumbits >= basebits);
806 do {
807 char digit = (char)(accum & (base - 1));
808 digit += (digit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000809 assert(p > PyString_AS_STRING(str));
Tim Peters586b2e32001-07-15 09:11:14 +0000810 *--p = digit;
811 accumbits -= basebits;
812 accum >>= basebits;
813 } while (i < size_a-1 ? accumbits >= basebits :
814 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000815 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000816 }
817 else {
Tim Petersfad225f2001-07-13 02:59:26 +0000818 /* Not 0, and base not a power of 2. Divide repeatedly by
819 base, but for speed use the highest power of base that
820 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +0000821 int size = size_a;
822 digit *pin = a->ob_digit;
823 PyLongObject *scratch;
824 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +0000825 digit powbase = base; /* powbase == base ** power */
826 int power = 1;
827 for (;;) {
828 unsigned long newpow = powbase * (unsigned long)base;
829 if (newpow >> SHIFT) /* doesn't fit in a digit */
830 break;
831 powbase = (digit)newpow;
832 ++power;
833 }
Tim Peters212e6142001-07-14 12:23:19 +0000834
835 /* Get a scratch area for repeated division. */
836 scratch = _PyLong_New(size);
837 if (scratch == NULL) {
838 Py_DECREF(str);
839 return NULL;
840 }
841
842 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000843 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000844 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +0000845 digit rem = inplace_divrem1(scratch->ob_digit,
846 pin, size, powbase);
847 pin = scratch->ob_digit; /* no need to use a again */
848 if (pin[size - 1] == 0)
849 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000850 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +0000851 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000852 Py_DECREF(str);
853 return NULL;
854 })
Tim Peters212e6142001-07-14 12:23:19 +0000855
856 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000857 assert(ntostore > 0);
858 do {
Tim Petersfad225f2001-07-13 02:59:26 +0000859 digit nextrem = (digit)(rem / base);
860 char c = (char)(rem - nextrem * base);
861 assert(p > PyString_AS_STRING(str));
862 c += (c < 10) ? '0' : 'A'-10;
863 *--p = c;
864 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +0000865 --ntostore;
866 /* Termination is a bit delicate: must not
867 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +0000868 remaining quotient and rem are both 0. */
869 } while (ntostore && (size || rem));
870 } while (size != 0);
871 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000872 }
873
Guido van Rossum2c475421992-08-14 15:13:07 +0000874 if (base == 8) {
875 if (size_a != 0)
876 *--p = '0';
877 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000878 else if (base == 16) {
879 *--p = 'x';
880 *--p = '0';
881 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000882 else if (base != 10) {
883 *--p = '#';
884 *--p = '0' + base%10;
885 if (base > 10)
886 *--p = '0' + base/10;
887 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000888 if (sign)
889 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 if (p != PyString_AS_STRING(str)) {
891 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000892 assert(p > q);
893 do {
894 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000895 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896 _PyString_Resize((PyObject **)&str,
897 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000898 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000899 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000900}
901
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000903PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000904{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000905 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000906 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000908
Guido van Rossum472c04f1996-12-05 21:57:21 +0000909 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000910 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000911 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000912 return NULL;
913 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000914 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000915 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000916 if (*str == '+')
917 ++str;
918 else if (*str == '-') {
919 ++str;
920 sign = -1;
921 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000922 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000923 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000924 if (base == 0) {
925 if (str[0] != '0')
926 base = 10;
927 else if (str[1] == 'x' || str[1] == 'X')
928 base = 16;
929 else
930 base = 8;
931 }
932 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
933 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000935 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000936 for ( ; z != NULL; ++str) {
937 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000939
940 if (*str <= '9')
941 k = *str - '0';
942 else if (*str >= 'a')
943 k = *str - 'a' + 10;
944 else if (*str >= 'A')
945 k = *str - 'A' + 10;
946 if (k < 0 || k >= base)
947 break;
948 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000950 z = temp;
951 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000952 if (z == NULL)
953 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000954 if (str == start)
955 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000956 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000957 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000958 if (*str == 'L' || *str == 'l')
959 str++;
960 while (*str && isspace(Py_CHARMASK(*str)))
961 str++;
962 if (*str != '\0')
963 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000964 if (pend)
965 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000966 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000967
968 onError:
969 PyErr_Format(PyExc_ValueError,
970 "invalid literal for long(): %.200s", orig_str);
971 Py_XDECREF(z);
972 return NULL;
973}
974
975PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000976PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000977{
978 char buffer[256];
979
980 if (length >= sizeof(buffer)) {
981 PyErr_SetString(PyExc_ValueError,
982 "long() literal too large to convert");
983 return NULL;
984 }
985 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
986 return NULL;
987
988 return PyLong_FromString(buffer, NULL, base);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000989}
990
Tim Peters9f688bf2000-07-07 15:53:28 +0000991/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +0000993 (PyLongObject *, PyLongObject *, PyLongObject **);
994static PyObject *long_pos(PyLongObject *);
995static int long_divrem(PyLongObject *, PyLongObject *,
996 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000997
998/* Long division with remainder, top-level routine */
999
Guido van Rossume32e0141992-01-19 16:31:05 +00001000static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001001long_divrem(PyLongObject *a, PyLongObject *b,
1002 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001003{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001004 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001006
1007 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001008 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001009 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001010 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001011 }
1012 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001013 (size_a == size_b &&
1014 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001015 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 *pdiv = _PyLong_New(0);
1017 Py_INCREF(a);
1018 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001019 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001020 }
1021 if (size_b == 1) {
1022 digit rem = 0;
1023 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001024 if (z == NULL)
1025 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001026 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001027 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001028 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001029 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001030 if (z == NULL)
1031 return -1;
1032 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001033 /* Set the signs.
1034 The quotient z has the sign of a*b;
1035 the remainder r has the sign of a,
1036 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001037 if ((a->ob_size < 0) != (b->ob_size < 0))
1038 z->ob_size = -(z->ob_size);
1039 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1040 (*prem)->ob_size = -((*prem)->ob_size);
1041 *pdiv = z;
1042 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001043}
1044
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001045/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001046
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001048x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001049{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001050 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001051 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052 PyLongObject *v = mul1(v1, d);
1053 PyLongObject *w = mul1(w1, d);
1054 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001055 int j, k;
1056
1057 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001058 Py_XDECREF(v);
1059 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001060 return NULL;
1061 }
1062
1063 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001064 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001065 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001066
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001067 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001068 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001069
1070 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1071 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1072 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001073 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001074 int i;
1075
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001076 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001077 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001078 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001079 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001080 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001081 if (vj == w->ob_digit[size_w-1])
1082 q = MASK;
1083 else
1084 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1085 w->ob_digit[size_w-1];
1086
1087 while (w->ob_digit[size_w-2]*q >
1088 ((
1089 ((twodigits)vj << SHIFT)
1090 + v->ob_digit[j-1]
1091 - q*w->ob_digit[size_w-1]
1092 ) << SHIFT)
1093 + v->ob_digit[j-2])
1094 --q;
1095
1096 for (i = 0; i < size_w && i+k < size_v; ++i) {
1097 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001098 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099 carry += v->ob_digit[i+k] - z
1100 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001101 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001102 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1103 carry, SHIFT);
1104 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001105 }
1106
1107 if (i+k < size_v) {
1108 carry += v->ob_digit[i+k];
1109 v->ob_digit[i+k] = 0;
1110 }
1111
1112 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001113 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001114 else {
1115 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001116 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001117 carry = 0;
1118 for (i = 0; i < size_w && i+k < size_v; ++i) {
1119 carry += v->ob_digit[i+k] + w->ob_digit[i];
1120 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001121 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1122 BASE_TWODIGITS_TYPE,
1123 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001124 }
1125 }
1126 } /* for j, k */
1127
Guido van Rossumc206c761995-01-10 15:23:19 +00001128 if (a == NULL)
1129 *prem = NULL;
1130 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001131 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001132 *prem = divrem1(v, d, &d);
1133 /* d receives the (unused) remainder */
1134 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001136 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001137 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001138 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001139 Py_DECREF(v);
1140 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001141 return a;
1142}
1143
1144/* Methods */
1145
1146static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001147long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001148{
Guido van Rossumb18618d2000-05-03 23:44:39 +00001149 PyObject_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001150}
1151
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001153long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001154{
Fred Drake121ee271999-12-23 15:41:28 +00001155 return long_format(v, 10, 1);
1156}
1157
1158static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001159long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001160{
1161 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001162}
1163
1164static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001165long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001166{
1167 int sign;
1168
Guido van Rossumc6913e71991-11-19 20:26:46 +00001169 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001170 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001171 sign = 0;
1172 else
1173 sign = a->ob_size - b->ob_size;
1174 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001175 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001176 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001177 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1178 ;
1179 if (i < 0)
1180 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001181 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001182 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001183 if (a->ob_size < 0)
1184 sign = -sign;
1185 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001186 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001187 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001188}
1189
Guido van Rossum9bfef441993-03-29 10:43:31 +00001190static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001191long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001192{
1193 long x;
1194 int i, sign;
1195
1196 /* This is designed so that Python ints and longs with the
1197 same value hash to the same value, otherwise comparisons
1198 of mapping keys will turn out weird */
1199 i = v->ob_size;
1200 sign = 1;
1201 x = 0;
1202 if (i < 0) {
1203 sign = -1;
1204 i = -(i);
1205 }
1206 while (--i >= 0) {
1207 /* Force a 32-bit circular shift */
1208 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1209 x += v->ob_digit[i];
1210 }
1211 x = x * sign;
1212 if (x == -1)
1213 x = -2;
1214 return x;
1215}
1216
1217
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001218/* Add the absolute values of two long integers. */
1219
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001221x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001222{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001223 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001224 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001225 int i;
1226 digit carry = 0;
1227
1228 /* Ensure a is the larger of the two: */
1229 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230 { PyLongObject *temp = a; a = b; b = temp; }
1231 { int size_temp = size_a;
1232 size_a = size_b;
1233 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001234 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001236 if (z == NULL)
1237 return NULL;
1238 for (i = 0; i < size_b; ++i) {
1239 carry += a->ob_digit[i] + b->ob_digit[i];
1240 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001241 carry >>= SHIFT;
1242 }
1243 for (; i < size_a; ++i) {
1244 carry += a->ob_digit[i];
1245 z->ob_digit[i] = carry & MASK;
1246 carry >>= SHIFT;
1247 }
1248 z->ob_digit[i] = carry;
1249 return long_normalize(z);
1250}
1251
1252/* Subtract the absolute values of two integers. */
1253
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001255x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001256{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001257 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001258 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001259 int i;
1260 int sign = 1;
1261 digit borrow = 0;
1262
1263 /* Ensure a is the larger of the two: */
1264 if (size_a < size_b) {
1265 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001266 { PyLongObject *temp = a; a = b; b = temp; }
1267 { int size_temp = size_a;
1268 size_a = size_b;
1269 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001270 }
1271 else if (size_a == size_b) {
1272 /* Find highest digit where a and b differ: */
1273 i = size_a;
1274 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1275 ;
1276 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001278 if (a->ob_digit[i] < b->ob_digit[i]) {
1279 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001281 }
1282 size_a = size_b = i+1;
1283 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001284 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001285 if (z == NULL)
1286 return NULL;
1287 for (i = 0; i < size_b; ++i) {
1288 /* The following assumes unsigned arithmetic
1289 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001290 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001291 z->ob_digit[i] = borrow & MASK;
1292 borrow >>= SHIFT;
1293 borrow &= 1; /* Keep only one sign bit */
1294 }
1295 for (; i < size_a; ++i) {
1296 borrow = a->ob_digit[i] - borrow;
1297 z->ob_digit[i] = borrow & MASK;
1298 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001299 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001300 }
1301 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001302 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001303 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001304 return long_normalize(z);
1305}
1306
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001308long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001309{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001310 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001311
Neil Schemenauerba872e22001-01-04 01:46:03 +00001312 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1313
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001314 if (a->ob_size < 0) {
1315 if (b->ob_size < 0) {
1316 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001317 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001318 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001319 }
1320 else
1321 z = x_sub(b, a);
1322 }
1323 else {
1324 if (b->ob_size < 0)
1325 z = x_sub(a, b);
1326 else
1327 z = x_add(a, b);
1328 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001329 Py_DECREF(a);
1330 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001332}
1333
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001335long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001336{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001337 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001338
Neil Schemenauerba872e22001-01-04 01:46:03 +00001339 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1340
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001341 if (a->ob_size < 0) {
1342 if (b->ob_size < 0)
1343 z = x_sub(a, b);
1344 else
1345 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001346 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001347 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001348 }
1349 else {
1350 if (b->ob_size < 0)
1351 z = x_add(a, b);
1352 else
1353 z = x_sub(a, b);
1354 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001355 Py_DECREF(a);
1356 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001357 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001358}
1359
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001360static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001361long_repeat(PyObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001362{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001363 /* sequence * long */
1364 long n = PyLong_AsLong((PyObject *) w);
1365 if (n == -1 && PyErr_Occurred())
1366 return NULL;
1367 else
1368 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
1369}
1370
1371static PyObject *
1372long_mul(PyLongObject *v, PyLongObject *w)
1373{
1374 PyLongObject *a, *b, *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001375 int size_a;
1376 int size_b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001377 int i;
1378
Neil Schemenauerba872e22001-01-04 01:46:03 +00001379 if (v->ob_type->tp_as_sequence &&
1380 v->ob_type->tp_as_sequence->sq_repeat) {
1381 return long_repeat((PyObject *)v, w);
1382 }
1383 else if (w->ob_type->tp_as_sequence &&
1384 w->ob_type->tp_as_sequence->sq_repeat) {
1385 return long_repeat((PyObject *)w, v);
1386 }
1387
1388 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1389
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001390 size_a = ABS(a->ob_size);
1391 size_b = ABS(b->ob_size);
Guido van Rossumba71a242000-04-10 17:31:58 +00001392 if (size_a > size_b) {
1393 /* we are faster with the small object on the left */
1394 int hold_sa = size_a;
1395 PyLongObject *hold_a = a;
1396 size_a = size_b;
1397 size_b = hold_sa;
1398 a = b;
1399 b = hold_a;
1400 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001401 z = _PyLong_New(size_a + size_b);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001402 if (z == NULL) {
1403 Py_DECREF(a);
1404 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001405 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001406 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001407 for (i = 0; i < z->ob_size; ++i)
1408 z->ob_digit[i] = 0;
1409 for (i = 0; i < size_a; ++i) {
1410 twodigits carry = 0;
1411 twodigits f = a->ob_digit[i];
1412 int j;
1413
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001414 SIGCHECK({
Neil Schemenauerba872e22001-01-04 01:46:03 +00001415 Py_DECREF(a);
1416 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001418 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001419 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001420 for (j = 0; j < size_b; ++j) {
1421 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +00001422 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001423 carry >>= SHIFT;
1424 }
1425 for (; carry != 0; ++j) {
1426 assert(i+j < z->ob_size);
1427 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +00001428 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001429 carry >>= SHIFT;
1430 }
1431 }
1432 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001433 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001434 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001435 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001436 Py_DECREF(a);
1437 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001439}
1440
Guido van Rossume32e0141992-01-19 16:31:05 +00001441/* The / and % operators are now defined in terms of divmod().
1442 The expression a mod b has the value a - b*floor(a/b).
1443 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001444 |a| by |b|, with the sign of a. This is also expressed
1445 as a - b*trunc(a/b), if trunc truncates towards zero.
1446 Some examples:
1447 a b a rem b a mod b
1448 13 10 3 3
1449 -13 10 -3 7
1450 13 -10 3 -7
1451 -13 -10 -3 -3
1452 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001453 have different signs. We then subtract one from the 'div'
1454 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001455
Guido van Rossume32e0141992-01-19 16:31:05 +00001456static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001457l_divmod(PyLongObject *v, PyLongObject *w,
1458 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00001459{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001460 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001461
1462 if (long_divrem(v, w, &div, &mod) < 0)
1463 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00001464 if ((mod->ob_size < 0 && w->ob_size > 0) ||
1465 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001466 PyLongObject *temp;
1467 PyLongObject *one;
1468 temp = (PyLongObject *) long_add(mod, w);
1469 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00001470 mod = temp;
1471 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001472 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001473 return -1;
1474 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00001476 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001477 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
1478 Py_DECREF(mod);
1479 Py_DECREF(div);
1480 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00001481 return -1;
1482 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001483 Py_DECREF(one);
1484 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001485 div = temp;
1486 }
1487 *pdiv = div;
1488 *pmod = mod;
1489 return 0;
1490}
1491
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001492static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001493long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001494{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001495 PyLongObject *a, *b, *div, *mod;
1496
1497 CONVERT_BINOP(v, w, &a, &b);
1498
1499 if (l_divmod(a, b, &div, &mod) < 0) {
1500 Py_DECREF(a);
1501 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001502 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001503 }
1504 Py_DECREF(a);
1505 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001506 Py_DECREF(mod);
1507 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001508}
1509
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001510static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001511long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00001512{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001513 PyLongObject *a, *b, *div, *mod;
1514
1515 CONVERT_BINOP(v, w, &a, &b);
1516
1517 if (l_divmod(a, b, &div, &mod) < 0) {
1518 Py_DECREF(a);
1519 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00001520 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001521 }
1522 Py_DECREF(a);
1523 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001524 Py_DECREF(div);
1525 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001526}
1527
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001528static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001529long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001530{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001531 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001532 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001533
1534 CONVERT_BINOP(v, w, &a, &b);
1535
1536 if (l_divmod(a, b, &div, &mod) < 0) {
1537 Py_DECREF(a);
1538 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001539 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001540 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001541 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001542 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543 PyTuple_SetItem(z, 0, (PyObject *) div);
1544 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001545 }
1546 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001547 Py_DECREF(div);
1548 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001549 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001550 Py_DECREF(a);
1551 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001552 return z;
1553}
1554
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001555static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001556long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001557{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001558 PyLongObject *a, *b;
1559 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001560 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001561 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001562
1563 CONVERT_BINOP(v, w, &a, &b);
1564 if (PyLong_Check(x) || Py_None == x) {
1565 c = x;
1566 Py_INCREF(x);
1567 }
1568 else if (PyInt_Check(x)) {
1569 c = PyLong_FromLong(PyInt_AS_LONG(x));
1570 }
1571 else {
1572 Py_DECREF(a);
1573 Py_DECREF(b);
1574 Py_INCREF(Py_NotImplemented);
1575 return Py_NotImplemented;
1576 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001577
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001578 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001579 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00001580 /* Return a float. This works because we know that
1581 this calls float_pow() which converts its
1582 arguments to double. */
1583 Py_DECREF(a);
1584 Py_DECREF(b);
1585 Py_DECREF(c);
1586 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001587 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001588 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001589 for (i = 0; i < size_b; ++i) {
1590 digit bi = b->ob_digit[i];
1591 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001592
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001593 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001594 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001595
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001596 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001597 temp = (PyLongObject *)long_mul(z, a);
1598 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001599 if (c!=Py_None && temp!=NULL) {
1600 if (l_divmod(temp,(PyLongObject *)c,
1601 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001602 Py_DECREF(temp);
1603 z = NULL;
1604 goto error;
1605 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001606 Py_XDECREF(div);
1607 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001608 temp = mod;
1609 }
1610 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001611 if (z == NULL)
1612 break;
1613 }
1614 bi >>= 1;
1615 if (bi == 0 && i+1 == size_b)
1616 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001617 temp = (PyLongObject *)long_mul(a, a);
1618 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001619 if (c!=Py_None && temp!=NULL) {
1620 if (l_divmod(temp, (PyLongObject *)c, &div,
1621 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001622 Py_DECREF(temp);
1623 z = NULL;
1624 goto error;
1625 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001626 Py_XDECREF(div);
1627 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001628 temp = mod;
1629 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001630 a = temp;
1631 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001632 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001633 z = NULL;
1634 break;
1635 }
1636 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001637 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001638 break;
1639 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001640 if (c!=Py_None && z!=NULL) {
1641 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001642 Py_DECREF(z);
1643 z = NULL;
1644 }
1645 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001646 Py_XDECREF(div);
1647 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001648 z = mod;
1649 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001650 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00001651 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00001652 Py_XDECREF(a);
1653 Py_DECREF(b);
1654 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001655 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001656}
1657
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001658static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001659long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001660{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001661 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001662 PyLongObject *x;
1663 PyLongObject *w;
1664 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001665 if (w == NULL)
1666 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001667 x = (PyLongObject *) long_add(v, w);
1668 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001669 if (x == NULL)
1670 return NULL;
1671 if (x->ob_size != 0)
1672 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001673 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001674}
1675
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001676static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001677long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001678{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001679 Py_INCREF(v);
1680 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001681}
1682
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001683static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001684long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001685{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001686 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001687 int i, n;
1688 n = ABS(v->ob_size);
1689 if (n == 0) {
1690 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001691 Py_INCREF(v);
1692 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001693 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001694 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001695 if (z == NULL)
1696 return NULL;
1697 for (i = 0; i < n; i++)
1698 z->ob_digit[i] = v->ob_digit[i];
1699 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001700 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001701}
1702
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001703static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001704long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001705{
1706 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001707 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001708 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001709 Py_INCREF(v);
1710 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001711 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001712}
1713
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001714static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001715long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001716{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001717 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001718}
1719
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001720static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001721long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001722{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001723 PyLongObject *a, *b;
1724 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001725 long shiftby;
1726 int newsize, wordshift, loshift, hishift, i, j;
1727 digit lomask, himask;
1728
Neil Schemenauerba872e22001-01-04 01:46:03 +00001729 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1730
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001731 if (a->ob_size < 0) {
1732 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001733 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001734 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001735 if (a1 == NULL)
1736 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001737 a2 = (PyLongObject *) long_rshift(a1, b);
1738 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001739 if (a2 == NULL)
1740 goto rshift_error;
1741 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001742 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001743 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001744 else {
1745
1746 shiftby = PyLong_AsLong((PyObject *)b);
1747 if (shiftby == -1L && PyErr_Occurred())
1748 goto rshift_error;
1749 if (shiftby < 0) {
1750 PyErr_SetString(PyExc_ValueError,
1751 "negative shift count");
1752 goto rshift_error;
1753 }
1754 wordshift = shiftby / SHIFT;
1755 newsize = ABS(a->ob_size) - wordshift;
1756 if (newsize <= 0) {
1757 z = _PyLong_New(0);
1758 Py_DECREF(a);
1759 Py_DECREF(b);
1760 return (PyObject *)z;
1761 }
1762 loshift = shiftby % SHIFT;
1763 hishift = SHIFT - loshift;
1764 lomask = ((digit)1 << hishift) - 1;
1765 himask = MASK ^ lomask;
1766 z = _PyLong_New(newsize);
1767 if (z == NULL)
1768 goto rshift_error;
1769 if (a->ob_size < 0)
1770 z->ob_size = -(z->ob_size);
1771 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1772 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1773 if (i+1 < newsize)
1774 z->ob_digit[i] |=
1775 (a->ob_digit[j+1] << hishift) & himask;
1776 }
1777 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001778 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001779rshift_error:
1780 Py_DECREF(a);
1781 Py_DECREF(b);
1782 return (PyObject *) z;
1783
Guido van Rossumc6913e71991-11-19 20:26:46 +00001784}
1785
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001786static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001787long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001788{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001789 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00001790 PyLongObject *a, *b;
1791 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001792 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001793 int oldsize, newsize, wordshift, remshift, i, j;
1794 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001795
Neil Schemenauerba872e22001-01-04 01:46:03 +00001796 CONVERT_BINOP(v, w, &a, &b);
1797
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001798 shiftby = PyLong_AsLong((PyObject *)b);
1799 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00001800 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001801 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001802 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001803 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001804 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001805 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001806 PyErr_SetString(PyExc_ValueError,
1807 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00001808 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001809 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001810 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1811 wordshift = (int)shiftby / SHIFT;
1812 remshift = (int)shiftby - wordshift * SHIFT;
1813
1814 oldsize = ABS(a->ob_size);
1815 newsize = oldsize + wordshift;
1816 if (remshift)
1817 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001818 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001819 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001820 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001821 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001822 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001823 for (i = 0; i < wordshift; i++)
1824 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001825 accum = 0;
1826 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1827 accum |= a->ob_digit[j] << remshift;
1828 z->ob_digit[i] = (digit)(accum & MASK);
1829 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001830 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001831 if (remshift)
1832 z->ob_digit[newsize-1] = (digit)accum;
1833 else
1834 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00001835 z = long_normalize(z);
1836lshift_error:
1837 Py_DECREF(a);
1838 Py_DECREF(b);
1839 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001840}
1841
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001842
1843/* Bitwise and/xor/or operations */
1844
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001845#define MAX(x, y) ((x) < (y) ? (y) : (x))
1846#define MIN(x, y) ((x) > (y) ? (y) : (x))
1847
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001848static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001849long_bitwise(PyLongObject *a,
1850 int op, /* '&', '|', '^' */
1851 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001852{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001853 digit maska, maskb; /* 0 or MASK */
1854 int negz;
1855 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001856 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001857 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001858 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001859 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001860
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001861 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001862 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001863 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001864 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001865 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001866 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001867 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001868 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001869 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001870 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001871 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001872 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001873 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001874 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001875 maskb = 0;
1876 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001877
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001878 negz = 0;
1879 switch (op) {
1880 case '^':
1881 if (maska != maskb) {
1882 maska ^= MASK;
1883 negz = -1;
1884 }
1885 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001886 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001887 if (maska && maskb) {
1888 op = '|';
1889 maska ^= MASK;
1890 maskb ^= MASK;
1891 negz = -1;
1892 }
1893 break;
1894 case '|':
1895 if (maska || maskb) {
1896 op = '&';
1897 maska ^= MASK;
1898 maskb ^= MASK;
1899 negz = -1;
1900 }
1901 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001902 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001903
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001904 /* JRH: The original logic here was to allocate the result value (z)
1905 as the longer of the two operands. However, there are some cases
1906 where the result is guaranteed to be shorter than that: AND of two
1907 positives, OR of two negatives: use the shorter number. AND with
1908 mixed signs: use the positive number. OR with mixed signs: use the
1909 negative number. After the transformations above, op will be '&'
1910 iff one of these cases applies, and mask will be non-0 for operands
1911 whose length should be ignored.
1912 */
1913
1914 size_a = a->ob_size;
1915 size_b = b->ob_size;
1916 size_z = op == '&'
1917 ? (maska
1918 ? size_b
1919 : (maskb ? size_a : MIN(size_a, size_b)))
1920 : MAX(size_a, size_b);
1921 z = _PyLong_New(size_z);
1922 if (a == NULL || b == NULL || z == NULL) {
1923 Py_XDECREF(a);
1924 Py_XDECREF(b);
1925 Py_XDECREF(z);
1926 return NULL;
1927 }
1928
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001929 for (i = 0; i < size_z; ++i) {
1930 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1931 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1932 switch (op) {
1933 case '&': z->ob_digit[i] = diga & digb; break;
1934 case '|': z->ob_digit[i] = diga | digb; break;
1935 case '^': z->ob_digit[i] = diga ^ digb; break;
1936 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001937 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001938
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001939 Py_DECREF(a);
1940 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001941 z = long_normalize(z);
1942 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001943 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001944 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001945 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001946 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001947}
1948
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001949static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001950long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001951{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001952 PyLongObject *a, *b;
1953 PyObject *c;
1954 CONVERT_BINOP(v, w, &a, &b);
1955 c = long_bitwise(a, '&', b);
1956 Py_DECREF(a);
1957 Py_DECREF(b);
1958 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001959}
1960
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001961static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001962long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001963{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001964 PyLongObject *a, *b;
1965 PyObject *c;
1966 CONVERT_BINOP(v, w, &a, &b);
1967 c = long_bitwise(a, '^', b);
1968 Py_DECREF(a);
1969 Py_DECREF(b);
1970 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001971}
1972
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001973static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001974long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001975{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001976 PyLongObject *a, *b;
1977 PyObject *c;
1978 CONVERT_BINOP(v, w, &a, &b);
1979 c = long_bitwise(a, '|', b);
1980 Py_DECREF(a);
1981 Py_DECREF(b);
1982 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001983}
1984
Guido van Rossum234f9421993-06-17 12:35:49 +00001985static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001986long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00001987{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001988 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001989 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001990 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001991 return 0;
1992 }
1993 return 1; /* Can't do it */
1994}
1995
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001996static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001997long_int(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001998{
1999 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002000 x = PyLong_AsLong(v);
2001 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002002 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002003 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002004}
2005
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002006static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002007long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002008{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002009 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002010 return v;
2011}
2012
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002013static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002014long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002015{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002016 double result;
2017 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002018 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00002019 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002020 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002021}
2022
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002023static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002024long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002025{
Fred Drake121ee271999-12-23 15:41:28 +00002026 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002027}
2028
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002029static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002030long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002031{
Fred Drake121ee271999-12-23 15:41:28 +00002032 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002033}
2034
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002035static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002036 (binaryfunc) long_add, /*nb_add*/
2037 (binaryfunc) long_sub, /*nb_subtract*/
2038 (binaryfunc) long_mul, /*nb_multiply*/
2039 (binaryfunc) long_div, /*nb_divide*/
2040 (binaryfunc) long_mod, /*nb_remainder*/
2041 (binaryfunc) long_divmod, /*nb_divmod*/
2042 (ternaryfunc) long_pow, /*nb_power*/
2043 (unaryfunc) long_neg, /*nb_negative*/
2044 (unaryfunc) long_pos, /*tp_positive*/
2045 (unaryfunc) long_abs, /*tp_absolute*/
2046 (inquiry) long_nonzero, /*tp_nonzero*/
2047 (unaryfunc) long_invert, /*nb_invert*/
2048 (binaryfunc) long_lshift, /*nb_lshift*/
2049 (binaryfunc) long_rshift, /*nb_rshift*/
2050 (binaryfunc) long_and, /*nb_and*/
2051 (binaryfunc) long_xor, /*nb_xor*/
2052 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002053 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002054 (unaryfunc) long_int, /*nb_int*/
2055 (unaryfunc) long_long, /*nb_long*/
2056 (unaryfunc) long_float, /*nb_float*/
2057 (unaryfunc) long_oct, /*nb_oct*/
2058 (unaryfunc) long_hex, /*nb_hex*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002059 0, /*nb_inplace_add*/
2060 0, /*nb_inplace_subtract*/
2061 0, /*nb_inplace_multiply*/
2062 0, /*nb_inplace_divide*/
2063 0, /*nb_inplace_remainder*/
2064 0, /*nb_inplace_power*/
2065 0, /*nb_inplace_lshift*/
2066 0, /*nb_inplace_rshift*/
2067 0, /*nb_inplace_and*/
2068 0, /*nb_inplace_xor*/
2069 0, /*nb_inplace_or*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002070};
2071
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002072PyTypeObject PyLong_Type = {
2073 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002074 0,
2075 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002076 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002077 sizeof(digit),
Tim Peters9f688bf2000-07-07 15:53:28 +00002078 (destructor)long_dealloc, /*tp_dealloc*/
2079 0, /*tp_print*/
2080 0, /*tp_getattr*/
2081 0, /*tp_setattr*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002082 (cmpfunc)long_compare, /*tp_compare*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002083 (reprfunc)long_repr, /*tp_repr*/
2084 &long_as_number, /*tp_as_number*/
2085 0, /*tp_as_sequence*/
2086 0, /*tp_as_mapping*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002087 (hashfunc)long_hash, /*tp_hash*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002088 0, /*tp_call*/
2089 (reprfunc)long_str, /*tp_str*/
Neil Schemenauerba872e22001-01-04 01:46:03 +00002090 0, /*tp_getattro*/
2091 0, /*tp_setattro*/
2092 0, /*tp_as_buffer*/
Guido van Rossum6fd867b2001-01-17 15:33:18 +00002093 Py_TPFLAGS_CHECKTYPES /*tp_flags*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002094};