blob: a5dc134562a5c90de91ffa00bd8df34000e0e63c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Integer object implementation */
12
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013#include "Python.h"
Barry Warsaw226ae6c1999-10-12 19:54:53 +000014#include <ctype.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000015
Guido van Rossumbf8c0e31994-08-29 12:48:32 +000016#ifdef HAVE_LIMITS_H
Guido van Rossum72481a31993-10-26 15:21:51 +000017#include <limits.h>
18#endif
19
20#ifndef LONG_MAX
21#define LONG_MAX 0X7FFFFFFFL
22#endif
23
24#ifndef LONG_MIN
25#define LONG_MIN (-LONG_MAX-1)
26#endif
27
28#ifndef CHAR_BIT
29#define CHAR_BIT 8
30#endif
31
Guido van Rossumb376a4a1993-11-23 17:53:17 +000032#ifndef LONG_BIT
Guido van Rossum72481a31993-10-26 15:21:51 +000033#define LONG_BIT (CHAR_BIT * sizeof(long))
Guido van Rossumb376a4a1993-11-23 17:53:17 +000034#endif
Guido van Rossum72481a31993-10-26 15:21:51 +000035
Guido van Rossum2e1d4331993-12-24 10:22:45 +000036long
Guido van Rossumc0b618a1997-05-02 03:12:38 +000037PyInt_GetMax()
Guido van Rossum2e1d4331993-12-24 10:22:45 +000038{
39 return LONG_MAX; /* To initialize sys.maxint */
40}
41
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042/* Standard Booleans */
Guido van Rossum3f5da241990-12-20 15:06:42 +000043
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044PyIntObject _Py_ZeroStruct = {
45 PyObject_HEAD_INIT(&PyInt_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046 0
47};
Guido van Rossum3f5da241990-12-20 15:06:42 +000048
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049PyIntObject _Py_TrueStruct = {
50 PyObject_HEAD_INIT(&PyInt_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051 1
52};
53
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054static PyObject *
Guido van Rossum3a628451991-12-10 13:57:36 +000055err_ovf(msg)
56 char *msg;
Guido van Rossum165e67e1990-10-14 20:02:26 +000057{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058 PyErr_SetString(PyExc_OverflowError, msg);
Guido van Rossum165e67e1990-10-14 20:02:26 +000059 return NULL;
60}
61
Guido van Rossum3f5da241990-12-20 15:06:42 +000062/* Integers are quite normal objects, to make object handling uniform.
63 (Using odd pointers to represent integers would save much space
64 but require extra checks for this special case throughout the code.)
65 Since, a typical Python program spends much of its time allocating
66 and deallocating integers, these operations should be very fast.
67 Therefore we use a dedicated allocation scheme with a much lower
68 overhead (in space and time) than straight malloc(): a simple
69 dedicated free list, filled when necessary with memory from malloc().
70*/
71
72#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000073#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
74#define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
Guido van Rossumda084ed1999-03-10 22:55:24 +000075
Guido van Rossum3fce8831999-03-12 19:43:17 +000076struct _intblock {
77 struct _intblock *next;
78 PyIntObject objects[N_INTOBJECTS];
79};
80
81typedef struct _intblock PyIntBlock;
82
83static PyIntBlock *block_list = NULL;
84static PyIntObject *free_list = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000085
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086static PyIntObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000087fill_free_list()
88{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 PyIntObject *p, *q;
Guido van Rossumb18618d2000-05-03 23:44:39 +000090 /* XXX Int blocks escape the object heap. Use PyObject_MALLOC ??? */
91 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
Guido van Rossum3f5da241990-12-20 15:06:42 +000092 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +000093 return (PyIntObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +000094 ((PyIntBlock *)p)->next = block_list;
95 block_list = (PyIntBlock *)p;
96 p = &((PyIntBlock *)p)->objects[0];
Guido van Rossum3f5da241990-12-20 15:06:42 +000097 q = p + N_INTOBJECTS;
98 while (--q > p)
Guido van Rossumda084ed1999-03-10 22:55:24 +000099 q->ob_type = (struct _typeobject *)(q-1);
100 q->ob_type = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000101 return p + N_INTOBJECTS - 1;
102}
103
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000104#ifndef NSMALLPOSINTS
105#define NSMALLPOSINTS 100
106#endif
107#ifndef NSMALLNEGINTS
108#define NSMALLNEGINTS 1
109#endif
110#if NSMALLNEGINTS + NSMALLPOSINTS > 0
111/* References to small integers are saved in this array so that they
112 can be shared.
113 The integers that are saved are those in the range
114 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
115*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000117#endif
118#ifdef COUNT_ALLOCS
119int quick_int_allocs, quick_neg_int_allocs;
120#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000121
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122PyObject *
123PyInt_FromLong(ival)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 long ival;
125{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 register PyIntObject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000127#if NSMALLNEGINTS + NSMALLPOSINTS > 0
128 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS &&
129 (v = small_ints[ival + NSMALLNEGINTS]) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000131#ifdef COUNT_ALLOCS
132 if (ival >= 0)
133 quick_int_allocs++;
134 else
135 quick_neg_int_allocs++;
136#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137 return (PyObject *) v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000138 }
139#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000140 if (free_list == NULL) {
141 if ((free_list = fill_free_list()) == NULL)
142 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000144 /* PyObject_New is inlined */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000145 v = free_list;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000146 free_list = (PyIntObject *)v->ob_type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000147 PyObject_INIT(v, &PyInt_Type);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000148 v->ob_ival = ival;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000149#if NSMALLNEGINTS + NSMALLPOSINTS > 0
150 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
151 /* save this one for a following allocation */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000153 small_ints[ival + NSMALLNEGINTS] = v;
154 }
155#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 return (PyObject *) v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000157}
158
159static void
160int_dealloc(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 PyIntObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000162{
Guido van Rossumda084ed1999-03-10 22:55:24 +0000163 v->ob_type = (struct _typeobject *)free_list;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000164 free_list = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165}
166
167long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168PyInt_AsLong(op)
169 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 PyNumberMethods *nb;
172 PyIntObject *io;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000173 long val;
174
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175 if (op && PyInt_Check(op))
176 return PyInt_AS_LONG((PyIntObject*) op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000177
178 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
179 nb->nb_int == NULL) {
Guido van Rossumc18a6f42000-05-09 14:27:48 +0000180 PyErr_SetString(PyExc_TypeError, "an integer is required");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181 return -1;
182 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000183
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184 io = (PyIntObject*) (*nb->nb_int) (op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000185 if (io == NULL)
186 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 if (!PyInt_Check(io)) {
188 PyErr_SetString(PyExc_TypeError,
189 "nb_int should return int object");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000190 return -1;
191 }
192
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 val = PyInt_AS_LONG(io);
194 Py_DECREF(io);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000195
196 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197}
198
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000199PyObject *
200PyInt_FromString(s, pend, base)
201 char *s;
202 char **pend;
203 int base;
204{
205 char *end;
206 long x;
207 char buffer[256]; /* For errors */
208
209 if ((base != 0 && base < 2) || base > 36) {
210 PyErr_SetString(PyExc_ValueError, "invalid base for int()");
211 return NULL;
212 }
213
214 while (*s && isspace(Py_CHARMASK(*s)))
215 s++;
216 errno = 0;
217 if (base == 0 && s[0] == '0')
218 x = (long) PyOS_strtoul(s, &end, base);
219 else
220 x = PyOS_strtol(s, &end, base);
221 if (end == s || !isalnum(end[-1]))
222 goto bad;
223 while (*end && isspace(Py_CHARMASK(*end)))
224 end++;
225 if (*end != '\0') {
226 bad:
227 sprintf(buffer, "invalid literal for int(): %.200s", s);
228 PyErr_SetString(PyExc_ValueError, buffer);
229 return NULL;
230 }
231 else if (errno != 0) {
232 sprintf(buffer, "int() literal too large: %.200s", s);
233 PyErr_SetString(PyExc_ValueError, buffer);
234 return NULL;
235 }
236 if (pend)
237 *pend = end;
238 return PyInt_FromLong(x);
239}
240
Guido van Rossum9e896b32000-04-05 20:11:21 +0000241PyObject *
242PyInt_FromUnicode(s, length, base)
243 Py_UNICODE *s;
244 int length;
245 int base;
246{
247 char buffer[256];
248
249 if (length >= sizeof(buffer)) {
250 PyErr_SetString(PyExc_ValueError,
251 "int() literal too large to convert");
252 return NULL;
253 }
254 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL))
255 return NULL;
256 return PyInt_FromString(buffer, NULL, base);
257}
258
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259/* Methods */
260
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000261/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000262static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000263int_print(v, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265 FILE *fp;
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000266 int flags; /* Not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267{
268 fprintf(fp, "%ld", v->ob_ival);
Guido van Rossum90933611991-06-07 16:10:43 +0000269 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270}
271
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000272static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000273int_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000274 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275{
276 char buf[20];
277 sprintf(buf, "%ld", v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000278 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279}
280
281static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000282int_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000283 PyIntObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284{
285 register long i = v->ob_ival;
286 register long j = w->ob_ival;
287 return (i < j) ? -1 : (i > j) ? 1 : 0;
288}
289
Guido van Rossum9bfef441993-03-29 10:43:31 +0000290static long
291int_hash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292 PyIntObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000293{
Guido van Rossum541cdd81997-01-06 22:53:20 +0000294 /* XXX If this is changed, you also need to change the way
295 Python's long, float and complex types are hashed. */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000296 long x = v -> ob_ival;
297 if (x == -1)
298 x = -2;
299 return x;
300}
301
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000303int_add(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304 PyIntObject *v;
305 PyIntObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000306{
307 register long a, b, x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000309 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 x = a + b;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000311 if ((x^a) < 0 && (x^b) < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000312 return err_ovf("integer addition");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000313 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314}
315
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317int_sub(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000318 PyIntObject *v;
319 PyIntObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320{
321 register long a, b, x;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000323 b = w->ob_ival;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324 x = a - b;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000325 if ((x^a) < 0 && (x^~b) < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000326 return err_ovf("integer subtraction");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328}
329
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000330/*
331Integer overflow checking used to be done using a double, but on 64
332bit machines (where both long and double are 64 bit) this fails
333because the double doesn't have enouvg precision. John Tromp suggests
334the following algorithm:
335
336Suppose again we normalize a and b to be nonnegative.
337Let ah and al (bh and bl) be the high and low 32 bits of a (b, resp.).
338Now we test ah and bh against zero and get essentially 3 possible outcomes.
339
3401) both ah and bh > 0 : then report overflow
341
3422) both ah and bh = 0 : then compute a*b and report overflow if it comes out
343 negative
344
3453) ah > 0 and bh = 0 : compute ah*bl and report overflow if it's >= 2^31
346 compute al*bl and report overflow if it's negative
347 add (ah*bl)<<32 to al*bl and report overflow if
348 it's negative
349
350In case of no overflow the result is then negated if necessary.
351
352The majority of cases will be 2), in which case this method is the same as
353what I suggested before. If multiplication is expensive enough, then the
354other method is faster on case 3), but also more work to program, so I
355guess the above is the preferred solution.
356
357*/
358
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000360int_mul(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 PyIntObject *v;
362 PyIntObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000363{
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000364 long a, b, ah, bh, x, y;
365 int s = 1;
366
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000367 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000368 b = w->ob_ival;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000369 ah = a >> (LONG_BIT/2);
370 bh = b >> (LONG_BIT/2);
371
372 /* Quick test for common case: two small positive ints */
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);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000379 }
380
381 /* Arrange that a >= b >= 0 */
382
383 if (a < 0) {
384 a = -a;
385 if (a < 0) {
386 /* Largest negative */
387 if (b == 0 || b == 1) {
388 x = a*b;
389 goto ok;
390 }
391 else
392 goto bad;
393 }
394 s = -s;
395 ah = a >> (LONG_BIT/2);
396 }
397 if (b < 0) {
398 b = -b;
399 if (b < 0) {
400 /* Largest negative */
Guido van Rossum9478dd41996-12-06 20:14:43 +0000401 if (a == 0 || (a == 1 && s == 1)) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000402 x = a*b;
403 goto ok;
404 }
405 else
406 goto bad;
407 }
408 s = -s;
409 bh = b >> (LONG_BIT/2);
410 }
411
412 /* 1) both ah and bh > 0 : then report overflow */
413
414 if (ah != 0 && bh != 0)
415 goto bad;
416
417 /* 2) both ah and bh = 0 : then compute a*b and report
418 overflow if it comes out negative */
419
420 if (ah == 0 && bh == 0) {
421 x = a*b;
422 if (x < 0)
423 goto bad;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 return PyInt_FromLong(x*s);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000425 }
426
427 if (a < b) {
428 /* Swap */
429 x = a;
430 a = b;
431 b = x;
432 ah = bh;
433 /* bh not used beyond this point */
434 }
435
436 /* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if
437 it's >= 2^31
438 compute al*bl and report overflow if it's negative
439 add (ah*bl)<<32 to al*bl and report overflow if
440 it's negative
441 (NB b == bl in this case, and we make a = al) */
442
443 y = ah*b;
Guido van Rossum541cdd81997-01-06 22:53:20 +0000444 if (y >= (1L << (LONG_BIT/2 - 1)))
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000445 goto bad;
446 a &= (1L << (LONG_BIT/2)) - 1;
447 x = a*b;
448 if (x < 0)
449 goto bad;
Guido van Rossum541cdd81997-01-06 22:53:20 +0000450 x += y << (LONG_BIT/2);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000451 if (x < 0)
452 goto bad;
453 ok:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454 return PyInt_FromLong(x * s);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000455
456 bad:
457 return err_ovf("integer multiplication");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458}
459
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000460static int
461i_divmod(x, y, p_xdivy, p_xmody)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 register PyIntObject *x, *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000463 long *p_xdivy, *p_xmody;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000465 long xi = x->ob_ival;
466 long yi = y->ob_ival;
467 long xdivy, xmody;
468
469 if (yi == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 PyErr_SetString(PyExc_ZeroDivisionError,
471 "integer division or modulo");
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000472 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000473 }
Guido van Rossum00466951991-05-05 20:08:27 +0000474 if (yi < 0) {
Guido van Rossume13ff2e1999-09-27 17:12:47 +0000475 if (xi < 0) {
476 if (yi == -1 && -xi < 0) {
477 /* most negative / -1 */
478 err_ovf("integer division");
479 return -1;
480 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000481 xdivy = -xi / -yi;
Guido van Rossume13ff2e1999-09-27 17:12:47 +0000482 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000483 else
484 xdivy = - (xi / -yi);
Guido van Rossum00466951991-05-05 20:08:27 +0000485 }
486 else {
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000487 if (xi < 0)
488 xdivy = - (-xi / yi);
489 else
490 xdivy = xi / yi;
Guido van Rossum00466951991-05-05 20:08:27 +0000491 }
492 xmody = xi - xdivy*yi;
Guido van Rossum9478dd41996-12-06 20:14:43 +0000493 if ((xmody < 0 && yi > 0) || (xmody > 0 && yi < 0)) {
Guido van Rossum00466951991-05-05 20:08:27 +0000494 xmody += yi;
495 xdivy -= 1;
496 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000497 *p_xdivy = xdivy;
498 *p_xmody = xmody;
499 return 0;
500}
501
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502static PyObject *
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000503int_div(x, y)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504 PyIntObject *x;
505 PyIntObject *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000506{
507 long d, m;
508 if (i_divmod(x, y, &d, &m) < 0)
509 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 return PyInt_FromLong(d);
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000511}
512
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513static PyObject *
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000514int_mod(x, y)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 PyIntObject *x;
516 PyIntObject *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000517{
518 long d, m;
519 if (i_divmod(x, y, &d, &m) < 0)
520 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 return PyInt_FromLong(m);
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000522}
523
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524static PyObject *
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000525int_divmod(x, y)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526 PyIntObject *x;
527 PyIntObject *y;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000528{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000529 long d, m;
530 if (i_divmod(x, y, &d, &m) < 0)
531 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 return Py_BuildValue("(ll)", d, m);
Guido van Rossum00466951991-05-05 20:08:27 +0000533}
534
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535static PyObject *
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000536int_pow(v, w, z)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 PyIntObject *v;
538 PyIntObject *w;
539 PyIntObject *z;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000540{
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000541#if 1
Guido van Rossum9478dd41996-12-06 20:14:43 +0000542 register long iv, iw, iz=0, ix, temp, prev;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000543 iv = v->ob_ival;
544 iw = w->ob_ival;
545 if (iw < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 PyErr_SetString(PyExc_ValueError,
547 "integer to the negative power");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000548 return NULL;
549 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 if ((PyObject *)z != Py_None) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000551 iz = z->ob_ival;
Guido van Rossum9478dd41996-12-06 20:14:43 +0000552 if (iz == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 PyErr_SetString(PyExc_ValueError,
554 "pow(x, y, z) with z==0");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000555 return NULL;
556 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000557 }
558 /*
559 * XXX: The original exponentiation code stopped looping
560 * when temp hit zero; this code will continue onwards
561 * unnecessarily, but at least it won't cause any errors.
562 * Hopefully the speed improvement from the fast exponentiation
563 * will compensate for the slight inefficiency.
564 * XXX: Better handling of overflows is desperately needed.
565 */
566 temp = iv;
567 ix = 1;
568 while (iw > 0) {
569 prev = ix; /* Save value for overflow check */
570 if (iw & 1) {
571 ix = ix*temp;
572 if (temp == 0)
573 break; /* Avoid ix / 0 */
574 if (ix / temp != prev)
Guido van Rossumfb4574e2000-02-15 14:51:46 +0000575 return err_ovf("integer exponentiation");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000576 }
577 iw >>= 1; /* Shift exponent down by 1 bit */
578 if (iw==0) break;
579 prev = temp;
580 temp *= temp; /* Square the value of temp */
581 if (prev!=0 && temp/prev!=prev)
Guido van Rossumfb4574e2000-02-15 14:51:46 +0000582 return err_ovf("integer exponentiation");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000583 if (iz) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000584 /* If we did a multiplication, perform a modulo */
585 ix = ix % iz;
586 temp = temp % iz;
587 }
588 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000589 if (iz) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 PyObject *t1, *t2;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000591 long int div, mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 t1=PyInt_FromLong(ix);
593 t2=PyInt_FromLong(iz);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000594 if (t1==NULL || t2==NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 i_divmod((PyIntObject *)t1,
596 (PyIntObject *)t2, &div, &mod)<0)
597 {
598 Py_XDECREF(t1);
599 Py_XDECREF(t2);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000600 return(NULL);
601 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 Py_DECREF(t1);
603 Py_DECREF(t2);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000604 ix=mod;
605 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 return PyInt_FromLong(ix);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000607#else
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000608 register long iv, iw, ix;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000609 iv = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000610 iw = w->ob_ival;
Guido van Rossum00466951991-05-05 20:08:27 +0000611 if (iw < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 PyErr_SetString(PyExc_ValueError,
613 "integer to the negative power");
Guido van Rossum00466951991-05-05 20:08:27 +0000614 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000615 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 if ((PyObject *)z != Py_None) {
617 PyErr_SetString(PyExc_TypeError,
618 "pow(int, int, int) not yet supported");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000619 return NULL;
620 }
Guido van Rossum00466951991-05-05 20:08:27 +0000621 ix = 1;
622 while (--iw >= 0) {
623 long prev = ix;
624 ix = ix * iv;
625 if (iv == 0)
626 break; /* 0 to some power -- avoid ix / 0 */
627 if (ix / iv != prev)
Guido van Rossumfb4574e2000-02-15 14:51:46 +0000628 return err_ovf("integer exponentiation");
Guido van Rossum00466951991-05-05 20:08:27 +0000629 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 return PyInt_FromLong(ix);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000631#endif
632}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000633
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000634static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000635int_neg(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000637{
638 register long a, x;
639 a = v->ob_ival;
640 x = -a;
Guido van Rossum165e67e1990-10-14 20:02:26 +0000641 if (a < 0 && x < 0)
Guido van Rossum3a628451991-12-10 13:57:36 +0000642 return err_ovf("integer negation");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000644}
645
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000647int_pos(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 PyIntObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000649{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650 Py_INCREF(v);
651 return (PyObject *)v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000652}
653
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654static PyObject *
Guido van Rossum00466951991-05-05 20:08:27 +0000655int_abs(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 PyIntObject *v;
Guido van Rossum00466951991-05-05 20:08:27 +0000657{
658 if (v->ob_ival >= 0)
659 return int_pos(v);
660 else
661 return int_neg(v);
662}
663
Guido van Rossum0bff0151991-05-14 12:05:32 +0000664static int
665int_nonzero(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 PyIntObject *v;
Guido van Rossum0bff0151991-05-14 12:05:32 +0000667{
668 return v->ob_ival != 0;
669}
670
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000672int_invert(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673 PyIntObject *v;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000674{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000676}
677
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000679int_lshift(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 PyIntObject *v;
681 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000682{
683 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000684 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000685 b = w->ob_ival;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000686 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000688 return NULL;
689 }
690 if (a == 0 || b == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691 Py_INCREF(v);
692 return (PyObject *) v;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000693 }
Guido van Rossum72481a31993-10-26 15:21:51 +0000694 if (b >= LONG_BIT) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 return PyInt_FromLong(0L);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000696 }
697 a = (unsigned long)a << b;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000698 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000699}
700
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000702int_rshift(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 PyIntObject *v;
704 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000705{
706 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000707 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000708 b = w->ob_ival;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000709 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000711 return NULL;
712 }
713 if (a == 0 || b == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 Py_INCREF(v);
715 return (PyObject *) v;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000716 }
Guido van Rossum72481a31993-10-26 15:21:51 +0000717 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000718 if (a < 0)
719 a = -1;
720 else
721 a = 0;
722 }
723 else {
Tim Peters7d3a5112000-07-08 04:17:21 +0000724 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000725 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000726 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000727}
728
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000729static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000730int_and(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 PyIntObject *v;
732 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000733{
734 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000735 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000736 b = w->ob_ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 return PyInt_FromLong(a & b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000738}
739
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000741int_xor(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742 PyIntObject *v;
743 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000744{
745 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000746 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000747 b = w->ob_ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000748 return PyInt_FromLong(a ^ b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000749}
750
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000751static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +0000752int_or(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753 PyIntObject *v;
754 PyIntObject *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000755{
756 register long a, b;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000757 a = v->ob_ival;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000758 b = w->ob_ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 return PyInt_FromLong(a | b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000760}
761
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000763int_int(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000765{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 Py_INCREF(v);
767 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000768}
769
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000771int_long(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 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000775}
776
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000778int_float(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000780{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000781 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000782}
783
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000785int_oct(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000787{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000788 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000789 long x = v -> ob_ival;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000790 if (x == 0)
791 strcpy(buf, "0");
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000792 else
Guido van Rossumebee0251997-01-12 19:48:03 +0000793 sprintf(buf, "0%lo", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000795}
796
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797static PyObject *
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000798int_hex(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799 PyIntObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000800{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000801 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000802 long x = v -> ob_ival;
Guido van Rossumebee0251997-01-12 19:48:03 +0000803 sprintf(buf, "0x%lx", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000805}
806
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807static PyNumberMethods int_as_number = {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000808 (binaryfunc)int_add, /*nb_add*/
809 (binaryfunc)int_sub, /*nb_subtract*/
810 (binaryfunc)int_mul, /*nb_multiply*/
811 (binaryfunc)int_div, /*nb_divide*/
812 (binaryfunc)int_mod, /*nb_remainder*/
813 (binaryfunc)int_divmod, /*nb_divmod*/
814 (ternaryfunc)int_pow, /*nb_power*/
815 (unaryfunc)int_neg, /*nb_negative*/
816 (unaryfunc)int_pos, /*nb_positive*/
817 (unaryfunc)int_abs, /*nb_absolute*/
818 (inquiry)int_nonzero, /*nb_nonzero*/
819 (unaryfunc)int_invert, /*nb_invert*/
820 (binaryfunc)int_lshift, /*nb_lshift*/
821 (binaryfunc)int_rshift, /*nb_rshift*/
822 (binaryfunc)int_and, /*nb_and*/
823 (binaryfunc)int_xor, /*nb_xor*/
824 (binaryfunc)int_or, /*nb_or*/
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000825 0, /*nb_coerce*/
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000826 (unaryfunc)int_int, /*nb_int*/
827 (unaryfunc)int_long, /*nb_long*/
828 (unaryfunc)int_float, /*nb_float*/
829 (unaryfunc)int_oct, /*nb_oct*/
830 (unaryfunc)int_hex, /*nb_hex*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000831};
832
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833PyTypeObject PyInt_Type = {
834 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000835 0,
836 "int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000837 sizeof(PyIntObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000838 0,
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000839 (destructor)int_dealloc, /*tp_dealloc*/
840 (printfunc)int_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000841 0, /*tp_getattr*/
842 0, /*tp_setattr*/
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000843 (cmpfunc)int_compare, /*tp_compare*/
844 (reprfunc)int_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000845 &int_as_number, /*tp_as_number*/
846 0, /*tp_as_sequence*/
847 0, /*tp_as_mapping*/
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000848 (hashfunc)int_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000849};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000850
851void
852PyInt_Fini()
853{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000854 PyIntObject *p;
855 PyIntBlock *list, *next;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000856 int i;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000857 int bc, bf; /* block count, number of freed blocks */
858 int irem, isum; /* remaining unfreed ints per block, total */
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000859
Guido van Rossumda084ed1999-03-10 22:55:24 +0000860#if NSMALLNEGINTS + NSMALLPOSINTS > 0
861 PyIntObject **q;
862
863 i = NSMALLNEGINTS + NSMALLPOSINTS;
864 q = small_ints;
865 while (--i >= 0) {
866 Py_XDECREF(*q);
867 *q++ = NULL;
868 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000869#endif
Guido van Rossumda084ed1999-03-10 22:55:24 +0000870 bc = 0;
871 bf = 0;
872 isum = 0;
873 list = block_list;
874 block_list = NULL;
Guido van Rossum51288bc1999-03-19 20:30:39 +0000875 free_list = NULL;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000876 while (list != NULL) {
Guido van Rossumda084ed1999-03-10 22:55:24 +0000877 bc++;
878 irem = 0;
Guido van Rossum51288bc1999-03-19 20:30:39 +0000879 for (i = 0, p = &list->objects[0];
880 i < N_INTOBJECTS;
881 i++, p++) {
Guido van Rossumda084ed1999-03-10 22:55:24 +0000882 if (PyInt_Check(p) && p->ob_refcnt != 0)
883 irem++;
884 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000885 next = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000886 if (irem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000887 list->next = block_list;
888 block_list = list;
Guido van Rossum51288bc1999-03-19 20:30:39 +0000889 for (i = 0, p = &list->objects[0];
890 i < N_INTOBJECTS;
891 i++, p++) {
892 if (!PyInt_Check(p) || p->ob_refcnt == 0) {
893 p->ob_type = (struct _typeobject *)
894 free_list;
895 free_list = p;
896 }
897#if NSMALLNEGINTS + NSMALLPOSINTS > 0
898 else if (-NSMALLNEGINTS <= p->ob_ival &&
899 p->ob_ival < NSMALLPOSINTS &&
900 small_ints[p->ob_ival +
901 NSMALLNEGINTS] == NULL) {
902 Py_INCREF(p);
903 small_ints[p->ob_ival +
904 NSMALLNEGINTS] = p;
905 }
906#endif
907 }
Guido van Rossumda084ed1999-03-10 22:55:24 +0000908 }
909 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000910 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumda084ed1999-03-10 22:55:24 +0000911 bf++;
912 }
913 isum += irem;
Guido van Rossum3fce8831999-03-12 19:43:17 +0000914 list = next;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000915 }
Guido van Rossum3fce8831999-03-12 19:43:17 +0000916 if (!Py_VerboseFlag)
917 return;
918 fprintf(stderr, "# cleanup ints");
919 if (!isum) {
920 fprintf(stderr, "\n");
921 }
922 else {
923 fprintf(stderr,
924 ": %d unfreed int%s in %d out of %d block%s\n",
925 isum, isum == 1 ? "" : "s",
926 bc - bf, bc, bc == 1 ? "" : "s");
927 }
928 if (Py_VerboseFlag > 1) {
929 list = block_list;
930 while (list != NULL) {
Guido van Rossum51288bc1999-03-19 20:30:39 +0000931 for (i = 0, p = &list->objects[0];
932 i < N_INTOBJECTS;
933 i++, p++) {
Guido van Rossum3fce8831999-03-12 19:43:17 +0000934 if (PyInt_Check(p) && p->ob_refcnt != 0)
935 fprintf(stderr,
Fred Drakea44d3532000-06-30 15:01:00 +0000936 "# <int at %p, refcnt=%d, val=%ld>\n",
937 p, p->ob_refcnt, p->ob_ival);
Guido van Rossum3fce8831999-03-12 19:43:17 +0000938 }
939 list = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000940 }
941 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000942}