blob: e73c92138c18a280fb39057f8cafbc5495c1e8c4 [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;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000370 sobj = PyString_FromStringAndSize(s, slen);
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000371 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",
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000379 base, PyString_AS_STRING(srepr));
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000380 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{
Eric Smith5e527eb2008-02-10 01:36:53 +0000440 return _PyInt_Format(v, 10, 0);
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_abs(PyIntObject *v)
Guido van Rossum00466951991-05-05 20:08:27 +0000787{
788 if (v->ob_ival >= 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000789 return int_int(v);
Guido van Rossum00466951991-05-05 20:08:27 +0000790 else
791 return int_neg(v);
792}
793
Guido van Rossum0bff0151991-05-14 12:05:32 +0000794static int
Fred Drakea2f55112000-07-09 15:16:51 +0000795int_nonzero(PyIntObject *v)
Guido van Rossum0bff0151991-05-14 12:05:32 +0000796{
797 return v->ob_ival != 0;
798}
799
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000801int_invert(PyIntObject *v)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000802{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000804}
805
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000807int_lshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000808{
Guido van Rossum078151d2002-08-11 04:24:12 +0000809 long a, b, c;
Raymond Hettingera006c372004-06-26 23:22:57 +0000810 PyObject *vv, *ww, *result;
811
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000812 CONVERT_TO_LONG(v, a);
813 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000814 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000816 return NULL;
817 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000818 if (a == 0 || b == 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000819 return int_int(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000820 if (b >= LONG_BIT) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000821 vv = PyLong_FromLong(PyInt_AS_LONG(v));
822 if (vv == NULL)
823 return NULL;
824 ww = PyLong_FromLong(PyInt_AS_LONG(w));
825 if (ww == NULL) {
826 Py_DECREF(vv);
827 return NULL;
828 }
829 result = PyNumber_Lshift(vv, ww);
830 Py_DECREF(vv);
831 Py_DECREF(ww);
832 return result;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000833 }
Tim Petersda1a2212002-08-11 17:54:42 +0000834 c = a << b;
835 if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000836 vv = PyLong_FromLong(PyInt_AS_LONG(v));
837 if (vv == NULL)
838 return NULL;
839 ww = PyLong_FromLong(PyInt_AS_LONG(w));
840 if (ww == NULL) {
841 Py_DECREF(vv);
842 return NULL;
843 }
844 result = PyNumber_Lshift(vv, ww);
845 Py_DECREF(vv);
846 Py_DECREF(ww);
847 return result;
Guido van Rossum078151d2002-08-11 04:24:12 +0000848 }
849 return PyInt_FromLong(c);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000850}
851
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000853int_rshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000854{
855 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000856 CONVERT_TO_LONG(v, a);
857 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000858 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000860 return NULL;
861 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000862 if (a == 0 || b == 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000863 return int_int(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000864 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000865 if (a < 0)
866 a = -1;
867 else
868 a = 0;
869 }
870 else {
Tim Peters7d3a5112000-07-08 04:17:21 +0000871 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000872 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000874}
875
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000877int_and(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000878{
879 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000880 CONVERT_TO_LONG(v, a);
881 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 return PyInt_FromLong(a & b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000883}
884
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000886int_xor(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000887{
888 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000889 CONVERT_TO_LONG(v, a);
890 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000891 return PyInt_FromLong(a ^ b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000892}
893
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000894static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000895int_or(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000896{
897 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000898 CONVERT_TO_LONG(v, a);
899 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 return PyInt_FromLong(a | b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000901}
902
Guido van Rossum1952e382001-09-19 01:25:16 +0000903static int
904int_coerce(PyObject **pv, PyObject **pw)
905{
906 if (PyInt_Check(*pw)) {
907 Py_INCREF(*pv);
908 Py_INCREF(*pw);
909 return 0;
910 }
911 return 1; /* Can't do it */
912}
913
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000914static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000915int_int(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000916{
Brett Cannonc3647ac2005-04-26 03:45:26 +0000917 if (PyInt_CheckExact(v))
918 Py_INCREF(v);
919 else
920 v = (PyIntObject *)PyInt_FromLong(v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000921 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000922}
923
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000924static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000925int_long(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000926{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000928}
929
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000931int_float(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000932{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000934}
935
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000937int_oct(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000938{
Eric Smith5e527eb2008-02-10 01:36:53 +0000939 return _PyInt_Format(v, 8, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000940}
941
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000943int_hex(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000944{
Eric Smith5e527eb2008-02-10 01:36:53 +0000945 return _PyInt_Format(v, 16, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000946}
947
Jeremy Hylton938ace62002-07-17 16:30:39 +0000948static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +0000949int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
950
Tim Peters6d6c1a32001-08-02 04:15:00 +0000951static PyObject *
952int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
953{
954 PyObject *x = NULL;
955 int base = -909;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000956 static char *kwlist[] = {"x", "base", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000957
Guido van Rossumbef14172001-08-29 15:47:46 +0000958 if (type != &PyInt_Type)
959 return int_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000960 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
961 &x, &base))
962 return NULL;
963 if (x == NULL)
964 return PyInt_FromLong(0L);
965 if (base == -909)
966 return PyNumber_Int(x);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000967 if (PyString_Check(x)) {
Georg Brandl2c1375c2006-10-12 11:27:59 +0000968 /* Since PyInt_FromString doesn't have a length parameter,
969 * check here for possible NULs in the string. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000970 char *string = PyString_AS_STRING(x);
971 if (strlen(string) != PyString_Size(x)) {
Georg Brandl2c1375c2006-10-12 11:27:59 +0000972 /* create a repr() of the input string,
973 * just like PyInt_FromString does */
974 PyObject *srepr;
975 srepr = PyObject_Repr(x);
976 if (srepr == NULL)
977 return NULL;
978 PyErr_Format(PyExc_ValueError,
979 "invalid literal for int() with base %d: %s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000980 base, PyString_AS_STRING(srepr));
Georg Brandl2c1375c2006-10-12 11:27:59 +0000981 Py_DECREF(srepr);
982 return NULL;
983 }
984 return PyInt_FromString(string, NULL, base);
985 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000986#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000987 if (PyUnicode_Check(x))
988 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
989 PyUnicode_GET_SIZE(x),
990 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000991#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000992 PyErr_SetString(PyExc_TypeError,
993 "int() can't convert non-string with explicit base");
994 return NULL;
995}
996
Guido van Rossumbef14172001-08-29 15:47:46 +0000997/* Wimpy, slow approach to tp_new calls for subtypes of int:
998 first create a regular int from whatever arguments we got,
999 then allocate a subtype instance and initialize its ob_ival
1000 from the regular int. The regular int is then thrown away.
1001*/
1002static PyObject *
1003int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1004{
Anthony Baxter377be112006-04-11 06:54:30 +00001005 PyObject *tmp, *newobj;
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001006 long ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001007
1008 assert(PyType_IsSubtype(type, &PyInt_Type));
1009 tmp = int_new(&PyInt_Type, args, kwds);
1010 if (tmp == NULL)
1011 return NULL;
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001012 if (!PyInt_Check(tmp)) {
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001013 ival = PyLong_AsLong(tmp);
Michael W. Hudson71665dc2003-08-11 17:32:02 +00001014 if (ival == -1 && PyErr_Occurred()) {
1015 Py_DECREF(tmp);
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001016 return NULL;
Michael W. Hudson71665dc2003-08-11 17:32:02 +00001017 }
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001018 } else {
1019 ival = ((PyIntObject *)tmp)->ob_ival;
1020 }
1021
Anthony Baxter377be112006-04-11 06:54:30 +00001022 newobj = type->tp_alloc(type, 0);
1023 if (newobj == NULL) {
Raymond Hettingerf4667932003-06-28 20:04:25 +00001024 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00001025 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00001026 }
Anthony Baxter377be112006-04-11 06:54:30 +00001027 ((PyIntObject *)newobj)->ob_ival = ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001028 Py_DECREF(tmp);
Anthony Baxter377be112006-04-11 06:54:30 +00001029 return newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001030}
1031
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001032static PyObject *
1033int_getnewargs(PyIntObject *v)
1034{
1035 return Py_BuildValue("(l)", v->ob_ival);
1036}
1037
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001038static PyObject *
1039int_getN(PyIntObject *v, void *context) {
Jeffrey Yasskin5de250e2008-03-18 01:09:59 +00001040 return PyInt_FromLong((Py_intptr_t)context);
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001041}
1042
Eric Smith5e527eb2008-02-10 01:36:53 +00001043/* Convert an integer to the given base. Returns a string.
1044 If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'.
1045 If newstyle is zero, then use the pre-2.6 behavior of octal having
1046 a leading "0" */
1047PyAPI_FUNC(PyObject*)
1048_PyInt_Format(PyIntObject *v, int base, int newstyle)
1049{
1050 /* There are no doubt many, many ways to optimize this, using code
1051 similar to _PyLong_Format */
1052 long n = v->ob_ival;
1053 int negative = n < 0;
1054 int is_zero = n == 0;
1055
1056 /* For the reasoning behind this size, see
1057 http://c-faq.com/misc/hexio.html. Then, add a few bytes for
1058 the possible sign and prefix "0[box]" */
1059 char buf[sizeof(n)*CHAR_BIT+6];
1060
1061 /* Start by pointing to the end of the buffer. We fill in from
1062 the back forward. */
1063 char* p = &buf[sizeof(buf)];
1064
1065 assert(base >= 2 && base <= 36);
1066
1067 do {
1068 /* I'd use i_divmod, except it doesn't produce the results
1069 I want when n is negative. So just duplicate the salient
1070 part here. */
1071 long div = n / base;
1072 long mod = n - div * base;
1073
1074 /* convert abs(mod) to the right character in [0-9, a-z] */
1075 char cdigit = (char)(mod < 0 ? -mod : mod);
1076 cdigit += (cdigit < 10) ? '0' : 'a'-10;
1077 *--p = cdigit;
1078
1079 n = div;
1080 } while(n);
1081
1082 if (base == 2) {
1083 *--p = 'b';
1084 *--p = '0';
1085 }
1086 else if (base == 8) {
1087 if (newstyle) {
1088 *--p = 'o';
1089 *--p = '0';
1090 }
1091 else
1092 if (!is_zero)
1093 *--p = '0';
1094 }
1095 else if (base == 16) {
1096 *--p = 'x';
1097 *--p = '0';
1098 }
1099 else if (base != 10) {
1100 *--p = '#';
1101 *--p = '0' + base%10;
1102 if (base > 10)
1103 *--p = '0' + base/10;
1104 }
1105 if (negative)
1106 *--p = '-';
1107
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001108 return PyString_FromStringAndSize(p, &buf[sizeof(buf)] - p);
Eric Smith5e527eb2008-02-10 01:36:53 +00001109}
1110
Eric Smitha9f7d622008-02-17 19:46:49 +00001111static PyObject *
1112int__format__(PyObject *self, PyObject *args)
1113{
1114 PyObject *format_spec;
1115
1116 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
1117 return NULL;
Christian Heimes593daf52008-05-26 12:51:38 +00001118 if (PyBytes_Check(format_spec))
Eric Smithdc13b792008-05-30 18:10:04 +00001119 return _PyInt_FormatAdvanced(self,
1120 PyBytes_AS_STRING(format_spec),
1121 PyBytes_GET_SIZE(format_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00001122 if (PyUnicode_Check(format_spec)) {
1123 /* Convert format_spec to a str */
Eric Smithdc13b792008-05-30 18:10:04 +00001124 PyObject *result;
1125 PyObject *str_spec = PyObject_Str(format_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00001126
Eric Smithdc13b792008-05-30 18:10:04 +00001127 if (str_spec == NULL)
1128 return NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +00001129
Eric Smithdc13b792008-05-30 18:10:04 +00001130 result = _PyInt_FormatAdvanced(self,
1131 PyBytes_AS_STRING(str_spec),
1132 PyBytes_GET_SIZE(str_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00001133
Eric Smithdc13b792008-05-30 18:10:04 +00001134 Py_DECREF(str_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00001135 return result;
1136 }
1137 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
1138 return NULL;
1139}
1140
Christian Heimes6f341092008-04-18 23:13:07 +00001141#if 0
1142static PyObject *
1143int_is_finite(PyObject *v)
1144{
1145 Py_RETURN_TRUE;
1146}
1147#endif
1148
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001149static PyMethodDef int_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001150 {"conjugate", (PyCFunction)int_int, METH_NOARGS,
1151 "Returns self, the complex conjugate of any int."},
Christian Heimes6f341092008-04-18 23:13:07 +00001152#if 0
1153 {"is_finite", (PyCFunction)int_is_finite, METH_NOARGS,
1154 "Returns always True."},
1155#endif
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001156 {"__trunc__", (PyCFunction)int_int, METH_NOARGS,
1157 "Truncating an Integral returns itself."},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001158 {"__getnewargs__", (PyCFunction)int_getnewargs, METH_NOARGS},
Eric Smitha9f7d622008-02-17 19:46:49 +00001159 {"__format__", (PyCFunction)int__format__, METH_VARARGS},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001160 {NULL, NULL} /* sentinel */
1161};
1162
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001163static PyGetSetDef int_getset[] = {
1164 {"real",
1165 (getter)int_int, (setter)NULL,
1166 "the real part of a complex number",
1167 NULL},
1168 {"imag",
1169 (getter)int_getN, (setter)NULL,
1170 "the imaginary part of a complex number",
1171 (void*)0},
1172 {"numerator",
1173 (getter)int_int, (setter)NULL,
1174 "the numerator of a rational number in lowest terms",
1175 NULL},
1176 {"denominator",
1177 (getter)int_getN, (setter)NULL,
1178 "the denominator of a rational number in lowest terms",
1179 (void*)1},
1180 {NULL} /* Sentinel */
1181};
1182
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001183PyDoc_STRVAR(int_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001184"int(x[, base]) -> integer\n\
1185\n\
1186Convert a string or number to an integer, if possible. A floating point\n\
1187argument will be truncated towards zero (this does not include a string\n\
1188representation of a floating point number!) When converting a string, use\n\
1189the optional base. It is an error to supply a base when converting a\n\
Gustavo Niemeyer37e65022007-01-10 16:15:48 +00001190non-string. If base is zero, the proper base is guessed based on the\n\
Gustavo Niemeyera443bc82007-01-10 16:13:40 +00001191string content. If the argument is outside the integer range a\n\
1192long object will be returned instead.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001193
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001194static PyNumberMethods int_as_number = {
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001195 (binaryfunc)int_add, /*nb_add*/
1196 (binaryfunc)int_sub, /*nb_subtract*/
1197 (binaryfunc)int_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00001198 (binaryfunc)int_classic_div, /*nb_divide*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001199 (binaryfunc)int_mod, /*nb_remainder*/
1200 (binaryfunc)int_divmod, /*nb_divmod*/
1201 (ternaryfunc)int_pow, /*nb_power*/
1202 (unaryfunc)int_neg, /*nb_negative*/
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001203 (unaryfunc)int_int, /*nb_positive*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001204 (unaryfunc)int_abs, /*nb_absolute*/
1205 (inquiry)int_nonzero, /*nb_nonzero*/
1206 (unaryfunc)int_invert, /*nb_invert*/
1207 (binaryfunc)int_lshift, /*nb_lshift*/
1208 (binaryfunc)int_rshift, /*nb_rshift*/
1209 (binaryfunc)int_and, /*nb_and*/
1210 (binaryfunc)int_xor, /*nb_xor*/
1211 (binaryfunc)int_or, /*nb_or*/
Guido van Rossum1952e382001-09-19 01:25:16 +00001212 int_coerce, /*nb_coerce*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001213 (unaryfunc)int_int, /*nb_int*/
1214 (unaryfunc)int_long, /*nb_long*/
1215 (unaryfunc)int_float, /*nb_float*/
1216 (unaryfunc)int_oct, /*nb_oct*/
1217 (unaryfunc)int_hex, /*nb_hex*/
1218 0, /*nb_inplace_add*/
1219 0, /*nb_inplace_subtract*/
1220 0, /*nb_inplace_multiply*/
1221 0, /*nb_inplace_divide*/
1222 0, /*nb_inplace_remainder*/
1223 0, /*nb_inplace_power*/
1224 0, /*nb_inplace_lshift*/
1225 0, /*nb_inplace_rshift*/
1226 0, /*nb_inplace_and*/
1227 0, /*nb_inplace_xor*/
1228 0, /*nb_inplace_or*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001229 (binaryfunc)int_div, /* nb_floor_divide */
1230 int_true_divide, /* nb_true_divide */
1231 0, /* nb_inplace_floor_divide */
1232 0, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001233 (unaryfunc)int_int, /* nb_index */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001234};
1235
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236PyTypeObject PyInt_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001237 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001238 "int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001239 sizeof(PyIntObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001240 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001241 (destructor)int_dealloc, /* tp_dealloc */
1242 (printfunc)int_print, /* tp_print */
1243 0, /* tp_getattr */
1244 0, /* tp_setattr */
1245 (cmpfunc)int_compare, /* tp_compare */
1246 (reprfunc)int_repr, /* tp_repr */
1247 &int_as_number, /* tp_as_number */
1248 0, /* tp_as_sequence */
1249 0, /* tp_as_mapping */
1250 (hashfunc)int_hash, /* tp_hash */
1251 0, /* tp_call */
Guido van Rossume75bfde2002-02-01 15:34:10 +00001252 (reprfunc)int_repr, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001253 PyObject_GenericGetAttr, /* tp_getattro */
1254 0, /* tp_setattro */
1255 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00001256 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00001257 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001258 int_doc, /* tp_doc */
1259 0, /* tp_traverse */
1260 0, /* tp_clear */
1261 0, /* tp_richcompare */
1262 0, /* tp_weaklistoffset */
1263 0, /* tp_iter */
1264 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001265 int_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001266 0, /* tp_members */
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001267 int_getset, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001268 0, /* tp_base */
1269 0, /* tp_dict */
1270 0, /* tp_descr_get */
1271 0, /* tp_descr_set */
1272 0, /* tp_dictoffset */
1273 0, /* tp_init */
1274 0, /* tp_alloc */
1275 int_new, /* tp_new */
Guido van Rossum93646982002-04-26 00:53:34 +00001276 (freefunc)int_free, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001277};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001278
Neal Norwitzc91ed402002-12-30 22:29:22 +00001279int
Neal Norwitzb2501f42002-12-31 03:42:13 +00001280_PyInt_Init(void)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001281{
1282 PyIntObject *v;
1283 int ival;
1284#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1285 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
Raymond Hettingerb32e6402004-02-08 18:54:37 +00001286 if (!free_list && (free_list = fill_free_list()) == NULL)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001287 return 0;
1288 /* PyObject_New is inlined */
1289 v = free_list;
Christian Heimese93237d2007-12-19 02:37:44 +00001290 free_list = (PyIntObject *)Py_TYPE(v);
Neal Norwitzc91ed402002-12-30 22:29:22 +00001291 PyObject_INIT(v, &PyInt_Type);
1292 v->ob_ival = ival;
1293 small_ints[ival + NSMALLNEGINTS] = v;
1294 }
1295#endif
1296 return 1;
1297}
1298
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001299int
1300PyInt_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001301{
Guido van Rossum3fce8831999-03-12 19:43:17 +00001302 PyIntObject *p;
1303 PyIntBlock *list, *next;
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001304 int i;
1305 int u; /* remaining unfreed ints per block */
1306 int freelist_size = 0;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001307
Guido van Rossumda084ed1999-03-10 22:55:24 +00001308 list = block_list;
1309 block_list = NULL;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001310 free_list = NULL;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001311 while (list != NULL) {
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001312 u = 0;
1313 for (i = 0, p = &list->objects[0];
1314 i < N_INTOBJECTS;
1315 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001316 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001317 u++;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001318 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001319 next = list->next;
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001320 if (u) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001321 list->next = block_list;
1322 block_list = list;
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001323 for (i = 0, p = &list->objects[0];
1324 i < N_INTOBJECTS;
1325 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001326 if (!PyInt_CheckExact(p) ||
Guido van Rossumbef14172001-08-29 15:47:46 +00001327 p->ob_refcnt == 0) {
Christian Heimese93237d2007-12-19 02:37:44 +00001328 Py_TYPE(p) = (struct _typeobject *)
Guido van Rossum51288bc1999-03-19 20:30:39 +00001329 free_list;
1330 free_list = p;
1331 }
1332#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1333 else if (-NSMALLNEGINTS <= p->ob_ival &&
1334 p->ob_ival < NSMALLPOSINTS &&
1335 small_ints[p->ob_ival +
1336 NSMALLNEGINTS] == NULL) {
1337 Py_INCREF(p);
1338 small_ints[p->ob_ival +
1339 NSMALLNEGINTS] = p;
1340 }
1341#endif
1342 }
Guido van Rossumda084ed1999-03-10 22:55:24 +00001343 }
1344 else {
Tim Peters29c0afc2002-04-28 16:57:34 +00001345 PyMem_FREE(list);
Guido van Rossumda084ed1999-03-10 22:55:24 +00001346 }
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001347 freelist_size += u;
Guido van Rossum3fce8831999-03-12 19:43:17 +00001348 list = next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001349 }
Christian Heimes422051a2008-02-04 18:00:12 +00001350
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001351 return freelist_size;
Christian Heimes422051a2008-02-04 18:00:12 +00001352}
1353
1354void
1355PyInt_Fini(void)
1356{
1357 PyIntObject *p;
1358 PyIntBlock *list;
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001359 int i;
1360 int u; /* total unfreed ints per block */
Christian Heimes422051a2008-02-04 18:00:12 +00001361
1362#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Christian Heimes422051a2008-02-04 18:00:12 +00001363 PyIntObject **q;
1364
1365 i = NSMALLNEGINTS + NSMALLPOSINTS;
1366 q = small_ints;
1367 while (--i >= 0) {
1368 Py_XDECREF(*q);
1369 *q++ = NULL;
1370 }
1371#endif
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001372 u = PyInt_ClearFreeList();
Guido van Rossum3fce8831999-03-12 19:43:17 +00001373 if (!Py_VerboseFlag)
1374 return;
1375 fprintf(stderr, "# cleanup ints");
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001376 if (!u) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001377 fprintf(stderr, "\n");
1378 }
1379 else {
1380 fprintf(stderr,
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001381 ": %d unfreed int%s\n",
1382 u, u == 1 ? "" : "s");
Guido van Rossum3fce8831999-03-12 19:43:17 +00001383 }
1384 if (Py_VerboseFlag > 1) {
1385 list = block_list;
1386 while (list != NULL) {
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001387 for (i = 0, p = &list->objects[0];
1388 i < N_INTOBJECTS;
1389 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001390 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001391 /* XXX(twouters) cast refcount to
1392 long until %zd is universally
1393 available
1394 */
Guido van Rossum3fce8831999-03-12 19:43:17 +00001395 fprintf(stderr,
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001396 "# <int at %p, refcnt=%ld, val=%ld>\n",
1397 p, (long)p->ob_refcnt,
1398 p->ob_ival);
Guido van Rossum3fce8831999-03-12 19:43:17 +00001399 }
1400 list = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001401 }
1402 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001403}