blob: b15a3f0ff01fea284a4e42c205e466bc7188df2a [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumedcc38a1991-05-05 20:09:44 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumedcc38a1991-05-05 20:09:44 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumedcc38a1991-05-05 20:09:44 +000029
30******************************************************************/
31
32/* Long (arbitrary precision) integer object implementation */
33
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000034/* XXX The functional organization of this file is terrible */
35
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037#include "longintrepr.h"
Guido van Rossum687ec181995-03-04 22:43:47 +000038#include "mymath.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +000039
Guido van Rossumedcc38a1991-05-05 20:09:44 +000040#include <assert.h>
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000041#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000042
Guido van Rossume32e0141992-01-19 16:31:05 +000043#define ABS(x) ((x) < 0 ? -(x) : (x))
44
45/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000046static PyLongObject *long_normalize Py_PROTO((PyLongObject *));
47static PyLongObject *mul1 Py_PROTO((PyLongObject *, wdigit));
48static PyLongObject *muladd1 Py_PROTO((PyLongObject *, wdigit, wdigit));
49static PyLongObject *divrem1 Py_PROTO((PyLongObject *, wdigit, digit *));
50static PyObject *long_format Py_PROTO((PyObject *aa, int base));
Guido van Rossume32e0141992-01-19 16:31:05 +000051
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000052static int ticker; /* XXX Could be shared with ceval? */
53
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054#define SIGCHECK(PyTryBlock) \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000055 if (--ticker < 0) { \
56 ticker = 100; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000058 }
59
Guido van Rossumedcc38a1991-05-05 20:09:44 +000060/* Normalize (remove leading zeros from) a long int object.
61 Doesn't attempt to free the storage--in most cases, due to the nature
62 of the algorithms used, this could save at most be one word anyway. */
63
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +000065long_normalize(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000067{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000068 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000069 register int i = j;
70
71 while (i > 0 && v->ob_digit[i-1] == 0)
72 --i;
73 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000074 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000075 return v;
76}
77
78/* Allocate a new long int object with size digits.
79 Return NULL and set exception if we run out of memory. */
80
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081PyLongObject *
82_PyLong_New(size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000083 int size;
84{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086}
87
88/* Create a new long int object from a C long int */
89
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090PyObject *
91PyLong_FromLong(ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000092 long ival;
93{
Guido van Rossum472c04f1996-12-05 21:57:21 +000094 /* Assume a C long fits in at most 5 'digits' */
95 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 PyLongObject *v = _PyLong_New(5);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000097 if (v != NULL) {
Guido van Rossum472c04f1996-12-05 21:57:21 +000098 unsigned long t = ival;
99 int i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000100 if (ival < 0) {
Guido van Rossum472c04f1996-12-05 21:57:21 +0000101 t = -ival;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000102 v->ob_size = -(v->ob_size);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000103 }
104 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000105 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000106 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000107 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000108 v = long_normalize(v);
109 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000111}
112
Guido van Rossum53756b11997-01-03 17:14:46 +0000113/* Create a new long int object from a C unsigned long int */
114
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
Guido van Rossum53756b11997-01-03 17:14:46 +0000116PyLong_FromUnsignedLong(ival)
117 unsigned long ival;
118{
119 /* Assume a C long fits in at most 5 'digits' */
120 /* Works on both 32- and 64-bit machines */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 PyLongObject *v = _PyLong_New(5);
Guido van Rossum53756b11997-01-03 17:14:46 +0000122 if (v != NULL) {
123 unsigned long t = ival;
124 int i;
125 for (i = 0; i < 5; i++) {
Guido van Rossum2095d241997-04-09 19:41:24 +0000126 v->ob_digit[i] = (digit) (t & MASK);
Guido van Rossum53756b11997-01-03 17:14:46 +0000127 t >>= SHIFT;
128 }
129 v = long_normalize(v);
130 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000132}
133
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000134/* Create a new long int object from a C double */
135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136PyObject *
Guido van Rossum687ec181995-03-04 22:43:47 +0000137#ifdef MPW
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138PyLong_FromDouble(double dval)
Guido van Rossum687ec181995-03-04 22:43:47 +0000139#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140PyLong_FromDouble(dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000141 double dval;
Guido van Rossum687ec181995-03-04 22:43:47 +0000142#endif /* MPW */
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000143{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000145 double frac;
146 int i, ndig, expo, neg;
147 neg = 0;
148 if (dval < 0.0) {
149 neg = 1;
150 dval = -dval;
151 }
152 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
153 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000155 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000157 if (v == NULL)
158 return NULL;
159 frac = ldexp(frac, (expo-1) % SHIFT + 1);
160 for (i = ndig; --i >= 0; ) {
161 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000162 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000163 frac = frac - (double)bits;
164 frac = ldexp(frac, SHIFT);
165 }
166 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000167 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000169}
170
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000171/* Get a C long int from a long int object.
172 Returns -1 and sets an error condition if overflow occurs. */
173
174long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175PyLong_AsLong(vv)
176 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000177{
Guido van Rossumf7531811998-05-26 14:33:37 +0000178 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000180 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000181 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000182
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 if (vv == NULL || !PyLong_Check(vv)) {
184 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000185 return -1;
186 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000188 i = v->ob_size;
189 sign = 1;
190 x = 0;
191 if (i < 0) {
192 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000193 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000194 }
195 while (--i >= 0) {
196 prev = x;
197 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000198 if ((x >> SHIFT) != prev)
199 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000200 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000201 /* Haven't lost any bits, but if the sign bit is set we're in
202 * trouble *unless* this is the min negative number. So,
203 * trouble iff sign bit set && (positive || some bit set other
204 * than the sign bit).
205 */
206 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
207 goto overflow;
208 return (long)x * sign;
209
210 overflow:
211 PyErr_SetString(PyExc_OverflowError,
212 "long int too long to convert");
213 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000214}
215
Guido van Rossum53756b11997-01-03 17:14:46 +0000216/* Get a C long int from a long int object.
217 Returns -1 and sets an error condition if overflow occurs. */
218
219unsigned long
220PyLong_AsUnsignedLong(vv)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 PyObject *vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000222{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000224 unsigned long x, prev;
225 int i;
226
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 if (vv == NULL || !PyLong_Check(vv)) {
228 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000229 return (unsigned long) -1;
230 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000232 i = v->ob_size;
233 x = 0;
234 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000236 "can't convert negative value to unsigned long");
237 return (unsigned long) -1;
238 }
239 while (--i >= 0) {
240 prev = x;
241 x = (x << SHIFT) + v->ob_digit[i];
242 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000244 "long int too long to convert");
245 return (unsigned long) -1;
246 }
247 }
248 return x;
249}
250
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000251/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000252
253double
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254PyLong_AsDouble(vv)
255 PyObject *vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000256{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 register PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000258 double x;
259 double multiplier = (double) (1L << SHIFT);
260 int i, sign;
261
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 if (vv == NULL || !PyLong_Check(vv)) {
263 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000264 return -1;
265 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000266 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000267 i = v->ob_size;
268 sign = 1;
269 x = 0.0;
270 if (i < 0) {
271 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000272 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000273 }
274 while (--i >= 0) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000275 x = x*multiplier + (double)v->ob_digit[i];
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000276 }
277 return x * sign;
278}
279
280/* Multiply by a single digit, ignoring the sign. */
281
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000283mul1(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000285 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000286{
287 return muladd1(a, n, (digit)0);
288}
289
290/* Multiply by a single digit and add a single digit, ignoring the sign. */
291
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000293muladd1(a, n, extra)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000295 wdigit n;
296 wdigit extra;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000297{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000298 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000300 twodigits carry = extra;
301 int i;
302
303 if (z == NULL)
304 return NULL;
305 for (i = 0; i < size_a; ++i) {
306 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000307 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000308 carry >>= SHIFT;
309 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000310 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000311 return long_normalize(z);
312}
313
314/* Divide a long integer by a digit, returning both the quotient
315 (as function result) and the remainder (through *prem).
316 The sign of a is ignored; n should not be zero. */
317
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000318static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000319divrem1(a, n, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 PyLongObject *a;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000321 wdigit n;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000322 digit *prem;
323{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000324 int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000326 int i;
327 twodigits rem = 0;
328
329 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000331 if (z == NULL)
332 return NULL;
333 for (i = size; --i >= 0; ) {
334 rem = (rem << SHIFT) + a->ob_digit[i];
Guido van Rossum2095d241997-04-09 19:41:24 +0000335 z->ob_digit[i] = (digit) (rem/n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000336 rem %= n;
337 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000338 *prem = (digit) rem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000339 return long_normalize(z);
340}
341
342/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000343 Return a string object.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000344 If base is 8 or 16, add the proper prefix '0' or '0x'.
345 External linkage: used in bltinmodule.c by hex() and oct(). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000346
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +0000348long_format(aa, base)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 PyObject *aa;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000350 int base;
351{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 register PyLongObject *a = (PyLongObject *)aa;
353 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000354 int i;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000355 int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000356 char *p;
357 int bits;
358 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000359
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 if (a == NULL || !PyLong_Check(a)) {
361 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000362 return NULL;
363 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000364 assert(base >= 2 && base <= 36);
365
366 /* Compute a rough upper bound for the length of the string */
367 i = base;
368 bits = 0;
369 while (i > 1) {
370 ++bits;
371 i >>= 1;
372 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000373 i = 6 + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000375 if (str == NULL)
376 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000378 *p = '\0';
Guido van Rossumc6913e71991-11-19 20:26:46 +0000379 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000380 if (a->ob_size < 0)
381 sign = '-';
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000382
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 Py_INCREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000384 do {
385 digit rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 PyLongObject *temp = divrem1(a, (digit)base, &rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000387 if (temp == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388 Py_DECREF(a);
389 Py_DECREF(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000390 return NULL;
391 }
392 if (rem < 10)
393 rem += '0';
394 else
395 rem += 'A'-10;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 assert(p > PyString_AS_STRING(str));
Guido van Rossum2095d241997-04-09 19:41:24 +0000397 *--p = (char) rem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000399 a = temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000400 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 Py_DECREF(a);
402 Py_DECREF(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000403 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000404 })
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000405 } while (ABS(a->ob_size) != 0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 Py_DECREF(a);
Guido van Rossum2c475421992-08-14 15:13:07 +0000407 if (base == 8) {
408 if (size_a != 0)
409 *--p = '0';
410 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000411 else if (base == 16) {
412 *--p = 'x';
413 *--p = '0';
414 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000415 else if (base != 10) {
416 *--p = '#';
417 *--p = '0' + base%10;
418 if (base > 10)
419 *--p = '0' + base/10;
420 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000421 if (sign)
422 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 if (p != PyString_AS_STRING(str)) {
424 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000425 assert(p > q);
426 do {
427 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +0000428 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429 _PyString_Resize((PyObject **)&str,
430 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000431 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000433}
434
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000435#if 0
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000436/* Convert a string to a long int object, in a given base.
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000437 Base zero implies a default depending on the number.
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000438 External linkage: used in compile.c and stropmodule.c. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000439
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000441long_scan(str, base)
442 char *str;
443 int base;
444{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 return PyLong_FromString(str, (char **)NULL, base);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000446}
Guido van Rossum3535f6e1995-01-17 16:34:13 +0000447#endif
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000448
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449PyObject *
450PyLong_FromString(str, pend, base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000451 char *str;
452 char **pend;
453 int base;
454{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000455 int sign = 1;
Guido van Rossume6762971998-06-22 03:54:46 +0000456 char *start;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000458
Guido van Rossum472c04f1996-12-05 21:57:21 +0000459 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 PyErr_SetString(PyExc_ValueError,
461 "invalid base for long literal");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000462 return NULL;
463 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000464 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000465 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000466 if (*str == '+')
467 ++str;
468 else if (*str == '-') {
469 ++str;
470 sign = -1;
471 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000472 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000473 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000474 if (base == 0) {
475 if (str[0] != '0')
476 base = 10;
477 else if (str[1] == 'x' || str[1] == 'X')
478 base = 16;
479 else
480 base = 8;
481 }
482 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
483 str += 2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 z = _PyLong_New(0);
Guido van Rossume6762971998-06-22 03:54:46 +0000485 start = str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000486 for ( ; z != NULL; ++str) {
487 int k = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 PyLongObject *temp;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000489
490 if (*str <= '9')
491 k = *str - '0';
492 else if (*str >= 'a')
493 k = *str - 'a' + 10;
494 else if (*str >= 'A')
495 k = *str - 'A' + 10;
496 if (k < 0 || k >= base)
497 break;
498 temp = muladd1(z, (digit)base, (digit)k);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000500 z = temp;
501 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +0000502 if (z == NULL)
503 return NULL;
Guido van Rossume6762971998-06-22 03:54:46 +0000504 if (str == start) {
505 PyErr_SetString(PyExc_ValueError,
506 "no digits in long int constant");
507 return NULL;
508 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000509 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000510 z->ob_size = -(z->ob_size);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000511 if (pend)
512 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 return (PyObject *) z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000514}
515
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516static PyLongObject *x_divrem
517 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject **));
518static PyObject *long_pos Py_PROTO((PyLongObject *));
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000519static int long_divrem Py_PROTO((PyLongObject *, PyLongObject *,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 PyLongObject **, PyLongObject **));
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000521
522/* Long division with remainder, top-level routine */
523
Guido van Rossume32e0141992-01-19 16:31:05 +0000524static int
525long_divrem(a, b, pdiv, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526 PyLongObject *a, *b;
527 PyLongObject **pdiv;
528 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000529{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000530 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000532
533 if (size_b == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 PyErr_SetString(PyExc_ZeroDivisionError, "long division or modulo");
Guido van Rossume32e0141992-01-19 16:31:05 +0000535 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000536 }
537 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +0000538 (size_a == size_b &&
539 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000540 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541 *pdiv = _PyLong_New(0);
542 Py_INCREF(a);
543 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +0000544 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000545 }
546 if (size_b == 1) {
547 digit rem = 0;
548 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000549 if (z == NULL)
550 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000552 }
Guido van Rossume32e0141992-01-19 16:31:05 +0000553 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000554 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +0000555 if (z == NULL)
556 return -1;
557 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000558 /* Set the signs.
559 The quotient z has the sign of a*b;
560 the remainder r has the sign of a,
561 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +0000562 if ((a->ob_size < 0) != (b->ob_size < 0))
563 z->ob_size = -(z->ob_size);
564 if (a->ob_size < 0 && (*prem)->ob_size != 0)
565 (*prem)->ob_size = -((*prem)->ob_size);
566 *pdiv = z;
567 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000568}
569
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000570/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000571
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000573x_divrem(v1, w1, prem)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 PyLongObject *v1, *w1;
575 PyLongObject **prem;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000576{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000577 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +0000578 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 PyLongObject *v = mul1(v1, d);
580 PyLongObject *w = mul1(w1, d);
581 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000582 int j, k;
583
584 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 Py_XDECREF(v);
586 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000587 return NULL;
588 }
589
590 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000591 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000592 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000593
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000594 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 a = _PyLong_New(size_v - size_w + 1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000596
597 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
598 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
599 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000600 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000601 int i;
602
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000603 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000605 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000606 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000607 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000608 if (vj == w->ob_digit[size_w-1])
609 q = MASK;
610 else
611 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
612 w->ob_digit[size_w-1];
613
614 while (w->ob_digit[size_w-2]*q >
615 ((
616 ((twodigits)vj << SHIFT)
617 + v->ob_digit[j-1]
618 - q*w->ob_digit[size_w-1]
619 ) << SHIFT)
620 + v->ob_digit[j-2])
621 --q;
622
623 for (i = 0; i < size_w && i+k < size_v; ++i) {
624 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +0000625 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 carry += v->ob_digit[i+k] - z
627 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000628 v->ob_digit[i+k] = carry & MASK;
629 carry = (carry >> SHIFT) - zz;
630 }
631
632 if (i+k < size_v) {
633 carry += v->ob_digit[i+k];
634 v->ob_digit[i+k] = 0;
635 }
636
637 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +0000638 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000639 else {
640 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +0000641 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000642 carry = 0;
643 for (i = 0; i < size_w && i+k < size_v; ++i) {
644 carry += v->ob_digit[i+k] + w->ob_digit[i];
645 v->ob_digit[i+k] = carry & MASK;
646 carry >>= SHIFT;
647 }
648 }
649 } /* for j, k */
650
Guido van Rossumc206c761995-01-10 15:23:19 +0000651 if (a == NULL)
652 *prem = NULL;
653 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +0000654 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000655 *prem = divrem1(v, d, &d);
656 /* d receives the (unused) remainder */
657 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +0000659 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +0000660 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000661 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 Py_DECREF(v);
663 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000664 return a;
665}
666
667/* Methods */
668
Guido van Rossume32e0141992-01-19 16:31:05 +0000669/* Forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000670static void long_dealloc Py_PROTO((PyObject *));
671static PyObject *long_repr Py_PROTO((PyObject *));
672static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
673static long long_hash Py_PROTO((PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000674
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
676static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));
677static PyObject *long_mul Py_PROTO((PyLongObject *, PyLongObject *));
678static PyObject *long_div Py_PROTO((PyLongObject *, PyLongObject *));
679static PyObject *long_mod Py_PROTO((PyLongObject *, PyLongObject *));
680static PyObject *long_divmod Py_PROTO((PyLongObject *, PyLongObject *));
681static PyObject *long_pow
682 Py_PROTO((PyLongObject *, PyLongObject *, PyLongObject *));
683static PyObject *long_neg Py_PROTO((PyLongObject *));
684static PyObject *long_pos Py_PROTO((PyLongObject *));
685static PyObject *long_abs Py_PROTO((PyLongObject *));
686static int long_nonzero Py_PROTO((PyLongObject *));
687static PyObject *long_invert Py_PROTO((PyLongObject *));
688static PyObject *long_lshift Py_PROTO((PyLongObject *, PyLongObject *));
689static PyObject *long_rshift Py_PROTO((PyLongObject *, PyLongObject *));
690static PyObject *long_and Py_PROTO((PyLongObject *, PyLongObject *));
691static PyObject *long_xor Py_PROTO((PyLongObject *, PyLongObject *));
692static PyObject *long_or Py_PROTO((PyLongObject *, PyLongObject *));
Guido van Rossume32e0141992-01-19 16:31:05 +0000693
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000694static void
695long_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000697{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000698 PyMem_DEL(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000699}
700
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000702long_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 PyObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000704{
Guido van Rossum8b27d921992-03-27 17:27:05 +0000705 return long_format(v, 10);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000706}
707
708static int
709long_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000711{
712 int sign;
713
Guido van Rossumc6913e71991-11-19 20:26:46 +0000714 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000715 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +0000716 sign = 0;
717 else
718 sign = a->ob_size - b->ob_size;
719 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000720 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000721 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000722 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
723 ;
724 if (i < 0)
725 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000726 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000727 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000728 if (a->ob_size < 0)
729 sign = -sign;
730 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000731 }
Guido van Rossumc6913e71991-11-19 20:26:46 +0000732 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000733}
734
Guido van Rossum9bfef441993-03-29 10:43:31 +0000735static long
736long_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 PyLongObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000738{
739 long x;
740 int i, sign;
741
742 /* This is designed so that Python ints and longs with the
743 same value hash to the same value, otherwise comparisons
744 of mapping keys will turn out weird */
745 i = v->ob_size;
746 sign = 1;
747 x = 0;
748 if (i < 0) {
749 sign = -1;
750 i = -(i);
751 }
752 while (--i >= 0) {
753 /* Force a 32-bit circular shift */
754 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
755 x += v->ob_digit[i];
756 }
757 x = x * sign;
758 if (x == -1)
759 x = -2;
760 return x;
761}
762
763
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000764/* Add the absolute values of two long integers. */
765
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766static PyLongObject *x_add Py_PROTO((PyLongObject *, PyLongObject *));
767static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000768x_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000770{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000771 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000772 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000773 int i;
774 digit carry = 0;
775
776 /* Ensure a is the larger of the two: */
777 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778 { PyLongObject *temp = a; a = b; b = temp; }
779 { int size_temp = size_a;
780 size_a = size_b;
781 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000782 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000784 if (z == NULL)
785 return NULL;
786 for (i = 0; i < size_b; ++i) {
787 carry += a->ob_digit[i] + b->ob_digit[i];
788 z->ob_digit[i] = carry & MASK;
789 /* The following assumes unsigned shifts don't
790 propagate the sign bit. */
791 carry >>= SHIFT;
792 }
793 for (; i < size_a; ++i) {
794 carry += a->ob_digit[i];
795 z->ob_digit[i] = carry & MASK;
796 carry >>= SHIFT;
797 }
798 z->ob_digit[i] = carry;
799 return long_normalize(z);
800}
801
802/* Subtract the absolute values of two integers. */
803
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804static PyLongObject *x_sub Py_PROTO((PyLongObject *, PyLongObject *));
805static PyLongObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000806x_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 PyLongObject *a, *b;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000808{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000809 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000811 int i;
812 int sign = 1;
813 digit borrow = 0;
814
815 /* Ensure a is the larger of the two: */
816 if (size_a < size_b) {
817 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 { PyLongObject *temp = a; a = b; b = temp; }
819 { int size_temp = size_a;
820 size_a = size_b;
821 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000822 }
823 else if (size_a == size_b) {
824 /* Find highest digit where a and b differ: */
825 i = size_a;
826 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
827 ;
828 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000829 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000830 if (a->ob_digit[i] < b->ob_digit[i]) {
831 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000832 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000833 }
834 size_a = size_b = i+1;
835 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000836 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000837 if (z == NULL)
838 return NULL;
839 for (i = 0; i < size_b; ++i) {
840 /* The following assumes unsigned arithmetic
841 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000842 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000843 z->ob_digit[i] = borrow & MASK;
844 borrow >>= SHIFT;
845 borrow &= 1; /* Keep only one sign bit */
846 }
847 for (; i < size_a; ++i) {
848 borrow = a->ob_digit[i] - borrow;
849 z->ob_digit[i] = borrow & MASK;
850 borrow >>= SHIFT;
851 }
852 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000853 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000854 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000855 return long_normalize(z);
856}
857
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000859long_add(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 PyLongObject *a;
861 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000862{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000863 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000864
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000865 if (a->ob_size < 0) {
866 if (b->ob_size < 0) {
867 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000868 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000869 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000870 }
871 else
872 z = x_sub(b, a);
873 }
874 else {
875 if (b->ob_size < 0)
876 z = x_sub(a, b);
877 else
878 z = x_add(a, b);
879 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000880 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000881}
882
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000884long_sub(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 PyLongObject *a;
886 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000887{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000888 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000889
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000890 if (a->ob_size < 0) {
891 if (b->ob_size < 0)
892 z = x_sub(a, b);
893 else
894 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +0000895 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000896 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000897 }
898 else {
899 if (b->ob_size < 0)
900 z = x_add(a, b);
901 else
902 z = x_sub(a, b);
903 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000905}
906
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000908long_mul(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 PyLongObject *a;
910 PyLongObject *b;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000911{
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000912 int size_a;
913 int size_b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000915 int i;
916
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000917 size_a = ABS(a->ob_size);
918 size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919 z = _PyLong_New(size_a + size_b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000920 if (z == NULL)
921 return NULL;
922 for (i = 0; i < z->ob_size; ++i)
923 z->ob_digit[i] = 0;
924 for (i = 0; i < size_a; ++i) {
925 twodigits carry = 0;
926 twodigits f = a->ob_digit[i];
927 int j;
928
Guido van Rossumeb1fafc1994-08-29 12:47:19 +0000929 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000931 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000932 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000933 for (j = 0; j < size_b; ++j) {
934 carry += z->ob_digit[i+j] + b->ob_digit[j] * f;
Guido van Rossum2095d241997-04-09 19:41:24 +0000935 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000936 carry >>= SHIFT;
937 }
938 for (; carry != 0; ++j) {
939 assert(i+j < z->ob_size);
940 carry += z->ob_digit[i+j];
Guido van Rossum2095d241997-04-09 19:41:24 +0000941 z->ob_digit[i+j] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000942 carry >>= SHIFT;
943 }
944 }
945 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000946 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000947 if (b->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000948 z->ob_size = -(z->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 return (PyObject *) long_normalize(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000950}
951
Guido van Rossume32e0141992-01-19 16:31:05 +0000952/* The / and % operators are now defined in terms of divmod().
953 The expression a mod b has the value a - b*floor(a/b).
954 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000955 |a| by |b|, with the sign of a. This is also expressed
956 as a - b*trunc(a/b), if trunc truncates towards zero.
957 Some examples:
958 a b a rem b a mod b
959 13 10 3 3
960 -13 10 -3 7
961 13 -10 3 -7
962 -13 -10 -3 -3
963 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +0000964 have different signs. We then subtract one from the 'div'
965 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000966
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967static int l_divmod Py_PROTO((PyLongObject *, PyLongObject *,
968 PyLongObject **, PyLongObject **));
Guido van Rossume32e0141992-01-19 16:31:05 +0000969static int
970l_divmod(v, w, pdiv, pmod)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 PyLongObject *v;
972 PyLongObject *w;
973 PyLongObject **pdiv;
974 PyLongObject **pmod;
Guido van Rossume32e0141992-01-19 16:31:05 +0000975{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000976 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +0000977
978 if (long_divrem(v, w, &div, &mod) < 0)
979 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +0000980 if ((mod->ob_size < 0 && w->ob_size > 0) ||
981 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 PyLongObject *temp;
983 PyLongObject *one;
984 temp = (PyLongObject *) long_add(mod, w);
985 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +0000986 mod = temp;
987 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000988 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +0000989 return -1;
990 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +0000992 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
994 Py_DECREF(mod);
995 Py_DECREF(div);
996 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +0000997 return -1;
998 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 Py_DECREF(one);
1000 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00001001 div = temp;
1002 }
1003 *pdiv = div;
1004 *pmod = mod;
1005 return 0;
1006}
1007
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001009long_div(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001010 PyLongObject *v;
1011 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001012{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001014 if (l_divmod(v, w, &div, &mod) < 0)
1015 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 Py_DECREF(mod);
1017 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00001018}
1019
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001021long_mod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 PyLongObject *v;
1023 PyLongObject *w;
Guido van Rossume32e0141992-01-19 16:31:05 +00001024{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001026 if (l_divmod(v, w, &div, &mod) < 0)
1027 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 Py_DECREF(div);
1029 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001030}
1031
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001033long_divmod(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 PyLongObject *v;
1035 PyLongObject *w;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001036{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001037 PyObject *z;
1038 PyLongObject *div, *mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00001039 if (l_divmod(v, w, &div, &mod) < 0)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001040 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001042 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043 PyTuple_SetItem(z, 0, (PyObject *) div);
1044 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001045 }
1046 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001047 Py_DECREF(div);
1048 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001049 }
1050 return z;
1051}
1052
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053static PyObject *
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001054long_pow(a, b, c)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 PyLongObject *a;
1056 PyLongObject *b;
1057 PyLongObject *c;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001058{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001060 int size_b, i;
1061
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001062 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001063 if (size_b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064 PyErr_SetString(PyExc_ValueError,
1065 "long integer to the negative power");
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001066 return NULL;
1067 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001068 z = (PyLongObject *)PyLong_FromLong(1L);
1069 Py_INCREF(a);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001070 for (i = 0; i < size_b; ++i) {
1071 digit bi = b->ob_digit[i];
1072 int j;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001073
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001074 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075 PyLongObject *temp;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001076
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001077 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001078 temp = (PyLongObject *)long_mul(z, a);
1079 Py_DECREF(z);
1080 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001081 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001082 Py_XDECREF(div);
1083 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001084 temp = mod;
1085 }
1086 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001087 if (z == NULL)
1088 break;
1089 }
1090 bi >>= 1;
1091 if (bi == 0 && i+1 == size_b)
1092 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001093 temp = (PyLongObject *)long_mul(a, a);
1094 Py_DECREF(a);
1095 if ((PyObject*)c!=Py_None && temp!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001096 l_divmod(temp, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001097 Py_XDECREF(div);
1098 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001099 temp = mod;
1100 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001101 a = temp;
1102 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001103 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001104 z = NULL;
1105 break;
1106 }
1107 }
Guido van Rossumc206c761995-01-10 15:23:19 +00001108 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001109 break;
1110 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001111 Py_XDECREF(a);
1112 if ((PyObject*)c!=Py_None && z!=NULL) {
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001113 l_divmod(z, c, &div, &mod);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001114 Py_XDECREF(div);
1115 Py_DECREF(z);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001116 z=mod;
1117 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001118 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001119}
1120
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001122long_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001123 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001124{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001125 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126 PyLongObject *x;
1127 PyLongObject *w;
1128 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001129 if (w == NULL)
1130 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001131 x = (PyLongObject *) long_add(v, w);
1132 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001133 if (x == NULL)
1134 return NULL;
1135 if (x->ob_size != 0)
1136 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001138}
1139
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001140static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001141long_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001142 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001143{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001144 Py_INCREF(v);
1145 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001146}
1147
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001148static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001149long_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001150 PyLongObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001151{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001152 PyLongObject *z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001153 int i, n;
1154 n = ABS(v->ob_size);
1155 if (n == 0) {
1156 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001157 Py_INCREF(v);
1158 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001159 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001160 z = _PyLong_New(ABS(n));
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001161 if (z == NULL)
1162 return NULL;
1163 for (i = 0; i < n; i++)
1164 z->ob_digit[i] = v->ob_digit[i];
1165 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001166 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001167}
1168
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001169static PyObject *
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001170long_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001171 PyLongObject *v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001172{
1173 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001174 return long_neg(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001175 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001176 Py_INCREF(v);
1177 return (PyObject *)v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001178 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001179}
1180
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001181static int
1182long_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001183 PyLongObject *v;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001184{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001185 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001186}
1187
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001188static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001189long_rshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 PyLongObject *a;
1191 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001192{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001193 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001194 long shiftby;
1195 int newsize, wordshift, loshift, hishift, i, j;
1196 digit lomask, himask;
1197
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001198 if (a->ob_size < 0) {
1199 /* Right shifting negative numbers is harder */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001200 PyLongObject *a1, *a2, *a3;
1201 a1 = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001202 if (a1 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001203 a2 = (PyLongObject *) long_rshift(a1, b);
1204 Py_DECREF(a1);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001205 if (a2 == NULL) return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001206 a3 = (PyLongObject *) long_invert(a2);
1207 Py_DECREF(a2);
1208 return (PyObject *) a3;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001209 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001210
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001211 shiftby = PyLong_AsLong((PyObject *)b);
1212 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001213 return NULL;
1214 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001216 return NULL;
1217 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001218 wordshift = shiftby / SHIFT;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001219 newsize = ABS(a->ob_size) - wordshift;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001220 if (newsize <= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001221 z = _PyLong_New(0);
1222 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001223 }
1224 loshift = shiftby % SHIFT;
1225 hishift = SHIFT - loshift;
1226 lomask = ((digit)1 << hishift) - 1;
1227 himask = MASK ^ lomask;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001228 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001229 if (z == NULL)
1230 return NULL;
1231 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001232 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001233 for (i = 0, j = wordshift; i < newsize; i++, j++) {
1234 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
1235 if (i+1 < newsize)
1236 z->ob_digit[i] |=
1237 (a->ob_digit[j+1] << hishift) & himask;
1238 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001240}
1241
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242static PyObject *
Guido van Rossumc6913e71991-11-19 20:26:46 +00001243long_lshift(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001244 PyLongObject *a;
1245 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001246{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001247 /* This version due to Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001248 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001249 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001250 int oldsize, newsize, wordshift, remshift, i, j;
1251 twodigits accum;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001252
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 shiftby = PyLong_AsLong((PyObject *)b);
1254 if (shiftby == -1L && PyErr_Occurred())
Guido van Rossumc6913e71991-11-19 20:26:46 +00001255 return NULL;
1256 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001257 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001258 return NULL;
1259 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001260 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001261 PyErr_SetString(PyExc_ValueError,
1262 "outrageous left shift count");
Guido van Rossumc6913e71991-11-19 20:26:46 +00001263 return NULL;
1264 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001265 /* wordshift, remshift = divmod(shiftby, SHIFT) */
1266 wordshift = (int)shiftby / SHIFT;
1267 remshift = (int)shiftby - wordshift * SHIFT;
1268
1269 oldsize = ABS(a->ob_size);
1270 newsize = oldsize + wordshift;
1271 if (remshift)
1272 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001273 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001274 if (z == NULL)
1275 return NULL;
1276 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001277 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001278 for (i = 0; i < wordshift; i++)
1279 z->ob_digit[i] = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001280 accum = 0;
1281 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
1282 accum |= a->ob_digit[j] << remshift;
1283 z->ob_digit[i] = (digit)(accum & MASK);
1284 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001285 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00001286 if (remshift)
1287 z->ob_digit[newsize-1] = (digit)accum;
1288 else
1289 assert(!accum);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001290 return (PyObject *) long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001291}
1292
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001293
1294/* Bitwise and/xor/or operations */
1295
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001296#define MAX(x, y) ((x) < (y) ? (y) : (x))
1297#define MIN(x, y) ((x) > (y) ? (y) : (x))
1298
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001299static PyObject *long_bitwise Py_PROTO((PyLongObject *, int, PyLongObject *));
1300static PyObject *
Guido van Rossume32e0141992-01-19 16:31:05 +00001301long_bitwise(a, op, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001302 PyLongObject *a;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001303 int op; /* '&', '|', '^' */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001305{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001306 digit maska, maskb; /* 0 or MASK */
1307 int negz;
1308 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001309 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001310 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00001311 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312 PyObject *v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001313
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001314 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001316 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001317 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001318 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001319 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001320 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001321 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001322 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001323 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001324 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001325 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001326 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001328 maskb = 0;
1329 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001330
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001331 size_a = a->ob_size;
1332 size_b = b->ob_size;
1333 size_z = MAX(size_a, size_b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334 z = _PyLong_New(size_z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001335 if (a == NULL || b == NULL || z == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001336 Py_XDECREF(a);
1337 Py_XDECREF(b);
1338 Py_XDECREF(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001339 return NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001340 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001341
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001342 negz = 0;
1343 switch (op) {
1344 case '^':
1345 if (maska != maskb) {
1346 maska ^= MASK;
1347 negz = -1;
1348 }
1349 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001350 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001351 if (maska && maskb) {
1352 op = '|';
1353 maska ^= MASK;
1354 maskb ^= MASK;
1355 negz = -1;
1356 }
1357 break;
1358 case '|':
1359 if (maska || maskb) {
1360 op = '&';
1361 maska ^= MASK;
1362 maskb ^= MASK;
1363 negz = -1;
1364 }
1365 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001366 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001367
1368 for (i = 0; i < size_z; ++i) {
1369 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
1370 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
1371 switch (op) {
1372 case '&': z->ob_digit[i] = diga & digb; break;
1373 case '|': z->ob_digit[i] = diga | digb; break;
1374 case '^': z->ob_digit[i] = diga ^ digb; break;
1375 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00001376 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001377
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001378 Py_DECREF(a);
1379 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001380 z = long_normalize(z);
1381 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001383 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001384 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001385 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001386}
1387
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001388static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001389long_and(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001390 PyLongObject *a;
1391 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001392{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001393 return long_bitwise(a, '&', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001394}
1395
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001396static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001397long_xor(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 PyLongObject *a;
1399 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001400{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001401 return long_bitwise(a, '^', b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001402}
1403
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001404static PyObject *
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001405long_or(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001406 PyLongObject *a;
1407 PyLongObject *b;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001408{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001409 return long_bitwise(a, '|', b);
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001410}
1411
Guido van Rossum234f9421993-06-17 12:35:49 +00001412static int
Guido van Rossume6eefc21992-08-14 12:06:52 +00001413long_coerce(pv, pw)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001414 PyObject **pv;
1415 PyObject **pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001416{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001417 if (PyInt_Check(*pw)) {
1418 *pw = PyLong_FromLong(PyInt_AsLong(*pw));
1419 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001420 return 0;
1421 }
1422 return 1; /* Can't do it */
1423}
1424
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001425static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001426long_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001428{
1429 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001430 x = PyLong_AsLong(v);
1431 if (PyErr_Occurred())
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001432 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001433 return PyInt_FromLong(x);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001434}
1435
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001437long_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001438 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001439{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001441 return v;
1442}
1443
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001444static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001445long_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001446 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001447{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00001448 double result;
1449 PyFPE_START_PROTECT("long_float", return 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001450 result = PyLong_AsDouble(v);
Guido van Rossum45b83911997-03-14 04:32:50 +00001451 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001453}
1454
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001455static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001456long_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001457 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001458{
1459 return long_format(v, 8);
1460}
1461
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001462static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001463long_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001464 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001465{
1466 return long_format(v, 16);
1467}
1468
1469
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001470#define UF (unaryfunc)
1471#define BF (binaryfunc)
1472#define TF (ternaryfunc)
1473#define IF (inquiry)
Guido van Rossum8b27d921992-03-27 17:27:05 +00001474
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001475static PyNumberMethods long_as_number = {
Guido van Rossum8b27d921992-03-27 17:27:05 +00001476 BF long_add, /*nb_add*/
1477 BF long_sub, /*nb_subtract*/
1478 BF long_mul, /*nb_multiply*/
1479 BF long_div, /*nb_divide*/
1480 BF long_mod, /*nb_remainder*/
1481 BF long_divmod, /*nb_divmod*/
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001482 TF long_pow, /*nb_power*/
Guido van Rossum8b27d921992-03-27 17:27:05 +00001483 UF long_neg, /*nb_negative*/
1484 UF long_pos, /*tp_positive*/
1485 UF long_abs, /*tp_absolute*/
1486 IF long_nonzero,/*tp_nonzero*/
1487 UF long_invert, /*nb_invert*/
1488 BF long_lshift, /*nb_lshift*/
1489 BF long_rshift, /*nb_rshift*/
1490 BF long_and, /*nb_and*/
1491 BF long_xor, /*nb_xor*/
1492 BF long_or, /*nb_or*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001493 (int (*) Py_FPROTO((PyObject **, PyObject **)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001494 (coercion)long_coerce, /*nb_coerce*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001495 UF long_int, /*nb_int*/
1496 UF long_long, /*nb_long*/
1497 UF long_float, /*nb_float*/
1498 UF long_oct, /*nb_oct*/
1499 UF long_hex, /*nb_hex*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001500};
1501
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001502PyTypeObject PyLong_Type = {
1503 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001504 0,
1505 "long int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001506 sizeof(PyLongObject) - sizeof(digit),
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001507 sizeof(digit),
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001508 (destructor)long_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +00001509 0, /*tp_print*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001510 0, /*tp_getattr*/
1511 0, /*tp_setattr*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512 (int (*) Py_FPROTO((PyObject *, PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001513 (cmpfunc)long_compare, /*tp_compare*/
1514 (reprfunc)long_repr, /*tp_repr*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001515 &long_as_number,/*tp_as_number*/
1516 0, /*tp_as_sequence*/
1517 0, /*tp_as_mapping*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001518 (long (*) Py_FPROTO((PyObject *)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001519 (hashfunc)long_hash, /*tp_hash*/
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001520};