blob: 364947eb9faab11f4c240aef30c187eb2075420f [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)
Martin v. Löwis68192102007-07-21 06:55:02 +000059 Py_Type(q) = (struct _typeobject *)(q-1);
60 Py_Type(q) = 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;
Martin v. Löwis68192102007-07-21 06:55:02 +0000105 free_list = (PyIntObject *)Py_Type(v);
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)) {
Martin v. Löwis68192102007-07-21 06:55:02 +0000131 Py_Type(v) = (struct _typeobject *)free_list;
Guido van Rossumbef14172001-08-29 15:47:46 +0000132 free_list = v;
133 }
134 else
Martin v. Löwis68192102007-07-21 06:55:02 +0000135 Py_Type(v)->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{
Martin v. Löwis68192102007-07-21 06:55:02 +0000141 Py_Type(v) = (struct _typeobject *)free_list;
Guido van Rossum93646982002-04-26 00:53:34 +0000142 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
Martin v. Löwis68192102007-07-21 06:55:02 +0000155 if (op == NULL || (nb = Py_Type(op)->tp_as_number) == NULL ||
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000156 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
Martin v. Löwis68192102007-07-21 06:55:02 +0000210 if ((nb = Py_Type(op)->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
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +0000216 if (nb->nb_long != 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000217 io = (PyIntObject*) (*nb->nb_long) (op);
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +0000218 else
Martin v. Löwis18e16552006-02-15 17:27:45 +0000219 io = (PyIntObject*) (*nb->nb_int) (op);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000220 if (io == NULL)
221 return -1;
222 if (!PyInt_Check(io)) {
223 if (PyLong_Check(io)) {
224 /* got a long? => retry int conversion */
225 val = _PyLong_AsSsize_t((PyObject *)io);
226 Py_DECREF(io);
227 if ((val == -1) && PyErr_Occurred())
228 return -1;
229 return val;
230 }
231 else
232 {
233 Py_DECREF(io);
234 PyErr_SetString(PyExc_TypeError,
235 "nb_int should return int object");
236 return -1;
237 }
238 }
239
240 val = PyInt_AS_LONG(io);
241 Py_DECREF(io);
242
243 return val;
244#endif
245}
246
Thomas Hellera4ea6032003-04-17 18:55:45 +0000247unsigned long
248PyInt_AsUnsignedLongMask(register PyObject *op)
249{
250 PyNumberMethods *nb;
251 PyIntObject *io;
252 unsigned long val;
253
254 if (op && PyInt_Check(op))
255 return PyInt_AS_LONG((PyIntObject*) op);
256 if (op && PyLong_Check(op))
257 return PyLong_AsUnsignedLongMask(op);
258
Martin v. Löwis68192102007-07-21 06:55:02 +0000259 if (op == NULL || (nb = Py_Type(op)->tp_as_number) == NULL ||
Thomas Hellera4ea6032003-04-17 18:55:45 +0000260 nb->nb_int == NULL) {
261 PyErr_SetString(PyExc_TypeError, "an integer is required");
Skip Montanaro429433b2006-04-18 00:35:43 +0000262 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000263 }
264
265 io = (PyIntObject*) (*nb->nb_int) (op);
266 if (io == NULL)
Skip Montanaro429433b2006-04-18 00:35:43 +0000267 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000268 if (!PyInt_Check(io)) {
269 if (PyLong_Check(io)) {
270 val = PyLong_AsUnsignedLongMask((PyObject *)io);
271 Py_DECREF(io);
272 if (PyErr_Occurred())
Skip Montanaro429433b2006-04-18 00:35:43 +0000273 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000274 return val;
275 }
276 else
277 {
278 Py_DECREF(io);
279 PyErr_SetString(PyExc_TypeError,
280 "nb_int should return int object");
Skip Montanaro429433b2006-04-18 00:35:43 +0000281 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000282 }
283 }
284
285 val = PyInt_AS_LONG(io);
286 Py_DECREF(io);
287
288 return val;
289}
290
291#ifdef HAVE_LONG_LONG
292unsigned PY_LONG_LONG
293PyInt_AsUnsignedLongLongMask(register PyObject *op)
294{
295 PyNumberMethods *nb;
296 PyIntObject *io;
297 unsigned PY_LONG_LONG val;
298
299 if (op && PyInt_Check(op))
300 return PyInt_AS_LONG((PyIntObject*) op);
301 if (op && PyLong_Check(op))
302 return PyLong_AsUnsignedLongLongMask(op);
303
Martin v. Löwis68192102007-07-21 06:55:02 +0000304 if (op == NULL || (nb = Py_Type(op)->tp_as_number) == NULL ||
Thomas Hellera4ea6032003-04-17 18:55:45 +0000305 nb->nb_int == NULL) {
306 PyErr_SetString(PyExc_TypeError, "an integer is required");
Skip Montanaro429433b2006-04-18 00:35:43 +0000307 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000308 }
309
310 io = (PyIntObject*) (*nb->nb_int) (op);
311 if (io == NULL)
Skip Montanaro429433b2006-04-18 00:35:43 +0000312 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000313 if (!PyInt_Check(io)) {
314 if (PyLong_Check(io)) {
315 val = PyLong_AsUnsignedLongLongMask((PyObject *)io);
316 Py_DECREF(io);
317 if (PyErr_Occurred())
Skip Montanaro429433b2006-04-18 00:35:43 +0000318 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000319 return val;
320 }
321 else
322 {
323 Py_DECREF(io);
324 PyErr_SetString(PyExc_TypeError,
325 "nb_int should return int object");
Skip Montanaro429433b2006-04-18 00:35:43 +0000326 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000327 }
328 }
329
330 val = PyInt_AS_LONG(io);
331 Py_DECREF(io);
332
333 return val;
334}
335#endif
336
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000337PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000338PyInt_FromString(char *s, char **pend, int base)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000339{
340 char *end;
341 long x;
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000342 Py_ssize_t slen;
343 PyObject *sobj, *srepr;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000344
345 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossum47710652003-02-12 20:48:22 +0000346 PyErr_SetString(PyExc_ValueError,
347 "int() base must be >= 2 and <= 36");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000348 return NULL;
349 }
350
351 while (*s && isspace(Py_CHARMASK(*s)))
352 s++;
353 errno = 0;
Guido van Rossum47710652003-02-12 20:48:22 +0000354 if (base == 0 && s[0] == '0') {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000355 x = (long) PyOS_strtoul(s, &end, base);
Guido van Rossum47710652003-02-12 20:48:22 +0000356 if (x < 0)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000357 return PyLong_FromString(s, pend, base);
Guido van Rossum47710652003-02-12 20:48:22 +0000358 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000359 else
360 x = PyOS_strtol(s, &end, base);
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000361 if (end == s || !isalnum(Py_CHARMASK(end[-1])))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000362 goto bad;
363 while (*end && isspace(Py_CHARMASK(*end)))
364 end++;
365 if (*end != '\0') {
366 bad:
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000367 slen = strlen(s) < 200 ? strlen(s) : 200;
368 sobj = PyString_FromStringAndSize(s, slen);
369 if (sobj == NULL)
370 return NULL;
371 srepr = PyObject_Repr(sobj);
372 Py_DECREF(sobj);
373 if (srepr == NULL)
374 return NULL;
375 PyErr_Format(PyExc_ValueError,
376 "invalid literal for int() with base %d: %s",
377 base, PyString_AS_STRING(srepr));
378 Py_DECREF(srepr);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000379 return NULL;
380 }
Tim Petersc8854432004-08-25 02:14:08 +0000381 else if (errno != 0)
Walter Dörwald07e14762002-11-06 16:15:14 +0000382 return PyLong_FromString(s, pend, base);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000383 if (pend)
384 *pend = end;
385 return PyInt_FromLong(x);
386}
387
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000388#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000389PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000390PyInt_FromUnicode(Py_UNICODE *s, Py_ssize_t length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000391{
Walter Dörwald07e14762002-11-06 16:15:14 +0000392 PyObject *result;
Anthony Baxter377be112006-04-11 06:54:30 +0000393 char *buffer = (char *)PyMem_MALLOC(length+1);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000394
Walter Dörwald07e14762002-11-06 16:15:14 +0000395 if (buffer == NULL)
Neal Norwitzd501d1f2007-05-16 04:33:50 +0000396 return PyErr_NoMemory();
Walter Dörwald07e14762002-11-06 16:15:14 +0000397
398 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) {
399 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000400 return NULL;
401 }
Walter Dörwald07e14762002-11-06 16:15:14 +0000402 result = PyInt_FromString(buffer, NULL, base);
403 PyMem_FREE(buffer);
404 return result;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000405}
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000406#endif
Guido van Rossum9e896b32000-04-05 20:11:21 +0000407
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000408/* Methods */
409
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000410/* Integers are seen as the "smallest" of all numeric types and thus
411 don't have any knowledge about conversion of other types to
412 integers. */
413
414#define CONVERT_TO_LONG(obj, lng) \
415 if (PyInt_Check(obj)) { \
416 lng = PyInt_AS_LONG(obj); \
417 } \
418 else { \
419 Py_INCREF(Py_NotImplemented); \
420 return Py_NotImplemented; \
421 }
422
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000423/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000424static int
Fred Drakea2f55112000-07-09 15:16:51 +0000425int_print(PyIntObject *v, FILE *fp, int flags)
426 /* flags -- not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427{
Brett Cannon01531592007-09-17 03:28:34 +0000428 long int_val = v->ob_ival;
429 Py_BEGIN_ALLOW_THREADS
430 fprintf(fp, "%ld", int_val);
431 Py_END_ALLOW_THREADS
Guido van Rossum90933611991-06-07 16:10:43 +0000432 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433}
434
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000436int_repr(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437{
Tim Peters42221042001-12-01 02:52:56 +0000438 char buf[64];
Barry Warsaw61975092001-11-28 20:55:34 +0000439 PyOS_snprintf(buf, sizeof(buf), "%ld", v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441}
442
443static int
Fred Drakea2f55112000-07-09 15:16:51 +0000444int_compare(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445{
446 register long i = v->ob_ival;
447 register long j = w->ob_ival;
448 return (i < j) ? -1 : (i > j) ? 1 : 0;
449}
450
Guido van Rossum9bfef441993-03-29 10:43:31 +0000451static long
Fred Drakea2f55112000-07-09 15:16:51 +0000452int_hash(PyIntObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000453{
Guido van Rossum541cdd81997-01-06 22:53:20 +0000454 /* XXX If this is changed, you also need to change the way
455 Python's long, float and complex types are hashed. */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000456 long x = v -> ob_ival;
457 if (x == -1)
458 x = -2;
459 return x;
460}
461
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000463int_add(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464{
465 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000466 CONVERT_TO_LONG(v, a);
467 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000468 x = a + b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000469 if ((x^a) >= 0 || (x^b) >= 0)
470 return PyInt_FromLong(x);
Guido van Rossume27f7952001-08-23 02:59:04 +0000471 return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472}
473
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000475int_sub(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000476{
477 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000478 CONVERT_TO_LONG(v, a);
479 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480 x = a - b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000481 if ((x^a) >= 0 || (x^~b) >= 0)
482 return PyInt_FromLong(x);
Guido van Rossume27f7952001-08-23 02:59:04 +0000483 return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
484 (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000485}
486
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000487/*
Tim Petersa3c01ce2001-12-04 23:05:10 +0000488Integer overflow checking for * is painful: Python tried a couple ways, but
489they didn't work on all platforms, or failed in endcases (a product of
490-sys.maxint-1 has been a particular pain).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000491
Tim Petersa3c01ce2001-12-04 23:05:10 +0000492Here's another way:
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000493
Tim Petersa3c01ce2001-12-04 23:05:10 +0000494The native long product x*y is either exactly right or *way* off, being
495just the last n bits of the true product, where n is the number of bits
496in a long (the delivered product is the true product plus i*2**n for
497some integer i).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000498
Tim Petersa3c01ce2001-12-04 23:05:10 +0000499The native double product (double)x * (double)y is subject to three
500rounding errors: on a sizeof(long)==8 box, each cast to double can lose
501info, and even on a sizeof(long)==4 box, the multiplication can lose info.
502But, unlike the native long product, it's not in *range* trouble: even
503if sizeof(long)==32 (256-bit longs), the product easily fits in the
504dynamic range of a double. So the leading 50 (or so) bits of the double
505product are correct.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000506
Tim Petersa3c01ce2001-12-04 23:05:10 +0000507We check these two ways against each other, and declare victory if they're
508approximately the same. Else, because the native long product is the only
509one that can lose catastrophic amounts of information, it's the native long
510product that must have overflowed.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000511*/
512
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513static PyObject *
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000514int_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000515{
Tim Petersa3c01ce2001-12-04 23:05:10 +0000516 long a, b;
517 long longprod; /* a*b in native long arithmetic */
518 double doubled_longprod; /* (double)longprod */
519 double doubleprod; /* (double)a * (double)b */
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000520
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000521 CONVERT_TO_LONG(v, a);
522 CONVERT_TO_LONG(w, b);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000523 longprod = a * b;
524 doubleprod = (double)a * (double)b;
525 doubled_longprod = (double)longprod;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000526
Tim Petersa3c01ce2001-12-04 23:05:10 +0000527 /* Fast path for normal case: small multiplicands, and no info
528 is lost in either method. */
529 if (doubled_longprod == doubleprod)
530 return PyInt_FromLong(longprod);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000531
Tim Petersa3c01ce2001-12-04 23:05:10 +0000532 /* Somebody somewhere lost info. Close enough, or way off? Note
533 that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0).
534 The difference either is or isn't significant compared to the
535 true value (of which doubleprod is a good approximation).
536 */
537 {
538 const double diff = doubled_longprod - doubleprod;
539 const double absdiff = diff >= 0.0 ? diff : -diff;
540 const double absprod = doubleprod >= 0.0 ? doubleprod :
541 -doubleprod;
542 /* absdiff/absprod <= 1/32 iff
543 32 * absdiff <= absprod -- 5 good bits is "close enough" */
544 if (32.0 * absdiff <= absprod)
545 return PyInt_FromLong(longprod);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000546 else
547 return PyLong_Type.tp_as_number->nb_multiply(v, w);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000548 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000549}
550
Armin Rigo7ccbca92006-10-04 12:17:45 +0000551/* Integer overflow checking for unary negation: on a 2's-complement
552 * box, -x overflows iff x is the most negative long. In this case we
553 * get -x == x. However, -x is undefined (by C) if x /is/ the most
554 * negative long (it's a signed overflow case), and some compilers care.
555 * So we cast x to unsigned long first. However, then other compilers
556 * warn about applying unary minus to an unsigned operand. Hence the
557 * weird "0-".
558 */
559#define UNARY_NEG_WOULD_OVERFLOW(x) \
560 ((x) < 0 && (unsigned long)(x) == 0-(unsigned long)(x))
561
Guido van Rossume27f7952001-08-23 02:59:04 +0000562/* Return type of i_divmod */
563enum divmod_result {
564 DIVMOD_OK, /* Correct result */
565 DIVMOD_OVERFLOW, /* Overflow, try again using longs */
566 DIVMOD_ERROR /* Exception raised */
567};
568
569static enum divmod_result
Tim Peters1dad6a82001-06-18 19:21:11 +0000570i_divmod(register long x, register long y,
Fred Drakea2f55112000-07-09 15:16:51 +0000571 long *p_xdivy, long *p_xmody)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000572{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000573 long xdivy, xmody;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000574
Tim Peters1dad6a82001-06-18 19:21:11 +0000575 if (y == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000577 "integer division or modulo by zero");
Guido van Rossume27f7952001-08-23 02:59:04 +0000578 return DIVMOD_ERROR;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000579 }
Tim Peters1dad6a82001-06-18 19:21:11 +0000580 /* (-sys.maxint-1)/-1 is the only overflow case. */
Armin Rigo7ccbca92006-10-04 12:17:45 +0000581 if (y == -1 && UNARY_NEG_WOULD_OVERFLOW(x))
Guido van Rossume27f7952001-08-23 02:59:04 +0000582 return DIVMOD_OVERFLOW;
Tim Peters1dad6a82001-06-18 19:21:11 +0000583 xdivy = x / y;
584 xmody = x - xdivy * y;
585 /* If the signs of x and y differ, and the remainder is non-0,
586 * C89 doesn't define whether xdivy is now the floor or the
587 * ceiling of the infinitely precise quotient. We want the floor,
588 * and we have it iff the remainder's sign matches y's.
589 */
590 if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
591 xmody += y;
592 --xdivy;
593 assert(xmody && ((y ^ xmody) >= 0));
Guido van Rossum00466951991-05-05 20:08:27 +0000594 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000595 *p_xdivy = xdivy;
596 *p_xmody = xmody;
Guido van Rossume27f7952001-08-23 02:59:04 +0000597 return DIVMOD_OK;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000598}
599
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000601int_div(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000602{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000603 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000604 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000605 CONVERT_TO_LONG(x, xi);
606 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000607 switch (i_divmod(xi, yi, &d, &m)) {
608 case DIVMOD_OK:
609 return PyInt_FromLong(d);
610 case DIVMOD_OVERFLOW:
611 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
612 (PyObject *)y);
613 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000614 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000615 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000616}
617
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000619int_classic_div(PyIntObject *x, PyIntObject *y)
620{
621 long xi, yi;
622 long d, m;
623 CONVERT_TO_LONG(x, xi);
624 CONVERT_TO_LONG(y, yi);
625 if (Py_DivisionWarningFlag &&
626 PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0)
627 return NULL;
628 switch (i_divmod(xi, yi, &d, &m)) {
629 case DIVMOD_OK:
630 return PyInt_FromLong(d);
631 case DIVMOD_OVERFLOW:
632 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
633 (PyObject *)y);
634 default:
635 return NULL;
636 }
637}
638
639static PyObject *
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000640int_true_divide(PyObject *v, PyObject *w)
641{
Tim Peterse2a60002001-09-04 06:17:36 +0000642 /* If they aren't both ints, give someone else a chance. In
643 particular, this lets int/long get handled by longs, which
644 underflows to 0 gracefully if the long is too big to convert
645 to float. */
646 if (PyInt_Check(v) && PyInt_Check(w))
647 return PyFloat_Type.tp_as_number->nb_true_divide(v, w);
648 Py_INCREF(Py_NotImplemented);
649 return Py_NotImplemented;
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000650}
651
652static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000653int_mod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000654{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000655 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000656 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000657 CONVERT_TO_LONG(x, xi);
658 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000659 switch (i_divmod(xi, yi, &d, &m)) {
660 case DIVMOD_OK:
661 return PyInt_FromLong(m);
662 case DIVMOD_OVERFLOW:
663 return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x,
664 (PyObject *)y);
665 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000666 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000667 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000668}
669
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000670static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000671int_divmod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000672{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000673 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000674 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000675 CONVERT_TO_LONG(x, xi);
676 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000677 switch (i_divmod(xi, yi, &d, &m)) {
678 case DIVMOD_OK:
679 return Py_BuildValue("(ll)", d, m);
680 case DIVMOD_OVERFLOW:
681 return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x,
682 (PyObject *)y);
683 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000684 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000685 }
Guido van Rossum00466951991-05-05 20:08:27 +0000686}
687
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000689int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000690{
Guido van Rossum9478dd41996-12-06 20:14:43 +0000691 register long iv, iw, iz=0, ix, temp, prev;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000692 CONVERT_TO_LONG(v, iv);
693 CONVERT_TO_LONG(w, iw);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000694 if (iw < 0) {
Tim Peters32f453e2001-09-03 08:35:41 +0000695 if ((PyObject *)z != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +0000696 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
697 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +0000698 return NULL;
699 }
Guido van Rossumb82fedc2001-07-12 11:19:45 +0000700 /* Return a float. This works because we know that
701 this calls float_pow() which converts its
702 arguments to double. */
703 return PyFloat_Type.tp_as_number->nb_power(
704 (PyObject *)v, (PyObject *)w, (PyObject *)z);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000705 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000706 if ((PyObject *)z != Py_None) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000707 CONVERT_TO_LONG(z, iz);
Guido van Rossum9478dd41996-12-06 20:14:43 +0000708 if (iz == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709 PyErr_SetString(PyExc_ValueError,
Tim Peters4c483c42001-09-05 06:24:58 +0000710 "pow() 3rd argument cannot be 0");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000711 return NULL;
712 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000713 }
714 /*
715 * XXX: The original exponentiation code stopped looping
716 * when temp hit zero; this code will continue onwards
717 * unnecessarily, but at least it won't cause any errors.
718 * Hopefully the speed improvement from the fast exponentiation
719 * will compensate for the slight inefficiency.
720 * XXX: Better handling of overflows is desperately needed.
721 */
722 temp = iv;
723 ix = 1;
724 while (iw > 0) {
725 prev = ix; /* Save value for overflow check */
Tim Petersa3c01ce2001-12-04 23:05:10 +0000726 if (iw & 1) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000727 ix = ix*temp;
728 if (temp == 0)
729 break; /* Avoid ix / 0 */
Guido van Rossume27f7952001-08-23 02:59:04 +0000730 if (ix / temp != prev) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000731 return PyLong_Type.tp_as_number->nb_power(
732 (PyObject *)v,
733 (PyObject *)w,
Tim Peters31960db2001-08-23 21:28:33 +0000734 (PyObject *)z);
Guido van Rossume27f7952001-08-23 02:59:04 +0000735 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000736 }
737 iw >>= 1; /* Shift exponent down by 1 bit */
738 if (iw==0) break;
739 prev = temp;
740 temp *= temp; /* Square the value of temp */
Tim Petersc8854432004-08-25 02:14:08 +0000741 if (prev != 0 && temp / prev != prev) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000742 return PyLong_Type.tp_as_number->nb_power(
743 (PyObject *)v, (PyObject *)w, (PyObject *)z);
744 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000745 if (iz) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000746 /* If we did a multiplication, perform a modulo */
747 ix = ix % iz;
748 temp = temp % iz;
749 }
750 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000751 if (iz) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000752 long div, mod;
Guido van Rossume27f7952001-08-23 02:59:04 +0000753 switch (i_divmod(ix, iz, &div, &mod)) {
754 case DIVMOD_OK:
755 ix = mod;
756 break;
757 case DIVMOD_OVERFLOW:
758 return PyLong_Type.tp_as_number->nb_power(
759 (PyObject *)v, (PyObject *)w, (PyObject *)z);
760 default:
761 return NULL;
762 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000763 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764 return PyInt_FromLong(ix);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000765}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000766
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000768int_neg(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000769{
Martin v. Löwis820d6ac2006-10-04 05:47:34 +0000770 register long a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000771 a = v->ob_ival;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000772 /* check for overflow */
773 if (UNARY_NEG_WOULD_OVERFLOW(a)) {
Tim Petersc8854432004-08-25 02:14:08 +0000774 PyObject *o = PyLong_FromLong(a);
Neal Norwitzfa56e2d2003-01-19 15:40:09 +0000775 if (o != NULL) {
776 PyObject *result = PyNumber_Negative(o);
777 Py_DECREF(o);
778 return result;
779 }
780 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000781 }
Martin v. Löwis820d6ac2006-10-04 05:47:34 +0000782 return PyInt_FromLong(-a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000783}
784
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000785static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000786int_pos(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000787{
Tim Peters73a1dfe2001-09-11 21:44:14 +0000788 if (PyInt_CheckExact(v)) {
789 Py_INCREF(v);
790 return (PyObject *)v;
791 }
792 else
793 return PyInt_FromLong(v->ob_ival);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000794}
795
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000797int_abs(PyIntObject *v)
Guido van Rossum00466951991-05-05 20:08:27 +0000798{
799 if (v->ob_ival >= 0)
800 return int_pos(v);
801 else
802 return int_neg(v);
803}
804
Guido van Rossum0bff0151991-05-14 12:05:32 +0000805static int
Fred Drakea2f55112000-07-09 15:16:51 +0000806int_nonzero(PyIntObject *v)
Guido van Rossum0bff0151991-05-14 12:05:32 +0000807{
808 return v->ob_ival != 0;
809}
810
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000812int_invert(PyIntObject *v)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000813{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000815}
816
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000818int_lshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000819{
Guido van Rossum078151d2002-08-11 04:24:12 +0000820 long a, b, c;
Raymond Hettingera006c372004-06-26 23:22:57 +0000821 PyObject *vv, *ww, *result;
822
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000823 CONVERT_TO_LONG(v, a);
824 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000825 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000826 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000827 return NULL;
828 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000829 if (a == 0 || b == 0)
830 return int_pos(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000831 if (b >= LONG_BIT) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000832 vv = PyLong_FromLong(PyInt_AS_LONG(v));
833 if (vv == NULL)
834 return NULL;
835 ww = PyLong_FromLong(PyInt_AS_LONG(w));
836 if (ww == NULL) {
837 Py_DECREF(vv);
838 return NULL;
839 }
840 result = PyNumber_Lshift(vv, ww);
841 Py_DECREF(vv);
842 Py_DECREF(ww);
843 return result;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000844 }
Tim Petersda1a2212002-08-11 17:54:42 +0000845 c = a << b;
846 if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000847 vv = PyLong_FromLong(PyInt_AS_LONG(v));
848 if (vv == NULL)
849 return NULL;
850 ww = PyLong_FromLong(PyInt_AS_LONG(w));
851 if (ww == NULL) {
852 Py_DECREF(vv);
853 return NULL;
854 }
855 result = PyNumber_Lshift(vv, ww);
856 Py_DECREF(vv);
857 Py_DECREF(ww);
858 return result;
Guido van Rossum078151d2002-08-11 04:24:12 +0000859 }
860 return PyInt_FromLong(c);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000861}
862
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000863static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000864int_rshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000865{
866 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000867 CONVERT_TO_LONG(v, a);
868 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000869 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000871 return NULL;
872 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000873 if (a == 0 || b == 0)
874 return int_pos(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000875 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000876 if (a < 0)
877 a = -1;
878 else
879 a = 0;
880 }
881 else {
Tim Peters7d3a5112000-07-08 04:17:21 +0000882 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000883 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000885}
886
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000887static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000888int_and(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000889{
890 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000891 CONVERT_TO_LONG(v, a);
892 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 return PyInt_FromLong(a & b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000894}
895
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000897int_xor(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000898{
899 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000900 CONVERT_TO_LONG(v, a);
901 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 return PyInt_FromLong(a ^ b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000903}
904
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000905static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000906int_or(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000907{
908 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000909 CONVERT_TO_LONG(v, a);
910 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 return PyInt_FromLong(a | b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000912}
913
Guido van Rossum1952e382001-09-19 01:25:16 +0000914static int
915int_coerce(PyObject **pv, PyObject **pw)
916{
917 if (PyInt_Check(*pw)) {
918 Py_INCREF(*pv);
919 Py_INCREF(*pw);
920 return 0;
921 }
922 return 1; /* Can't do it */
923}
924
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000926int_int(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000927{
Brett Cannonc3647ac2005-04-26 03:45:26 +0000928 if (PyInt_CheckExact(v))
929 Py_INCREF(v);
930 else
931 v = (PyIntObject *)PyInt_FromLong(v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000933}
934
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000936int_long(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000937{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000939}
940
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000942int_float(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000943{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000944 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000945}
946
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000948int_oct(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000949{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000950 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000951 long x = v -> ob_ival;
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000952 if (x < 0)
953 PyOS_snprintf(buf, sizeof(buf), "-0%lo", -x);
954 else if (x == 0)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000955 strcpy(buf, "0");
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000956 else
Barry Warsaw61975092001-11-28 20:55:34 +0000957 PyOS_snprintf(buf, sizeof(buf), "0%lo", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000958 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000959}
960
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000962int_hex(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000963{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000964 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000965 long x = v -> ob_ival;
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000966 if (x < 0)
967 PyOS_snprintf(buf, sizeof(buf), "-0x%lx", -x);
968 else
969 PyOS_snprintf(buf, sizeof(buf), "0x%lx", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000971}
972
Jeremy Hylton938ace62002-07-17 16:30:39 +0000973static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +0000974int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
975
Tim Peters6d6c1a32001-08-02 04:15:00 +0000976static PyObject *
977int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
978{
979 PyObject *x = NULL;
980 int base = -909;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000981 static char *kwlist[] = {"x", "base", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000982
Guido van Rossumbef14172001-08-29 15:47:46 +0000983 if (type != &PyInt_Type)
984 return int_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000985 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
986 &x, &base))
987 return NULL;
988 if (x == NULL)
989 return PyInt_FromLong(0L);
990 if (base == -909)
991 return PyNumber_Int(x);
Georg Brandl2c1375c2006-10-12 11:27:59 +0000992 if (PyString_Check(x)) {
993 /* Since PyInt_FromString doesn't have a length parameter,
994 * check here for possible NULs in the string. */
995 char *string = PyString_AS_STRING(x);
996 if (strlen(string) != PyString_Size(x)) {
997 /* create a repr() of the input string,
998 * just like PyInt_FromString does */
999 PyObject *srepr;
1000 srepr = PyObject_Repr(x);
1001 if (srepr == NULL)
1002 return NULL;
1003 PyErr_Format(PyExc_ValueError,
1004 "invalid literal for int() with base %d: %s",
1005 base, PyString_AS_STRING(srepr));
1006 Py_DECREF(srepr);
1007 return NULL;
1008 }
1009 return PyInt_FromString(string, NULL, base);
1010 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001011#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00001012 if (PyUnicode_Check(x))
1013 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
1014 PyUnicode_GET_SIZE(x),
1015 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001016#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00001017 PyErr_SetString(PyExc_TypeError,
1018 "int() can't convert non-string with explicit base");
1019 return NULL;
1020}
1021
Guido van Rossumbef14172001-08-29 15:47:46 +00001022/* Wimpy, slow approach to tp_new calls for subtypes of int:
1023 first create a regular int from whatever arguments we got,
1024 then allocate a subtype instance and initialize its ob_ival
1025 from the regular int. The regular int is then thrown away.
1026*/
1027static PyObject *
1028int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1029{
Anthony Baxter377be112006-04-11 06:54:30 +00001030 PyObject *tmp, *newobj;
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001031 long ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001032
1033 assert(PyType_IsSubtype(type, &PyInt_Type));
1034 tmp = int_new(&PyInt_Type, args, kwds);
1035 if (tmp == NULL)
1036 return NULL;
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001037 if (!PyInt_Check(tmp)) {
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001038 ival = PyLong_AsLong(tmp);
Michael W. Hudson71665dc2003-08-11 17:32:02 +00001039 if (ival == -1 && PyErr_Occurred()) {
1040 Py_DECREF(tmp);
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001041 return NULL;
Michael W. Hudson71665dc2003-08-11 17:32:02 +00001042 }
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001043 } else {
1044 ival = ((PyIntObject *)tmp)->ob_ival;
1045 }
1046
Anthony Baxter377be112006-04-11 06:54:30 +00001047 newobj = type->tp_alloc(type, 0);
1048 if (newobj == NULL) {
Raymond Hettingerf4667932003-06-28 20:04:25 +00001049 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00001050 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00001051 }
Anthony Baxter377be112006-04-11 06:54:30 +00001052 ((PyIntObject *)newobj)->ob_ival = ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001053 Py_DECREF(tmp);
Anthony Baxter377be112006-04-11 06:54:30 +00001054 return newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001055}
1056
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001057static PyObject *
1058int_getnewargs(PyIntObject *v)
1059{
1060 return Py_BuildValue("(l)", v->ob_ival);
1061}
1062
1063static PyMethodDef int_methods[] = {
1064 {"__getnewargs__", (PyCFunction)int_getnewargs, METH_NOARGS},
1065 {NULL, NULL} /* sentinel */
1066};
1067
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001068PyDoc_STRVAR(int_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001069"int(x[, base]) -> integer\n\
1070\n\
1071Convert a string or number to an integer, if possible. A floating point\n\
1072argument will be truncated towards zero (this does not include a string\n\
1073representation of a floating point number!) When converting a string, use\n\
1074the optional base. It is an error to supply a base when converting a\n\
Gustavo Niemeyer37e65022007-01-10 16:15:48 +00001075non-string. If base is zero, the proper base is guessed based on the\n\
Gustavo Niemeyera443bc82007-01-10 16:13:40 +00001076string content. If the argument is outside the integer range a\n\
1077long object will be returned instead.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001078
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079static PyNumberMethods int_as_number = {
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001080 (binaryfunc)int_add, /*nb_add*/
1081 (binaryfunc)int_sub, /*nb_subtract*/
1082 (binaryfunc)int_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00001083 (binaryfunc)int_classic_div, /*nb_divide*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001084 (binaryfunc)int_mod, /*nb_remainder*/
1085 (binaryfunc)int_divmod, /*nb_divmod*/
1086 (ternaryfunc)int_pow, /*nb_power*/
1087 (unaryfunc)int_neg, /*nb_negative*/
1088 (unaryfunc)int_pos, /*nb_positive*/
1089 (unaryfunc)int_abs, /*nb_absolute*/
1090 (inquiry)int_nonzero, /*nb_nonzero*/
1091 (unaryfunc)int_invert, /*nb_invert*/
1092 (binaryfunc)int_lshift, /*nb_lshift*/
1093 (binaryfunc)int_rshift, /*nb_rshift*/
1094 (binaryfunc)int_and, /*nb_and*/
1095 (binaryfunc)int_xor, /*nb_xor*/
1096 (binaryfunc)int_or, /*nb_or*/
Guido van Rossum1952e382001-09-19 01:25:16 +00001097 int_coerce, /*nb_coerce*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001098 (unaryfunc)int_int, /*nb_int*/
1099 (unaryfunc)int_long, /*nb_long*/
1100 (unaryfunc)int_float, /*nb_float*/
1101 (unaryfunc)int_oct, /*nb_oct*/
1102 (unaryfunc)int_hex, /*nb_hex*/
1103 0, /*nb_inplace_add*/
1104 0, /*nb_inplace_subtract*/
1105 0, /*nb_inplace_multiply*/
1106 0, /*nb_inplace_divide*/
1107 0, /*nb_inplace_remainder*/
1108 0, /*nb_inplace_power*/
1109 0, /*nb_inplace_lshift*/
1110 0, /*nb_inplace_rshift*/
1111 0, /*nb_inplace_and*/
1112 0, /*nb_inplace_xor*/
1113 0, /*nb_inplace_or*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001114 (binaryfunc)int_div, /* nb_floor_divide */
1115 int_true_divide, /* nb_true_divide */
1116 0, /* nb_inplace_floor_divide */
1117 0, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001118 (unaryfunc)int_int, /* nb_index */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001119};
1120
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001121PyTypeObject PyInt_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001122 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001123 "int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001124 sizeof(PyIntObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001125 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001126 (destructor)int_dealloc, /* tp_dealloc */
1127 (printfunc)int_print, /* tp_print */
1128 0, /* tp_getattr */
1129 0, /* tp_setattr */
1130 (cmpfunc)int_compare, /* tp_compare */
1131 (reprfunc)int_repr, /* tp_repr */
1132 &int_as_number, /* tp_as_number */
1133 0, /* tp_as_sequence */
1134 0, /* tp_as_mapping */
1135 (hashfunc)int_hash, /* tp_hash */
1136 0, /* tp_call */
Guido van Rossume75bfde2002-02-01 15:34:10 +00001137 (reprfunc)int_repr, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001138 PyObject_GenericGetAttr, /* tp_getattro */
1139 0, /* tp_setattro */
1140 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00001141 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00001142 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001143 int_doc, /* tp_doc */
1144 0, /* tp_traverse */
1145 0, /* tp_clear */
1146 0, /* tp_richcompare */
1147 0, /* tp_weaklistoffset */
1148 0, /* tp_iter */
1149 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001150 int_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001151 0, /* tp_members */
1152 0, /* tp_getset */
1153 0, /* tp_base */
1154 0, /* tp_dict */
1155 0, /* tp_descr_get */
1156 0, /* tp_descr_set */
1157 0, /* tp_dictoffset */
1158 0, /* tp_init */
1159 0, /* tp_alloc */
1160 int_new, /* tp_new */
Guido van Rossum93646982002-04-26 00:53:34 +00001161 (freefunc)int_free, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001162};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001163
Neal Norwitzc91ed402002-12-30 22:29:22 +00001164int
Neal Norwitzb2501f42002-12-31 03:42:13 +00001165_PyInt_Init(void)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001166{
1167 PyIntObject *v;
1168 int ival;
1169#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1170 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
Raymond Hettingerb32e6402004-02-08 18:54:37 +00001171 if (!free_list && (free_list = fill_free_list()) == NULL)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001172 return 0;
1173 /* PyObject_New is inlined */
1174 v = free_list;
Martin v. Löwis68192102007-07-21 06:55:02 +00001175 free_list = (PyIntObject *)Py_Type(v);
Neal Norwitzc91ed402002-12-30 22:29:22 +00001176 PyObject_INIT(v, &PyInt_Type);
1177 v->ob_ival = ival;
1178 small_ints[ival + NSMALLNEGINTS] = v;
1179 }
1180#endif
1181 return 1;
1182}
1183
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001184void
Fred Drakea2f55112000-07-09 15:16:51 +00001185PyInt_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001186{
Guido van Rossum3fce8831999-03-12 19:43:17 +00001187 PyIntObject *p;
1188 PyIntBlock *list, *next;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001189 int i;
Skip Montanaro429433b2006-04-18 00:35:43 +00001190 unsigned int ctr;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001191 int bc, bf; /* block count, number of freed blocks */
1192 int irem, isum; /* remaining unfreed ints per block, total */
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001193
Guido van Rossumda084ed1999-03-10 22:55:24 +00001194#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1195 PyIntObject **q;
1196
1197 i = NSMALLNEGINTS + NSMALLPOSINTS;
1198 q = small_ints;
1199 while (--i >= 0) {
1200 Py_XDECREF(*q);
1201 *q++ = NULL;
1202 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001203#endif
Guido van Rossumda084ed1999-03-10 22:55:24 +00001204 bc = 0;
1205 bf = 0;
1206 isum = 0;
1207 list = block_list;
1208 block_list = NULL;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001209 free_list = NULL;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001210 while (list != NULL) {
Guido van Rossumda084ed1999-03-10 22:55:24 +00001211 bc++;
1212 irem = 0;
Skip Montanaro429433b2006-04-18 00:35:43 +00001213 for (ctr = 0, p = &list->objects[0];
1214 ctr < N_INTOBJECTS;
1215 ctr++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001216 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Guido van Rossumda084ed1999-03-10 22:55:24 +00001217 irem++;
1218 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001219 next = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001220 if (irem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001221 list->next = block_list;
1222 block_list = list;
Skip Montanaro429433b2006-04-18 00:35:43 +00001223 for (ctr = 0, p = &list->objects[0];
1224 ctr < N_INTOBJECTS;
1225 ctr++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001226 if (!PyInt_CheckExact(p) ||
Guido van Rossumbef14172001-08-29 15:47:46 +00001227 p->ob_refcnt == 0) {
Martin v. Löwis68192102007-07-21 06:55:02 +00001228 Py_Type(p) = (struct _typeobject *)
Guido van Rossum51288bc1999-03-19 20:30:39 +00001229 free_list;
1230 free_list = p;
1231 }
1232#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1233 else if (-NSMALLNEGINTS <= p->ob_ival &&
1234 p->ob_ival < NSMALLPOSINTS &&
1235 small_ints[p->ob_ival +
1236 NSMALLNEGINTS] == NULL) {
1237 Py_INCREF(p);
1238 small_ints[p->ob_ival +
1239 NSMALLNEGINTS] = p;
1240 }
1241#endif
1242 }
Guido van Rossumda084ed1999-03-10 22:55:24 +00001243 }
1244 else {
Tim Peters29c0afc2002-04-28 16:57:34 +00001245 PyMem_FREE(list);
Guido van Rossumda084ed1999-03-10 22:55:24 +00001246 bf++;
1247 }
1248 isum += irem;
Guido van Rossum3fce8831999-03-12 19:43:17 +00001249 list = next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001250 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001251 if (!Py_VerboseFlag)
1252 return;
1253 fprintf(stderr, "# cleanup ints");
1254 if (!isum) {
1255 fprintf(stderr, "\n");
1256 }
1257 else {
1258 fprintf(stderr,
1259 ": %d unfreed int%s in %d out of %d block%s\n",
1260 isum, isum == 1 ? "" : "s",
1261 bc - bf, bc, bc == 1 ? "" : "s");
1262 }
1263 if (Py_VerboseFlag > 1) {
1264 list = block_list;
1265 while (list != NULL) {
Skip Montanaro429433b2006-04-18 00:35:43 +00001266 for (ctr = 0, p = &list->objects[0];
1267 ctr < N_INTOBJECTS;
1268 ctr++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001269 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001270 /* XXX(twouters) cast refcount to
1271 long until %zd is universally
1272 available
1273 */
Guido van Rossum3fce8831999-03-12 19:43:17 +00001274 fprintf(stderr,
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001275 "# <int at %p, refcnt=%ld, val=%ld>\n",
1276 p, (long)p->ob_refcnt,
1277 p->ob_ival);
Guido van Rossum3fce8831999-03-12 19:43:17 +00001278 }
1279 list = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001280 }
1281 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001282}