blob: 7c2a6fba5f35b1fe4ac3e6037f19e06f8f4b38cc [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
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00007static PyObject *int_int(PyIntObject *v);
8
Guido van Rossum2e1d4331993-12-24 10:22:45 +00009long
Fred Drakea2f55112000-07-09 15:16:51 +000010PyInt_GetMax(void)
Guido van Rossum2e1d4331993-12-24 10:22:45 +000011{
12 return LONG_MAX; /* To initialize sys.maxint */
13}
14
Guido van Rossum3f5da241990-12-20 15:06:42 +000015/* Integers are quite normal objects, to make object handling uniform.
16 (Using odd pointers to represent integers would save much space
17 but require extra checks for this special case throughout the code.)
Tim Peters29c0afc2002-04-28 16:57:34 +000018 Since a typical Python program spends much of its time allocating
Guido van Rossum3f5da241990-12-20 15:06:42 +000019 and deallocating integers, these operations should be very fast.
20 Therefore we use a dedicated allocation scheme with a much lower
21 overhead (in space and time) than straight malloc(): a simple
22 dedicated free list, filled when necessary with memory from malloc().
Tim Peters29c0afc2002-04-28 16:57:34 +000023
24 block_list is a singly-linked list of all PyIntBlocks ever allocated,
25 linked via their next members. PyIntBlocks are never returned to the
26 system before shutdown (PyInt_Fini).
27
28 free_list is a singly-linked list of available PyIntObjects, linked
29 via abuse of their ob_type members.
Guido van Rossum3f5da241990-12-20 15:06:42 +000030*/
31
32#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000033#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
34#define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
Guido van Rossumda084ed1999-03-10 22:55:24 +000035
Guido van Rossum3fce8831999-03-12 19:43:17 +000036struct _intblock {
37 struct _intblock *next;
38 PyIntObject objects[N_INTOBJECTS];
39};
40
41typedef struct _intblock PyIntBlock;
42
43static PyIntBlock *block_list = NULL;
44static PyIntObject *free_list = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000045
Guido van Rossumc0b618a1997-05-02 03:12:38 +000046static PyIntObject *
Fred Drakea2f55112000-07-09 15:16:51 +000047fill_free_list(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +000048{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049 PyIntObject *p, *q;
Tim Peters29c0afc2002-04-28 16:57:34 +000050 /* Python's object allocator isn't appropriate for large blocks. */
Guido van Rossumb18618d2000-05-03 23:44:39 +000051 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
Guido van Rossum3f5da241990-12-20 15:06:42 +000052 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +000053 return (PyIntObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +000054 ((PyIntBlock *)p)->next = block_list;
55 block_list = (PyIntBlock *)p;
Tim Peters29c0afc2002-04-28 16:57:34 +000056 /* Link the int objects together, from rear to front, then return
57 the address of the last int object in the block. */
Guido van Rossum3fce8831999-03-12 19:43:17 +000058 p = &((PyIntBlock *)p)->objects[0];
Guido van Rossum3f5da241990-12-20 15:06:42 +000059 q = p + N_INTOBJECTS;
60 while (--q > p)
Christian Heimese93237d2007-12-19 02:37:44 +000061 Py_TYPE(q) = (struct _typeobject *)(q-1);
62 Py_TYPE(q) = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000063 return p + N_INTOBJECTS - 1;
64}
65
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000066#ifndef NSMALLPOSINTS
Georg Brandl418a1ef2006-02-22 11:30:06 +000067#define NSMALLPOSINTS 257
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000068#endif
69#ifndef NSMALLNEGINTS
Neal Norwitzc91ed402002-12-30 22:29:22 +000070#define NSMALLNEGINTS 5
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000071#endif
72#if NSMALLNEGINTS + NSMALLPOSINTS > 0
73/* References to small integers are saved in this array so that they
74 can be shared.
75 The integers that are saved are those in the range
76 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
77*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000079#endif
80#ifdef COUNT_ALLOCS
81int quick_int_allocs, quick_neg_int_allocs;
82#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +000083
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000085PyInt_FromLong(long ival)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 register PyIntObject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000088#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Neal Norwitzc91ed402002-12-30 22:29:22 +000089 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
90 v = small_ints[ival + NSMALLNEGINTS];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000092#ifdef COUNT_ALLOCS
93 if (ival >= 0)
94 quick_int_allocs++;
95 else
96 quick_neg_int_allocs++;
97#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098 return (PyObject *) v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000099 }
100#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000101 if (free_list == NULL) {
102 if ((free_list = fill_free_list()) == NULL)
103 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104 }
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000105 /* Inline PyObject_New */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000106 v = free_list;
Christian Heimese93237d2007-12-19 02:37:44 +0000107 free_list = (PyIntObject *)Py_TYPE(v);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000108 PyObject_INIT(v, &PyInt_Type);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000109 v->ob_ival = ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 return (PyObject *) v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000111}
112
Martin v. Löwis18e16552006-02-15 17:27:45 +0000113PyObject *
114PyInt_FromSize_t(size_t ival)
115{
116 if (ival <= LONG_MAX)
117 return PyInt_FromLong((long)ival);
118 return _PyLong_FromSize_t(ival);
119}
120
121PyObject *
122PyInt_FromSsize_t(Py_ssize_t ival)
123{
124 if (ival >= LONG_MIN && ival <= LONG_MAX)
125 return PyInt_FromLong((long)ival);
126 return _PyLong_FromSsize_t(ival);
127}
128
Guido van Rossum3f5da241990-12-20 15:06:42 +0000129static void
Fred Drakea2f55112000-07-09 15:16:51 +0000130int_dealloc(PyIntObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000131{
Guido van Rossumdea6ef92001-09-11 16:13:52 +0000132 if (PyInt_CheckExact(v)) {
Christian Heimese93237d2007-12-19 02:37:44 +0000133 Py_TYPE(v) = (struct _typeobject *)free_list;
Guido van Rossumbef14172001-08-29 15:47:46 +0000134 free_list = v;
135 }
136 else
Christian Heimese93237d2007-12-19 02:37:44 +0000137 Py_TYPE(v)->tp_free((PyObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138}
139
Guido van Rossum93646982002-04-26 00:53:34 +0000140static void
141int_free(PyIntObject *v)
142{
Christian Heimese93237d2007-12-19 02:37:44 +0000143 Py_TYPE(v) = (struct _typeobject *)free_list;
Guido van Rossum93646982002-04-26 00:53:34 +0000144 free_list = v;
145}
146
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147long
Fred Drakea2f55112000-07-09 15:16:51 +0000148PyInt_AsLong(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 PyNumberMethods *nb;
151 PyIntObject *io;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000152 long val;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000153
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 if (op && PyInt_Check(op))
155 return PyInt_AS_LONG((PyIntObject*) op);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000156
Christian Heimese93237d2007-12-19 02:37:44 +0000157 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000158 nb->nb_int == NULL) {
Guido van Rossumc18a6f42000-05-09 14:27:48 +0000159 PyErr_SetString(PyExc_TypeError, "an integer is required");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160 return -1;
161 }
Tim Petersa3c01ce2001-12-04 23:05:10 +0000162
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 io = (PyIntObject*) (*nb->nb_int) (op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000164 if (io == NULL)
165 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000166 if (!PyInt_Check(io)) {
Walter Dörwaldf1715402002-11-19 20:49:15 +0000167 if (PyLong_Check(io)) {
168 /* got a long? => retry int conversion */
169 val = PyLong_AsLong((PyObject *)io);
Thomas Heller850566b2003-02-20 20:32:11 +0000170 Py_DECREF(io);
171 if ((val == -1) && PyErr_Occurred())
Walter Dörwaldf1715402002-11-19 20:49:15 +0000172 return -1;
Thomas Heller850566b2003-02-20 20:32:11 +0000173 return val;
Walter Dörwaldf1715402002-11-19 20:49:15 +0000174 }
175 else
176 {
Thomas Hellera4ea6032003-04-17 18:55:45 +0000177 Py_DECREF(io);
Walter Dörwaldf1715402002-11-19 20:49:15 +0000178 PyErr_SetString(PyExc_TypeError,
179 "nb_int should return int object");
180 return -1;
181 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000182 }
Tim Petersa3c01ce2001-12-04 23:05:10 +0000183
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184 val = PyInt_AS_LONG(io);
185 Py_DECREF(io);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000186
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000187 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188}
189
Martin v. Löwis18e16552006-02-15 17:27:45 +0000190Py_ssize_t
191PyInt_AsSsize_t(register PyObject *op)
192{
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000193#if SIZEOF_SIZE_T != SIZEOF_LONG
Martin v. Löwis18e16552006-02-15 17:27:45 +0000194 PyNumberMethods *nb;
195 PyIntObject *io;
196 Py_ssize_t val;
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000197#endif
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000198
199 if (op == NULL) {
200 PyErr_SetString(PyExc_TypeError, "an integer is required");
201 return -1;
202 }
203
204 if (PyInt_Check(op))
205 return PyInt_AS_LONG((PyIntObject*) op);
206 if (PyLong_Check(op))
Martin v. Löwis18e16552006-02-15 17:27:45 +0000207 return _PyLong_AsSsize_t(op);
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000208#if SIZEOF_SIZE_T == SIZEOF_LONG
Martin v. Löwis18e16552006-02-15 17:27:45 +0000209 return PyInt_AsLong(op);
210#else
211
Christian Heimese93237d2007-12-19 02:37:44 +0000212 if ((nb = Py_TYPE(op)->tp_as_number) == NULL ||
Martin v. Löwis18e16552006-02-15 17:27:45 +0000213 (nb->nb_int == NULL && nb->nb_long == 0)) {
214 PyErr_SetString(PyExc_TypeError, "an integer is required");
215 return -1;
216 }
217
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +0000218 if (nb->nb_long != 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000219 io = (PyIntObject*) (*nb->nb_long) (op);
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +0000220 else
Martin v. Löwis18e16552006-02-15 17:27:45 +0000221 io = (PyIntObject*) (*nb->nb_int) (op);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000222 if (io == NULL)
223 return -1;
224 if (!PyInt_Check(io)) {
225 if (PyLong_Check(io)) {
226 /* got a long? => retry int conversion */
227 val = _PyLong_AsSsize_t((PyObject *)io);
228 Py_DECREF(io);
229 if ((val == -1) && PyErr_Occurred())
230 return -1;
231 return val;
232 }
233 else
234 {
235 Py_DECREF(io);
236 PyErr_SetString(PyExc_TypeError,
237 "nb_int should return int object");
238 return -1;
239 }
240 }
241
242 val = PyInt_AS_LONG(io);
243 Py_DECREF(io);
244
245 return val;
246#endif
247}
248
Thomas Hellera4ea6032003-04-17 18:55:45 +0000249unsigned long
250PyInt_AsUnsignedLongMask(register PyObject *op)
251{
252 PyNumberMethods *nb;
253 PyIntObject *io;
254 unsigned long val;
255
256 if (op && PyInt_Check(op))
257 return PyInt_AS_LONG((PyIntObject*) op);
258 if (op && PyLong_Check(op))
259 return PyLong_AsUnsignedLongMask(op);
260
Christian Heimese93237d2007-12-19 02:37:44 +0000261 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
Thomas Hellera4ea6032003-04-17 18:55:45 +0000262 nb->nb_int == NULL) {
263 PyErr_SetString(PyExc_TypeError, "an integer is required");
Skip Montanaro429433b2006-04-18 00:35:43 +0000264 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000265 }
266
267 io = (PyIntObject*) (*nb->nb_int) (op);
268 if (io == NULL)
Skip Montanaro429433b2006-04-18 00:35:43 +0000269 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000270 if (!PyInt_Check(io)) {
271 if (PyLong_Check(io)) {
272 val = PyLong_AsUnsignedLongMask((PyObject *)io);
273 Py_DECREF(io);
274 if (PyErr_Occurred())
Skip Montanaro429433b2006-04-18 00:35:43 +0000275 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000276 return val;
277 }
278 else
279 {
280 Py_DECREF(io);
281 PyErr_SetString(PyExc_TypeError,
282 "nb_int should return int object");
Skip Montanaro429433b2006-04-18 00:35:43 +0000283 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000284 }
285 }
286
287 val = PyInt_AS_LONG(io);
288 Py_DECREF(io);
289
290 return val;
291}
292
293#ifdef HAVE_LONG_LONG
294unsigned PY_LONG_LONG
295PyInt_AsUnsignedLongLongMask(register PyObject *op)
296{
297 PyNumberMethods *nb;
298 PyIntObject *io;
299 unsigned PY_LONG_LONG val;
300
301 if (op && PyInt_Check(op))
302 return PyInt_AS_LONG((PyIntObject*) op);
303 if (op && PyLong_Check(op))
304 return PyLong_AsUnsignedLongLongMask(op);
305
Christian Heimese93237d2007-12-19 02:37:44 +0000306 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
Thomas Hellera4ea6032003-04-17 18:55:45 +0000307 nb->nb_int == NULL) {
308 PyErr_SetString(PyExc_TypeError, "an integer is required");
Skip Montanaro429433b2006-04-18 00:35:43 +0000309 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000310 }
311
312 io = (PyIntObject*) (*nb->nb_int) (op);
313 if (io == NULL)
Skip Montanaro429433b2006-04-18 00:35:43 +0000314 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000315 if (!PyInt_Check(io)) {
316 if (PyLong_Check(io)) {
317 val = PyLong_AsUnsignedLongLongMask((PyObject *)io);
318 Py_DECREF(io);
319 if (PyErr_Occurred())
Skip Montanaro429433b2006-04-18 00:35:43 +0000320 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000321 return val;
322 }
323 else
324 {
325 Py_DECREF(io);
326 PyErr_SetString(PyExc_TypeError,
327 "nb_int should return int object");
Skip Montanaro429433b2006-04-18 00:35:43 +0000328 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000329 }
330 }
331
332 val = PyInt_AS_LONG(io);
333 Py_DECREF(io);
334
335 return val;
336}
337#endif
338
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000339PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000340PyInt_FromString(char *s, char **pend, int base)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000341{
342 char *end;
343 long x;
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000344 Py_ssize_t slen;
345 PyObject *sobj, *srepr;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000346
347 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossum47710652003-02-12 20:48:22 +0000348 PyErr_SetString(PyExc_ValueError,
349 "int() base must be >= 2 and <= 36");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000350 return NULL;
351 }
352
353 while (*s && isspace(Py_CHARMASK(*s)))
354 s++;
355 errno = 0;
Guido van Rossum47710652003-02-12 20:48:22 +0000356 if (base == 0 && s[0] == '0') {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000357 x = (long) PyOS_strtoul(s, &end, base);
Guido van Rossum47710652003-02-12 20:48:22 +0000358 if (x < 0)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000359 return PyLong_FromString(s, pend, base);
Guido van Rossum47710652003-02-12 20:48:22 +0000360 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000361 else
362 x = PyOS_strtol(s, &end, base);
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000363 if (end == s || !isalnum(Py_CHARMASK(end[-1])))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000364 goto bad;
365 while (*end && isspace(Py_CHARMASK(*end)))
366 end++;
367 if (*end != '\0') {
368 bad:
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000369 slen = strlen(s) < 200 ? strlen(s) : 200;
370 sobj = PyString_FromStringAndSize(s, slen);
371 if (sobj == NULL)
372 return NULL;
373 srepr = PyObject_Repr(sobj);
374 Py_DECREF(sobj);
375 if (srepr == NULL)
376 return NULL;
377 PyErr_Format(PyExc_ValueError,
378 "invalid literal for int() with base %d: %s",
379 base, PyString_AS_STRING(srepr));
380 Py_DECREF(srepr);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000381 return NULL;
382 }
Tim Petersc8854432004-08-25 02:14:08 +0000383 else if (errno != 0)
Walter Dörwald07e14762002-11-06 16:15:14 +0000384 return PyLong_FromString(s, pend, base);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000385 if (pend)
386 *pend = end;
387 return PyInt_FromLong(x);
388}
389
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000390#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000391PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000392PyInt_FromUnicode(Py_UNICODE *s, Py_ssize_t length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000393{
Walter Dörwald07e14762002-11-06 16:15:14 +0000394 PyObject *result;
Anthony Baxter377be112006-04-11 06:54:30 +0000395 char *buffer = (char *)PyMem_MALLOC(length+1);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000396
Walter Dörwald07e14762002-11-06 16:15:14 +0000397 if (buffer == NULL)
Neal Norwitzd501d1f2007-05-16 04:33:50 +0000398 return PyErr_NoMemory();
Walter Dörwald07e14762002-11-06 16:15:14 +0000399
400 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) {
401 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000402 return NULL;
403 }
Walter Dörwald07e14762002-11-06 16:15:14 +0000404 result = PyInt_FromString(buffer, NULL, base);
405 PyMem_FREE(buffer);
406 return result;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000407}
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000408#endif
Guido van Rossum9e896b32000-04-05 20:11:21 +0000409
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410/* Methods */
411
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000412/* Integers are seen as the "smallest" of all numeric types and thus
413 don't have any knowledge about conversion of other types to
414 integers. */
415
416#define CONVERT_TO_LONG(obj, lng) \
417 if (PyInt_Check(obj)) { \
418 lng = PyInt_AS_LONG(obj); \
419 } \
420 else { \
421 Py_INCREF(Py_NotImplemented); \
422 return Py_NotImplemented; \
423 }
424
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000425/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000426static int
Fred Drakea2f55112000-07-09 15:16:51 +0000427int_print(PyIntObject *v, FILE *fp, int flags)
428 /* flags -- not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429{
Brett Cannon01531592007-09-17 03:28:34 +0000430 long int_val = v->ob_ival;
431 Py_BEGIN_ALLOW_THREADS
432 fprintf(fp, "%ld", int_val);
433 Py_END_ALLOW_THREADS
Guido van Rossum90933611991-06-07 16:10:43 +0000434 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435}
436
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000438int_repr(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439{
Tim Peters42221042001-12-01 02:52:56 +0000440 char buf[64];
Barry Warsaw61975092001-11-28 20:55:34 +0000441 PyOS_snprintf(buf, sizeof(buf), "%ld", v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443}
444
445static int
Fred Drakea2f55112000-07-09 15:16:51 +0000446int_compare(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447{
448 register long i = v->ob_ival;
449 register long j = w->ob_ival;
450 return (i < j) ? -1 : (i > j) ? 1 : 0;
451}
452
Guido van Rossum9bfef441993-03-29 10:43:31 +0000453static long
Fred Drakea2f55112000-07-09 15:16:51 +0000454int_hash(PyIntObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000455{
Guido van Rossum541cdd81997-01-06 22:53:20 +0000456 /* XXX If this is changed, you also need to change the way
457 Python's long, float and complex types are hashed. */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000458 long x = v -> ob_ival;
459 if (x == -1)
460 x = -2;
461 return x;
462}
463
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000465int_add(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466{
467 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000468 CONVERT_TO_LONG(v, a);
469 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470 x = a + b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000471 if ((x^a) >= 0 || (x^b) >= 0)
472 return PyInt_FromLong(x);
Guido van Rossume27f7952001-08-23 02:59:04 +0000473 return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474}
475
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000477int_sub(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000478{
479 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000480 CONVERT_TO_LONG(v, a);
481 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000482 x = a - b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000483 if ((x^a) >= 0 || (x^~b) >= 0)
484 return PyInt_FromLong(x);
Guido van Rossume27f7952001-08-23 02:59:04 +0000485 return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
486 (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487}
488
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000489/*
Tim Petersa3c01ce2001-12-04 23:05:10 +0000490Integer overflow checking for * is painful: Python tried a couple ways, but
491they didn't work on all platforms, or failed in endcases (a product of
492-sys.maxint-1 has been a particular pain).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000493
Tim Petersa3c01ce2001-12-04 23:05:10 +0000494Here's another way:
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000495
Tim Petersa3c01ce2001-12-04 23:05:10 +0000496The native long product x*y is either exactly right or *way* off, being
497just the last n bits of the true product, where n is the number of bits
498in a long (the delivered product is the true product plus i*2**n for
499some integer i).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000500
Tim Petersa3c01ce2001-12-04 23:05:10 +0000501The native double product (double)x * (double)y is subject to three
502rounding errors: on a sizeof(long)==8 box, each cast to double can lose
503info, and even on a sizeof(long)==4 box, the multiplication can lose info.
504But, unlike the native long product, it's not in *range* trouble: even
505if sizeof(long)==32 (256-bit longs), the product easily fits in the
506dynamic range of a double. So the leading 50 (or so) bits of the double
507product are correct.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000508
Tim Petersa3c01ce2001-12-04 23:05:10 +0000509We check these two ways against each other, and declare victory if they're
510approximately the same. Else, because the native long product is the only
511one that can lose catastrophic amounts of information, it's the native long
512product that must have overflowed.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000513*/
514
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515static PyObject *
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000516int_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000517{
Tim Petersa3c01ce2001-12-04 23:05:10 +0000518 long a, b;
519 long longprod; /* a*b in native long arithmetic */
520 double doubled_longprod; /* (double)longprod */
521 double doubleprod; /* (double)a * (double)b */
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000522
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000523 CONVERT_TO_LONG(v, a);
524 CONVERT_TO_LONG(w, b);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000525 longprod = a * b;
526 doubleprod = (double)a * (double)b;
527 doubled_longprod = (double)longprod;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000528
Tim Petersa3c01ce2001-12-04 23:05:10 +0000529 /* Fast path for normal case: small multiplicands, and no info
530 is lost in either method. */
531 if (doubled_longprod == doubleprod)
532 return PyInt_FromLong(longprod);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000533
Tim Petersa3c01ce2001-12-04 23:05:10 +0000534 /* Somebody somewhere lost info. Close enough, or way off? Note
535 that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0).
536 The difference either is or isn't significant compared to the
537 true value (of which doubleprod is a good approximation).
538 */
539 {
540 const double diff = doubled_longprod - doubleprod;
541 const double absdiff = diff >= 0.0 ? diff : -diff;
542 const double absprod = doubleprod >= 0.0 ? doubleprod :
543 -doubleprod;
544 /* absdiff/absprod <= 1/32 iff
545 32 * absdiff <= absprod -- 5 good bits is "close enough" */
546 if (32.0 * absdiff <= absprod)
547 return PyInt_FromLong(longprod);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000548 else
549 return PyLong_Type.tp_as_number->nb_multiply(v, w);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000550 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000551}
552
Armin Rigo7ccbca92006-10-04 12:17:45 +0000553/* Integer overflow checking for unary negation: on a 2's-complement
554 * box, -x overflows iff x is the most negative long. In this case we
555 * get -x == x. However, -x is undefined (by C) if x /is/ the most
556 * negative long (it's a signed overflow case), and some compilers care.
557 * So we cast x to unsigned long first. However, then other compilers
558 * warn about applying unary minus to an unsigned operand. Hence the
559 * weird "0-".
560 */
561#define UNARY_NEG_WOULD_OVERFLOW(x) \
562 ((x) < 0 && (unsigned long)(x) == 0-(unsigned long)(x))
563
Guido van Rossume27f7952001-08-23 02:59:04 +0000564/* Return type of i_divmod */
565enum divmod_result {
566 DIVMOD_OK, /* Correct result */
567 DIVMOD_OVERFLOW, /* Overflow, try again using longs */
568 DIVMOD_ERROR /* Exception raised */
569};
570
571static enum divmod_result
Tim Peters1dad6a82001-06-18 19:21:11 +0000572i_divmod(register long x, register long y,
Fred Drakea2f55112000-07-09 15:16:51 +0000573 long *p_xdivy, long *p_xmody)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000575 long xdivy, xmody;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000576
Tim Peters1dad6a82001-06-18 19:21:11 +0000577 if (y == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000579 "integer division or modulo by zero");
Guido van Rossume27f7952001-08-23 02:59:04 +0000580 return DIVMOD_ERROR;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000581 }
Tim Peters1dad6a82001-06-18 19:21:11 +0000582 /* (-sys.maxint-1)/-1 is the only overflow case. */
Armin Rigo7ccbca92006-10-04 12:17:45 +0000583 if (y == -1 && UNARY_NEG_WOULD_OVERFLOW(x))
Guido van Rossume27f7952001-08-23 02:59:04 +0000584 return DIVMOD_OVERFLOW;
Tim Peters1dad6a82001-06-18 19:21:11 +0000585 xdivy = x / y;
586 xmody = x - xdivy * y;
587 /* If the signs of x and y differ, and the remainder is non-0,
588 * C89 doesn't define whether xdivy is now the floor or the
589 * ceiling of the infinitely precise quotient. We want the floor,
590 * and we have it iff the remainder's sign matches y's.
591 */
592 if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
593 xmody += y;
594 --xdivy;
595 assert(xmody && ((y ^ xmody) >= 0));
Guido van Rossum00466951991-05-05 20:08:27 +0000596 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000597 *p_xdivy = xdivy;
598 *p_xmody = xmody;
Guido van Rossume27f7952001-08-23 02:59:04 +0000599 return DIVMOD_OK;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000600}
601
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000603int_div(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000604{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000605 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000606 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000607 CONVERT_TO_LONG(x, xi);
608 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000609 switch (i_divmod(xi, yi, &d, &m)) {
610 case DIVMOD_OK:
611 return PyInt_FromLong(d);
612 case DIVMOD_OVERFLOW:
613 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
614 (PyObject *)y);
615 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000616 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000617 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000618}
619
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000621int_classic_div(PyIntObject *x, PyIntObject *y)
622{
623 long xi, yi;
624 long d, m;
625 CONVERT_TO_LONG(x, xi);
626 CONVERT_TO_LONG(y, yi);
627 if (Py_DivisionWarningFlag &&
628 PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0)
629 return NULL;
630 switch (i_divmod(xi, yi, &d, &m)) {
631 case DIVMOD_OK:
632 return PyInt_FromLong(d);
633 case DIVMOD_OVERFLOW:
634 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
635 (PyObject *)y);
636 default:
637 return NULL;
638 }
639}
640
641static PyObject *
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000642int_true_divide(PyObject *v, PyObject *w)
643{
Tim Peterse2a60002001-09-04 06:17:36 +0000644 /* If they aren't both ints, give someone else a chance. In
645 particular, this lets int/long get handled by longs, which
646 underflows to 0 gracefully if the long is too big to convert
647 to float. */
648 if (PyInt_Check(v) && PyInt_Check(w))
649 return PyFloat_Type.tp_as_number->nb_true_divide(v, w);
650 Py_INCREF(Py_NotImplemented);
651 return Py_NotImplemented;
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000652}
653
654static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000655int_mod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000656{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000657 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000658 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000659 CONVERT_TO_LONG(x, xi);
660 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000661 switch (i_divmod(xi, yi, &d, &m)) {
662 case DIVMOD_OK:
663 return PyInt_FromLong(m);
664 case DIVMOD_OVERFLOW:
665 return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x,
666 (PyObject *)y);
667 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000668 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000669 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000670}
671
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000673int_divmod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000674{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000675 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000676 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000677 CONVERT_TO_LONG(x, xi);
678 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000679 switch (i_divmod(xi, yi, &d, &m)) {
680 case DIVMOD_OK:
681 return Py_BuildValue("(ll)", d, m);
682 case DIVMOD_OVERFLOW:
683 return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x,
684 (PyObject *)y);
685 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000686 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000687 }
Guido van Rossum00466951991-05-05 20:08:27 +0000688}
689
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000691int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000692{
Guido van Rossum9478dd41996-12-06 20:14:43 +0000693 register long iv, iw, iz=0, ix, temp, prev;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000694 CONVERT_TO_LONG(v, iv);
695 CONVERT_TO_LONG(w, iw);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000696 if (iw < 0) {
Tim Peters32f453e2001-09-03 08:35:41 +0000697 if ((PyObject *)z != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +0000698 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
699 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +0000700 return NULL;
701 }
Guido van Rossumb82fedc2001-07-12 11:19:45 +0000702 /* Return a float. This works because we know that
703 this calls float_pow() which converts its
704 arguments to double. */
705 return PyFloat_Type.tp_as_number->nb_power(
706 (PyObject *)v, (PyObject *)w, (PyObject *)z);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000707 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 if ((PyObject *)z != Py_None) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000709 CONVERT_TO_LONG(z, iz);
Guido van Rossum9478dd41996-12-06 20:14:43 +0000710 if (iz == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 PyErr_SetString(PyExc_ValueError,
Tim Peters4c483c42001-09-05 06:24:58 +0000712 "pow() 3rd argument cannot be 0");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000713 return NULL;
714 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000715 }
716 /*
717 * XXX: The original exponentiation code stopped looping
718 * when temp hit zero; this code will continue onwards
719 * unnecessarily, but at least it won't cause any errors.
720 * Hopefully the speed improvement from the fast exponentiation
721 * will compensate for the slight inefficiency.
722 * XXX: Better handling of overflows is desperately needed.
723 */
724 temp = iv;
725 ix = 1;
726 while (iw > 0) {
727 prev = ix; /* Save value for overflow check */
Tim Petersa3c01ce2001-12-04 23:05:10 +0000728 if (iw & 1) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000729 ix = ix*temp;
730 if (temp == 0)
731 break; /* Avoid ix / 0 */
Guido van Rossume27f7952001-08-23 02:59:04 +0000732 if (ix / temp != prev) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000733 return PyLong_Type.tp_as_number->nb_power(
734 (PyObject *)v,
735 (PyObject *)w,
Tim Peters31960db2001-08-23 21:28:33 +0000736 (PyObject *)z);
Guido van Rossume27f7952001-08-23 02:59:04 +0000737 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000738 }
739 iw >>= 1; /* Shift exponent down by 1 bit */
740 if (iw==0) break;
741 prev = temp;
742 temp *= temp; /* Square the value of temp */
Tim Petersc8854432004-08-25 02:14:08 +0000743 if (prev != 0 && temp / prev != prev) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000744 return PyLong_Type.tp_as_number->nb_power(
745 (PyObject *)v, (PyObject *)w, (PyObject *)z);
746 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000747 if (iz) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000748 /* If we did a multiplication, perform a modulo */
749 ix = ix % iz;
750 temp = temp % iz;
751 }
752 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000753 if (iz) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000754 long div, mod;
Guido van Rossume27f7952001-08-23 02:59:04 +0000755 switch (i_divmod(ix, iz, &div, &mod)) {
756 case DIVMOD_OK:
757 ix = mod;
758 break;
759 case DIVMOD_OVERFLOW:
760 return PyLong_Type.tp_as_number->nb_power(
761 (PyObject *)v, (PyObject *)w, (PyObject *)z);
762 default:
763 return NULL;
764 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000765 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 return PyInt_FromLong(ix);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000767}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000768
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000770int_neg(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000771{
Martin v. Löwis820d6ac2006-10-04 05:47:34 +0000772 register long a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000773 a = v->ob_ival;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000774 /* check for overflow */
775 if (UNARY_NEG_WOULD_OVERFLOW(a)) {
Tim Petersc8854432004-08-25 02:14:08 +0000776 PyObject *o = PyLong_FromLong(a);
Neal Norwitzfa56e2d2003-01-19 15:40:09 +0000777 if (o != NULL) {
778 PyObject *result = PyNumber_Negative(o);
779 Py_DECREF(o);
780 return result;
781 }
782 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000783 }
Martin v. Löwis820d6ac2006-10-04 05:47:34 +0000784 return PyInt_FromLong(-a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000785}
786
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000788int_abs(PyIntObject *v)
Guido van Rossum00466951991-05-05 20:08:27 +0000789{
790 if (v->ob_ival >= 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000791 return int_int(v);
Guido van Rossum00466951991-05-05 20:08:27 +0000792 else
793 return int_neg(v);
794}
795
Guido van Rossum0bff0151991-05-14 12:05:32 +0000796static int
Fred Drakea2f55112000-07-09 15:16:51 +0000797int_nonzero(PyIntObject *v)
Guido van Rossum0bff0151991-05-14 12:05:32 +0000798{
799 return v->ob_ival != 0;
800}
801
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000803int_invert(PyIntObject *v)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000804{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000806}
807
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000808static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000809int_lshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000810{
Guido van Rossum078151d2002-08-11 04:24:12 +0000811 long a, b, c;
Raymond Hettingera006c372004-06-26 23:22:57 +0000812 PyObject *vv, *ww, *result;
813
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000814 CONVERT_TO_LONG(v, a);
815 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000816 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000818 return NULL;
819 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000820 if (a == 0 || b == 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000821 return int_int(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000822 if (b >= LONG_BIT) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000823 vv = PyLong_FromLong(PyInt_AS_LONG(v));
824 if (vv == NULL)
825 return NULL;
826 ww = PyLong_FromLong(PyInt_AS_LONG(w));
827 if (ww == NULL) {
828 Py_DECREF(vv);
829 return NULL;
830 }
831 result = PyNumber_Lshift(vv, ww);
832 Py_DECREF(vv);
833 Py_DECREF(ww);
834 return result;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000835 }
Tim Petersda1a2212002-08-11 17:54:42 +0000836 c = a << b;
837 if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000838 vv = PyLong_FromLong(PyInt_AS_LONG(v));
839 if (vv == NULL)
840 return NULL;
841 ww = PyLong_FromLong(PyInt_AS_LONG(w));
842 if (ww == NULL) {
843 Py_DECREF(vv);
844 return NULL;
845 }
846 result = PyNumber_Lshift(vv, ww);
847 Py_DECREF(vv);
848 Py_DECREF(ww);
849 return result;
Guido van Rossum078151d2002-08-11 04:24:12 +0000850 }
851 return PyInt_FromLong(c);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000852}
853
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000855int_rshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000856{
857 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000858 CONVERT_TO_LONG(v, a);
859 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000860 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000862 return NULL;
863 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000864 if (a == 0 || b == 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000865 return int_int(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000866 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000867 if (a < 0)
868 a = -1;
869 else
870 a = 0;
871 }
872 else {
Tim Peters7d3a5112000-07-08 04:17:21 +0000873 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000874 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000875 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000876}
877
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000879int_and(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000880{
881 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000882 CONVERT_TO_LONG(v, a);
883 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 return PyInt_FromLong(a & b);
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_xor(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_or(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 Rossum1952e382001-09-19 01:25:16 +0000905static int
906int_coerce(PyObject **pv, PyObject **pw)
907{
908 if (PyInt_Check(*pw)) {
909 Py_INCREF(*pv);
910 Py_INCREF(*pw);
911 return 0;
912 }
913 return 1; /* Can't do it */
914}
915
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000917int_int(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000918{
Brett Cannonc3647ac2005-04-26 03:45:26 +0000919 if (PyInt_CheckExact(v))
920 Py_INCREF(v);
921 else
922 v = (PyIntObject *)PyInt_FromLong(v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000924}
925
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000927int_long(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000928{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000930}
931
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000933int_float(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000934{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000936}
937
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000939int_oct(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000940{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000941 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000942 long x = v -> ob_ival;
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000943 if (x < 0)
944 PyOS_snprintf(buf, sizeof(buf), "-0%lo", -x);
945 else if (x == 0)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000946 strcpy(buf, "0");
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000947 else
Barry Warsaw61975092001-11-28 20:55:34 +0000948 PyOS_snprintf(buf, sizeof(buf), "0%lo", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000950}
951
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000953int_hex(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000954{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000955 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000956 long x = v -> ob_ival;
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000957 if (x < 0)
958 PyOS_snprintf(buf, sizeof(buf), "-0x%lx", -x);
959 else
960 PyOS_snprintf(buf, sizeof(buf), "0x%lx", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000962}
963
Jeremy Hylton938ace62002-07-17 16:30:39 +0000964static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +0000965int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
966
Tim Peters6d6c1a32001-08-02 04:15:00 +0000967static PyObject *
968int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
969{
970 PyObject *x = NULL;
971 int base = -909;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000972 static char *kwlist[] = {"x", "base", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000973
Guido van Rossumbef14172001-08-29 15:47:46 +0000974 if (type != &PyInt_Type)
975 return int_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000976 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
977 &x, &base))
978 return NULL;
979 if (x == NULL)
980 return PyInt_FromLong(0L);
981 if (base == -909)
982 return PyNumber_Int(x);
Georg Brandl2c1375c2006-10-12 11:27:59 +0000983 if (PyString_Check(x)) {
984 /* Since PyInt_FromString doesn't have a length parameter,
985 * check here for possible NULs in the string. */
986 char *string = PyString_AS_STRING(x);
987 if (strlen(string) != PyString_Size(x)) {
988 /* create a repr() of the input string,
989 * just like PyInt_FromString does */
990 PyObject *srepr;
991 srepr = PyObject_Repr(x);
992 if (srepr == NULL)
993 return NULL;
994 PyErr_Format(PyExc_ValueError,
995 "invalid literal for int() with base %d: %s",
996 base, PyString_AS_STRING(srepr));
997 Py_DECREF(srepr);
998 return NULL;
999 }
1000 return PyInt_FromString(string, NULL, base);
1001 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001002#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00001003 if (PyUnicode_Check(x))
1004 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
1005 PyUnicode_GET_SIZE(x),
1006 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001007#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00001008 PyErr_SetString(PyExc_TypeError,
1009 "int() can't convert non-string with explicit base");
1010 return NULL;
1011}
1012
Guido van Rossumbef14172001-08-29 15:47:46 +00001013/* Wimpy, slow approach to tp_new calls for subtypes of int:
1014 first create a regular int from whatever arguments we got,
1015 then allocate a subtype instance and initialize its ob_ival
1016 from the regular int. The regular int is then thrown away.
1017*/
1018static PyObject *
1019int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1020{
Anthony Baxter377be112006-04-11 06:54:30 +00001021 PyObject *tmp, *newobj;
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001022 long ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001023
1024 assert(PyType_IsSubtype(type, &PyInt_Type));
1025 tmp = int_new(&PyInt_Type, args, kwds);
1026 if (tmp == NULL)
1027 return NULL;
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001028 if (!PyInt_Check(tmp)) {
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001029 ival = PyLong_AsLong(tmp);
Michael W. Hudson71665dc2003-08-11 17:32:02 +00001030 if (ival == -1 && PyErr_Occurred()) {
1031 Py_DECREF(tmp);
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001032 return NULL;
Michael W. Hudson71665dc2003-08-11 17:32:02 +00001033 }
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001034 } else {
1035 ival = ((PyIntObject *)tmp)->ob_ival;
1036 }
1037
Anthony Baxter377be112006-04-11 06:54:30 +00001038 newobj = type->tp_alloc(type, 0);
1039 if (newobj == NULL) {
Raymond Hettingerf4667932003-06-28 20:04:25 +00001040 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00001041 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00001042 }
Anthony Baxter377be112006-04-11 06:54:30 +00001043 ((PyIntObject *)newobj)->ob_ival = ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001044 Py_DECREF(tmp);
Anthony Baxter377be112006-04-11 06:54:30 +00001045 return newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001046}
1047
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001048static PyObject *
1049int_getnewargs(PyIntObject *v)
1050{
1051 return Py_BuildValue("(l)", v->ob_ival);
1052}
1053
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001054static PyObject *
1055int_getN(PyIntObject *v, void *context) {
1056 return PyInt_FromLong((intptr_t)context);
1057}
1058
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001059static PyMethodDef int_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001060 {"conjugate", (PyCFunction)int_int, METH_NOARGS,
1061 "Returns self, the complex conjugate of any int."},
1062 {"__trunc__", (PyCFunction)int_int, METH_NOARGS,
1063 "Truncating an Integral returns itself."},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001064 {"__getnewargs__", (PyCFunction)int_getnewargs, METH_NOARGS},
1065 {NULL, NULL} /* sentinel */
1066};
1067
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001068static PyGetSetDef int_getset[] = {
1069 {"real",
1070 (getter)int_int, (setter)NULL,
1071 "the real part of a complex number",
1072 NULL},
1073 {"imag",
1074 (getter)int_getN, (setter)NULL,
1075 "the imaginary part of a complex number",
1076 (void*)0},
1077 {"numerator",
1078 (getter)int_int, (setter)NULL,
1079 "the numerator of a rational number in lowest terms",
1080 NULL},
1081 {"denominator",
1082 (getter)int_getN, (setter)NULL,
1083 "the denominator of a rational number in lowest terms",
1084 (void*)1},
1085 {NULL} /* Sentinel */
1086};
1087
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001088PyDoc_STRVAR(int_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001089"int(x[, base]) -> integer\n\
1090\n\
1091Convert a string or number to an integer, if possible. A floating point\n\
1092argument will be truncated towards zero (this does not include a string\n\
1093representation of a floating point number!) When converting a string, use\n\
1094the optional base. It is an error to supply a base when converting a\n\
Gustavo Niemeyer37e65022007-01-10 16:15:48 +00001095non-string. If base is zero, the proper base is guessed based on the\n\
Gustavo Niemeyera443bc82007-01-10 16:13:40 +00001096string content. If the argument is outside the integer range a\n\
1097long object will be returned instead.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001098
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001099static PyNumberMethods int_as_number = {
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001100 (binaryfunc)int_add, /*nb_add*/
1101 (binaryfunc)int_sub, /*nb_subtract*/
1102 (binaryfunc)int_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00001103 (binaryfunc)int_classic_div, /*nb_divide*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001104 (binaryfunc)int_mod, /*nb_remainder*/
1105 (binaryfunc)int_divmod, /*nb_divmod*/
1106 (ternaryfunc)int_pow, /*nb_power*/
1107 (unaryfunc)int_neg, /*nb_negative*/
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001108 (unaryfunc)int_int, /*nb_positive*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001109 (unaryfunc)int_abs, /*nb_absolute*/
1110 (inquiry)int_nonzero, /*nb_nonzero*/
1111 (unaryfunc)int_invert, /*nb_invert*/
1112 (binaryfunc)int_lshift, /*nb_lshift*/
1113 (binaryfunc)int_rshift, /*nb_rshift*/
1114 (binaryfunc)int_and, /*nb_and*/
1115 (binaryfunc)int_xor, /*nb_xor*/
1116 (binaryfunc)int_or, /*nb_or*/
Guido van Rossum1952e382001-09-19 01:25:16 +00001117 int_coerce, /*nb_coerce*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001118 (unaryfunc)int_int, /*nb_int*/
1119 (unaryfunc)int_long, /*nb_long*/
1120 (unaryfunc)int_float, /*nb_float*/
1121 (unaryfunc)int_oct, /*nb_oct*/
1122 (unaryfunc)int_hex, /*nb_hex*/
1123 0, /*nb_inplace_add*/
1124 0, /*nb_inplace_subtract*/
1125 0, /*nb_inplace_multiply*/
1126 0, /*nb_inplace_divide*/
1127 0, /*nb_inplace_remainder*/
1128 0, /*nb_inplace_power*/
1129 0, /*nb_inplace_lshift*/
1130 0, /*nb_inplace_rshift*/
1131 0, /*nb_inplace_and*/
1132 0, /*nb_inplace_xor*/
1133 0, /*nb_inplace_or*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001134 (binaryfunc)int_div, /* nb_floor_divide */
1135 int_true_divide, /* nb_true_divide */
1136 0, /* nb_inplace_floor_divide */
1137 0, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001138 (unaryfunc)int_int, /* nb_index */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001139};
1140
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141PyTypeObject PyInt_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001142 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001143 "int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001144 sizeof(PyIntObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001145 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001146 (destructor)int_dealloc, /* tp_dealloc */
1147 (printfunc)int_print, /* tp_print */
1148 0, /* tp_getattr */
1149 0, /* tp_setattr */
1150 (cmpfunc)int_compare, /* tp_compare */
1151 (reprfunc)int_repr, /* tp_repr */
1152 &int_as_number, /* tp_as_number */
1153 0, /* tp_as_sequence */
1154 0, /* tp_as_mapping */
1155 (hashfunc)int_hash, /* tp_hash */
1156 0, /* tp_call */
Guido van Rossume75bfde2002-02-01 15:34:10 +00001157 (reprfunc)int_repr, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001158 PyObject_GenericGetAttr, /* tp_getattro */
1159 0, /* tp_setattro */
1160 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00001161 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00001162 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001163 int_doc, /* tp_doc */
1164 0, /* tp_traverse */
1165 0, /* tp_clear */
1166 0, /* tp_richcompare */
1167 0, /* tp_weaklistoffset */
1168 0, /* tp_iter */
1169 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001170 int_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001171 0, /* tp_members */
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001172 int_getset, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001173 0, /* tp_base */
1174 0, /* tp_dict */
1175 0, /* tp_descr_get */
1176 0, /* tp_descr_set */
1177 0, /* tp_dictoffset */
1178 0, /* tp_init */
1179 0, /* tp_alloc */
1180 int_new, /* tp_new */
Guido van Rossum93646982002-04-26 00:53:34 +00001181 (freefunc)int_free, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001182};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001183
Neal Norwitzc91ed402002-12-30 22:29:22 +00001184int
Neal Norwitzb2501f42002-12-31 03:42:13 +00001185_PyInt_Init(void)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001186{
1187 PyIntObject *v;
1188 int ival;
1189#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1190 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
Raymond Hettingerb32e6402004-02-08 18:54:37 +00001191 if (!free_list && (free_list = fill_free_list()) == NULL)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001192 return 0;
1193 /* PyObject_New is inlined */
1194 v = free_list;
Christian Heimese93237d2007-12-19 02:37:44 +00001195 free_list = (PyIntObject *)Py_TYPE(v);
Neal Norwitzc91ed402002-12-30 22:29:22 +00001196 PyObject_INIT(v, &PyInt_Type);
1197 v->ob_ival = ival;
1198 small_ints[ival + NSMALLNEGINTS] = v;
1199 }
1200#endif
1201 return 1;
1202}
1203
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001204void
Christian Heimes422051a2008-02-04 18:00:12 +00001205PyInt_CompactFreeList(size_t *pbc, size_t *pbf, size_t *bsum)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001206{
Guido van Rossum3fce8831999-03-12 19:43:17 +00001207 PyIntObject *p;
1208 PyIntBlock *list, *next;
Skip Montanaro429433b2006-04-18 00:35:43 +00001209 unsigned int ctr;
Christian Heimes422051a2008-02-04 18:00:12 +00001210 size_t bc = 0, bf = 0; /* block count, number of freed blocks */
1211 size_t isum = 0; /* total unfreed ints */
1212 int irem; /* remaining unfreed ints per block */
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001213
Guido van Rossumda084ed1999-03-10 22:55:24 +00001214 list = block_list;
1215 block_list = NULL;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001216 free_list = NULL;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001217 while (list != NULL) {
Guido van Rossumda084ed1999-03-10 22:55:24 +00001218 bc++;
1219 irem = 0;
Skip Montanaro429433b2006-04-18 00:35:43 +00001220 for (ctr = 0, p = &list->objects[0];
1221 ctr < N_INTOBJECTS;
1222 ctr++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001223 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Guido van Rossumda084ed1999-03-10 22:55:24 +00001224 irem++;
1225 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001226 next = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001227 if (irem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001228 list->next = block_list;
1229 block_list = list;
Skip Montanaro429433b2006-04-18 00:35:43 +00001230 for (ctr = 0, p = &list->objects[0];
1231 ctr < N_INTOBJECTS;
1232 ctr++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001233 if (!PyInt_CheckExact(p) ||
Guido van Rossumbef14172001-08-29 15:47:46 +00001234 p->ob_refcnt == 0) {
Christian Heimese93237d2007-12-19 02:37:44 +00001235 Py_TYPE(p) = (struct _typeobject *)
Guido van Rossum51288bc1999-03-19 20:30:39 +00001236 free_list;
1237 free_list = p;
1238 }
1239#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1240 else if (-NSMALLNEGINTS <= p->ob_ival &&
1241 p->ob_ival < NSMALLPOSINTS &&
1242 small_ints[p->ob_ival +
1243 NSMALLNEGINTS] == NULL) {
1244 Py_INCREF(p);
1245 small_ints[p->ob_ival +
1246 NSMALLNEGINTS] = p;
1247 }
1248#endif
1249 }
Guido van Rossumda084ed1999-03-10 22:55:24 +00001250 }
1251 else {
Tim Peters29c0afc2002-04-28 16:57:34 +00001252 PyMem_FREE(list);
Guido van Rossumda084ed1999-03-10 22:55:24 +00001253 bf++;
1254 }
1255 isum += irem;
Guido van Rossum3fce8831999-03-12 19:43:17 +00001256 list = next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001257 }
Christian Heimes422051a2008-02-04 18:00:12 +00001258
1259 *pbc = bc;
1260 *pbf = bf;
1261 *bsum = isum;
1262}
1263
1264void
1265PyInt_Fini(void)
1266{
1267 PyIntObject *p;
1268 PyIntBlock *list;
1269 unsigned int ctr;
1270 size_t bc, bf; /* block count, number of freed blocks */
1271 size_t isum; /* total unfreed ints per block */
1272
1273#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1274 int i;
1275 PyIntObject **q;
1276
1277 i = NSMALLNEGINTS + NSMALLPOSINTS;
1278 q = small_ints;
1279 while (--i >= 0) {
1280 Py_XDECREF(*q);
1281 *q++ = NULL;
1282 }
1283#endif
1284 PyInt_CompactFreeList(&bc, &bf, &isum);
Guido van Rossum3fce8831999-03-12 19:43:17 +00001285 if (!Py_VerboseFlag)
1286 return;
1287 fprintf(stderr, "# cleanup ints");
1288 if (!isum) {
1289 fprintf(stderr, "\n");
1290 }
1291 else {
1292 fprintf(stderr,
Christian Heimes422051a2008-02-04 18:00:12 +00001293 ": %" PY_FORMAT_SIZE_T "d unfreed ints%s in %"
1294 PY_FORMAT_SIZE_T "d out of %"
1295 PY_FORMAT_SIZE_T "d block%s\n",
Guido van Rossum3fce8831999-03-12 19:43:17 +00001296 isum, isum == 1 ? "" : "s",
1297 bc - bf, bc, bc == 1 ? "" : "s");
1298 }
1299 if (Py_VerboseFlag > 1) {
1300 list = block_list;
1301 while (list != NULL) {
Skip Montanaro429433b2006-04-18 00:35:43 +00001302 for (ctr = 0, p = &list->objects[0];
1303 ctr < N_INTOBJECTS;
1304 ctr++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001305 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001306 /* XXX(twouters) cast refcount to
1307 long until %zd is universally
1308 available
1309 */
Guido van Rossum3fce8831999-03-12 19:43:17 +00001310 fprintf(stderr,
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001311 "# <int at %p, refcnt=%ld, val=%ld>\n",
1312 p, (long)p->ob_refcnt,
1313 p->ob_ival);
Guido van Rossum3fce8831999-03-12 19:43:17 +00001314 }
1315 list = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001316 }
1317 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001318}