blob: 1ae8006c28285da38a2f38b44dbd98956bf2abf8 [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>
Mark Dickinson6736cf82009-04-20 21:13:33 +00006#include <float.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00008static PyObject *int_int(PyIntObject *v);
9
Guido van Rossum2e1d4331993-12-24 10:22:45 +000010long
Fred Drakea2f55112000-07-09 15:16:51 +000011PyInt_GetMax(void)
Guido van Rossum2e1d4331993-12-24 10:22:45 +000012{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000013 return LONG_MAX; /* To initialize sys.maxint */
Guido van Rossum2e1d4331993-12-24 10:22:45 +000014}
15
Guido van Rossum3f5da241990-12-20 15:06:42 +000016/* Integers are quite normal objects, to make object handling uniform.
17 (Using odd pointers to represent integers would save much space
18 but require extra checks for this special case throughout the code.)
Tim Peters29c0afc2002-04-28 16:57:34 +000019 Since a typical Python program spends much of its time allocating
Guido van Rossum3f5da241990-12-20 15:06:42 +000020 and deallocating integers, these operations should be very fast.
21 Therefore we use a dedicated allocation scheme with a much lower
22 overhead (in space and time) than straight malloc(): a simple
23 dedicated free list, filled when necessary with memory from malloc().
Tim Peters29c0afc2002-04-28 16:57:34 +000024
25 block_list is a singly-linked list of all PyIntBlocks ever allocated,
26 linked via their next members. PyIntBlocks are never returned to the
27 system before shutdown (PyInt_Fini).
28
29 free_list is a singly-linked list of available PyIntObjects, linked
30 via abuse of their ob_type members.
Guido van Rossum3f5da241990-12-20 15:06:42 +000031*/
32
Antoine Pitrouc83ea132010-05-09 14:46:46 +000033#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
34#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
35#define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
Guido van Rossumda084ed1999-03-10 22:55:24 +000036
Guido van Rossum3fce8831999-03-12 19:43:17 +000037struct _intblock {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000038 struct _intblock *next;
39 PyIntObject objects[N_INTOBJECTS];
Guido van Rossum3fce8831999-03-12 19:43:17 +000040};
41
42typedef struct _intblock PyIntBlock;
43
44static PyIntBlock *block_list = NULL;
45static PyIntObject *free_list = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000046
Guido van Rossumc0b618a1997-05-02 03:12:38 +000047static PyIntObject *
Fred Drakea2f55112000-07-09 15:16:51 +000048fill_free_list(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +000049{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000050 PyIntObject *p, *q;
51 /* Python's object allocator isn't appropriate for large blocks. */
52 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
53 if (p == NULL)
54 return (PyIntObject *) PyErr_NoMemory();
55 ((PyIntBlock *)p)->next = block_list;
56 block_list = (PyIntBlock *)p;
57 /* Link the int objects together, from rear to front, then return
58 the address of the last int object in the block. */
59 p = &((PyIntBlock *)p)->objects[0];
60 q = p + N_INTOBJECTS;
61 while (--q > p)
62 Py_TYPE(q) = (struct _typeobject *)(q-1);
63 Py_TYPE(q) = NULL;
64 return p + N_INTOBJECTS - 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +000065}
66
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000067#ifndef NSMALLPOSINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +000068#define NSMALLPOSINTS 257
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000069#endif
70#ifndef NSMALLNEGINTS
Antoine Pitrouc83ea132010-05-09 14:46:46 +000071#define NSMALLNEGINTS 5
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000072#endif
73#if NSMALLNEGINTS + NSMALLPOSINTS > 0
74/* References to small integers are saved in this array so that they
75 can be shared.
76 The integers that are saved are those in the range
77 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
78*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000079static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000080#endif
81#ifdef COUNT_ALLOCS
Martin v. Löwisb90304a2009-01-07 18:40:40 +000082Py_ssize_t quick_int_allocs;
83Py_ssize_t quick_neg_int_allocs;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000084#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +000085
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000087PyInt_FromLong(long ival)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000089 register PyIntObject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000090#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Antoine Pitrouc83ea132010-05-09 14:46:46 +000091 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
92 v = small_ints[ival + NSMALLNEGINTS];
93 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000094#ifdef COUNT_ALLOCS
Antoine Pitrouc83ea132010-05-09 14:46:46 +000095 if (ival >= 0)
96 quick_int_allocs++;
97 else
98 quick_neg_int_allocs++;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000099#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000100 return (PyObject *) v;
101 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000102#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000103 if (free_list == NULL) {
104 if ((free_list = fill_free_list()) == NULL)
105 return NULL;
106 }
107 /* Inline PyObject_New */
108 v = free_list;
109 free_list = (PyIntObject *)Py_TYPE(v);
110 PyObject_INIT(v, &PyInt_Type);
111 v->ob_ival = ival;
112 return (PyObject *) v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000113}
114
Martin v. Löwis18e16552006-02-15 17:27:45 +0000115PyObject *
116PyInt_FromSize_t(size_t ival)
117{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000118 if (ival <= LONG_MAX)
119 return PyInt_FromLong((long)ival);
120 return _PyLong_FromSize_t(ival);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000121}
122
123PyObject *
124PyInt_FromSsize_t(Py_ssize_t ival)
125{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000126 if (ival >= LONG_MIN && ival <= LONG_MAX)
127 return PyInt_FromLong((long)ival);
128 return _PyLong_FromSsize_t(ival);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000129}
130
Guido van Rossum3f5da241990-12-20 15:06:42 +0000131static void
Fred Drakea2f55112000-07-09 15:16:51 +0000132int_dealloc(PyIntObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000133{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000134 if (PyInt_CheckExact(v)) {
135 Py_TYPE(v) = (struct _typeobject *)free_list;
136 free_list = v;
137 }
138 else
139 Py_TYPE(v)->tp_free((PyObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140}
141
Guido van Rossum93646982002-04-26 00:53:34 +0000142static void
143int_free(PyIntObject *v)
144{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000145 Py_TYPE(v) = (struct _typeobject *)free_list;
146 free_list = v;
Guido van Rossum93646982002-04-26 00:53:34 +0000147}
148
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149long
Fred Drakea2f55112000-07-09 15:16:51 +0000150PyInt_AsLong(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000152 PyNumberMethods *nb;
153 PyIntObject *io;
154 long val;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000155
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000156 if (op && PyInt_Check(op))
157 return PyInt_AS_LONG((PyIntObject*) op);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000158
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000159 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
160 nb->nb_int == NULL) {
161 PyErr_SetString(PyExc_TypeError, "an integer is required");
162 return -1;
163 }
Tim Petersa3c01ce2001-12-04 23:05:10 +0000164
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000165 io = (PyIntObject*) (*nb->nb_int) (op);
166 if (io == NULL)
167 return -1;
168 if (!PyInt_Check(io)) {
169 if (PyLong_Check(io)) {
170 /* got a long? => retry int conversion */
171 val = PyLong_AsLong((PyObject *)io);
172 Py_DECREF(io);
173 if ((val == -1) && PyErr_Occurred())
174 return -1;
175 return val;
176 }
177 else
178 {
179 Py_DECREF(io);
180 PyErr_SetString(PyExc_TypeError,
181 "__int__ method should return an integer");
182 return -1;
183 }
184 }
Tim Petersa3c01ce2001-12-04 23:05:10 +0000185
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000186 val = PyInt_AS_LONG(io);
187 Py_DECREF(io);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000188
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000189 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190}
191
Martin v. Löwis18e16552006-02-15 17:27:45 +0000192Py_ssize_t
193PyInt_AsSsize_t(register PyObject *op)
194{
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000195#if SIZEOF_SIZE_T != SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000196 PyNumberMethods *nb;
197 PyIntObject *io;
198 Py_ssize_t val;
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000199#endif
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000200
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000201 if (op == NULL) {
202 PyErr_SetString(PyExc_TypeError, "an integer is required");
203 return -1;
204 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000205
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000206 if (PyInt_Check(op))
207 return PyInt_AS_LONG((PyIntObject*) op);
208 if (PyLong_Check(op))
209 return _PyLong_AsSsize_t(op);
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000210#if SIZEOF_SIZE_T == SIZEOF_LONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000211 return PyInt_AsLong(op);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000212#else
213
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000214 if ((nb = Py_TYPE(op)->tp_as_number) == NULL ||
215 (nb->nb_int == NULL && nb->nb_long == 0)) {
216 PyErr_SetString(PyExc_TypeError, "an integer is required");
217 return -1;
218 }
Martin v. Löwis18e16552006-02-15 17:27:45 +0000219
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000220 if (nb->nb_long != 0)
221 io = (PyIntObject*) (*nb->nb_long) (op);
222 else
223 io = (PyIntObject*) (*nb->nb_int) (op);
224 if (io == NULL)
225 return -1;
226 if (!PyInt_Check(io)) {
227 if (PyLong_Check(io)) {
228 /* got a long? => retry int conversion */
229 val = _PyLong_AsSsize_t((PyObject *)io);
230 Py_DECREF(io);
231 if ((val == -1) && PyErr_Occurred())
232 return -1;
233 return val;
234 }
235 else
236 {
237 Py_DECREF(io);
238 PyErr_SetString(PyExc_TypeError,
239 "__int__ method should return an integer");
240 return -1;
241 }
242 }
Martin v. Löwis18e16552006-02-15 17:27:45 +0000243
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000244 val = PyInt_AS_LONG(io);
245 Py_DECREF(io);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000246
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000247 return val;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000248#endif
249}
250
Thomas Hellera4ea6032003-04-17 18:55:45 +0000251unsigned long
252PyInt_AsUnsignedLongMask(register PyObject *op)
253{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000254 PyNumberMethods *nb;
255 PyIntObject *io;
256 unsigned long val;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000257
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000258 if (op && PyInt_Check(op))
259 return PyInt_AS_LONG((PyIntObject*) op);
260 if (op && PyLong_Check(op))
261 return PyLong_AsUnsignedLongMask(op);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000262
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000263 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
264 nb->nb_int == NULL) {
265 PyErr_SetString(PyExc_TypeError, "an integer is required");
266 return (unsigned long)-1;
267 }
Thomas Hellera4ea6032003-04-17 18:55:45 +0000268
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000269 io = (PyIntObject*) (*nb->nb_int) (op);
270 if (io == NULL)
271 return (unsigned long)-1;
272 if (!PyInt_Check(io)) {
273 if (PyLong_Check(io)) {
274 val = PyLong_AsUnsignedLongMask((PyObject *)io);
275 Py_DECREF(io);
276 if (PyErr_Occurred())
277 return (unsigned long)-1;
278 return val;
279 }
280 else
281 {
282 Py_DECREF(io);
283 PyErr_SetString(PyExc_TypeError,
284 "__int__ method should return an integer");
285 return (unsigned long)-1;
286 }
287 }
Thomas Hellera4ea6032003-04-17 18:55:45 +0000288
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000289 val = PyInt_AS_LONG(io);
290 Py_DECREF(io);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000291
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000292 return val;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000293}
294
295#ifdef HAVE_LONG_LONG
296unsigned PY_LONG_LONG
297PyInt_AsUnsignedLongLongMask(register PyObject *op)
298{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000299 PyNumberMethods *nb;
300 PyIntObject *io;
301 unsigned PY_LONG_LONG val;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000302
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000303 if (op && PyInt_Check(op))
304 return PyInt_AS_LONG((PyIntObject*) op);
305 if (op && PyLong_Check(op))
306 return PyLong_AsUnsignedLongLongMask(op);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000307
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000308 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
309 nb->nb_int == NULL) {
310 PyErr_SetString(PyExc_TypeError, "an integer is required");
311 return (unsigned PY_LONG_LONG)-1;
312 }
Thomas Hellera4ea6032003-04-17 18:55:45 +0000313
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000314 io = (PyIntObject*) (*nb->nb_int) (op);
315 if (io == NULL)
316 return (unsigned PY_LONG_LONG)-1;
317 if (!PyInt_Check(io)) {
318 if (PyLong_Check(io)) {
319 val = PyLong_AsUnsignedLongLongMask((PyObject *)io);
320 Py_DECREF(io);
321 if (PyErr_Occurred())
322 return (unsigned PY_LONG_LONG)-1;
323 return val;
324 }
325 else
326 {
327 Py_DECREF(io);
328 PyErr_SetString(PyExc_TypeError,
329 "__int__ method should return an integer");
330 return (unsigned PY_LONG_LONG)-1;
331 }
332 }
Thomas Hellera4ea6032003-04-17 18:55:45 +0000333
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000334 val = PyInt_AS_LONG(io);
335 Py_DECREF(io);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000336
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000337 return val;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000338}
339#endif
340
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000341PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000342PyInt_FromString(char *s, char **pend, int base)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000343{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000344 char *end;
345 long x;
346 Py_ssize_t slen;
347 PyObject *sobj, *srepr;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000348
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000349 if ((base != 0 && base < 2) || base > 36) {
350 PyErr_SetString(PyExc_ValueError,
351 "int() base must be >= 2 and <= 36");
352 return NULL;
353 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000354
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000355 while (*s && isspace(Py_CHARMASK(*s)))
356 s++;
357 errno = 0;
358 if (base == 0 && s[0] == '0') {
359 x = (long) PyOS_strtoul(s, &end, base);
360 if (x < 0)
361 return PyLong_FromString(s, pend, base);
362 }
363 else
364 x = PyOS_strtol(s, &end, base);
365 if (end == s || !isalnum(Py_CHARMASK(end[-1])))
366 goto bad;
367 while (*end && isspace(Py_CHARMASK(*end)))
368 end++;
369 if (*end != '\0') {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000370 bad:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000371 slen = strlen(s) < 200 ? strlen(s) : 200;
372 sobj = PyString_FromStringAndSize(s, slen);
373 if (sobj == NULL)
374 return NULL;
375 srepr = PyObject_Repr(sobj);
376 Py_DECREF(sobj);
377 if (srepr == NULL)
378 return NULL;
379 PyErr_Format(PyExc_ValueError,
380 "invalid literal for int() with base %d: %s",
381 base, PyString_AS_STRING(srepr));
382 Py_DECREF(srepr);
383 return NULL;
384 }
385 else if (errno != 0)
386 return PyLong_FromString(s, pend, base);
387 if (pend)
388 *pend = end;
389 return PyInt_FromLong(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000390}
391
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000392#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000393PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000394PyInt_FromUnicode(Py_UNICODE *s, Py_ssize_t length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000395{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000396 PyObject *result;
397 char *buffer = (char *)PyMem_MALLOC(length+1);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000398
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000399 if (buffer == NULL)
400 return PyErr_NoMemory();
Walter Dörwald07e14762002-11-06 16:15:14 +0000401
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000402 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) {
403 PyMem_FREE(buffer);
404 return NULL;
405 }
406 result = PyInt_FromString(buffer, NULL, base);
407 PyMem_FREE(buffer);
408 return result;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000409}
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000410#endif
Guido van Rossum9e896b32000-04-05 20:11:21 +0000411
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412/* Methods */
413
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000414/* Integers are seen as the "smallest" of all numeric types and thus
415 don't have any knowledge about conversion of other types to
416 integers. */
417
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000418#define CONVERT_TO_LONG(obj, lng) \
419 if (PyInt_Check(obj)) { \
420 lng = PyInt_AS_LONG(obj); \
421 } \
422 else { \
423 Py_INCREF(Py_NotImplemented); \
424 return Py_NotImplemented; \
425 }
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000426
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000427/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000428static int
Fred Drakea2f55112000-07-09 15:16:51 +0000429int_print(PyIntObject *v, FILE *fp, int flags)
430 /* flags -- not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000432 long int_val = v->ob_ival;
433 Py_BEGIN_ALLOW_THREADS
434 fprintf(fp, "%ld", int_val);
435 Py_END_ALLOW_THREADS
436 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437}
438
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439static int
Fred Drakea2f55112000-07-09 15:16:51 +0000440int_compare(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000442 register long i = v->ob_ival;
443 register long j = w->ob_ival;
444 return (i < j) ? -1 : (i > j) ? 1 : 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445}
446
Guido van Rossum9bfef441993-03-29 10:43:31 +0000447static long
Fred Drakea2f55112000-07-09 15:16:51 +0000448int_hash(PyIntObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000449{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000450 /* XXX If this is changed, you also need to change the way
451 Python's long, float and complex types are hashed. */
452 long x = v -> ob_ival;
453 if (x == -1)
454 x = -2;
455 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000456}
457
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000459int_add(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000461 register long a, b, x;
462 CONVERT_TO_LONG(v, a);
463 CONVERT_TO_LONG(w, b);
464 /* casts in the line below avoid undefined behaviour on overflow */
465 x = (long)((unsigned long)a + b);
466 if ((x^a) >= 0 || (x^b) >= 0)
467 return PyInt_FromLong(x);
468 return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469}
470
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000472int_sub(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000473{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000474 register long a, b, x;
475 CONVERT_TO_LONG(v, a);
476 CONVERT_TO_LONG(w, b);
477 /* casts in the line below avoid undefined behaviour on overflow */
478 x = (long)((unsigned long)a - b);
479 if ((x^a) >= 0 || (x^~b) >= 0)
480 return PyInt_FromLong(x);
481 return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
482 (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483}
484
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000485/*
Tim Petersa3c01ce2001-12-04 23:05:10 +0000486Integer overflow checking for * is painful: Python tried a couple ways, but
487they didn't work on all platforms, or failed in endcases (a product of
488-sys.maxint-1 has been a particular pain).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000489
Tim Petersa3c01ce2001-12-04 23:05:10 +0000490Here's another way:
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000491
Tim Petersa3c01ce2001-12-04 23:05:10 +0000492The native long product x*y is either exactly right or *way* off, being
493just the last n bits of the true product, where n is the number of bits
494in a long (the delivered product is the true product plus i*2**n for
495some integer i).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000496
Tim Petersa3c01ce2001-12-04 23:05:10 +0000497The native double product (double)x * (double)y is subject to three
498rounding errors: on a sizeof(long)==8 box, each cast to double can lose
499info, and even on a sizeof(long)==4 box, the multiplication can lose info.
500But, unlike the native long product, it's not in *range* trouble: even
501if sizeof(long)==32 (256-bit longs), the product easily fits in the
502dynamic range of a double. So the leading 50 (or so) bits of the double
503product are correct.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000504
Tim Petersa3c01ce2001-12-04 23:05:10 +0000505We check these two ways against each other, and declare victory if they're
506approximately the same. Else, because the native long product is the only
507one that can lose catastrophic amounts of information, it's the native long
508product that must have overflowed.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000509*/
510
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511static PyObject *
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000512int_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000513{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000514 long a, b;
515 long longprod; /* a*b in native long arithmetic */
516 double doubled_longprod; /* (double)longprod */
517 double doubleprod; /* (double)a * (double)b */
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000518
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000519 CONVERT_TO_LONG(v, a);
520 CONVERT_TO_LONG(w, b);
521 /* casts in the next line avoid undefined behaviour on overflow */
522 longprod = (long)((unsigned long)a * b);
523 doubleprod = (double)a * (double)b;
524 doubled_longprod = (double)longprod;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000525
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000526 /* Fast path for normal case: small multiplicands, and no info
527 is lost in either method. */
528 if (doubled_longprod == doubleprod)
529 return PyInt_FromLong(longprod);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000530
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000531 /* Somebody somewhere lost info. Close enough, or way off? Note
532 that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0).
533 The difference either is or isn't significant compared to the
534 true value (of which doubleprod is a good approximation).
535 */
536 {
537 const double diff = doubled_longprod - doubleprod;
538 const double absdiff = diff >= 0.0 ? diff : -diff;
539 const double absprod = doubleprod >= 0.0 ? doubleprod :
540 -doubleprod;
541 /* absdiff/absprod <= 1/32 iff
542 32 * absdiff <= absprod -- 5 good bits is "close enough" */
543 if (32.0 * absdiff <= absprod)
544 return PyInt_FromLong(longprod);
545 else
546 return PyLong_Type.tp_as_number->nb_multiply(v, w);
547 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548}
549
Armin Rigo7ccbca92006-10-04 12:17:45 +0000550/* Integer overflow checking for unary negation: on a 2's-complement
551 * box, -x overflows iff x is the most negative long. In this case we
552 * get -x == x. However, -x is undefined (by C) if x /is/ the most
553 * negative long (it's a signed overflow case), and some compilers care.
554 * So we cast x to unsigned long first. However, then other compilers
555 * warn about applying unary minus to an unsigned operand. Hence the
556 * weird "0-".
557 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000558#define UNARY_NEG_WOULD_OVERFLOW(x) \
559 ((x) < 0 && (unsigned long)(x) == 0-(unsigned long)(x))
Armin Rigo7ccbca92006-10-04 12:17:45 +0000560
Guido van Rossume27f7952001-08-23 02:59:04 +0000561/* Return type of i_divmod */
562enum divmod_result {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000563 DIVMOD_OK, /* Correct result */
564 DIVMOD_OVERFLOW, /* Overflow, try again using longs */
565 DIVMOD_ERROR /* Exception raised */
Guido van Rossume27f7952001-08-23 02:59:04 +0000566};
567
568static enum divmod_result
Tim Peters1dad6a82001-06-18 19:21:11 +0000569i_divmod(register long x, register long y,
Fred Drakea2f55112000-07-09 15:16:51 +0000570 long *p_xdivy, long *p_xmody)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000571{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000572 long xdivy, xmody;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000573
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000574 if (y == 0) {
575 PyErr_SetString(PyExc_ZeroDivisionError,
576 "integer division or modulo by zero");
577 return DIVMOD_ERROR;
578 }
579 /* (-sys.maxint-1)/-1 is the only overflow case. */
580 if (y == -1 && UNARY_NEG_WOULD_OVERFLOW(x))
581 return DIVMOD_OVERFLOW;
582 xdivy = x / y;
583 /* xdiv*y can overflow on platforms where x/y gives floor(x/y)
584 * for x and y with differing signs. (This is unusual
585 * behaviour, and C99 prohibits it, but it's allowed by C89;
586 * for an example of overflow, take x = LONG_MIN, y = 5 or x =
587 * LONG_MAX, y = -5.) However, x - xdivy*y is always
588 * representable as a long, since it lies strictly between
589 * -abs(y) and abs(y). We add casts to avoid intermediate
590 * overflow.
591 */
592 xmody = (long)(x - (unsigned long)xdivy * y);
593 /* If the signs of x and y differ, and the remainder is non-0,
594 * C89 doesn't define whether xdivy is now the floor or the
595 * ceiling of the infinitely precise quotient. We want the floor,
596 * and we have it iff the remainder's sign matches y's.
597 */
598 if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
599 xmody += y;
600 --xdivy;
601 assert(xmody && ((y ^ xmody) >= 0));
602 }
603 *p_xdivy = xdivy;
604 *p_xmody = xmody;
605 return DIVMOD_OK;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000606}
607
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000609int_div(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000610{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000611 long xi, yi;
612 long d, m;
613 CONVERT_TO_LONG(x, xi);
614 CONVERT_TO_LONG(y, yi);
615 switch (i_divmod(xi, yi, &d, &m)) {
616 case DIVMOD_OK:
617 return PyInt_FromLong(d);
618 case DIVMOD_OVERFLOW:
619 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
620 (PyObject *)y);
621 default:
622 return NULL;
623 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000624}
625
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000627int_classic_div(PyIntObject *x, PyIntObject *y)
628{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000629 long xi, yi;
630 long d, m;
631 CONVERT_TO_LONG(x, xi);
632 CONVERT_TO_LONG(y, yi);
633 if (Py_DivisionWarningFlag &&
634 PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0)
635 return NULL;
636 switch (i_divmod(xi, yi, &d, &m)) {
637 case DIVMOD_OK:
638 return PyInt_FromLong(d);
639 case DIVMOD_OVERFLOW:
640 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
641 (PyObject *)y);
642 default:
643 return NULL;
644 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000645}
646
647static PyObject *
Mark Dickinson46572832009-12-27 14:55:57 +0000648int_true_divide(PyIntObject *x, PyIntObject *y)
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000649{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000650 long xi, yi;
651 /* If they aren't both ints, give someone else a chance. In
652 particular, this lets int/long get handled by longs, which
653 underflows to 0 gracefully if the long is too big to convert
654 to float. */
655 CONVERT_TO_LONG(x, xi);
656 CONVERT_TO_LONG(y, yi);
657 if (yi == 0) {
658 PyErr_SetString(PyExc_ZeroDivisionError,
659 "division by zero");
660 return NULL;
661 }
662 if (xi == 0)
663 return PyFloat_FromDouble(yi < 0 ? -0.0 : 0.0);
Mark Dickinson46572832009-12-27 14:55:57 +0000664
665#define WIDTH_OF_ULONG (CHAR_BIT*SIZEOF_LONG)
666#if DBL_MANT_DIG < WIDTH_OF_ULONG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000667 if ((xi >= 0 ? 0UL + xi : 0UL - xi) >> DBL_MANT_DIG ||
668 (yi >= 0 ? 0UL + yi : 0UL - yi) >> DBL_MANT_DIG)
669 /* Large x or y. Use long integer arithmetic. */
670 return PyLong_Type.tp_as_number->nb_true_divide(
671 (PyObject *)x, (PyObject *)y);
672 else
Mark Dickinson46572832009-12-27 14:55:57 +0000673#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000674 /* Both ints can be exactly represented as doubles. Do a
675 floating-point division. */
676 return PyFloat_FromDouble((double)xi / (double)yi);
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000677}
678
679static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000680int_mod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000681{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000682 long xi, yi;
683 long d, m;
684 CONVERT_TO_LONG(x, xi);
685 CONVERT_TO_LONG(y, yi);
686 switch (i_divmod(xi, yi, &d, &m)) {
687 case DIVMOD_OK:
688 return PyInt_FromLong(m);
689 case DIVMOD_OVERFLOW:
690 return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x,
691 (PyObject *)y);
692 default:
693 return NULL;
694 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000695}
696
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000698int_divmod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000699{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000700 long xi, yi;
701 long d, m;
702 CONVERT_TO_LONG(x, xi);
703 CONVERT_TO_LONG(y, yi);
704 switch (i_divmod(xi, yi, &d, &m)) {
705 case DIVMOD_OK:
706 return Py_BuildValue("(ll)", d, m);
707 case DIVMOD_OVERFLOW:
708 return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x,
709 (PyObject *)y);
710 default:
711 return NULL;
712 }
Guido van Rossum00466951991-05-05 20:08:27 +0000713}
714
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000716int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000717{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000718 register long iv, iw, iz=0, ix, temp, prev;
719 CONVERT_TO_LONG(v, iv);
720 CONVERT_TO_LONG(w, iw);
721 if (iw < 0) {
722 if ((PyObject *)z != Py_None) {
723 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
724 "cannot be negative when 3rd argument specified");
725 return NULL;
726 }
727 /* Return a float. This works because we know that
728 this calls float_pow() which converts its
729 arguments to double. */
730 return PyFloat_Type.tp_as_number->nb_power(
731 (PyObject *)v, (PyObject *)w, (PyObject *)z);
732 }
733 if ((PyObject *)z != Py_None) {
734 CONVERT_TO_LONG(z, iz);
735 if (iz == 0) {
736 PyErr_SetString(PyExc_ValueError,
737 "pow() 3rd argument cannot be 0");
738 return NULL;
739 }
740 }
741 /*
742 * XXX: The original exponentiation code stopped looping
743 * when temp hit zero; this code will continue onwards
744 * unnecessarily, but at least it won't cause any errors.
745 * Hopefully the speed improvement from the fast exponentiation
746 * will compensate for the slight inefficiency.
747 * XXX: Better handling of overflows is desperately needed.
748 */
749 temp = iv;
750 ix = 1;
751 while (iw > 0) {
752 prev = ix; /* Save value for overflow check */
753 if (iw & 1) {
Mark Dickinsondbbed042011-09-19 16:38:08 +0100754 /*
755 * The (unsigned long) cast below ensures that the multiplication
756 * is interpreted as an unsigned operation rather than a signed one
757 * (C99 6.3.1.8p1), thus avoiding the perils of undefined behaviour
758 * from signed arithmetic overflow (C99 6.5p5). See issue #12973.
759 */
760 ix = (unsigned long)ix * temp;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000761 if (temp == 0)
762 break; /* Avoid ix / 0 */
763 if (ix / temp != prev) {
764 return PyLong_Type.tp_as_number->nb_power(
765 (PyObject *)v,
766 (PyObject *)w,
767 (PyObject *)z);
768 }
769 }
770 iw >>= 1; /* Shift exponent down by 1 bit */
771 if (iw==0) break;
772 prev = temp;
Mark Dickinsondbbed042011-09-19 16:38:08 +0100773 temp = (unsigned long)temp * temp; /* Square the value of temp */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000774 if (prev != 0 && temp / prev != prev) {
775 return PyLong_Type.tp_as_number->nb_power(
776 (PyObject *)v, (PyObject *)w, (PyObject *)z);
777 }
778 if (iz) {
779 /* If we did a multiplication, perform a modulo */
780 ix = ix % iz;
781 temp = temp % iz;
782 }
783 }
784 if (iz) {
785 long div, mod;
786 switch (i_divmod(ix, iz, &div, &mod)) {
787 case DIVMOD_OK:
788 ix = mod;
789 break;
790 case DIVMOD_OVERFLOW:
791 return PyLong_Type.tp_as_number->nb_power(
792 (PyObject *)v, (PyObject *)w, (PyObject *)z);
793 default:
794 return NULL;
795 }
796 }
797 return PyInt_FromLong(ix);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000798}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000799
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000801int_neg(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000802{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000803 register long a;
804 a = v->ob_ival;
805 /* check for overflow */
806 if (UNARY_NEG_WOULD_OVERFLOW(a)) {
807 PyObject *o = PyLong_FromLong(a);
808 if (o != NULL) {
809 PyObject *result = PyNumber_Negative(o);
810 Py_DECREF(o);
811 return result;
812 }
813 return NULL;
814 }
815 return PyInt_FromLong(-a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000816}
817
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000819int_abs(PyIntObject *v)
Guido van Rossum00466951991-05-05 20:08:27 +0000820{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000821 if (v->ob_ival >= 0)
822 return int_int(v);
823 else
824 return int_neg(v);
Guido van Rossum00466951991-05-05 20:08:27 +0000825}
826
Guido van Rossum0bff0151991-05-14 12:05:32 +0000827static int
Fred Drakea2f55112000-07-09 15:16:51 +0000828int_nonzero(PyIntObject *v)
Guido van Rossum0bff0151991-05-14 12:05:32 +0000829{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000830 return v->ob_ival != 0;
Guido van Rossum0bff0151991-05-14 12:05:32 +0000831}
832
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000834int_invert(PyIntObject *v)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000835{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000836 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000837}
838
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000840int_lshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000841{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000842 long a, b, c;
843 PyObject *vv, *ww, *result;
Raymond Hettingera006c372004-06-26 23:22:57 +0000844
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000845 CONVERT_TO_LONG(v, a);
846 CONVERT_TO_LONG(w, b);
847 if (b < 0) {
848 PyErr_SetString(PyExc_ValueError, "negative shift count");
849 return NULL;
850 }
851 if (a == 0 || b == 0)
852 return int_int(v);
853 if (b >= LONG_BIT) {
854 vv = PyLong_FromLong(PyInt_AS_LONG(v));
855 if (vv == NULL)
856 return NULL;
857 ww = PyLong_FromLong(PyInt_AS_LONG(w));
858 if (ww == NULL) {
859 Py_DECREF(vv);
860 return NULL;
861 }
862 result = PyNumber_Lshift(vv, ww);
863 Py_DECREF(vv);
864 Py_DECREF(ww);
865 return result;
866 }
867 c = a << b;
868 if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) {
869 vv = PyLong_FromLong(PyInt_AS_LONG(v));
870 if (vv == NULL)
871 return NULL;
872 ww = PyLong_FromLong(PyInt_AS_LONG(w));
873 if (ww == NULL) {
874 Py_DECREF(vv);
875 return NULL;
876 }
877 result = PyNumber_Lshift(vv, ww);
878 Py_DECREF(vv);
879 Py_DECREF(ww);
880 return result;
881 }
882 return PyInt_FromLong(c);
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_rshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000887{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000888 register long a, b;
889 CONVERT_TO_LONG(v, a);
890 CONVERT_TO_LONG(w, b);
891 if (b < 0) {
892 PyErr_SetString(PyExc_ValueError, "negative shift count");
893 return NULL;
894 }
895 if (a == 0 || b == 0)
896 return int_int(v);
897 if (b >= LONG_BIT) {
898 if (a < 0)
899 a = -1;
900 else
901 a = 0;
902 }
903 else {
904 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
905 }
906 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000907}
908
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000910int_and(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000911{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000912 register long a, b;
913 CONVERT_TO_LONG(v, a);
914 CONVERT_TO_LONG(w, b);
915 return PyInt_FromLong(a & b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000916}
917
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000919int_xor(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000920{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000921 register long a, b;
922 CONVERT_TO_LONG(v, a);
923 CONVERT_TO_LONG(w, b);
924 return PyInt_FromLong(a ^ b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000925}
926
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000928int_or(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000929{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000930 register long a, b;
931 CONVERT_TO_LONG(v, a);
932 CONVERT_TO_LONG(w, b);
933 return PyInt_FromLong(a | b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000934}
935
Guido van Rossum1952e382001-09-19 01:25:16 +0000936static int
937int_coerce(PyObject **pv, PyObject **pw)
938{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000939 if (PyInt_Check(*pw)) {
940 Py_INCREF(*pv);
941 Py_INCREF(*pw);
942 return 0;
943 }
944 return 1; /* Can't do it */
Guido van Rossum1952e382001-09-19 01:25:16 +0000945}
946
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000947static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000948int_int(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000949{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000950 if (PyInt_CheckExact(v))
951 Py_INCREF(v);
952 else
953 v = (PyIntObject *)PyInt_FromLong(v->ob_ival);
954 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000955}
956
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000958int_long(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000959{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000960 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000961}
962
Mark Dickinson6736cf82009-04-20 21:13:33 +0000963static const unsigned char BitLengthTable[32] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000964 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
965 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
Mark Dickinson6736cf82009-04-20 21:13:33 +0000966};
967
968static int
969bits_in_ulong(unsigned long d)
970{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000971 int d_bits = 0;
972 while (d >= 32) {
973 d_bits += 6;
974 d >>= 6;
975 }
976 d_bits += (int)BitLengthTable[d];
977 return d_bits;
Mark Dickinson6736cf82009-04-20 21:13:33 +0000978}
979
980#if 8*SIZEOF_LONG-1 <= DBL_MANT_DIG
981/* Every Python int can be exactly represented as a float. */
982
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000983static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000984int_float(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000985{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000986 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000987}
988
Mark Dickinson6736cf82009-04-20 21:13:33 +0000989#else
990/* Here not all Python ints are exactly representable as floats, so we may
991 have to round. We do this manually, since the C standards don't specify
992 whether converting an integer to a float rounds up or down */
993
994static PyObject *
995int_float(PyIntObject *v)
996{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000997 unsigned long abs_ival, lsb;
998 int round_up;
Mark Dickinson6736cf82009-04-20 21:13:33 +0000999
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001000 if (v->ob_ival < 0)
1001 abs_ival = 0U-(unsigned long)v->ob_ival;
1002 else
1003 abs_ival = (unsigned long)v->ob_ival;
1004 if (abs_ival < (1L << DBL_MANT_DIG))
1005 /* small integer; no need to round */
1006 return PyFloat_FromDouble((double)v->ob_ival);
Mark Dickinson6736cf82009-04-20 21:13:33 +00001007
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001008 /* Round abs_ival to MANT_DIG significant bits, using the
1009 round-half-to-even rule. abs_ival & lsb picks out the 'rounding'
1010 bit: the first bit after the most significant MANT_DIG bits of
1011 abs_ival. We round up if this bit is set, provided that either:
Mark Dickinson6736cf82009-04-20 21:13:33 +00001012
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001013 (1) abs_ival isn't exactly halfway between two floats, in which
1014 case at least one of the bits following the rounding bit must be
1015 set; i.e., abs_ival & lsb-1 != 0, or:
Mark Dickinson6736cf82009-04-20 21:13:33 +00001016
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001017 (2) the resulting rounded value has least significant bit 0; or
1018 in other words the bit above the rounding bit is set (this is the
1019 'to-even' bit of round-half-to-even); i.e., abs_ival & 2*lsb != 0
Mark Dickinson6736cf82009-04-20 21:13:33 +00001020
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001021 The condition "(1) or (2)" equates to abs_ival & 3*lsb-1 != 0. */
Mark Dickinson6736cf82009-04-20 21:13:33 +00001022
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001023 lsb = 1L << (bits_in_ulong(abs_ival)-DBL_MANT_DIG-1);
1024 round_up = (abs_ival & lsb) && (abs_ival & (3*lsb-1));
1025 abs_ival &= -2*lsb;
1026 if (round_up)
1027 abs_ival += 2*lsb;
1028 return PyFloat_FromDouble(v->ob_ival < 0 ?
1029 -(double)abs_ival :
1030 (double)abs_ival);
Mark Dickinson6736cf82009-04-20 21:13:33 +00001031}
1032
1033#endif
1034
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001036int_oct(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001037{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001038 return _PyInt_Format(v, 8, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001039}
1040
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001041static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001042int_hex(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001043{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001044 return _PyInt_Format(v, 16, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001045}
1046
Jeremy Hylton938ace62002-07-17 16:30:39 +00001047static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00001048int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1049
Tim Peters6d6c1a32001-08-02 04:15:00 +00001050static PyObject *
1051int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1052{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001053 PyObject *x = NULL;
1054 int base = -909;
1055 static char *kwlist[] = {"x", "base", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00001056
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001057 if (type != &PyInt_Type)
1058 return int_subtype_new(type, args, kwds); /* Wimp out */
1059 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
1060 &x, &base))
1061 return NULL;
Serhiy Storchakacf095f82012-12-28 09:31:59 +02001062 if (x == NULL) {
1063 if (base != -909) {
1064 PyErr_SetString(PyExc_TypeError,
1065 "int() missing string argument");
1066 return NULL;
1067 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001068 return PyInt_FromLong(0L);
Serhiy Storchakacf095f82012-12-28 09:31:59 +02001069 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001070 if (base == -909)
1071 return PyNumber_Int(x);
1072 if (PyString_Check(x)) {
1073 /* Since PyInt_FromString doesn't have a length parameter,
1074 * check here for possible NULs in the string. */
1075 char *string = PyString_AS_STRING(x);
1076 if (strlen(string) != PyString_Size(x)) {
1077 /* create a repr() of the input string,
1078 * just like PyInt_FromString does */
1079 PyObject *srepr;
1080 srepr = PyObject_Repr(x);
1081 if (srepr == NULL)
1082 return NULL;
1083 PyErr_Format(PyExc_ValueError,
1084 "invalid literal for int() with base %d: %s",
1085 base, PyString_AS_STRING(srepr));
1086 Py_DECREF(srepr);
1087 return NULL;
1088 }
1089 return PyInt_FromString(string, NULL, base);
1090 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001091#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001092 if (PyUnicode_Check(x))
1093 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
1094 PyUnicode_GET_SIZE(x),
1095 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001096#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001097 PyErr_SetString(PyExc_TypeError,
1098 "int() can't convert non-string with explicit base");
1099 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001100}
1101
Guido van Rossumbef14172001-08-29 15:47:46 +00001102/* Wimpy, slow approach to tp_new calls for subtypes of int:
1103 first create a regular int from whatever arguments we got,
1104 then allocate a subtype instance and initialize its ob_ival
1105 from the regular int. The regular int is then thrown away.
1106*/
1107static PyObject *
1108int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1109{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001110 PyObject *tmp, *newobj;
1111 long ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001112
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001113 assert(PyType_IsSubtype(type, &PyInt_Type));
1114 tmp = int_new(&PyInt_Type, args, kwds);
1115 if (tmp == NULL)
1116 return NULL;
1117 if (!PyInt_Check(tmp)) {
1118 ival = PyLong_AsLong(tmp);
1119 if (ival == -1 && PyErr_Occurred()) {
1120 Py_DECREF(tmp);
1121 return NULL;
1122 }
1123 } else {
1124 ival = ((PyIntObject *)tmp)->ob_ival;
1125 }
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001126
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001127 newobj = type->tp_alloc(type, 0);
1128 if (newobj == NULL) {
1129 Py_DECREF(tmp);
1130 return NULL;
1131 }
1132 ((PyIntObject *)newobj)->ob_ival = ival;
1133 Py_DECREF(tmp);
1134 return newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001135}
1136
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001137static PyObject *
1138int_getnewargs(PyIntObject *v)
1139{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001140 return Py_BuildValue("(l)", v->ob_ival);
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001141}
1142
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001143static PyObject *
Mark Dickinson85e269b2009-05-03 20:39:06 +00001144int_get0(PyIntObject *v, void *context) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001145 return PyInt_FromLong(0L);
Mark Dickinson85e269b2009-05-03 20:39:06 +00001146}
1147
1148static PyObject *
1149int_get1(PyIntObject *v, void *context) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001150 return PyInt_FromLong(1L);
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001151}
1152
Mark Dickinson4b9d4732009-09-27 16:05:21 +00001153/* Convert an integer to a decimal string. On many platforms, this
1154 will be significantly faster than the general arbitrary-base
1155 conversion machinery in _PyInt_Format, thanks to optimization
1156 opportunities offered by division by a compile-time constant. */
1157static PyObject *
1158int_to_decimal_string(PyIntObject *v) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001159 char buf[sizeof(long)*CHAR_BIT/3+6], *p, *bufend;
1160 long n = v->ob_ival;
1161 unsigned long absn;
1162 p = bufend = buf + sizeof(buf);
1163 absn = n < 0 ? 0UL - n : n;
1164 do {
1165 *--p = '0' + (char)(absn % 10);
1166 absn /= 10;
1167 } while (absn);
1168 if (n < 0)
1169 *--p = '-';
1170 return PyString_FromStringAndSize(p, bufend - p);
Mark Dickinson4b9d4732009-09-27 16:05:21 +00001171}
1172
Eric Smith5e527eb2008-02-10 01:36:53 +00001173/* Convert an integer to the given base. Returns a string.
1174 If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'.
1175 If newstyle is zero, then use the pre-2.6 behavior of octal having
1176 a leading "0" */
1177PyAPI_FUNC(PyObject*)
1178_PyInt_Format(PyIntObject *v, int base, int newstyle)
1179{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001180 /* There are no doubt many, many ways to optimize this, using code
1181 similar to _PyLong_Format */
1182 long n = v->ob_ival;
1183 int negative = n < 0;
1184 int is_zero = n == 0;
Eric Smith5e527eb2008-02-10 01:36:53 +00001185
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001186 /* For the reasoning behind this size, see
1187 http://c-faq.com/misc/hexio.html. Then, add a few bytes for
1188 the possible sign and prefix "0[box]" */
1189 char buf[sizeof(n)*CHAR_BIT+6];
Eric Smith5e527eb2008-02-10 01:36:53 +00001190
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001191 /* Start by pointing to the end of the buffer. We fill in from
1192 the back forward. */
1193 char* p = &buf[sizeof(buf)];
Eric Smith5e527eb2008-02-10 01:36:53 +00001194
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001195 assert(base >= 2 && base <= 36);
Eric Smith5e527eb2008-02-10 01:36:53 +00001196
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001197 /* Special case base 10, for speed */
1198 if (base == 10)
1199 return int_to_decimal_string(v);
Mark Dickinson4b9d4732009-09-27 16:05:21 +00001200
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001201 do {
1202 /* I'd use i_divmod, except it doesn't produce the results
1203 I want when n is negative. So just duplicate the salient
1204 part here. */
1205 long div = n / base;
1206 long mod = n - div * base;
Eric Smith5e527eb2008-02-10 01:36:53 +00001207
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001208 /* convert abs(mod) to the right character in [0-9, a-z] */
1209 char cdigit = (char)(mod < 0 ? -mod : mod);
1210 cdigit += (cdigit < 10) ? '0' : 'a'-10;
1211 *--p = cdigit;
Eric Smith5e527eb2008-02-10 01:36:53 +00001212
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001213 n = div;
1214 } while(n);
Eric Smith5e527eb2008-02-10 01:36:53 +00001215
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001216 if (base == 2) {
1217 *--p = 'b';
1218 *--p = '0';
1219 }
1220 else if (base == 8) {
1221 if (newstyle) {
1222 *--p = 'o';
1223 *--p = '0';
1224 }
1225 else
1226 if (!is_zero)
1227 *--p = '0';
1228 }
1229 else if (base == 16) {
1230 *--p = 'x';
1231 *--p = '0';
1232 }
1233 else {
1234 *--p = '#';
1235 *--p = '0' + base%10;
1236 if (base > 10)
1237 *--p = '0' + base/10;
1238 }
1239 if (negative)
1240 *--p = '-';
Eric Smith5e527eb2008-02-10 01:36:53 +00001241
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001242 return PyString_FromStringAndSize(p, &buf[sizeof(buf)] - p);
Eric Smith5e527eb2008-02-10 01:36:53 +00001243}
1244
Eric Smitha9f7d622008-02-17 19:46:49 +00001245static PyObject *
1246int__format__(PyObject *self, PyObject *args)
1247{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001248 PyObject *format_spec;
Eric Smitha9f7d622008-02-17 19:46:49 +00001249
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001250 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
1251 return NULL;
1252 if (PyBytes_Check(format_spec))
1253 return _PyInt_FormatAdvanced(self,
1254 PyBytes_AS_STRING(format_spec),
1255 PyBytes_GET_SIZE(format_spec));
1256 if (PyUnicode_Check(format_spec)) {
1257 /* Convert format_spec to a str */
1258 PyObject *result;
1259 PyObject *str_spec = PyObject_Str(format_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00001260
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001261 if (str_spec == NULL)
1262 return NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +00001263
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001264 result = _PyInt_FormatAdvanced(self,
1265 PyBytes_AS_STRING(str_spec),
1266 PyBytes_GET_SIZE(str_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00001267
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001268 Py_DECREF(str_spec);
1269 return result;
1270 }
1271 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
1272 return NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +00001273}
1274
Mark Dickinson1a707982008-12-17 16:14:37 +00001275static PyObject *
1276int_bit_length(PyIntObject *v)
1277{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001278 unsigned long n;
Mark Dickinson1a707982008-12-17 16:14:37 +00001279
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001280 if (v->ob_ival < 0)
1281 /* avoid undefined behaviour when v->ob_ival == -LONG_MAX-1 */
1282 n = 0U-(unsigned long)v->ob_ival;
1283 else
1284 n = (unsigned long)v->ob_ival;
Mark Dickinson1a707982008-12-17 16:14:37 +00001285
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001286 return PyInt_FromLong(bits_in_ulong(n));
Mark Dickinson1a707982008-12-17 16:14:37 +00001287}
1288
1289PyDoc_STRVAR(int_bit_length_doc,
1290"int.bit_length() -> int\n\
1291\n\
1292Number of bits necessary to represent self in binary.\n\
1293>>> bin(37)\n\
1294'0b100101'\n\
1295>>> (37).bit_length()\n\
12966");
1297
Christian Heimes6f341092008-04-18 23:13:07 +00001298#if 0
1299static PyObject *
1300int_is_finite(PyObject *v)
1301{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001302 Py_RETURN_TRUE;
Christian Heimes6f341092008-04-18 23:13:07 +00001303}
1304#endif
1305
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001306static PyMethodDef int_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001307 {"conjugate", (PyCFunction)int_int, METH_NOARGS,
1308 "Returns self, the complex conjugate of any int."},
1309 {"bit_length", (PyCFunction)int_bit_length, METH_NOARGS,
1310 int_bit_length_doc},
Christian Heimes6f341092008-04-18 23:13:07 +00001311#if 0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001312 {"is_finite", (PyCFunction)int_is_finite, METH_NOARGS,
1313 "Returns always True."},
Christian Heimes6f341092008-04-18 23:13:07 +00001314#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001315 {"__trunc__", (PyCFunction)int_int, METH_NOARGS,
1316 "Truncating an Integral returns itself."},
1317 {"__getnewargs__", (PyCFunction)int_getnewargs, METH_NOARGS},
1318 {"__format__", (PyCFunction)int__format__, METH_VARARGS},
1319 {NULL, NULL} /* sentinel */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001320};
1321
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001322static PyGetSetDef int_getset[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001323 {"real",
1324 (getter)int_int, (setter)NULL,
1325 "the real part of a complex number",
1326 NULL},
1327 {"imag",
1328 (getter)int_get0, (setter)NULL,
1329 "the imaginary part of a complex number",
1330 NULL},
1331 {"numerator",
1332 (getter)int_int, (setter)NULL,
1333 "the numerator of a rational number in lowest terms",
1334 NULL},
1335 {"denominator",
1336 (getter)int_get1, (setter)NULL,
1337 "the denominator of a rational number in lowest terms",
1338 NULL},
1339 {NULL} /* Sentinel */
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001340};
1341
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001342PyDoc_STRVAR(int_doc,
Chris Jerdonekad4b0002012-10-07 20:37:54 -07001343"int(x=0) -> int or long\n\
1344int(x, base=10) -> int or long\n\
Tim Peters6d6c1a32001-08-02 04:15:00 +00001345\n\
Chris Jerdonekad4b0002012-10-07 20:37:54 -07001346Convert a number or string to an integer, or return 0 if no arguments\n\
1347are given. If x is floating point, the conversion truncates towards zero.\n\
1348If x is outside the integer range, the function returns a long instead.\n\
1349\n\
1350If x is not a number or if base is given, then x must be a string or\n\
1351Unicode object representing an integer literal in the given base. The\n\
1352literal can be preceded by '+' or '-' and be surrounded by whitespace.\n\
1353The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to\n\
1354interpret the base from the string as an integer literal.\n\
1355>>> int('0b100', base=0)\n\
13564");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001357
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358static PyNumberMethods int_as_number = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001359 (binaryfunc)int_add, /*nb_add*/
1360 (binaryfunc)int_sub, /*nb_subtract*/
1361 (binaryfunc)int_mul, /*nb_multiply*/
1362 (binaryfunc)int_classic_div, /*nb_divide*/
1363 (binaryfunc)int_mod, /*nb_remainder*/
1364 (binaryfunc)int_divmod, /*nb_divmod*/
1365 (ternaryfunc)int_pow, /*nb_power*/
1366 (unaryfunc)int_neg, /*nb_negative*/
1367 (unaryfunc)int_int, /*nb_positive*/
1368 (unaryfunc)int_abs, /*nb_absolute*/
1369 (inquiry)int_nonzero, /*nb_nonzero*/
1370 (unaryfunc)int_invert, /*nb_invert*/
1371 (binaryfunc)int_lshift, /*nb_lshift*/
1372 (binaryfunc)int_rshift, /*nb_rshift*/
1373 (binaryfunc)int_and, /*nb_and*/
1374 (binaryfunc)int_xor, /*nb_xor*/
1375 (binaryfunc)int_or, /*nb_or*/
1376 int_coerce, /*nb_coerce*/
1377 (unaryfunc)int_int, /*nb_int*/
1378 (unaryfunc)int_long, /*nb_long*/
1379 (unaryfunc)int_float, /*nb_float*/
1380 (unaryfunc)int_oct, /*nb_oct*/
1381 (unaryfunc)int_hex, /*nb_hex*/
1382 0, /*nb_inplace_add*/
1383 0, /*nb_inplace_subtract*/
1384 0, /*nb_inplace_multiply*/
1385 0, /*nb_inplace_divide*/
1386 0, /*nb_inplace_remainder*/
1387 0, /*nb_inplace_power*/
1388 0, /*nb_inplace_lshift*/
1389 0, /*nb_inplace_rshift*/
1390 0, /*nb_inplace_and*/
1391 0, /*nb_inplace_xor*/
1392 0, /*nb_inplace_or*/
1393 (binaryfunc)int_div, /* nb_floor_divide */
1394 (binaryfunc)int_true_divide, /* nb_true_divide */
1395 0, /* nb_inplace_floor_divide */
1396 0, /* nb_inplace_true_divide */
1397 (unaryfunc)int_int, /* nb_index */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001398};
1399
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400PyTypeObject PyInt_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001401 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1402 "int",
1403 sizeof(PyIntObject),
1404 0,
1405 (destructor)int_dealloc, /* tp_dealloc */
1406 (printfunc)int_print, /* tp_print */
1407 0, /* tp_getattr */
1408 0, /* tp_setattr */
1409 (cmpfunc)int_compare, /* tp_compare */
1410 (reprfunc)int_to_decimal_string, /* tp_repr */
1411 &int_as_number, /* tp_as_number */
1412 0, /* tp_as_sequence */
1413 0, /* tp_as_mapping */
1414 (hashfunc)int_hash, /* tp_hash */
1415 0, /* tp_call */
1416 (reprfunc)int_to_decimal_string, /* tp_str */
1417 PyObject_GenericGetAttr, /* tp_getattro */
1418 0, /* tp_setattro */
1419 0, /* tp_as_buffer */
1420 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
1421 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS, /* tp_flags */
1422 int_doc, /* tp_doc */
1423 0, /* tp_traverse */
1424 0, /* tp_clear */
1425 0, /* tp_richcompare */
1426 0, /* tp_weaklistoffset */
1427 0, /* tp_iter */
1428 0, /* tp_iternext */
1429 int_methods, /* tp_methods */
1430 0, /* tp_members */
1431 int_getset, /* tp_getset */
1432 0, /* tp_base */
1433 0, /* tp_dict */
1434 0, /* tp_descr_get */
1435 0, /* tp_descr_set */
1436 0, /* tp_dictoffset */
1437 0, /* tp_init */
1438 0, /* tp_alloc */
1439 int_new, /* tp_new */
1440 (freefunc)int_free, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001441};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001442
Neal Norwitzc91ed402002-12-30 22:29:22 +00001443int
Neal Norwitzb2501f42002-12-31 03:42:13 +00001444_PyInt_Init(void)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001445{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001446 PyIntObject *v;
1447 int ival;
Neal Norwitzc91ed402002-12-30 22:29:22 +00001448#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001449 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
1450 if (!free_list && (free_list = fill_free_list()) == NULL)
1451 return 0;
1452 /* PyObject_New is inlined */
1453 v = free_list;
1454 free_list = (PyIntObject *)Py_TYPE(v);
1455 PyObject_INIT(v, &PyInt_Type);
1456 v->ob_ival = ival;
1457 small_ints[ival + NSMALLNEGINTS] = v;
1458 }
Neal Norwitzc91ed402002-12-30 22:29:22 +00001459#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001460 return 1;
Neal Norwitzc91ed402002-12-30 22:29:22 +00001461}
1462
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001463int
1464PyInt_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001465{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001466 PyIntObject *p;
1467 PyIntBlock *list, *next;
1468 int i;
1469 int u; /* remaining unfreed ints per block */
1470 int freelist_size = 0;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001471
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001472 list = block_list;
1473 block_list = NULL;
1474 free_list = NULL;
1475 while (list != NULL) {
1476 u = 0;
1477 for (i = 0, p = &list->objects[0];
1478 i < N_INTOBJECTS;
1479 i++, p++) {
1480 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
1481 u++;
1482 }
1483 next = list->next;
1484 if (u) {
1485 list->next = block_list;
1486 block_list = list;
1487 for (i = 0, p = &list->objects[0];
1488 i < N_INTOBJECTS;
1489 i++, p++) {
1490 if (!PyInt_CheckExact(p) ||
1491 p->ob_refcnt == 0) {
1492 Py_TYPE(p) = (struct _typeobject *)
1493 free_list;
1494 free_list = p;
1495 }
Guido van Rossum51288bc1999-03-19 20:30:39 +00001496#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001497 else if (-NSMALLNEGINTS <= p->ob_ival &&
1498 p->ob_ival < NSMALLPOSINTS &&
1499 small_ints[p->ob_ival +
1500 NSMALLNEGINTS] == NULL) {
1501 Py_INCREF(p);
1502 small_ints[p->ob_ival +
1503 NSMALLNEGINTS] = p;
1504 }
Guido van Rossum51288bc1999-03-19 20:30:39 +00001505#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001506 }
1507 }
1508 else {
1509 PyMem_FREE(list);
1510 }
1511 freelist_size += u;
1512 list = next;
1513 }
Christian Heimes422051a2008-02-04 18:00:12 +00001514
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001515 return freelist_size;
Christian Heimes422051a2008-02-04 18:00:12 +00001516}
1517
1518void
1519PyInt_Fini(void)
1520{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001521 PyIntObject *p;
1522 PyIntBlock *list;
1523 int i;
1524 int u; /* total unfreed ints per block */
Christian Heimes422051a2008-02-04 18:00:12 +00001525
1526#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001527 PyIntObject **q;
Christian Heimes422051a2008-02-04 18:00:12 +00001528
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001529 i = NSMALLNEGINTS + NSMALLPOSINTS;
1530 q = small_ints;
1531 while (--i >= 0) {
1532 Py_XDECREF(*q);
1533 *q++ = NULL;
1534 }
Christian Heimes422051a2008-02-04 18:00:12 +00001535#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001536 u = PyInt_ClearFreeList();
1537 if (!Py_VerboseFlag)
1538 return;
1539 fprintf(stderr, "# cleanup ints");
1540 if (!u) {
1541 fprintf(stderr, "\n");
1542 }
1543 else {
1544 fprintf(stderr,
1545 ": %d unfreed int%s\n",
1546 u, u == 1 ? "" : "s");
1547 }
1548 if (Py_VerboseFlag > 1) {
1549 list = block_list;
1550 while (list != NULL) {
1551 for (i = 0, p = &list->objects[0];
1552 i < N_INTOBJECTS;
1553 i++, p++) {
1554 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
1555 /* XXX(twouters) cast refcount to
1556 long until %zd is universally
1557 available
1558 */
1559 fprintf(stderr,
1560 "# <int at %p, refcnt=%ld, val=%ld>\n",
1561 p, (long)p->ob_refcnt,
1562 p->ob_ival);
1563 }
1564 list = list->next;
1565 }
1566 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001567}