blob: fa24824e763a93e552b5883d360f26b0e8051da3 [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"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossumbf8c0e31994-08-29 12:48:32 +000036#ifdef HAVE_LIMITS_H
Guido van Rossum72481a31993-10-26 15:21:51 +000037#include <limits.h>
38#endif
39
40#ifndef LONG_MAX
41#define LONG_MAX 0X7FFFFFFFL
42#endif
43
44#ifndef LONG_MIN
45#define LONG_MIN (-LONG_MAX-1)
46#endif
47
48#ifndef CHAR_BIT
49#define CHAR_BIT 8
50#endif
51
Guido van Rossumb376a4a1993-11-23 17:53:17 +000052#ifndef LONG_BIT
Guido van Rossum72481a31993-10-26 15:21:51 +000053#define LONG_BIT (CHAR_BIT * sizeof(long))
Guido van Rossumb376a4a1993-11-23 17:53:17 +000054#endif
Guido van Rossum72481a31993-10-26 15:21:51 +000055
Guido van Rossum2e1d4331993-12-24 10:22:45 +000056long
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057PyInt_GetMax()
Guido van Rossum2e1d4331993-12-24 10:22:45 +000058{
59 return LONG_MAX; /* To initialize sys.maxint */
60}
61
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062/* Standard Booleans */
Guido van Rossum3f5da241990-12-20 15:06:42 +000063
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064PyIntObject _Py_ZeroStruct = {
65 PyObject_HEAD_INIT(&PyInt_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066 0
67};
Guido van Rossum3f5da241990-12-20 15:06:42 +000068
Guido van Rossumc0b618a1997-05-02 03:12:38 +000069PyIntObject _Py_TrueStruct = {
70 PyObject_HEAD_INIT(&PyInt_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071 1
72};
73
Guido van Rossumc0b618a1997-05-02 03:12:38 +000074static PyObject *
Guido van Rossum3a628451991-12-10 13:57:36 +000075err_ovf(msg)
76 char *msg;
Guido van Rossum165e67e1990-10-14 20:02:26 +000077{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 PyErr_SetString(PyExc_OverflowError, msg);
Guido van Rossum165e67e1990-10-14 20:02:26 +000079 return NULL;
80}
81
Guido van Rossum3f5da241990-12-20 15:06:42 +000082/* Integers are quite normal objects, to make object handling uniform.
83 (Using odd pointers to represent integers would save much space
84 but require extra checks for this special case throughout the code.)
85 Since, a typical Python program spends much of its time allocating
86 and deallocating integers, these operations should be very fast.
87 Therefore we use a dedicated allocation scheme with a much lower
88 overhead (in space and time) than straight malloc(): a simple
89 dedicated free list, filled when necessary with memory from malloc().
90*/
91
92#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossumda084ed1999-03-10 22:55:24 +000093#define N_INTOBJECTS ((BLOCK_SIZE - sizeof(PyIntObject *)) / \
94 sizeof(PyIntObject))
95
96#define PyMem_MALLOC malloc
97#define PyMem_FREE free
98static PyIntObject *block_list = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000099
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100static PyIntObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000101fill_free_list()
102{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000103 PyIntObject *p, *q;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000104 p = (PyIntObject *)PyMem_MALLOC(BLOCK_SIZE);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000105 if (p == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 return (PyIntObject *)PyErr_NoMemory();
Guido van Rossumda084ed1999-03-10 22:55:24 +0000107 *(PyIntObject **)p = block_list;
108 block_list = p;
109 p = (PyIntObject *)((char *)p + sizeof(PyIntObject *));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000110 q = p + N_INTOBJECTS;
111 while (--q > p)
Guido van Rossumda084ed1999-03-10 22:55:24 +0000112 q->ob_type = (struct _typeobject *)(q-1);
113 q->ob_type = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000114 return p + N_INTOBJECTS - 1;
115}
116
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000117static PyIntObject *free_list = NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000118#ifndef NSMALLPOSINTS
119#define NSMALLPOSINTS 100
120#endif
121#ifndef NSMALLNEGINTS
122#define NSMALLNEGINTS 1
123#endif
124#if NSMALLNEGINTS + NSMALLPOSINTS > 0
125/* References to small integers are saved in this array so that they
126 can be shared.
127 The integers that are saved are those in the range
128 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
129*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000131#endif
132#ifdef COUNT_ALLOCS
133int quick_int_allocs, quick_neg_int_allocs;
134#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000135
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000136PyObject *
137PyInt_FromLong(ival)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138 long ival;
139{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140 register PyIntObject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000141#if NSMALLNEGINTS + NSMALLPOSINTS > 0
142 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS &&
143 (v = small_ints[ival + NSMALLNEGINTS]) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000145#ifdef COUNT_ALLOCS
146 if (ival >= 0)
147 quick_int_allocs++;
148 else
149 quick_neg_int_allocs++;
150#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 return (PyObject *) v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000152 }
153#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000154 if (free_list == NULL) {
155 if ((free_list = fill_free_list()) == NULL)
156 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000158 v = free_list;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000159 free_list = (PyIntObject *)v->ob_type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 v->ob_type = &PyInt_Type;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000161 v->ob_ival = ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 _Py_NewReference(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000163#if NSMALLNEGINTS + NSMALLPOSINTS > 0
164 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
165 /* save this one for a following allocation */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000166 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000167 small_ints[ival + NSMALLNEGINTS] = v;
168 }
169#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 return (PyObject *) v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000171}
172
173static void
174int_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175 PyIntObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000176{
Guido van Rossumda084ed1999-03-10 22:55:24 +0000177 v->ob_type = (struct _typeobject *)free_list;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000178 free_list = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179}
180
181long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182PyInt_AsLong(op)
183 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 PyNumberMethods *nb;
186 PyIntObject *io;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000187 long val;
188
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 if (op && PyInt_Check(op))
190 return PyInt_AS_LONG((PyIntObject*) op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000191
192 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
193 nb->nb_int == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 return -1;
196 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000197
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 io = (PyIntObject*) (*nb->nb_int) (op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000199 if (io == NULL)
200 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000201 if (!PyInt_Check(io)) {
202 PyErr_SetString(PyExc_TypeError,
203 "nb_int should return int object");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000204 return -1;
205 }
206
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 val = PyInt_AS_LONG(io);
208 Py_DECREF(io);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000209
210 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211}
212
213/* Methods */
214
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000215/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000216static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000217int_print(v, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000218 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000219 FILE *fp;
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000220 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221{
222 fprintf(fp, "%ld", v->ob_ival);
Guido van Rossum90933611991-06-07 16:10:43 +0000223 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224}
225
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000227int_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229{
230 char buf[20];
231 sprintf(buf, "%ld", v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233}
234
235static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000236int_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 PyIntObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238{
239 register long i = v->ob_ival;
240 register long j = w->ob_ival;
241 return (i < j) ? -1 : (i > j) ? 1 : 0;
242}
243
Guido van Rossum9bfef441993-03-29 10:43:31 +0000244static long
245int_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 PyIntObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000247{
Guido van Rossum541cdd81997-01-06 22:53:20 +0000248 /* XXX If this is changed, you also need to change the way
249 Python's long, float and complex types are hashed. */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000250 long x = v -> ob_ival;
251 if (x == -1)
252 x = -2;
253 return x;
254}
255
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000257int_add(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000258 PyIntObject *v;
259 PyIntObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260{
261 register long a, b, x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000263 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264 x = a + b;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000265 if ((x^a) < 0 && (x^b) < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000266 return err_ovf("integer addition");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268}
269
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000270static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000271int_sub(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000272 PyIntObject *v;
273 PyIntObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274{
275 register long a, b, x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000277 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278 x = a - b;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000279 if ((x^a) < 0 && (x^~b) < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000280 return err_ovf("integer subtraction");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000281 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282}
283
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000284/*
285Integer overflow checking used to be done using a double, but on 64
286bit machines (where both long and double are 64 bit) this fails
287because the double doesn't have enouvg precision. John Tromp suggests
288the following algorithm:
289
290Suppose again we normalize a and b to be nonnegative.
291Let ah and al (bh and bl) be the high and low 32 bits of a (b, resp.).
292Now we test ah and bh against zero and get essentially 3 possible outcomes.
293
2941) both ah and bh > 0 : then report overflow
295
2962) both ah and bh = 0 : then compute a*b and report overflow if it comes out
297 negative
298
2993) ah > 0 and bh = 0 : compute ah*bl and report overflow if it's >= 2^31
300 compute al*bl and report overflow if it's negative
301 add (ah*bl)<<32 to al*bl and report overflow if
302 it's negative
303
304In case of no overflow the result is then negated if necessary.
305
306The majority of cases will be 2), in which case this method is the same as
307what I suggested before. If multiplication is expensive enough, then the
308other method is faster on case 3), but also more work to program, so I
309guess the above is the preferred solution.
310
311*/
312
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000313static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000314int_mul(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 PyIntObject *v;
316 PyIntObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317{
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000318 long a, b, ah, bh, x, y;
319 int s = 1;
320
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000322 b = w->ob_ival;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000323 ah = a >> (LONG_BIT/2);
324 bh = b >> (LONG_BIT/2);
325
326 /* Quick test for common case: two small positive ints */
327
328 if (ah == 0 && bh == 0) {
329 x = a*b;
330 if (x < 0)
331 goto bad;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 return PyInt_FromLong(x);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000333 }
334
335 /* Arrange that a >= b >= 0 */
336
337 if (a < 0) {
338 a = -a;
339 if (a < 0) {
340 /* Largest negative */
341 if (b == 0 || b == 1) {
342 x = a*b;
343 goto ok;
344 }
345 else
346 goto bad;
347 }
348 s = -s;
349 ah = a >> (LONG_BIT/2);
350 }
351 if (b < 0) {
352 b = -b;
353 if (b < 0) {
354 /* Largest negative */
Guido van Rossum9478dd41996-12-06 20:14:43 +0000355 if (a == 0 || (a == 1 && s == 1)) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000356 x = a*b;
357 goto ok;
358 }
359 else
360 goto bad;
361 }
362 s = -s;
363 bh = b >> (LONG_BIT/2);
364 }
365
366 /* 1) both ah and bh > 0 : then report overflow */
367
368 if (ah != 0 && bh != 0)
369 goto bad;
370
371 /* 2) both ah and bh = 0 : then compute a*b and report
372 overflow if it comes out negative */
373
374 if (ah == 0 && bh == 0) {
375 x = a*b;
376 if (x < 0)
377 goto bad;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378 return PyInt_FromLong(x*s);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000379 }
380
381 if (a < b) {
382 /* Swap */
383 x = a;
384 a = b;
385 b = x;
386 ah = bh;
387 /* bh not used beyond this point */
388 }
389
390 /* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if
391 it's >= 2^31
392 compute al*bl and report overflow if it's negative
393 add (ah*bl)<<32 to al*bl and report overflow if
394 it's negative
395 (NB b == bl in this case, and we make a = al) */
396
397 y = ah*b;
Guido van Rossum541cdd81997-01-06 22:53:20 +0000398 if (y >= (1L << (LONG_BIT/2 - 1)))
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000399 goto bad;
400 a &= (1L << (LONG_BIT/2)) - 1;
401 x = a*b;
402 if (x < 0)
403 goto bad;
Guido van Rossum541cdd81997-01-06 22:53:20 +0000404 x += y << (LONG_BIT/2);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000405 if (x < 0)
406 goto bad;
407 ok:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000408 return PyInt_FromLong(x * s);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000409
410 bad:
411 return err_ovf("integer multiplication");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412}
413
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000414static int
415i_divmod(x, y, p_xdivy, p_xmody)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 register PyIntObject *x, *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000417 long *p_xdivy, *p_xmody;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000419 long xi = x->ob_ival;
420 long yi = y->ob_ival;
421 long xdivy, xmody;
422
423 if (yi == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 PyErr_SetString(PyExc_ZeroDivisionError,
425 "integer division or modulo");
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000426 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427 }
Guido van Rossum00466951991-05-05 20:08:27 +0000428 if (yi < 0) {
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000429 if (xi < 0)
430 xdivy = -xi / -yi;
431 else
432 xdivy = - (xi / -yi);
Guido van Rossum00466951991-05-05 20:08:27 +0000433 }
434 else {
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000435 if (xi < 0)
436 xdivy = - (-xi / yi);
437 else
438 xdivy = xi / yi;
Guido van Rossum00466951991-05-05 20:08:27 +0000439 }
440 xmody = xi - xdivy*yi;
Guido van Rossum9478dd41996-12-06 20:14:43 +0000441 if ((xmody < 0 && yi > 0) || (xmody > 0 && yi < 0)) {
Guido van Rossum00466951991-05-05 20:08:27 +0000442 xmody += yi;
443 xdivy -= 1;
444 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000445 *p_xdivy = xdivy;
446 *p_xmody = xmody;
447 return 0;
448}
449
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450static PyObject *
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000451int_div(x, y)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452 PyIntObject *x;
453 PyIntObject *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000454{
455 long d, m;
456 if (i_divmod(x, y, &d, &m) < 0)
457 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 return PyInt_FromLong(d);
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000459}
460
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461static PyObject *
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000462int_mod(x, y)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000463 PyIntObject *x;
464 PyIntObject *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000465{
466 long d, m;
467 if (i_divmod(x, y, &d, &m) < 0)
468 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 return PyInt_FromLong(m);
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000470}
471
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472static PyObject *
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000473int_divmod(x, y)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 PyIntObject *x;
475 PyIntObject *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000476{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000477 long d, m;
478 if (i_divmod(x, y, &d, &m) < 0)
479 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 return Py_BuildValue("(ll)", d, m);
Guido van Rossum00466951991-05-05 20:08:27 +0000481}
482
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483static PyObject *
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000484int_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000485 PyIntObject *v;
486 PyIntObject *w;
487 PyIntObject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000488{
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000489#if 1
Guido van Rossum9478dd41996-12-06 20:14:43 +0000490 register long iv, iw, iz=0, ix, temp, prev;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000491 iv = v->ob_ival;
492 iw = w->ob_ival;
493 if (iw < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 PyErr_SetString(PyExc_ValueError,
495 "integer to the negative power");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000496 return NULL;
497 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 if ((PyObject *)z != Py_None) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000499 iz = z->ob_ival;
Guido van Rossum9478dd41996-12-06 20:14:43 +0000500 if (iz == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501 PyErr_SetString(PyExc_ValueError,
502 "pow(x, y, z) with z==0");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000503 return NULL;
504 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000505 }
506 /*
507 * XXX: The original exponentiation code stopped looping
508 * when temp hit zero; this code will continue onwards
509 * unnecessarily, but at least it won't cause any errors.
510 * Hopefully the speed improvement from the fast exponentiation
511 * will compensate for the slight inefficiency.
512 * XXX: Better handling of overflows is desperately needed.
513 */
514 temp = iv;
515 ix = 1;
516 while (iw > 0) {
517 prev = ix; /* Save value for overflow check */
518 if (iw & 1) {
519 ix = ix*temp;
520 if (temp == 0)
521 break; /* Avoid ix / 0 */
522 if (ix / temp != prev)
523 return err_ovf("integer pow()");
524 }
525 iw >>= 1; /* Shift exponent down by 1 bit */
526 if (iw==0) break;
527 prev = temp;
528 temp *= temp; /* Square the value of temp */
529 if (prev!=0 && temp/prev!=prev)
530 return err_ovf("integer pow()");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000531 if (iz) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000532 /* If we did a multiplication, perform a modulo */
533 ix = ix % iz;
534 temp = temp % iz;
535 }
536 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000537 if (iz) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538 PyObject *t1, *t2;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000539 long int div, mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540 t1=PyInt_FromLong(ix);
541 t2=PyInt_FromLong(iz);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000542 if (t1==NULL || t2==NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 i_divmod((PyIntObject *)t1,
544 (PyIntObject *)t2, &div, &mod)<0)
545 {
546 Py_XDECREF(t1);
547 Py_XDECREF(t2);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000548 return(NULL);
549 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 Py_DECREF(t1);
551 Py_DECREF(t2);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000552 ix=mod;
553 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 return PyInt_FromLong(ix);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000555#else
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556 register long iv, iw, ix;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000557 iv = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000558 iw = w->ob_ival;
Guido van Rossum00466951991-05-05 20:08:27 +0000559 if (iw < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 PyErr_SetString(PyExc_ValueError,
561 "integer to the negative power");
Guido van Rossum00466951991-05-05 20:08:27 +0000562 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564 if ((PyObject *)z != Py_None) {
565 PyErr_SetString(PyExc_TypeError,
566 "pow(int, int, int) not yet supported");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000567 return NULL;
568 }
Guido van Rossum00466951991-05-05 20:08:27 +0000569 ix = 1;
570 while (--iw >= 0) {
571 long prev = ix;
572 ix = ix * iv;
573 if (iv == 0)
574 break; /* 0 to some power -- avoid ix / 0 */
575 if (ix / iv != prev)
Guido van Rossum3a628451991-12-10 13:57:36 +0000576 return err_ovf("integer pow()");
Guido van Rossum00466951991-05-05 20:08:27 +0000577 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 return PyInt_FromLong(ix);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000579#endif
580}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000581
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000583int_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000585{
586 register long a, x;
587 a = v->ob_ival;
588 x = -a;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000589 if (a < 0 && x < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000590 return err_ovf("integer negation");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592}
593
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000595int_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000597{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 Py_INCREF(v);
599 return (PyObject *)v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000600}
601
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602static PyObject *
Guido van Rossum00466951991-05-05 20:08:27 +0000603int_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 PyIntObject *v;
Guido van Rossum00466951991-05-05 20:08:27 +0000605{
606 if (v->ob_ival >= 0)
607 return int_pos(v);
608 else
609 return int_neg(v);
610}
611
Guido van Rossum0bff0151991-05-14 12:05:32 +0000612static int
613int_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614 PyIntObject *v;
Guido van Rossum0bff0151991-05-14 12:05:32 +0000615{
616 return v->ob_ival != 0;
617}
618
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000620int_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 PyIntObject *v;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000622{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000624}
625
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000627int_lshift(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628 PyIntObject *v;
629 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000630{
631 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000632 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000633 b = w->ob_ival;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000634 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000636 return NULL;
637 }
638 if (a == 0 || b == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 Py_INCREF(v);
640 return (PyObject *) v;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000641 }
Guido van Rossum72481a31993-10-26 15:21:51 +0000642 if (b >= LONG_BIT) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 return PyInt_FromLong(0L);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000644 }
645 a = (unsigned long)a << b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000647}
648
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000650int_rshift(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651 PyIntObject *v;
652 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000653{
654 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000655 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000656 b = w->ob_ival;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000657 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000659 return NULL;
660 }
661 if (a == 0 || b == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 Py_INCREF(v);
663 return (PyObject *) v;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000664 }
Guido van Rossum72481a31993-10-26 15:21:51 +0000665 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000666 if (a < 0)
667 a = -1;
668 else
669 a = 0;
670 }
671 else {
672 if (a < 0)
673 a = ~( ~(unsigned long)a >> b );
674 else
675 a = (unsigned long)a >> b;
676 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000678}
679
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000681int_and(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 PyIntObject *v;
683 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000684{
685 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000686 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000687 b = w->ob_ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688 return PyInt_FromLong(a & b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000689}
690
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000692int_xor(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 PyIntObject *v;
694 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000695{
696 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000697 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000698 b = w->ob_ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000699 return PyInt_FromLong(a ^ b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000700}
701
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000702static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000703int_or(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000704 PyIntObject *v;
705 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000706{
707 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000708 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000709 b = w->ob_ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 return PyInt_FromLong(a | b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000711}
712
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000714int_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000716{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717 Py_INCREF(v);
718 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000719}
720
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000722int_long(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000724{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000726}
727
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000729int_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000730 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000731{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000733}
734
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000736int_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000738{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000739 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000740 long x = v -> ob_ival;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000741 if (x == 0)
742 strcpy(buf, "0");
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000743 else
Guido van Rossumebee0251997-01-12 19:48:03 +0000744 sprintf(buf, "0%lo", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000746}
747
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000748static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000749int_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000751{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000752 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000753 long x = v -> ob_ival;
Guido van Rossumebee0251997-01-12 19:48:03 +0000754 sprintf(buf, "0x%lx", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000756}
757
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000758static PyNumberMethods int_as_number = {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000759 (binaryfunc)int_add, /*nb_add*/
760 (binaryfunc)int_sub, /*nb_subtract*/
761 (binaryfunc)int_mul, /*nb_multiply*/
762 (binaryfunc)int_div, /*nb_divide*/
763 (binaryfunc)int_mod, /*nb_remainder*/
764 (binaryfunc)int_divmod, /*nb_divmod*/
765 (ternaryfunc)int_pow, /*nb_power*/
766 (unaryfunc)int_neg, /*nb_negative*/
767 (unaryfunc)int_pos, /*nb_positive*/
768 (unaryfunc)int_abs, /*nb_absolute*/
769 (inquiry)int_nonzero, /*nb_nonzero*/
770 (unaryfunc)int_invert, /*nb_invert*/
771 (binaryfunc)int_lshift, /*nb_lshift*/
772 (binaryfunc)int_rshift, /*nb_rshift*/
773 (binaryfunc)int_and, /*nb_and*/
774 (binaryfunc)int_xor, /*nb_xor*/
775 (binaryfunc)int_or, /*nb_or*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000776 0, /*nb_coerce*/
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000777 (unaryfunc)int_int, /*nb_int*/
778 (unaryfunc)int_long, /*nb_long*/
779 (unaryfunc)int_float, /*nb_float*/
780 (unaryfunc)int_oct, /*nb_oct*/
781 (unaryfunc)int_hex, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000782};
783
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784PyTypeObject PyInt_Type = {
785 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000786 0,
787 "int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000788 sizeof(PyIntObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000789 0,
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000790 (destructor)int_dealloc, /*tp_dealloc*/
791 (printfunc)int_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000792 0, /*tp_getattr*/
793 0, /*tp_setattr*/
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000794 (cmpfunc)int_compare, /*tp_compare*/
795 (reprfunc)int_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000796 &int_as_number, /*tp_as_number*/
797 0, /*tp_as_sequence*/
798 0, /*tp_as_mapping*/
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000799 (hashfunc)int_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000800};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000801
802void
803PyInt_Fini()
804{
Guido van Rossumda084ed1999-03-10 22:55:24 +0000805 PyIntObject *p, *list;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000806 int i;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000807 int bc, bf; /* block count, number of freed blocks */
808 int irem, isum; /* remaining unfreed ints per block, total */
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000809
Guido van Rossumda084ed1999-03-10 22:55:24 +0000810#if NSMALLNEGINTS + NSMALLPOSINTS > 0
811 PyIntObject **q;
812
813 i = NSMALLNEGINTS + NSMALLPOSINTS;
814 q = small_ints;
815 while (--i >= 0) {
816 Py_XDECREF(*q);
817 *q++ = NULL;
818 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000819#endif
Guido van Rossumda084ed1999-03-10 22:55:24 +0000820 bc = 0;
821 bf = 0;
822 isum = 0;
823 list = block_list;
824 block_list = NULL;
825 while (list != NULL) {
826 p = list;
827 p = (PyIntObject *)((char *)p + sizeof(PyIntObject *));
828 bc++;
829 irem = 0;
830 for (i = 0; i < N_INTOBJECTS; i++, p++) {
831 if (PyInt_Check(p) && p->ob_refcnt != 0)
832 irem++;
833 }
834 p = list;
835 list = *(PyIntObject **)p;
836 if (irem) {
837 *(PyIntObject **)p = block_list;
838 block_list = p;
839 }
840 else {
841 PyMem_FREE(p);
842 bf++;
843 }
844 isum += irem;
845 }
846 if (Py_VerboseFlag) {
847 fprintf(stderr, "# cleanup ints");
848 if (!isum) {
849 fprintf(stderr, "\n");
850 }
851 else {
852 fprintf(stderr,
853 ": %d unfreed int%s in %d out of %d block%s\n",
854 isum, isum == 1 ? "" : "s",
855 bc - bf, bc, bc == 1 ? "" : "s");
856 }
857 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000858}