blob: 2f5c124609de5e5d50df5779ced7775df6726e03 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Integer object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Barry Warsaw226ae6c1999-10-12 19:54:53 +00005#include <ctype.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006
Guido van Rossum2e1d4331993-12-24 10:22:45 +00007long
Fred Drakea2f55112000-07-09 15:16:51 +00008PyInt_GetMax(void)
Guido van Rossum2e1d4331993-12-24 10:22:45 +00009{
10 return LONG_MAX; /* To initialize sys.maxint */
11}
12
Guido van Rossum3f5da241990-12-20 15:06:42 +000013/* Integers are quite normal objects, to make object handling uniform.
14 (Using odd pointers to represent integers would save much space
15 but require extra checks for this special case throughout the code.)
Tim Peters29c0afc2002-04-28 16:57:34 +000016 Since a typical Python program spends much of its time allocating
Guido van Rossum3f5da241990-12-20 15:06:42 +000017 and deallocating integers, these operations should be very fast.
18 Therefore we use a dedicated allocation scheme with a much lower
19 overhead (in space and time) than straight malloc(): a simple
20 dedicated free list, filled when necessary with memory from malloc().
Tim Peters29c0afc2002-04-28 16:57:34 +000021
22 block_list is a singly-linked list of all PyIntBlocks ever allocated,
23 linked via their next members. PyIntBlocks are never returned to the
24 system before shutdown (PyInt_Fini).
25
26 free_list is a singly-linked list of available PyIntObjects, linked
27 via abuse of their ob_type members.
Guido van Rossum3f5da241990-12-20 15:06:42 +000028*/
29
30#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000031#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
32#define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
Guido van Rossumda084ed1999-03-10 22:55:24 +000033
Guido van Rossum3fce8831999-03-12 19:43:17 +000034struct _intblock {
35 struct _intblock *next;
36 PyIntObject objects[N_INTOBJECTS];
37};
38
39typedef struct _intblock PyIntBlock;
40
41static PyIntBlock *block_list = NULL;
42static PyIntObject *free_list = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000043
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044static PyIntObject *
Fred Drakea2f55112000-07-09 15:16:51 +000045fill_free_list(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +000046{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000047 PyIntObject *p, *q;
Tim Peters29c0afc2002-04-28 16:57:34 +000048 /* Python's object allocator isn't appropriate for large blocks. */
Guido van Rossumb18618d2000-05-03 23:44:39 +000049 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
Guido van Rossum3f5da241990-12-20 15:06:42 +000050 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +000051 return (PyIntObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +000052 ((PyIntBlock *)p)->next = block_list;
53 block_list = (PyIntBlock *)p;
Tim Peters29c0afc2002-04-28 16:57:34 +000054 /* Link the int objects together, from rear to front, then return
55 the address of the last int object in the block. */
Guido van Rossum3fce8831999-03-12 19:43:17 +000056 p = &((PyIntBlock *)p)->objects[0];
Guido van Rossum3f5da241990-12-20 15:06:42 +000057 q = p + N_INTOBJECTS;
58 while (--q > p)
Guido van Rossumda084ed1999-03-10 22:55:24 +000059 q->ob_type = (struct _typeobject *)(q-1);
60 q->ob_type = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000061 return p + N_INTOBJECTS - 1;
62}
63
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000064#ifndef NSMALLPOSINTS
Georg Brandl418a1ef2006-02-22 11:30:06 +000065#define NSMALLPOSINTS 257
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000066#endif
67#ifndef NSMALLNEGINTS
Neal Norwitzc91ed402002-12-30 22:29:22 +000068#define NSMALLNEGINTS 5
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000069#endif
70#if NSMALLNEGINTS + NSMALLPOSINTS > 0
71/* References to small integers are saved in this array so that they
72 can be shared.
73 The integers that are saved are those in the range
74 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
75*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000077#endif
78#ifdef COUNT_ALLOCS
79int quick_int_allocs, quick_neg_int_allocs;
80#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +000081
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000083PyInt_FromLong(long ival)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 register PyIntObject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000086#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Neal Norwitzc91ed402002-12-30 22:29:22 +000087 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
88 v = small_ints[ival + NSMALLNEGINTS];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000090#ifdef COUNT_ALLOCS
91 if (ival >= 0)
92 quick_int_allocs++;
93 else
94 quick_neg_int_allocs++;
95#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 return (PyObject *) v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000097 }
98#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +000099 if (free_list == NULL) {
100 if ((free_list = fill_free_list()) == NULL)
101 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102 }
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000103 /* Inline PyObject_New */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000104 v = free_list;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000105 free_list = (PyIntObject *)v->ob_type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000106 PyObject_INIT(v, &PyInt_Type);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000107 v->ob_ival = ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 return (PyObject *) v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000109}
110
Martin v. Löwis18e16552006-02-15 17:27:45 +0000111PyObject *
112PyInt_FromSize_t(size_t ival)
113{
114 if (ival <= LONG_MAX)
115 return PyInt_FromLong((long)ival);
116 return _PyLong_FromSize_t(ival);
117}
118
119PyObject *
120PyInt_FromSsize_t(Py_ssize_t ival)
121{
122 if (ival >= LONG_MIN && ival <= LONG_MAX)
123 return PyInt_FromLong((long)ival);
124 return _PyLong_FromSsize_t(ival);
125}
126
Guido van Rossum3f5da241990-12-20 15:06:42 +0000127static void
Fred Drakea2f55112000-07-09 15:16:51 +0000128int_dealloc(PyIntObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000129{
Guido van Rossumdea6ef92001-09-11 16:13:52 +0000130 if (PyInt_CheckExact(v)) {
Guido van Rossumbef14172001-08-29 15:47:46 +0000131 v->ob_type = (struct _typeobject *)free_list;
132 free_list = v;
133 }
134 else
135 v->ob_type->tp_free((PyObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136}
137
Guido van Rossum93646982002-04-26 00:53:34 +0000138static void
139int_free(PyIntObject *v)
140{
141 v->ob_type = (struct _typeobject *)free_list;
142 free_list = v;
143}
144
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145long
Fred Drakea2f55112000-07-09 15:16:51 +0000146PyInt_AsLong(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148 PyNumberMethods *nb;
149 PyIntObject *io;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000150 long val;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000151
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 if (op && PyInt_Check(op))
153 return PyInt_AS_LONG((PyIntObject*) op);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000154
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000155 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
156 nb->nb_int == NULL) {
Guido van Rossumc18a6f42000-05-09 14:27:48 +0000157 PyErr_SetString(PyExc_TypeError, "an integer is required");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158 return -1;
159 }
Tim Petersa3c01ce2001-12-04 23:05:10 +0000160
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 io = (PyIntObject*) (*nb->nb_int) (op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000162 if (io == NULL)
163 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 if (!PyInt_Check(io)) {
Walter Dörwaldf1715402002-11-19 20:49:15 +0000165 if (PyLong_Check(io)) {
166 /* got a long? => retry int conversion */
167 val = PyLong_AsLong((PyObject *)io);
Thomas Heller850566b2003-02-20 20:32:11 +0000168 Py_DECREF(io);
169 if ((val == -1) && PyErr_Occurred())
Walter Dörwaldf1715402002-11-19 20:49:15 +0000170 return -1;
Thomas Heller850566b2003-02-20 20:32:11 +0000171 return val;
Walter Dörwaldf1715402002-11-19 20:49:15 +0000172 }
173 else
174 {
Thomas Hellera4ea6032003-04-17 18:55:45 +0000175 Py_DECREF(io);
Walter Dörwaldf1715402002-11-19 20:49:15 +0000176 PyErr_SetString(PyExc_TypeError,
177 "nb_int should return int object");
178 return -1;
179 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000180 }
Tim Petersa3c01ce2001-12-04 23:05:10 +0000181
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 val = PyInt_AS_LONG(io);
183 Py_DECREF(io);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000184
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000185 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186}
187
Martin v. Löwis18e16552006-02-15 17:27:45 +0000188Py_ssize_t
189PyInt_AsSsize_t(register PyObject *op)
190{
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000191#if SIZEOF_SIZE_T != SIZEOF_LONG
Martin v. Löwis18e16552006-02-15 17:27:45 +0000192 PyNumberMethods *nb;
193 PyIntObject *io;
194 Py_ssize_t val;
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000195#endif
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000196
197 if (op == NULL) {
198 PyErr_SetString(PyExc_TypeError, "an integer is required");
199 return -1;
200 }
201
202 if (PyInt_Check(op))
203 return PyInt_AS_LONG((PyIntObject*) op);
204 if (PyLong_Check(op))
Martin v. Löwis18e16552006-02-15 17:27:45 +0000205 return _PyLong_AsSsize_t(op);
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000206#if SIZEOF_SIZE_T == SIZEOF_LONG
Martin v. Löwis18e16552006-02-15 17:27:45 +0000207 return PyInt_AsLong(op);
208#else
209
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000210 if ((nb = op->ob_type->tp_as_number) == NULL ||
Martin v. Löwis18e16552006-02-15 17:27:45 +0000211 (nb->nb_int == NULL && nb->nb_long == 0)) {
212 PyErr_SetString(PyExc_TypeError, "an integer is required");
213 return -1;
214 }
215
216 if (nb->nb_long != 0) {
217 io = (PyIntObject*) (*nb->nb_long) (op);
218 } else {
219 io = (PyIntObject*) (*nb->nb_int) (op);
220 }
221 if (io == NULL)
222 return -1;
223 if (!PyInt_Check(io)) {
224 if (PyLong_Check(io)) {
225 /* got a long? => retry int conversion */
226 val = _PyLong_AsSsize_t((PyObject *)io);
227 Py_DECREF(io);
228 if ((val == -1) && PyErr_Occurred())
229 return -1;
230 return val;
231 }
232 else
233 {
234 Py_DECREF(io);
235 PyErr_SetString(PyExc_TypeError,
236 "nb_int should return int object");
237 return -1;
238 }
239 }
240
241 val = PyInt_AS_LONG(io);
242 Py_DECREF(io);
243
244 return val;
245#endif
246}
247
Thomas Hellera4ea6032003-04-17 18:55:45 +0000248unsigned long
249PyInt_AsUnsignedLongMask(register PyObject *op)
250{
251 PyNumberMethods *nb;
252 PyIntObject *io;
253 unsigned long val;
254
255 if (op && PyInt_Check(op))
256 return PyInt_AS_LONG((PyIntObject*) op);
257 if (op && PyLong_Check(op))
258 return PyLong_AsUnsignedLongMask(op);
259
260 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
261 nb->nb_int == NULL) {
262 PyErr_SetString(PyExc_TypeError, "an integer is required");
Skip Montanaro429433b2006-04-18 00:35:43 +0000263 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000264 }
265
266 io = (PyIntObject*) (*nb->nb_int) (op);
267 if (io == NULL)
Skip Montanaro429433b2006-04-18 00:35:43 +0000268 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000269 if (!PyInt_Check(io)) {
270 if (PyLong_Check(io)) {
271 val = PyLong_AsUnsignedLongMask((PyObject *)io);
272 Py_DECREF(io);
273 if (PyErr_Occurred())
Skip Montanaro429433b2006-04-18 00:35:43 +0000274 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000275 return val;
276 }
277 else
278 {
279 Py_DECREF(io);
280 PyErr_SetString(PyExc_TypeError,
281 "nb_int should return int object");
Skip Montanaro429433b2006-04-18 00:35:43 +0000282 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000283 }
284 }
285
286 val = PyInt_AS_LONG(io);
287 Py_DECREF(io);
288
289 return val;
290}
291
292#ifdef HAVE_LONG_LONG
293unsigned PY_LONG_LONG
294PyInt_AsUnsignedLongLongMask(register PyObject *op)
295{
296 PyNumberMethods *nb;
297 PyIntObject *io;
298 unsigned PY_LONG_LONG val;
299
300 if (op && PyInt_Check(op))
301 return PyInt_AS_LONG((PyIntObject*) op);
302 if (op && PyLong_Check(op))
303 return PyLong_AsUnsignedLongLongMask(op);
304
305 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
306 nb->nb_int == NULL) {
307 PyErr_SetString(PyExc_TypeError, "an integer is required");
Skip Montanaro429433b2006-04-18 00:35:43 +0000308 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000309 }
310
311 io = (PyIntObject*) (*nb->nb_int) (op);
312 if (io == NULL)
Skip Montanaro429433b2006-04-18 00:35:43 +0000313 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000314 if (!PyInt_Check(io)) {
315 if (PyLong_Check(io)) {
316 val = PyLong_AsUnsignedLongLongMask((PyObject *)io);
317 Py_DECREF(io);
318 if (PyErr_Occurred())
Skip Montanaro429433b2006-04-18 00:35:43 +0000319 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000320 return val;
321 }
322 else
323 {
324 Py_DECREF(io);
325 PyErr_SetString(PyExc_TypeError,
326 "nb_int should return int object");
Skip Montanaro429433b2006-04-18 00:35:43 +0000327 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000328 }
329 }
330
331 val = PyInt_AS_LONG(io);
332 Py_DECREF(io);
333
334 return val;
335}
336#endif
337
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000338PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000339PyInt_FromString(char *s, char **pend, int base)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000340{
341 char *end;
342 long x;
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000343 Py_ssize_t slen;
344 PyObject *sobj, *srepr;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000345
346 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossum47710652003-02-12 20:48:22 +0000347 PyErr_SetString(PyExc_ValueError,
348 "int() base must be >= 2 and <= 36");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000349 return NULL;
350 }
351
352 while (*s && isspace(Py_CHARMASK(*s)))
353 s++;
354 errno = 0;
Guido van Rossum47710652003-02-12 20:48:22 +0000355 if (base == 0 && s[0] == '0') {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000356 x = (long) PyOS_strtoul(s, &end, base);
Guido van Rossum47710652003-02-12 20:48:22 +0000357 if (x < 0)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000358 return PyLong_FromString(s, pend, base);
Guido van Rossum47710652003-02-12 20:48:22 +0000359 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000360 else
361 x = PyOS_strtol(s, &end, base);
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000362 if (end == s || !isalnum(Py_CHARMASK(end[-1])))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000363 goto bad;
364 while (*end && isspace(Py_CHARMASK(*end)))
365 end++;
366 if (*end != '\0') {
367 bad:
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000368 slen = strlen(s) < 200 ? strlen(s) : 200;
369 sobj = PyString_FromStringAndSize(s, slen);
370 if (sobj == NULL)
371 return NULL;
372 srepr = PyObject_Repr(sobj);
373 Py_DECREF(sobj);
374 if (srepr == NULL)
375 return NULL;
376 PyErr_Format(PyExc_ValueError,
377 "invalid literal for int() with base %d: %s",
378 base, PyString_AS_STRING(srepr));
379 Py_DECREF(srepr);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000380 return NULL;
381 }
Tim Petersc8854432004-08-25 02:14:08 +0000382 else if (errno != 0)
Walter Dörwald07e14762002-11-06 16:15:14 +0000383 return PyLong_FromString(s, pend, base);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000384 if (pend)
385 *pend = end;
386 return PyInt_FromLong(x);
387}
388
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000389#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000390PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000391PyInt_FromUnicode(Py_UNICODE *s, Py_ssize_t length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000392{
Walter Dörwald07e14762002-11-06 16:15:14 +0000393 PyObject *result;
Anthony Baxter377be112006-04-11 06:54:30 +0000394 char *buffer = (char *)PyMem_MALLOC(length+1);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000395
Walter Dörwald07e14762002-11-06 16:15:14 +0000396 if (buffer == NULL)
Neal Norwitz5ece2fb2007-05-16 04:35:11 +0000397 return PyErr_NoMemory();
Walter Dörwald07e14762002-11-06 16:15:14 +0000398
399 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) {
400 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000401 return NULL;
402 }
Walter Dörwald07e14762002-11-06 16:15:14 +0000403 result = PyInt_FromString(buffer, NULL, base);
404 PyMem_FREE(buffer);
405 return result;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000406}
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000407#endif
Guido van Rossum9e896b32000-04-05 20:11:21 +0000408
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409/* Methods */
410
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000411/* Integers are seen as the "smallest" of all numeric types and thus
412 don't have any knowledge about conversion of other types to
413 integers. */
414
415#define CONVERT_TO_LONG(obj, lng) \
416 if (PyInt_Check(obj)) { \
417 lng = PyInt_AS_LONG(obj); \
418 } \
419 else { \
420 Py_INCREF(Py_NotImplemented); \
421 return Py_NotImplemented; \
422 }
423
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000424/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000425static int
Fred Drakea2f55112000-07-09 15:16:51 +0000426int_print(PyIntObject *v, FILE *fp, int flags)
427 /* flags -- not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428{
429 fprintf(fp, "%ld", v->ob_ival);
Guido van Rossum90933611991-06-07 16:10:43 +0000430 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431}
432
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000434int_repr(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435{
Tim Peters42221042001-12-01 02:52:56 +0000436 char buf[64];
Barry Warsaw61975092001-11-28 20:55:34 +0000437 PyOS_snprintf(buf, sizeof(buf), "%ld", v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439}
440
441static int
Fred Drakea2f55112000-07-09 15:16:51 +0000442int_compare(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443{
444 register long i = v->ob_ival;
445 register long j = w->ob_ival;
446 return (i < j) ? -1 : (i > j) ? 1 : 0;
447}
448
Guido van Rossum9bfef441993-03-29 10:43:31 +0000449static long
Fred Drakea2f55112000-07-09 15:16:51 +0000450int_hash(PyIntObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000451{
Guido van Rossum541cdd81997-01-06 22:53:20 +0000452 /* XXX If this is changed, you also need to change the way
453 Python's long, float and complex types are hashed. */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000454 long x = v -> ob_ival;
455 if (x == -1)
456 x = -2;
457 return x;
458}
459
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000461int_add(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000462{
463 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000464 CONVERT_TO_LONG(v, a);
465 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466 x = a + b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000467 if ((x^a) >= 0 || (x^b) >= 0)
468 return PyInt_FromLong(x);
Guido van Rossume27f7952001-08-23 02:59:04 +0000469 return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470}
471
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000473int_sub(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474{
475 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000476 CONVERT_TO_LONG(v, a);
477 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000478 x = a - b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000479 if ((x^a) >= 0 || (x^~b) >= 0)
480 return PyInt_FromLong(x);
Guido van Rossume27f7952001-08-23 02:59:04 +0000481 return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
482 (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483}
484
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000485/*
Tim Petersa3c01ce2001-12-04 23:05:10 +0000486Integer overflow checking for * is painful: Python tried a couple ways, but
487they didn't work on all platforms, or failed in endcases (a product of
488-sys.maxint-1 has been a particular pain).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000489
Tim Petersa3c01ce2001-12-04 23:05:10 +0000490Here's another way:
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000491
Tim Petersa3c01ce2001-12-04 23:05:10 +0000492The native long product x*y is either exactly right or *way* off, being
493just the last n bits of the true product, where n is the number of bits
494in a long (the delivered product is the true product plus i*2**n for
495some integer i).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000496
Tim Petersa3c01ce2001-12-04 23:05:10 +0000497The native double product (double)x * (double)y is subject to three
498rounding errors: on a sizeof(long)==8 box, each cast to double can lose
499info, and even on a sizeof(long)==4 box, the multiplication can lose info.
500But, unlike the native long product, it's not in *range* trouble: even
501if sizeof(long)==32 (256-bit longs), the product easily fits in the
502dynamic range of a double. So the leading 50 (or so) bits of the double
503product are correct.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000504
Tim Petersa3c01ce2001-12-04 23:05:10 +0000505We check these two ways against each other, and declare victory if they're
506approximately the same. Else, because the native long product is the only
507one that can lose catastrophic amounts of information, it's the native long
508product that must have overflowed.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000509*/
510
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511static PyObject *
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000512int_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000513{
Tim Petersa3c01ce2001-12-04 23:05:10 +0000514 long a, b;
515 long longprod; /* a*b in native long arithmetic */
516 double doubled_longprod; /* (double)longprod */
517 double doubleprod; /* (double)a * (double)b */
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000518
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000519 CONVERT_TO_LONG(v, a);
520 CONVERT_TO_LONG(w, b);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000521 longprod = a * b;
522 doubleprod = (double)a * (double)b;
523 doubled_longprod = (double)longprod;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000524
Tim Petersa3c01ce2001-12-04 23:05:10 +0000525 /* Fast path for normal case: small multiplicands, and no info
526 is lost in either method. */
527 if (doubled_longprod == doubleprod)
528 return PyInt_FromLong(longprod);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000529
Tim Petersa3c01ce2001-12-04 23:05:10 +0000530 /* Somebody somewhere lost info. Close enough, or way off? Note
531 that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0).
532 The difference either is or isn't significant compared to the
533 true value (of which doubleprod is a good approximation).
534 */
535 {
536 const double diff = doubled_longprod - doubleprod;
537 const double absdiff = diff >= 0.0 ? diff : -diff;
538 const double absprod = doubleprod >= 0.0 ? doubleprod :
539 -doubleprod;
540 /* absdiff/absprod <= 1/32 iff
541 32 * absdiff <= absprod -- 5 good bits is "close enough" */
542 if (32.0 * absdiff <= absprod)
543 return PyInt_FromLong(longprod);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000544 else
545 return PyLong_Type.tp_as_number->nb_multiply(v, w);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000546 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000547}
548
Armin Rigo4b63c212006-10-04 11:44:06 +0000549/* Integer overflow checking for unary negation: on a 2's-complement
550 * box, -x overflows iff x is the most negative long. In this case we
551 * get -x == x. However, -x is undefined (by C) if x /is/ the most
552 * negative long (it's a signed overflow case), and some compilers care.
553 * So we cast x to unsigned long first. However, then other compilers
554 * warn about applying unary minus to an unsigned operand. Hence the
555 * weird "0-".
556 */
557#define UNARY_NEG_WOULD_OVERFLOW(x) \
558 ((x) < 0 && (unsigned long)(x) == 0-(unsigned long)(x))
559
Guido van Rossume27f7952001-08-23 02:59:04 +0000560/* Return type of i_divmod */
561enum divmod_result {
562 DIVMOD_OK, /* Correct result */
563 DIVMOD_OVERFLOW, /* Overflow, try again using longs */
564 DIVMOD_ERROR /* Exception raised */
565};
566
567static enum divmod_result
Tim Peters1dad6a82001-06-18 19:21:11 +0000568i_divmod(register long x, register long y,
Fred Drakea2f55112000-07-09 15:16:51 +0000569 long *p_xdivy, long *p_xmody)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000570{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000571 long xdivy, xmody;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000572
Tim Peters1dad6a82001-06-18 19:21:11 +0000573 if (y == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000575 "integer division or modulo by zero");
Guido van Rossume27f7952001-08-23 02:59:04 +0000576 return DIVMOD_ERROR;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000577 }
Armin Rigo4b63c212006-10-04 11:44:06 +0000578 /* (-sys.maxint-1)/-1 is the only overflow case. */
579 if (y == -1 && UNARY_NEG_WOULD_OVERFLOW(x))
Guido van Rossume27f7952001-08-23 02:59:04 +0000580 return DIVMOD_OVERFLOW;
Tim Peters1dad6a82001-06-18 19:21:11 +0000581 xdivy = x / y;
582 xmody = x - xdivy * y;
583 /* If the signs of x and y differ, and the remainder is non-0,
584 * C89 doesn't define whether xdivy is now the floor or the
585 * ceiling of the infinitely precise quotient. We want the floor,
586 * and we have it iff the remainder's sign matches y's.
587 */
588 if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
589 xmody += y;
590 --xdivy;
591 assert(xmody && ((y ^ xmody) >= 0));
Guido van Rossum00466951991-05-05 20:08:27 +0000592 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000593 *p_xdivy = xdivy;
594 *p_xmody = xmody;
Guido van Rossume27f7952001-08-23 02:59:04 +0000595 return DIVMOD_OK;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000596}
597
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000599int_div(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000600{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000601 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000602 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000603 CONVERT_TO_LONG(x, xi);
604 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000605 switch (i_divmod(xi, yi, &d, &m)) {
606 case DIVMOD_OK:
607 return PyInt_FromLong(d);
608 case DIVMOD_OVERFLOW:
609 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
610 (PyObject *)y);
611 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000612 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000613 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000614}
615
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000617int_classic_div(PyIntObject *x, PyIntObject *y)
618{
619 long xi, yi;
620 long d, m;
621 CONVERT_TO_LONG(x, xi);
622 CONVERT_TO_LONG(y, yi);
623 if (Py_DivisionWarningFlag &&
624 PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0)
625 return NULL;
626 switch (i_divmod(xi, yi, &d, &m)) {
627 case DIVMOD_OK:
628 return PyInt_FromLong(d);
629 case DIVMOD_OVERFLOW:
630 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
631 (PyObject *)y);
632 default:
633 return NULL;
634 }
635}
636
637static PyObject *
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000638int_true_divide(PyObject *v, PyObject *w)
639{
Tim Peterse2a60002001-09-04 06:17:36 +0000640 /* If they aren't both ints, give someone else a chance. In
641 particular, this lets int/long get handled by longs, which
642 underflows to 0 gracefully if the long is too big to convert
643 to float. */
644 if (PyInt_Check(v) && PyInt_Check(w))
645 return PyFloat_Type.tp_as_number->nb_true_divide(v, w);
646 Py_INCREF(Py_NotImplemented);
647 return Py_NotImplemented;
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000648}
649
650static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000651int_mod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000652{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000653 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000654 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000655 CONVERT_TO_LONG(x, xi);
656 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000657 switch (i_divmod(xi, yi, &d, &m)) {
658 case DIVMOD_OK:
659 return PyInt_FromLong(m);
660 case DIVMOD_OVERFLOW:
661 return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x,
662 (PyObject *)y);
663 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000664 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000665 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000666}
667
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000669int_divmod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000670{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000671 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000672 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000673 CONVERT_TO_LONG(x, xi);
674 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000675 switch (i_divmod(xi, yi, &d, &m)) {
676 case DIVMOD_OK:
677 return Py_BuildValue("(ll)", d, m);
678 case DIVMOD_OVERFLOW:
679 return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x,
680 (PyObject *)y);
681 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000682 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000683 }
Guido van Rossum00466951991-05-05 20:08:27 +0000684}
685
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000687int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000688{
Guido van Rossum9478dd41996-12-06 20:14:43 +0000689 register long iv, iw, iz=0, ix, temp, prev;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000690 CONVERT_TO_LONG(v, iv);
691 CONVERT_TO_LONG(w, iw);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000692 if (iw < 0) {
Tim Peters32f453e2001-09-03 08:35:41 +0000693 if ((PyObject *)z != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +0000694 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
695 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +0000696 return NULL;
697 }
Guido van Rossumb82fedc2001-07-12 11:19:45 +0000698 /* Return a float. This works because we know that
699 this calls float_pow() which converts its
700 arguments to double. */
701 return PyFloat_Type.tp_as_number->nb_power(
702 (PyObject *)v, (PyObject *)w, (PyObject *)z);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000703 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000704 if ((PyObject *)z != Py_None) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000705 CONVERT_TO_LONG(z, iz);
Guido van Rossum9478dd41996-12-06 20:14:43 +0000706 if (iz == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 PyErr_SetString(PyExc_ValueError,
Tim Peters4c483c42001-09-05 06:24:58 +0000708 "pow() 3rd argument cannot be 0");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000709 return NULL;
710 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000711 }
712 /*
713 * XXX: The original exponentiation code stopped looping
714 * when temp hit zero; this code will continue onwards
715 * unnecessarily, but at least it won't cause any errors.
716 * Hopefully the speed improvement from the fast exponentiation
717 * will compensate for the slight inefficiency.
718 * XXX: Better handling of overflows is desperately needed.
719 */
720 temp = iv;
721 ix = 1;
722 while (iw > 0) {
723 prev = ix; /* Save value for overflow check */
Tim Petersa3c01ce2001-12-04 23:05:10 +0000724 if (iw & 1) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000725 ix = ix*temp;
726 if (temp == 0)
727 break; /* Avoid ix / 0 */
Guido van Rossume27f7952001-08-23 02:59:04 +0000728 if (ix / temp != prev) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000729 return PyLong_Type.tp_as_number->nb_power(
730 (PyObject *)v,
731 (PyObject *)w,
Tim Peters31960db2001-08-23 21:28:33 +0000732 (PyObject *)z);
Guido van Rossume27f7952001-08-23 02:59:04 +0000733 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000734 }
735 iw >>= 1; /* Shift exponent down by 1 bit */
736 if (iw==0) break;
737 prev = temp;
738 temp *= temp; /* Square the value of temp */
Tim Petersc8854432004-08-25 02:14:08 +0000739 if (prev != 0 && temp / prev != prev) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000740 return PyLong_Type.tp_as_number->nb_power(
741 (PyObject *)v, (PyObject *)w, (PyObject *)z);
742 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000743 if (iz) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000744 /* If we did a multiplication, perform a modulo */
745 ix = ix % iz;
746 temp = temp % iz;
747 }
748 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000749 if (iz) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000750 long div, mod;
Guido van Rossume27f7952001-08-23 02:59:04 +0000751 switch (i_divmod(ix, iz, &div, &mod)) {
752 case DIVMOD_OK:
753 ix = mod;
754 break;
755 case DIVMOD_OVERFLOW:
756 return PyLong_Type.tp_as_number->nb_power(
757 (PyObject *)v, (PyObject *)w, (PyObject *)z);
758 default:
759 return NULL;
760 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000761 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000762 return PyInt_FromLong(ix);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000763}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000764
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000766int_neg(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000767{
Martin v. Löwis10525ad2006-10-04 05:47:47 +0000768 register long a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000769 a = v->ob_ival;
Armin Rigo4b63c212006-10-04 11:44:06 +0000770 /* check for overflow */
771 if (UNARY_NEG_WOULD_OVERFLOW(a)) {
Tim Petersc8854432004-08-25 02:14:08 +0000772 PyObject *o = PyLong_FromLong(a);
Neal Norwitzfa56e2d2003-01-19 15:40:09 +0000773 if (o != NULL) {
774 PyObject *result = PyNumber_Negative(o);
775 Py_DECREF(o);
776 return result;
777 }
778 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000779 }
Martin v. Löwis10525ad2006-10-04 05:47:47 +0000780 return PyInt_FromLong(-a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000781}
782
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000784int_pos(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000785{
Tim Peters73a1dfe2001-09-11 21:44:14 +0000786 if (PyInt_CheckExact(v)) {
787 Py_INCREF(v);
788 return (PyObject *)v;
789 }
790 else
791 return PyInt_FromLong(v->ob_ival);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000792}
793
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000795int_abs(PyIntObject *v)
Guido van Rossum00466951991-05-05 20:08:27 +0000796{
797 if (v->ob_ival >= 0)
798 return int_pos(v);
799 else
800 return int_neg(v);
801}
802
Guido van Rossum0bff0151991-05-14 12:05:32 +0000803static int
Fred Drakea2f55112000-07-09 15:16:51 +0000804int_nonzero(PyIntObject *v)
Guido van Rossum0bff0151991-05-14 12:05:32 +0000805{
806 return v->ob_ival != 0;
807}
808
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000810int_invert(PyIntObject *v)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000811{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000813}
814
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000816int_lshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000817{
Guido van Rossum078151d2002-08-11 04:24:12 +0000818 long a, b, c;
Raymond Hettingera006c372004-06-26 23:22:57 +0000819 PyObject *vv, *ww, *result;
820
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000821 CONVERT_TO_LONG(v, a);
822 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000823 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000825 return NULL;
826 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000827 if (a == 0 || b == 0)
828 return int_pos(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000829 if (b >= LONG_BIT) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000830 vv = PyLong_FromLong(PyInt_AS_LONG(v));
831 if (vv == NULL)
832 return NULL;
833 ww = PyLong_FromLong(PyInt_AS_LONG(w));
834 if (ww == NULL) {
835 Py_DECREF(vv);
836 return NULL;
837 }
838 result = PyNumber_Lshift(vv, ww);
839 Py_DECREF(vv);
840 Py_DECREF(ww);
841 return result;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000842 }
Tim Petersda1a2212002-08-11 17:54:42 +0000843 c = a << b;
844 if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000845 vv = PyLong_FromLong(PyInt_AS_LONG(v));
846 if (vv == NULL)
847 return NULL;
848 ww = PyLong_FromLong(PyInt_AS_LONG(w));
849 if (ww == NULL) {
850 Py_DECREF(vv);
851 return NULL;
852 }
853 result = PyNumber_Lshift(vv, ww);
854 Py_DECREF(vv);
855 Py_DECREF(ww);
856 return result;
Guido van Rossum078151d2002-08-11 04:24:12 +0000857 }
858 return PyInt_FromLong(c);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000859}
860
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000862int_rshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000863{
864 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000865 CONVERT_TO_LONG(v, a);
866 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000867 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000869 return NULL;
870 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000871 if (a == 0 || b == 0)
872 return int_pos(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000873 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000874 if (a < 0)
875 a = -1;
876 else
877 a = 0;
878 }
879 else {
Tim Peters7d3a5112000-07-08 04:17:21 +0000880 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000881 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000883}
884
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000886int_and(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000887{
888 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000889 CONVERT_TO_LONG(v, a);
890 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 return PyInt_FromLong(a & b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000892}
893
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000894static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000895int_xor(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000896{
897 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000898 CONVERT_TO_LONG(v, a);
899 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 return PyInt_FromLong(a ^ b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000901}
902
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000903static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000904int_or(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000905{
906 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000907 CONVERT_TO_LONG(v, a);
908 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 return PyInt_FromLong(a | b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000910}
911
Guido van Rossum1952e382001-09-19 01:25:16 +0000912static int
913int_coerce(PyObject **pv, PyObject **pw)
914{
915 if (PyInt_Check(*pw)) {
916 Py_INCREF(*pv);
917 Py_INCREF(*pw);
918 return 0;
919 }
920 return 1; /* Can't do it */
921}
922
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000924int_int(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000925{
Brett Cannonc3647ac2005-04-26 03:45:26 +0000926 if (PyInt_CheckExact(v))
927 Py_INCREF(v);
928 else
929 v = (PyIntObject *)PyInt_FromLong(v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000931}
932
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000934int_long(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000935{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000937}
938
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000939static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000940int_float(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000941{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000943}
944
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000946int_oct(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000947{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000948 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000949 long x = v -> ob_ival;
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000950 if (x < 0)
951 PyOS_snprintf(buf, sizeof(buf), "-0%lo", -x);
952 else if (x == 0)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000953 strcpy(buf, "0");
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000954 else
Barry Warsaw61975092001-11-28 20:55:34 +0000955 PyOS_snprintf(buf, sizeof(buf), "0%lo", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000956 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000957}
958
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000960int_hex(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000961{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000962 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000963 long x = v -> ob_ival;
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000964 if (x < 0)
965 PyOS_snprintf(buf, sizeof(buf), "-0x%lx", -x);
966 else
967 PyOS_snprintf(buf, sizeof(buf), "0x%lx", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000968 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000969}
970
Jeremy Hylton938ace62002-07-17 16:30:39 +0000971static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +0000972int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
973
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974static PyObject *
975int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
976{
977 PyObject *x = NULL;
978 int base = -909;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000979 static char *kwlist[] = {"x", "base", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000980
Guido van Rossumbef14172001-08-29 15:47:46 +0000981 if (type != &PyInt_Type)
982 return int_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000983 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
984 &x, &base))
985 return NULL;
986 if (x == NULL)
987 return PyInt_FromLong(0L);
988 if (base == -909)
989 return PyNumber_Int(x);
Georg Brandldd4c3982006-10-12 11:28:04 +0000990 if (PyString_Check(x)) {
991 /* Since PyInt_FromString doesn't have a length parameter,
992 * check here for possible NULs in the string. */
993 char *string = PyString_AS_STRING(x);
994 if (strlen(string) != PyString_Size(x)) {
995 /* create a repr() of the input string,
996 * just like PyInt_FromString does */
997 PyObject *srepr;
998 srepr = PyObject_Repr(x);
999 if (srepr == NULL)
1000 return NULL;
1001 PyErr_Format(PyExc_ValueError,
1002 "invalid literal for int() with base %d: %s",
1003 base, PyString_AS_STRING(srepr));
1004 Py_DECREF(srepr);
1005 return NULL;
1006 }
1007 return PyInt_FromString(string, NULL, base);
1008 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001009#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00001010 if (PyUnicode_Check(x))
1011 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
1012 PyUnicode_GET_SIZE(x),
1013 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001014#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00001015 PyErr_SetString(PyExc_TypeError,
1016 "int() can't convert non-string with explicit base");
1017 return NULL;
1018}
1019
Guido van Rossumbef14172001-08-29 15:47:46 +00001020/* Wimpy, slow approach to tp_new calls for subtypes of int:
1021 first create a regular int from whatever arguments we got,
1022 then allocate a subtype instance and initialize its ob_ival
1023 from the regular int. The regular int is then thrown away.
1024*/
1025static PyObject *
1026int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1027{
Anthony Baxter377be112006-04-11 06:54:30 +00001028 PyObject *tmp, *newobj;
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001029 long ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001030
1031 assert(PyType_IsSubtype(type, &PyInt_Type));
1032 tmp = int_new(&PyInt_Type, args, kwds);
1033 if (tmp == NULL)
1034 return NULL;
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001035 if (!PyInt_Check(tmp)) {
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001036 ival = PyLong_AsLong(tmp);
Michael W. Hudson71665dc2003-08-11 17:32:02 +00001037 if (ival == -1 && PyErr_Occurred()) {
1038 Py_DECREF(tmp);
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001039 return NULL;
Michael W. Hudson71665dc2003-08-11 17:32:02 +00001040 }
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001041 } else {
1042 ival = ((PyIntObject *)tmp)->ob_ival;
1043 }
1044
Anthony Baxter377be112006-04-11 06:54:30 +00001045 newobj = type->tp_alloc(type, 0);
1046 if (newobj == NULL) {
Raymond Hettingerf4667932003-06-28 20:04:25 +00001047 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00001048 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00001049 }
Anthony Baxter377be112006-04-11 06:54:30 +00001050 ((PyIntObject *)newobj)->ob_ival = ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001051 Py_DECREF(tmp);
Anthony Baxter377be112006-04-11 06:54:30 +00001052 return newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001053}
1054
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001055static PyObject *
1056int_getnewargs(PyIntObject *v)
1057{
1058 return Py_BuildValue("(l)", v->ob_ival);
1059}
1060
1061static PyMethodDef int_methods[] = {
1062 {"__getnewargs__", (PyCFunction)int_getnewargs, METH_NOARGS},
1063 {NULL, NULL} /* sentinel */
1064};
1065
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001066PyDoc_STRVAR(int_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001067"int(x[, base]) -> integer\n\
1068\n\
1069Convert a string or number to an integer, if possible. A floating point\n\
1070argument will be truncated towards zero (this does not include a string\n\
1071representation of a floating point number!) When converting a string, use\n\
1072the optional base. It is an error to supply a base when converting a\n\
Walter Dörwaldf1715402002-11-19 20:49:15 +00001073non-string. If the argument is outside the integer range a long object\n\
1074will be returned instead.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001075
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001076static PyNumberMethods int_as_number = {
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001077 (binaryfunc)int_add, /*nb_add*/
1078 (binaryfunc)int_sub, /*nb_subtract*/
1079 (binaryfunc)int_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00001080 (binaryfunc)int_classic_div, /*nb_divide*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001081 (binaryfunc)int_mod, /*nb_remainder*/
1082 (binaryfunc)int_divmod, /*nb_divmod*/
1083 (ternaryfunc)int_pow, /*nb_power*/
1084 (unaryfunc)int_neg, /*nb_negative*/
1085 (unaryfunc)int_pos, /*nb_positive*/
1086 (unaryfunc)int_abs, /*nb_absolute*/
1087 (inquiry)int_nonzero, /*nb_nonzero*/
1088 (unaryfunc)int_invert, /*nb_invert*/
1089 (binaryfunc)int_lshift, /*nb_lshift*/
1090 (binaryfunc)int_rshift, /*nb_rshift*/
1091 (binaryfunc)int_and, /*nb_and*/
1092 (binaryfunc)int_xor, /*nb_xor*/
1093 (binaryfunc)int_or, /*nb_or*/
Guido van Rossum1952e382001-09-19 01:25:16 +00001094 int_coerce, /*nb_coerce*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001095 (unaryfunc)int_int, /*nb_int*/
1096 (unaryfunc)int_long, /*nb_long*/
1097 (unaryfunc)int_float, /*nb_float*/
1098 (unaryfunc)int_oct, /*nb_oct*/
1099 (unaryfunc)int_hex, /*nb_hex*/
1100 0, /*nb_inplace_add*/
1101 0, /*nb_inplace_subtract*/
1102 0, /*nb_inplace_multiply*/
1103 0, /*nb_inplace_divide*/
1104 0, /*nb_inplace_remainder*/
1105 0, /*nb_inplace_power*/
1106 0, /*nb_inplace_lshift*/
1107 0, /*nb_inplace_rshift*/
1108 0, /*nb_inplace_and*/
1109 0, /*nb_inplace_xor*/
1110 0, /*nb_inplace_or*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001111 (binaryfunc)int_div, /* nb_floor_divide */
1112 int_true_divide, /* nb_true_divide */
1113 0, /* nb_inplace_floor_divide */
1114 0, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001115 (unaryfunc)int_int, /* nb_index */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001116};
1117
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001118PyTypeObject PyInt_Type = {
1119 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001120 0,
1121 "int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001122 sizeof(PyIntObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001123 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001124 (destructor)int_dealloc, /* tp_dealloc */
1125 (printfunc)int_print, /* tp_print */
1126 0, /* tp_getattr */
1127 0, /* tp_setattr */
1128 (cmpfunc)int_compare, /* tp_compare */
1129 (reprfunc)int_repr, /* tp_repr */
1130 &int_as_number, /* tp_as_number */
1131 0, /* tp_as_sequence */
1132 0, /* tp_as_mapping */
1133 (hashfunc)int_hash, /* tp_hash */
1134 0, /* tp_call */
Guido van Rossume75bfde2002-02-01 15:34:10 +00001135 (reprfunc)int_repr, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001136 PyObject_GenericGetAttr, /* tp_getattro */
1137 0, /* tp_setattro */
1138 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00001139 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
1140 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001141 int_doc, /* tp_doc */
1142 0, /* tp_traverse */
1143 0, /* tp_clear */
1144 0, /* tp_richcompare */
1145 0, /* tp_weaklistoffset */
1146 0, /* tp_iter */
1147 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001148 int_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001149 0, /* tp_members */
1150 0, /* tp_getset */
1151 0, /* tp_base */
1152 0, /* tp_dict */
1153 0, /* tp_descr_get */
1154 0, /* tp_descr_set */
1155 0, /* tp_dictoffset */
1156 0, /* tp_init */
1157 0, /* tp_alloc */
1158 int_new, /* tp_new */
Guido van Rossum93646982002-04-26 00:53:34 +00001159 (freefunc)int_free, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001160};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001161
Neal Norwitzc91ed402002-12-30 22:29:22 +00001162int
Neal Norwitzb2501f42002-12-31 03:42:13 +00001163_PyInt_Init(void)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001164{
1165 PyIntObject *v;
1166 int ival;
1167#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1168 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
Raymond Hettingerb32e6402004-02-08 18:54:37 +00001169 if (!free_list && (free_list = fill_free_list()) == NULL)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001170 return 0;
1171 /* PyObject_New is inlined */
1172 v = free_list;
1173 free_list = (PyIntObject *)v->ob_type;
1174 PyObject_INIT(v, &PyInt_Type);
1175 v->ob_ival = ival;
1176 small_ints[ival + NSMALLNEGINTS] = v;
1177 }
1178#endif
1179 return 1;
1180}
1181
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001182void
Fred Drakea2f55112000-07-09 15:16:51 +00001183PyInt_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001184{
Guido van Rossum3fce8831999-03-12 19:43:17 +00001185 PyIntObject *p;
1186 PyIntBlock *list, *next;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001187 int i;
Skip Montanaro429433b2006-04-18 00:35:43 +00001188 unsigned int ctr;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001189 int bc, bf; /* block count, number of freed blocks */
1190 int irem, isum; /* remaining unfreed ints per block, total */
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001191
Guido van Rossumda084ed1999-03-10 22:55:24 +00001192#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1193 PyIntObject **q;
1194
1195 i = NSMALLNEGINTS + NSMALLPOSINTS;
1196 q = small_ints;
1197 while (--i >= 0) {
1198 Py_XDECREF(*q);
1199 *q++ = NULL;
1200 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001201#endif
Guido van Rossumda084ed1999-03-10 22:55:24 +00001202 bc = 0;
1203 bf = 0;
1204 isum = 0;
1205 list = block_list;
1206 block_list = NULL;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001207 free_list = NULL;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001208 while (list != NULL) {
Guido van Rossumda084ed1999-03-10 22:55:24 +00001209 bc++;
1210 irem = 0;
Skip Montanaro429433b2006-04-18 00:35:43 +00001211 for (ctr = 0, p = &list->objects[0];
1212 ctr < N_INTOBJECTS;
1213 ctr++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001214 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Guido van Rossumda084ed1999-03-10 22:55:24 +00001215 irem++;
1216 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001217 next = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001218 if (irem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001219 list->next = block_list;
1220 block_list = list;
Skip Montanaro429433b2006-04-18 00:35:43 +00001221 for (ctr = 0, p = &list->objects[0];
1222 ctr < N_INTOBJECTS;
1223 ctr++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001224 if (!PyInt_CheckExact(p) ||
Guido van Rossumbef14172001-08-29 15:47:46 +00001225 p->ob_refcnt == 0) {
Guido van Rossum51288bc1999-03-19 20:30:39 +00001226 p->ob_type = (struct _typeobject *)
1227 free_list;
1228 free_list = p;
1229 }
1230#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1231 else if (-NSMALLNEGINTS <= p->ob_ival &&
1232 p->ob_ival < NSMALLPOSINTS &&
1233 small_ints[p->ob_ival +
1234 NSMALLNEGINTS] == NULL) {
1235 Py_INCREF(p);
1236 small_ints[p->ob_ival +
1237 NSMALLNEGINTS] = p;
1238 }
1239#endif
1240 }
Guido van Rossumda084ed1999-03-10 22:55:24 +00001241 }
1242 else {
Tim Peters29c0afc2002-04-28 16:57:34 +00001243 PyMem_FREE(list);
Guido van Rossumda084ed1999-03-10 22:55:24 +00001244 bf++;
1245 }
1246 isum += irem;
Guido van Rossum3fce8831999-03-12 19:43:17 +00001247 list = next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001248 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001249 if (!Py_VerboseFlag)
1250 return;
1251 fprintf(stderr, "# cleanup ints");
1252 if (!isum) {
1253 fprintf(stderr, "\n");
1254 }
1255 else {
1256 fprintf(stderr,
1257 ": %d unfreed int%s in %d out of %d block%s\n",
1258 isum, isum == 1 ? "" : "s",
1259 bc - bf, bc, bc == 1 ? "" : "s");
1260 }
1261 if (Py_VerboseFlag > 1) {
1262 list = block_list;
1263 while (list != NULL) {
Skip Montanaro429433b2006-04-18 00:35:43 +00001264 for (ctr = 0, p = &list->objects[0];
1265 ctr < N_INTOBJECTS;
1266 ctr++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001267 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001268 /* XXX(twouters) cast refcount to
1269 long until %zd is universally
1270 available
1271 */
Guido van Rossum3fce8831999-03-12 19:43:17 +00001272 fprintf(stderr,
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001273 "# <int at %p, refcnt=%ld, val=%ld>\n",
1274 p, (long)p->ob_refcnt,
1275 p->ob_ival);
Guido van Rossum3fce8831999-03-12 19:43:17 +00001276 }
1277 list = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001278 }
1279 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001280}