blob: 59c84ad03c2d4c0b126c4dac3e60f65400da5615 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +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 Rossumf70e43a1991-02-19 12:39:46 +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 Rossumf70e43a1991-02-19 12:39:46 +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 Rossumf70e43a1991-02-19 12:39:46 +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 Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Integer object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Barry Warsaw226ae6c1999-10-12 19:54:53 +000035#include <ctype.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036
Guido van Rossumbf8c0e31994-08-29 12:48:32 +000037#ifdef HAVE_LIMITS_H
Guido van Rossum72481a31993-10-26 15:21:51 +000038#include <limits.h>
39#endif
40
41#ifndef LONG_MAX
42#define LONG_MAX 0X7FFFFFFFL
43#endif
44
45#ifndef LONG_MIN
46#define LONG_MIN (-LONG_MAX-1)
47#endif
48
49#ifndef CHAR_BIT
50#define CHAR_BIT 8
51#endif
52
Guido van Rossumb376a4a1993-11-23 17:53:17 +000053#ifndef LONG_BIT
Guido van Rossum72481a31993-10-26 15:21:51 +000054#define LONG_BIT (CHAR_BIT * sizeof(long))
Guido van Rossumb376a4a1993-11-23 17:53:17 +000055#endif
Guido van Rossum72481a31993-10-26 15:21:51 +000056
Guido van Rossum2e1d4331993-12-24 10:22:45 +000057long
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058PyInt_GetMax()
Guido van Rossum2e1d4331993-12-24 10:22:45 +000059{
60 return LONG_MAX; /* To initialize sys.maxint */
61}
62
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063/* Standard Booleans */
Guido van Rossum3f5da241990-12-20 15:06:42 +000064
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065PyIntObject _Py_ZeroStruct = {
66 PyObject_HEAD_INIT(&PyInt_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067 0
68};
Guido van Rossum3f5da241990-12-20 15:06:42 +000069
Guido van Rossumc0b618a1997-05-02 03:12:38 +000070PyIntObject _Py_TrueStruct = {
71 PyObject_HEAD_INIT(&PyInt_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072 1
73};
74
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075static PyObject *
Guido van Rossum3a628451991-12-10 13:57:36 +000076err_ovf(msg)
77 char *msg;
Guido van Rossum165e67e1990-10-14 20:02:26 +000078{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000079 PyErr_SetString(PyExc_OverflowError, msg);
Guido van Rossum165e67e1990-10-14 20:02:26 +000080 return NULL;
81}
82
Guido van Rossum3f5da241990-12-20 15:06:42 +000083/* Integers are quite normal objects, to make object handling uniform.
84 (Using odd pointers to represent integers would save much space
85 but require extra checks for this special case throughout the code.)
86 Since, a typical Python program spends much of its time allocating
87 and deallocating integers, these operations should be very fast.
88 Therefore we use a dedicated allocation scheme with a much lower
89 overhead (in space and time) than straight malloc(): a simple
90 dedicated free list, filled when necessary with memory from malloc().
91*/
92
93#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000094#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
95#define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
Guido van Rossumda084ed1999-03-10 22:55:24 +000096
97#define PyMem_MALLOC malloc
98#define PyMem_FREE free
Guido van Rossum3fce8831999-03-12 19:43:17 +000099
100struct _intblock {
101 struct _intblock *next;
102 PyIntObject objects[N_INTOBJECTS];
103};
104
105typedef struct _intblock PyIntBlock;
106
107static PyIntBlock *block_list = NULL;
108static PyIntObject *free_list = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000109
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110static PyIntObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000111fill_free_list()
112{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 PyIntObject *p, *q;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000114 p = (PyIntObject *)PyMem_MALLOC(sizeof(PyIntBlock));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000115 if (p == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 return (PyIntObject *)PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +0000117 ((PyIntBlock *)p)->next = block_list;
118 block_list = (PyIntBlock *)p;
119 p = &((PyIntBlock *)p)->objects[0];
Guido van Rossum3f5da241990-12-20 15:06:42 +0000120 q = p + N_INTOBJECTS;
121 while (--q > p)
Guido van Rossumda084ed1999-03-10 22:55:24 +0000122 q->ob_type = (struct _typeobject *)(q-1);
123 q->ob_type = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000124 return p + N_INTOBJECTS - 1;
125}
126
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000127#ifndef NSMALLPOSINTS
128#define NSMALLPOSINTS 100
129#endif
130#ifndef NSMALLNEGINTS
131#define NSMALLNEGINTS 1
132#endif
133#if NSMALLNEGINTS + NSMALLPOSINTS > 0
134/* References to small integers are saved in this array so that they
135 can be shared.
136 The integers that are saved are those in the range
137 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
138*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000140#endif
141#ifdef COUNT_ALLOCS
142int quick_int_allocs, quick_neg_int_allocs;
143#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000144
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145PyObject *
146PyInt_FromLong(ival)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147 long ival;
148{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 register PyIntObject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000150#if NSMALLNEGINTS + NSMALLPOSINTS > 0
151 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS &&
152 (v = small_ints[ival + NSMALLNEGINTS]) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000154#ifdef COUNT_ALLOCS
155 if (ival >= 0)
156 quick_int_allocs++;
157 else
158 quick_neg_int_allocs++;
159#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 return (PyObject *) v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000161 }
162#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000163 if (free_list == NULL) {
164 if ((free_list = fill_free_list()) == NULL)
165 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000167 v = free_list;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000168 free_list = (PyIntObject *)v->ob_type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000169 v->ob_type = &PyInt_Type;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000170 v->ob_ival = ival;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000171 _Py_NewReference((PyObject *)v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000172#if NSMALLNEGINTS + NSMALLPOSINTS > 0
173 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
174 /* save this one for a following allocation */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000176 small_ints[ival + NSMALLNEGINTS] = v;
177 }
178#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 return (PyObject *) v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000180}
181
182static void
183int_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184 PyIntObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000185{
Guido van Rossumda084ed1999-03-10 22:55:24 +0000186 v->ob_type = (struct _typeobject *)free_list;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000187 free_list = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188}
189
190long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191PyInt_AsLong(op)
192 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 PyNumberMethods *nb;
195 PyIntObject *io;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000196 long val;
197
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 if (op && PyInt_Check(op))
199 return PyInt_AS_LONG((PyIntObject*) op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000200
201 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
202 nb->nb_int == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 return -1;
205 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000206
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 io = (PyIntObject*) (*nb->nb_int) (op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000208 if (io == NULL)
209 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 if (!PyInt_Check(io)) {
211 PyErr_SetString(PyExc_TypeError,
212 "nb_int should return int object");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000213 return -1;
214 }
215
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 val = PyInt_AS_LONG(io);
217 Py_DECREF(io);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000218
219 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220}
221
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000222PyObject *
223PyInt_FromString(s, pend, base)
224 char *s;
225 char **pend;
226 int base;
227{
228 char *end;
229 long x;
230 char buffer[256]; /* For errors */
231
232 if ((base != 0 && base < 2) || base > 36) {
233 PyErr_SetString(PyExc_ValueError, "invalid base for int()");
234 return NULL;
235 }
236
237 while (*s && isspace(Py_CHARMASK(*s)))
238 s++;
239 errno = 0;
240 if (base == 0 && s[0] == '0')
241 x = (long) PyOS_strtoul(s, &end, base);
242 else
243 x = PyOS_strtol(s, &end, base);
244 if (end == s || !isalnum(end[-1]))
245 goto bad;
246 while (*end && isspace(Py_CHARMASK(*end)))
247 end++;
248 if (*end != '\0') {
249 bad:
250 sprintf(buffer, "invalid literal for int(): %.200s", s);
251 PyErr_SetString(PyExc_ValueError, buffer);
252 return NULL;
253 }
254 else if (errno != 0) {
255 sprintf(buffer, "int() literal too large: %.200s", s);
256 PyErr_SetString(PyExc_ValueError, buffer);
257 return NULL;
258 }
259 if (pend)
260 *pend = end;
261 return PyInt_FromLong(x);
262}
263
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264/* Methods */
265
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000266/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000267static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000268int_print(v, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270 FILE *fp;
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000271 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272{
273 fprintf(fp, "%ld", v->ob_ival);
Guido van Rossum90933611991-06-07 16:10:43 +0000274 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275}
276
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000277static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000278int_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280{
281 char buf[20];
282 sprintf(buf, "%ld", v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000283 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284}
285
286static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000287int_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000288 PyIntObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289{
290 register long i = v->ob_ival;
291 register long j = w->ob_ival;
292 return (i < j) ? -1 : (i > j) ? 1 : 0;
293}
294
Guido van Rossum9bfef441993-03-29 10:43:31 +0000295static long
296int_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297 PyIntObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000298{
Guido van Rossum541cdd81997-01-06 22:53:20 +0000299 /* XXX If this is changed, you also need to change the way
300 Python's long, float and complex types are hashed. */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000301 long x = v -> ob_ival;
302 if (x == -1)
303 x = -2;
304 return x;
305}
306
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000308int_add(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 PyIntObject *v;
310 PyIntObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311{
312 register long a, b, x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000314 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 x = a + b;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000316 if ((x^a) < 0 && (x^b) < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000317 return err_ovf("integer addition");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000318 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319}
320
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000321static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000322int_sub(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323 PyIntObject *v;
324 PyIntObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325{
326 register long a, b, x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000328 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329 x = a - b;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000330 if ((x^a) < 0 && (x^~b) < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000331 return err_ovf("integer subtraction");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333}
334
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000335/*
336Integer overflow checking used to be done using a double, but on 64
337bit machines (where both long and double are 64 bit) this fails
338because the double doesn't have enouvg precision. John Tromp suggests
339the following algorithm:
340
341Suppose again we normalize a and b to be nonnegative.
342Let ah and al (bh and bl) be the high and low 32 bits of a (b, resp.).
343Now we test ah and bh against zero and get essentially 3 possible outcomes.
344
3451) both ah and bh > 0 : then report overflow
346
3472) both ah and bh = 0 : then compute a*b and report overflow if it comes out
348 negative
349
3503) ah > 0 and bh = 0 : compute ah*bl and report overflow if it's >= 2^31
351 compute al*bl and report overflow if it's negative
352 add (ah*bl)<<32 to al*bl and report overflow if
353 it's negative
354
355In case of no overflow the result is then negated if necessary.
356
357The majority of cases will be 2), in which case this method is the same as
358what I suggested before. If multiplication is expensive enough, then the
359other method is faster on case 3), but also more work to program, so I
360guess the above is the preferred solution.
361
362*/
363
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000365int_mul(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 PyIntObject *v;
367 PyIntObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368{
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000369 long a, b, ah, bh, x, y;
370 int s = 1;
371
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000372 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000373 b = w->ob_ival;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000374 ah = a >> (LONG_BIT/2);
375 bh = b >> (LONG_BIT/2);
376
377 /* Quick test for common case: two small positive ints */
378
379 if (ah == 0 && bh == 0) {
380 x = a*b;
381 if (x < 0)
382 goto bad;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 return PyInt_FromLong(x);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000384 }
385
386 /* Arrange that a >= b >= 0 */
387
388 if (a < 0) {
389 a = -a;
390 if (a < 0) {
391 /* Largest negative */
392 if (b == 0 || b == 1) {
393 x = a*b;
394 goto ok;
395 }
396 else
397 goto bad;
398 }
399 s = -s;
400 ah = a >> (LONG_BIT/2);
401 }
402 if (b < 0) {
403 b = -b;
404 if (b < 0) {
405 /* Largest negative */
Guido van Rossum9478dd41996-12-06 20:14:43 +0000406 if (a == 0 || (a == 1 && s == 1)) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000407 x = a*b;
408 goto ok;
409 }
410 else
411 goto bad;
412 }
413 s = -s;
414 bh = b >> (LONG_BIT/2);
415 }
416
417 /* 1) both ah and bh > 0 : then report overflow */
418
419 if (ah != 0 && bh != 0)
420 goto bad;
421
422 /* 2) both ah and bh = 0 : then compute a*b and report
423 overflow if it comes out negative */
424
425 if (ah == 0 && bh == 0) {
426 x = a*b;
427 if (x < 0)
428 goto bad;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429 return PyInt_FromLong(x*s);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000430 }
431
432 if (a < b) {
433 /* Swap */
434 x = a;
435 a = b;
436 b = x;
437 ah = bh;
438 /* bh not used beyond this point */
439 }
440
441 /* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if
442 it's >= 2^31
443 compute al*bl and report overflow if it's negative
444 add (ah*bl)<<32 to al*bl and report overflow if
445 it's negative
446 (NB b == bl in this case, and we make a = al) */
447
448 y = ah*b;
Guido van Rossum541cdd81997-01-06 22:53:20 +0000449 if (y >= (1L << (LONG_BIT/2 - 1)))
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000450 goto bad;
451 a &= (1L << (LONG_BIT/2)) - 1;
452 x = a*b;
453 if (x < 0)
454 goto bad;
Guido van Rossum541cdd81997-01-06 22:53:20 +0000455 x += y << (LONG_BIT/2);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000456 if (x < 0)
457 goto bad;
458 ok:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459 return PyInt_FromLong(x * s);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000460
461 bad:
462 return err_ovf("integer multiplication");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463}
464
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000465static int
466i_divmod(x, y, p_xdivy, p_xmody)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 register PyIntObject *x, *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000468 long *p_xdivy, *p_xmody;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000470 long xi = x->ob_ival;
471 long yi = y->ob_ival;
472 long xdivy, xmody;
473
474 if (yi == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 PyErr_SetString(PyExc_ZeroDivisionError,
476 "integer division or modulo");
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000477 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000478 }
Guido van Rossum00466951991-05-05 20:08:27 +0000479 if (yi < 0) {
Guido van Rossume13ff2e1999-09-27 17:12:47 +0000480 if (xi < 0) {
481 if (yi == -1 && -xi < 0) {
482 /* most negative / -1 */
483 err_ovf("integer division");
484 return -1;
485 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000486 xdivy = -xi / -yi;
Guido van Rossume13ff2e1999-09-27 17:12:47 +0000487 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000488 else
489 xdivy = - (xi / -yi);
Guido van Rossum00466951991-05-05 20:08:27 +0000490 }
491 else {
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000492 if (xi < 0)
493 xdivy = - (-xi / yi);
494 else
495 xdivy = xi / yi;
Guido van Rossum00466951991-05-05 20:08:27 +0000496 }
497 xmody = xi - xdivy*yi;
Guido van Rossum9478dd41996-12-06 20:14:43 +0000498 if ((xmody < 0 && yi > 0) || (xmody > 0 && yi < 0)) {
Guido van Rossum00466951991-05-05 20:08:27 +0000499 xmody += yi;
500 xdivy -= 1;
501 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000502 *p_xdivy = xdivy;
503 *p_xmody = xmody;
504 return 0;
505}
506
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507static PyObject *
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000508int_div(x, y)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509 PyIntObject *x;
510 PyIntObject *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000511{
512 long d, m;
513 if (i_divmod(x, y, &d, &m) < 0)
514 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 return PyInt_FromLong(d);
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000516}
517
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518static PyObject *
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000519int_mod(x, y)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 PyIntObject *x;
521 PyIntObject *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000522{
523 long d, m;
524 if (i_divmod(x, y, &d, &m) < 0)
525 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526 return PyInt_FromLong(m);
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000527}
528
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000529static PyObject *
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000530int_divmod(x, y)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 PyIntObject *x;
532 PyIntObject *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000533{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000534 long d, m;
535 if (i_divmod(x, y, &d, &m) < 0)
536 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 return Py_BuildValue("(ll)", d, m);
Guido van Rossum00466951991-05-05 20:08:27 +0000538}
539
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540static PyObject *
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000541int_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 PyIntObject *v;
543 PyIntObject *w;
544 PyIntObject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545{
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000546#if 1
Guido van Rossum9478dd41996-12-06 20:14:43 +0000547 register long iv, iw, iz=0, ix, temp, prev;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000548 iv = v->ob_ival;
549 iw = w->ob_ival;
550 if (iw < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 PyErr_SetString(PyExc_ValueError,
552 "integer to the negative power");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000553 return NULL;
554 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 if ((PyObject *)z != Py_None) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000556 iz = z->ob_ival;
Guido van Rossum9478dd41996-12-06 20:14:43 +0000557 if (iz == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 PyErr_SetString(PyExc_ValueError,
559 "pow(x, y, z) with z==0");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000560 return NULL;
561 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000562 }
563 /*
564 * XXX: The original exponentiation code stopped looping
565 * when temp hit zero; this code will continue onwards
566 * unnecessarily, but at least it won't cause any errors.
567 * Hopefully the speed improvement from the fast exponentiation
568 * will compensate for the slight inefficiency.
569 * XXX: Better handling of overflows is desperately needed.
570 */
571 temp = iv;
572 ix = 1;
573 while (iw > 0) {
574 prev = ix; /* Save value for overflow check */
575 if (iw & 1) {
576 ix = ix*temp;
577 if (temp == 0)
578 break; /* Avoid ix / 0 */
579 if (ix / temp != prev)
Guido van Rossumfb4574e2000-02-15 14:51:46 +0000580 return err_ovf("integer exponentiation");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000581 }
582 iw >>= 1; /* Shift exponent down by 1 bit */
583 if (iw==0) break;
584 prev = temp;
585 temp *= temp; /* Square the value of temp */
586 if (prev!=0 && temp/prev!=prev)
Guido van Rossumfb4574e2000-02-15 14:51:46 +0000587 return err_ovf("integer exponentiation");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000588 if (iz) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000589 /* If we did a multiplication, perform a modulo */
590 ix = ix % iz;
591 temp = temp % iz;
592 }
593 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000594 if (iz) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 PyObject *t1, *t2;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000596 long int div, mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597 t1=PyInt_FromLong(ix);
598 t2=PyInt_FromLong(iz);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000599 if (t1==NULL || t2==NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600 i_divmod((PyIntObject *)t1,
601 (PyIntObject *)t2, &div, &mod)<0)
602 {
603 Py_XDECREF(t1);
604 Py_XDECREF(t2);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000605 return(NULL);
606 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 Py_DECREF(t1);
608 Py_DECREF(t2);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000609 ix=mod;
610 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 return PyInt_FromLong(ix);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000612#else
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000613 register long iv, iw, ix;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614 iv = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000615 iw = w->ob_ival;
Guido van Rossum00466951991-05-05 20:08:27 +0000616 if (iw < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 PyErr_SetString(PyExc_ValueError,
618 "integer to the negative power");
Guido van Rossum00466951991-05-05 20:08:27 +0000619 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000620 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 if ((PyObject *)z != Py_None) {
622 PyErr_SetString(PyExc_TypeError,
623 "pow(int, int, int) not yet supported");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000624 return NULL;
625 }
Guido van Rossum00466951991-05-05 20:08:27 +0000626 ix = 1;
627 while (--iw >= 0) {
628 long prev = ix;
629 ix = ix * iv;
630 if (iv == 0)
631 break; /* 0 to some power -- avoid ix / 0 */
632 if (ix / iv != prev)
Guido van Rossumfb4574e2000-02-15 14:51:46 +0000633 return err_ovf("integer exponentiation");
Guido van Rossum00466951991-05-05 20:08:27 +0000634 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 return PyInt_FromLong(ix);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000636#endif
637}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000638
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000640int_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000642{
643 register long a, x;
644 a = v->ob_ival;
645 x = -a;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000646 if (a < 0 && x < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000647 return err_ovf("integer negation");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000649}
650
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000652int_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000654{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 Py_INCREF(v);
656 return (PyObject *)v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000657}
658
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659static PyObject *
Guido van Rossum00466951991-05-05 20:08:27 +0000660int_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 PyIntObject *v;
Guido van Rossum00466951991-05-05 20:08:27 +0000662{
663 if (v->ob_ival >= 0)
664 return int_pos(v);
665 else
666 return int_neg(v);
667}
668
Guido van Rossum0bff0151991-05-14 12:05:32 +0000669static int
670int_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671 PyIntObject *v;
Guido van Rossum0bff0151991-05-14 12:05:32 +0000672{
673 return v->ob_ival != 0;
674}
675
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000677int_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 PyIntObject *v;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000679{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000681}
682
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000684int_lshift(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685 PyIntObject *v;
686 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000687{
688 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000689 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000690 b = w->ob_ival;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000691 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000693 return NULL;
694 }
695 if (a == 0 || b == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 Py_INCREF(v);
697 return (PyObject *) v;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000698 }
Guido van Rossum72481a31993-10-26 15:21:51 +0000699 if (b >= LONG_BIT) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700 return PyInt_FromLong(0L);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000701 }
702 a = (unsigned long)a << b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000704}
705
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000706static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000707int_rshift(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 PyIntObject *v;
709 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000710{
711 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000712 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000713 b = w->ob_ival;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000714 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000716 return NULL;
717 }
718 if (a == 0 || b == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719 Py_INCREF(v);
720 return (PyObject *) v;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000721 }
Guido van Rossum72481a31993-10-26 15:21:51 +0000722 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000723 if (a < 0)
724 a = -1;
725 else
726 a = 0;
727 }
728 else {
729 if (a < 0)
730 a = ~( ~(unsigned long)a >> b );
731 else
732 a = (unsigned long)a >> b;
733 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000734 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000735}
736
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000738int_and(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739 PyIntObject *v;
740 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000741{
742 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000743 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000744 b = w->ob_ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 return PyInt_FromLong(a & b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000746}
747
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000748static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000749int_xor(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750 PyIntObject *v;
751 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000752{
753 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000754 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000755 b = w->ob_ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 return PyInt_FromLong(a ^ b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000757}
758
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000760int_or(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000761 PyIntObject *v;
762 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000763{
764 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000765 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000766 b = w->ob_ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767 return PyInt_FromLong(a | b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000768}
769
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000771int_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000772 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000773{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 Py_INCREF(v);
775 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000776}
777
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000779int_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000780 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000781{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000783}
784
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000786int_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000788{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000790}
791
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000793int_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000795{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000796 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000797 long x = v -> ob_ival;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000798 if (x == 0)
799 strcpy(buf, "0");
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000800 else
Guido van Rossumebee0251997-01-12 19:48:03 +0000801 sprintf(buf, "0%lo", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000803}
804
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000806int_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000808{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000809 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000810 long x = v -> ob_ival;
Guido van Rossumebee0251997-01-12 19:48:03 +0000811 sprintf(buf, "0x%lx", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000813}
814
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815static PyNumberMethods int_as_number = {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000816 (binaryfunc)int_add, /*nb_add*/
817 (binaryfunc)int_sub, /*nb_subtract*/
818 (binaryfunc)int_mul, /*nb_multiply*/
819 (binaryfunc)int_div, /*nb_divide*/
820 (binaryfunc)int_mod, /*nb_remainder*/
821 (binaryfunc)int_divmod, /*nb_divmod*/
822 (ternaryfunc)int_pow, /*nb_power*/
823 (unaryfunc)int_neg, /*nb_negative*/
824 (unaryfunc)int_pos, /*nb_positive*/
825 (unaryfunc)int_abs, /*nb_absolute*/
826 (inquiry)int_nonzero, /*nb_nonzero*/
827 (unaryfunc)int_invert, /*nb_invert*/
828 (binaryfunc)int_lshift, /*nb_lshift*/
829 (binaryfunc)int_rshift, /*nb_rshift*/
830 (binaryfunc)int_and, /*nb_and*/
831 (binaryfunc)int_xor, /*nb_xor*/
832 (binaryfunc)int_or, /*nb_or*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000833 0, /*nb_coerce*/
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000834 (unaryfunc)int_int, /*nb_int*/
835 (unaryfunc)int_long, /*nb_long*/
836 (unaryfunc)int_float, /*nb_float*/
837 (unaryfunc)int_oct, /*nb_oct*/
838 (unaryfunc)int_hex, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000839};
840
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841PyTypeObject PyInt_Type = {
842 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000843 0,
844 "int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000845 sizeof(PyIntObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000846 0,
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000847 (destructor)int_dealloc, /*tp_dealloc*/
848 (printfunc)int_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000849 0, /*tp_getattr*/
850 0, /*tp_setattr*/
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000851 (cmpfunc)int_compare, /*tp_compare*/
852 (reprfunc)int_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000853 &int_as_number, /*tp_as_number*/
854 0, /*tp_as_sequence*/
855 0, /*tp_as_mapping*/
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000856 (hashfunc)int_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000857};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000858
859void
860PyInt_Fini()
861{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000862 PyIntObject *p;
863 PyIntBlock *list, *next;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000864 int i;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000865 int bc, bf; /* block count, number of freed blocks */
866 int irem, isum; /* remaining unfreed ints per block, total */
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000867
Guido van Rossumda084ed1999-03-10 22:55:24 +0000868#if NSMALLNEGINTS + NSMALLPOSINTS > 0
869 PyIntObject **q;
870
871 i = NSMALLNEGINTS + NSMALLPOSINTS;
872 q = small_ints;
873 while (--i >= 0) {
874 Py_XDECREF(*q);
875 *q++ = NULL;
876 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000877#endif
Guido van Rossumda084ed1999-03-10 22:55:24 +0000878 bc = 0;
879 bf = 0;
880 isum = 0;
881 list = block_list;
882 block_list = NULL;
Guido van Rossum51288bc1999-03-19 20:30:39 +0000883 free_list = NULL;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000884 while (list != NULL) {
Guido van Rossumda084ed1999-03-10 22:55:24 +0000885 bc++;
886 irem = 0;
Guido van Rossum51288bc1999-03-19 20:30:39 +0000887 for (i = 0, p = &list->objects[0];
888 i < N_INTOBJECTS;
889 i++, p++) {
Guido van Rossumda084ed1999-03-10 22:55:24 +0000890 if (PyInt_Check(p) && p->ob_refcnt != 0)
891 irem++;
892 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000893 next = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000894 if (irem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000895 list->next = block_list;
896 block_list = list;
Guido van Rossum51288bc1999-03-19 20:30:39 +0000897 for (i = 0, p = &list->objects[0];
898 i < N_INTOBJECTS;
899 i++, p++) {
900 if (!PyInt_Check(p) || p->ob_refcnt == 0) {
901 p->ob_type = (struct _typeobject *)
902 free_list;
903 free_list = p;
904 }
905#if NSMALLNEGINTS + NSMALLPOSINTS > 0
906 else if (-NSMALLNEGINTS <= p->ob_ival &&
907 p->ob_ival < NSMALLPOSINTS &&
908 small_ints[p->ob_ival +
909 NSMALLNEGINTS] == NULL) {
910 Py_INCREF(p);
911 small_ints[p->ob_ival +
912 NSMALLNEGINTS] = p;
913 }
914#endif
915 }
Guido van Rossumda084ed1999-03-10 22:55:24 +0000916 }
917 else {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000918 PyMem_FREE(list);
Guido van Rossumda084ed1999-03-10 22:55:24 +0000919 bf++;
920 }
921 isum += irem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000922 list = next;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000923 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000924 if (!Py_VerboseFlag)
925 return;
926 fprintf(stderr, "# cleanup ints");
927 if (!isum) {
928 fprintf(stderr, "\n");
929 }
930 else {
931 fprintf(stderr,
932 ": %d unfreed int%s in %d out of %d block%s\n",
933 isum, isum == 1 ? "" : "s",
934 bc - bf, bc, bc == 1 ? "" : "s");
935 }
936 if (Py_VerboseFlag > 1) {
937 list = block_list;
938 while (list != NULL) {
Guido van Rossum51288bc1999-03-19 20:30:39 +0000939 for (i = 0, p = &list->objects[0];
940 i < N_INTOBJECTS;
941 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000942 if (PyInt_Check(p) && p->ob_refcnt != 0)
943 fprintf(stderr,
Guido van Rossum51288bc1999-03-19 20:30:39 +0000944 "# <int at %lx, refcnt=%d, val=%ld>\n",
Guido van Rossum4c08d552000-03-10 22:55:18 +0000945 (long)p, p->ob_refcnt, p->ob_ival);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000946 }
947 list = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000948 }
949 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000950}