blob: a0e60e756f41bd094fe11b0f3c3500e0f54aea1e [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{
13 return LONG_MAX; /* To initialize sys.maxint */
14}
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
33#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000034#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 {
38 struct _intblock *next;
39 PyIntObject objects[N_INTOBJECTS];
40};
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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050 PyIntObject *p, *q;
Tim Peters29c0afc2002-04-28 16:57:34 +000051 /* Python's object allocator isn't appropriate for large blocks. */
Guido van Rossumb18618d2000-05-03 23:44:39 +000052 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
Guido van Rossum3f5da241990-12-20 15:06:42 +000053 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +000054 return (PyIntObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +000055 ((PyIntBlock *)p)->next = block_list;
56 block_list = (PyIntBlock *)p;
Tim Peters29c0afc2002-04-28 16:57:34 +000057 /* Link the int objects together, from rear to front, then return
58 the address of the last int object in the block. */
Guido van Rossum3fce8831999-03-12 19:43:17 +000059 p = &((PyIntBlock *)p)->objects[0];
Guido van Rossum3f5da241990-12-20 15:06:42 +000060 q = p + N_INTOBJECTS;
61 while (--q > p)
Christian Heimese93237d2007-12-19 02:37:44 +000062 Py_TYPE(q) = (struct _typeobject *)(q-1);
63 Py_TYPE(q) = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000064 return p + N_INTOBJECTS - 1;
65}
66
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000067#ifndef NSMALLPOSINTS
Georg Brandl418a1ef2006-02-22 11:30:06 +000068#define NSMALLPOSINTS 257
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000069#endif
70#ifndef NSMALLNEGINTS
Neal Norwitzc91ed402002-12-30 22:29:22 +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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 register PyIntObject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000090#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Neal Norwitzc91ed402002-12-30 22:29:22 +000091 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
92 v = small_ints[ival + NSMALLNEGINTS];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000094#ifdef COUNT_ALLOCS
95 if (ival >= 0)
96 quick_int_allocs++;
97 else
98 quick_neg_int_allocs++;
99#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 return (PyObject *) v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000101 }
102#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000103 if (free_list == NULL) {
104 if ((free_list = fill_free_list()) == NULL)
105 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106 }
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000107 /* Inline PyObject_New */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000108 v = free_list;
Christian Heimese93237d2007-12-19 02:37:44 +0000109 free_list = (PyIntObject *)Py_TYPE(v);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000110 PyObject_INIT(v, &PyInt_Type);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000111 v->ob_ival = ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 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{
118 if (ival <= LONG_MAX)
119 return PyInt_FromLong((long)ival);
120 return _PyLong_FromSize_t(ival);
121}
122
123PyObject *
124PyInt_FromSsize_t(Py_ssize_t ival)
125{
126 if (ival >= LONG_MIN && ival <= LONG_MAX)
127 return PyInt_FromLong((long)ival);
128 return _PyLong_FromSsize_t(ival);
129}
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{
Guido van Rossumdea6ef92001-09-11 16:13:52 +0000134 if (PyInt_CheckExact(v)) {
Christian Heimese93237d2007-12-19 02:37:44 +0000135 Py_TYPE(v) = (struct _typeobject *)free_list;
Guido van Rossumbef14172001-08-29 15:47:46 +0000136 free_list = v;
137 }
138 else
Christian Heimese93237d2007-12-19 02:37:44 +0000139 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{
Christian Heimese93237d2007-12-19 02:37:44 +0000145 Py_TYPE(v) = (struct _typeobject *)free_list;
Guido van Rossum93646982002-04-26 00:53:34 +0000146 free_list = v;
147}
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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 PyNumberMethods *nb;
153 PyIntObject *io;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000154 long val;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000155
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 if (op && PyInt_Check(op))
157 return PyInt_AS_LONG((PyIntObject*) op);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000158
Christian Heimese93237d2007-12-19 02:37:44 +0000159 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000160 nb->nb_int == NULL) {
Guido van Rossumc18a6f42000-05-09 14:27:48 +0000161 PyErr_SetString(PyExc_TypeError, "an integer is required");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162 return -1;
163 }
Tim Petersa3c01ce2001-12-04 23:05:10 +0000164
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 io = (PyIntObject*) (*nb->nb_int) (op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000166 if (io == NULL)
167 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 if (!PyInt_Check(io)) {
Walter Dörwaldf1715402002-11-19 20:49:15 +0000169 if (PyLong_Check(io)) {
170 /* got a long? => retry int conversion */
171 val = PyLong_AsLong((PyObject *)io);
Thomas Heller850566b2003-02-20 20:32:11 +0000172 Py_DECREF(io);
173 if ((val == -1) && PyErr_Occurred())
Walter Dörwaldf1715402002-11-19 20:49:15 +0000174 return -1;
Thomas Heller850566b2003-02-20 20:32:11 +0000175 return val;
Walter Dörwaldf1715402002-11-19 20:49:15 +0000176 }
177 else
178 {
Thomas Hellera4ea6032003-04-17 18:55:45 +0000179 Py_DECREF(io);
Walter Dörwaldf1715402002-11-19 20:49:15 +0000180 PyErr_SetString(PyExc_TypeError,
181 "nb_int should return int object");
182 return -1;
183 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000184 }
Tim Petersa3c01ce2001-12-04 23:05:10 +0000185
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 val = PyInt_AS_LONG(io);
187 Py_DECREF(io);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000188
Guido van Rossumbf8c0e31994-08-29 12:48:32 +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
Martin v. Löwis18e16552006-02-15 17:27:45 +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
201 if (op == NULL) {
202 PyErr_SetString(PyExc_TypeError, "an integer is required");
203 return -1;
204 }
205
206 if (PyInt_Check(op))
207 return PyInt_AS_LONG((PyIntObject*) op);
208 if (PyLong_Check(op))
Martin v. Löwis18e16552006-02-15 17:27:45 +0000209 return _PyLong_AsSsize_t(op);
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000210#if SIZEOF_SIZE_T == SIZEOF_LONG
Martin v. Löwis18e16552006-02-15 17:27:45 +0000211 return PyInt_AsLong(op);
212#else
213
Christian Heimese93237d2007-12-19 02:37:44 +0000214 if ((nb = Py_TYPE(op)->tp_as_number) == NULL ||
Martin v. Löwis18e16552006-02-15 17:27:45 +0000215 (nb->nb_int == NULL && nb->nb_long == 0)) {
216 PyErr_SetString(PyExc_TypeError, "an integer is required");
217 return -1;
218 }
219
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +0000220 if (nb->nb_long != 0)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000221 io = (PyIntObject*) (*nb->nb_long) (op);
Kristján Valur Jónssonabe1d482007-05-07 16:46:54 +0000222 else
Martin v. Löwis18e16552006-02-15 17:27:45 +0000223 io = (PyIntObject*) (*nb->nb_int) (op);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000224 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 "nb_int should return int object");
240 return -1;
241 }
242 }
243
244 val = PyInt_AS_LONG(io);
245 Py_DECREF(io);
246
247 return val;
248#endif
249}
250
Thomas Hellera4ea6032003-04-17 18:55:45 +0000251unsigned long
252PyInt_AsUnsignedLongMask(register PyObject *op)
253{
254 PyNumberMethods *nb;
255 PyIntObject *io;
256 unsigned long val;
257
258 if (op && PyInt_Check(op))
259 return PyInt_AS_LONG((PyIntObject*) op);
260 if (op && PyLong_Check(op))
261 return PyLong_AsUnsignedLongMask(op);
262
Christian Heimese93237d2007-12-19 02:37:44 +0000263 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
Thomas Hellera4ea6032003-04-17 18:55:45 +0000264 nb->nb_int == NULL) {
265 PyErr_SetString(PyExc_TypeError, "an integer is required");
Skip Montanaro429433b2006-04-18 00:35:43 +0000266 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000267 }
268
269 io = (PyIntObject*) (*nb->nb_int) (op);
270 if (io == NULL)
Skip Montanaro429433b2006-04-18 00:35:43 +0000271 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000272 if (!PyInt_Check(io)) {
273 if (PyLong_Check(io)) {
274 val = PyLong_AsUnsignedLongMask((PyObject *)io);
275 Py_DECREF(io);
276 if (PyErr_Occurred())
Skip Montanaro429433b2006-04-18 00:35:43 +0000277 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000278 return val;
279 }
280 else
281 {
282 Py_DECREF(io);
283 PyErr_SetString(PyExc_TypeError,
284 "nb_int should return int object");
Skip Montanaro429433b2006-04-18 00:35:43 +0000285 return (unsigned long)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000286 }
287 }
288
289 val = PyInt_AS_LONG(io);
290 Py_DECREF(io);
291
292 return val;
293}
294
295#ifdef HAVE_LONG_LONG
296unsigned PY_LONG_LONG
297PyInt_AsUnsignedLongLongMask(register PyObject *op)
298{
299 PyNumberMethods *nb;
300 PyIntObject *io;
301 unsigned PY_LONG_LONG val;
302
303 if (op && PyInt_Check(op))
304 return PyInt_AS_LONG((PyIntObject*) op);
305 if (op && PyLong_Check(op))
306 return PyLong_AsUnsignedLongLongMask(op);
307
Christian Heimese93237d2007-12-19 02:37:44 +0000308 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
Thomas Hellera4ea6032003-04-17 18:55:45 +0000309 nb->nb_int == NULL) {
310 PyErr_SetString(PyExc_TypeError, "an integer is required");
Skip Montanaro429433b2006-04-18 00:35:43 +0000311 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000312 }
313
314 io = (PyIntObject*) (*nb->nb_int) (op);
315 if (io == NULL)
Skip Montanaro429433b2006-04-18 00:35:43 +0000316 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000317 if (!PyInt_Check(io)) {
318 if (PyLong_Check(io)) {
319 val = PyLong_AsUnsignedLongLongMask((PyObject *)io);
320 Py_DECREF(io);
321 if (PyErr_Occurred())
Skip Montanaro429433b2006-04-18 00:35:43 +0000322 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000323 return val;
324 }
325 else
326 {
327 Py_DECREF(io);
328 PyErr_SetString(PyExc_TypeError,
329 "nb_int should return int object");
Skip Montanaro429433b2006-04-18 00:35:43 +0000330 return (unsigned PY_LONG_LONG)-1;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000331 }
332 }
333
334 val = PyInt_AS_LONG(io);
335 Py_DECREF(io);
336
337 return val;
338}
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{
344 char *end;
345 long x;
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000346 Py_ssize_t slen;
347 PyObject *sobj, *srepr;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000348
349 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossum47710652003-02-12 20:48:22 +0000350 PyErr_SetString(PyExc_ValueError,
351 "int() base must be >= 2 and <= 36");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000352 return NULL;
353 }
354
355 while (*s && isspace(Py_CHARMASK(*s)))
356 s++;
357 errno = 0;
Guido van Rossum47710652003-02-12 20:48:22 +0000358 if (base == 0 && s[0] == '0') {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000359 x = (long) PyOS_strtoul(s, &end, base);
Guido van Rossum47710652003-02-12 20:48:22 +0000360 if (x < 0)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000361 return PyLong_FromString(s, pend, base);
Guido van Rossum47710652003-02-12 20:48:22 +0000362 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000363 else
364 x = PyOS_strtol(s, &end, base);
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000365 if (end == s || !isalnum(Py_CHARMASK(end[-1])))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000366 goto bad;
367 while (*end && isspace(Py_CHARMASK(*end)))
368 end++;
369 if (*end != '\0') {
370 bad:
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000371 slen = strlen(s) < 200 ? strlen(s) : 200;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000372 sobj = PyString_FromStringAndSize(s, slen);
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000373 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",
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000381 base, PyString_AS_STRING(srepr));
Thomas Wouters9cb28bea2006-04-11 23:50:33 +0000382 Py_DECREF(srepr);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000383 return NULL;
384 }
Tim Petersc8854432004-08-25 02:14:08 +0000385 else if (errno != 0)
Walter Dörwald07e14762002-11-06 16:15:14 +0000386 return PyLong_FromString(s, pend, base);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000387 if (pend)
388 *pend = end;
389 return PyInt_FromLong(x);
390}
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{
Walter Dörwald07e14762002-11-06 16:15:14 +0000396 PyObject *result;
Anthony Baxter377be112006-04-11 06:54:30 +0000397 char *buffer = (char *)PyMem_MALLOC(length+1);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000398
Walter Dörwald07e14762002-11-06 16:15:14 +0000399 if (buffer == NULL)
Neal Norwitzd501d1f2007-05-16 04:33:50 +0000400 return PyErr_NoMemory();
Walter Dörwald07e14762002-11-06 16:15:14 +0000401
402 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) {
403 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000404 return NULL;
405 }
Walter Dörwald07e14762002-11-06 16:15:14 +0000406 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
418#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 }
426
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{
Brett Cannon01531592007-09-17 03:28:34 +0000432 long int_val = v->ob_ival;
433 Py_BEGIN_ALLOW_THREADS
434 fprintf(fp, "%ld", int_val);
435 Py_END_ALLOW_THREADS
Guido van Rossum90933611991-06-07 16:10:43 +0000436 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437}
438
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000440int_repr(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441{
Eric Smith5e527eb2008-02-10 01:36:53 +0000442 return _PyInt_Format(v, 10, 0);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443}
444
445static int
Fred Drakea2f55112000-07-09 15:16:51 +0000446int_compare(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447{
448 register long i = v->ob_ival;
449 register long j = w->ob_ival;
450 return (i < j) ? -1 : (i > j) ? 1 : 0;
451}
452
Guido van Rossum9bfef441993-03-29 10:43:31 +0000453static long
Fred Drakea2f55112000-07-09 15:16:51 +0000454int_hash(PyIntObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000455{
Guido van Rossum541cdd81997-01-06 22:53:20 +0000456 /* XXX If this is changed, you also need to change the way
457 Python's long, float and complex types are hashed. */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000458 long x = v -> ob_ival;
459 if (x == -1)
460 x = -2;
461 return x;
462}
463
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000465int_add(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466{
467 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000468 CONVERT_TO_LONG(v, a);
469 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470 x = a + b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000471 if ((x^a) >= 0 || (x^b) >= 0)
472 return PyInt_FromLong(x);
Guido van Rossume27f7952001-08-23 02:59:04 +0000473 return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474}
475
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000477int_sub(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000478{
479 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000480 CONVERT_TO_LONG(v, a);
481 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000482 x = a - b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000483 if ((x^a) >= 0 || (x^~b) >= 0)
484 return PyInt_FromLong(x);
Guido van Rossume27f7952001-08-23 02:59:04 +0000485 return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
486 (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487}
488
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000489/*
Tim Petersa3c01ce2001-12-04 23:05:10 +0000490Integer overflow checking for * is painful: Python tried a couple ways, but
491they didn't work on all platforms, or failed in endcases (a product of
492-sys.maxint-1 has been a particular pain).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000493
Tim Petersa3c01ce2001-12-04 23:05:10 +0000494Here's another way:
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000495
Tim Petersa3c01ce2001-12-04 23:05:10 +0000496The native long product x*y is either exactly right or *way* off, being
497just the last n bits of the true product, where n is the number of bits
498in a long (the delivered product is the true product plus i*2**n for
499some integer i).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000500
Tim Petersa3c01ce2001-12-04 23:05:10 +0000501The native double product (double)x * (double)y is subject to three
502rounding errors: on a sizeof(long)==8 box, each cast to double can lose
503info, and even on a sizeof(long)==4 box, the multiplication can lose info.
504But, unlike the native long product, it's not in *range* trouble: even
505if sizeof(long)==32 (256-bit longs), the product easily fits in the
506dynamic range of a double. So the leading 50 (or so) bits of the double
507product are correct.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000508
Tim Petersa3c01ce2001-12-04 23:05:10 +0000509We check these two ways against each other, and declare victory if they're
510approximately the same. Else, because the native long product is the only
511one that can lose catastrophic amounts of information, it's the native long
512product that must have overflowed.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000513*/
514
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515static PyObject *
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000516int_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000517{
Tim Petersa3c01ce2001-12-04 23:05:10 +0000518 long a, b;
519 long longprod; /* a*b in native long arithmetic */
520 double doubled_longprod; /* (double)longprod */
521 double doubleprod; /* (double)a * (double)b */
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000522
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000523 CONVERT_TO_LONG(v, a);
524 CONVERT_TO_LONG(w, b);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000525 longprod = a * b;
526 doubleprod = (double)a * (double)b;
527 doubled_longprod = (double)longprod;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000528
Tim Petersa3c01ce2001-12-04 23:05:10 +0000529 /* Fast path for normal case: small multiplicands, and no info
530 is lost in either method. */
531 if (doubled_longprod == doubleprod)
532 return PyInt_FromLong(longprod);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000533
Tim Petersa3c01ce2001-12-04 23:05:10 +0000534 /* Somebody somewhere lost info. Close enough, or way off? Note
535 that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0).
536 The difference either is or isn't significant compared to the
537 true value (of which doubleprod is a good approximation).
538 */
539 {
540 const double diff = doubled_longprod - doubleprod;
541 const double absdiff = diff >= 0.0 ? diff : -diff;
542 const double absprod = doubleprod >= 0.0 ? doubleprod :
543 -doubleprod;
544 /* absdiff/absprod <= 1/32 iff
545 32 * absdiff <= absprod -- 5 good bits is "close enough" */
546 if (32.0 * absdiff <= absprod)
547 return PyInt_FromLong(longprod);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000548 else
549 return PyLong_Type.tp_as_number->nb_multiply(v, w);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000550 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000551}
552
Armin Rigo7ccbca92006-10-04 12:17:45 +0000553/* Integer overflow checking for unary negation: on a 2's-complement
554 * box, -x overflows iff x is the most negative long. In this case we
555 * get -x == x. However, -x is undefined (by C) if x /is/ the most
556 * negative long (it's a signed overflow case), and some compilers care.
557 * So we cast x to unsigned long first. However, then other compilers
558 * warn about applying unary minus to an unsigned operand. Hence the
559 * weird "0-".
560 */
561#define UNARY_NEG_WOULD_OVERFLOW(x) \
562 ((x) < 0 && (unsigned long)(x) == 0-(unsigned long)(x))
563
Guido van Rossume27f7952001-08-23 02:59:04 +0000564/* Return type of i_divmod */
565enum divmod_result {
566 DIVMOD_OK, /* Correct result */
567 DIVMOD_OVERFLOW, /* Overflow, try again using longs */
568 DIVMOD_ERROR /* Exception raised */
569};
570
571static enum divmod_result
Tim Peters1dad6a82001-06-18 19:21:11 +0000572i_divmod(register long x, register long y,
Fred Drakea2f55112000-07-09 15:16:51 +0000573 long *p_xdivy, long *p_xmody)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000575 long xdivy, xmody;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000576
Tim Peters1dad6a82001-06-18 19:21:11 +0000577 if (y == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000579 "integer division or modulo by zero");
Guido van Rossume27f7952001-08-23 02:59:04 +0000580 return DIVMOD_ERROR;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000581 }
Tim Peters1dad6a82001-06-18 19:21:11 +0000582 /* (-sys.maxint-1)/-1 is the only overflow case. */
Armin Rigo7ccbca92006-10-04 12:17:45 +0000583 if (y == -1 && UNARY_NEG_WOULD_OVERFLOW(x))
Guido van Rossume27f7952001-08-23 02:59:04 +0000584 return DIVMOD_OVERFLOW;
Tim Peters1dad6a82001-06-18 19:21:11 +0000585 xdivy = x / y;
586 xmody = x - xdivy * y;
587 /* If the signs of x and y differ, and the remainder is non-0,
588 * C89 doesn't define whether xdivy is now the floor or the
589 * ceiling of the infinitely precise quotient. We want the floor,
590 * and we have it iff the remainder's sign matches y's.
591 */
592 if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
593 xmody += y;
594 --xdivy;
595 assert(xmody && ((y ^ xmody) >= 0));
Guido van Rossum00466951991-05-05 20:08:27 +0000596 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000597 *p_xdivy = xdivy;
598 *p_xmody = xmody;
Guido van Rossume27f7952001-08-23 02:59:04 +0000599 return DIVMOD_OK;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000600}
601
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000603int_div(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000604{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000605 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000606 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000607 CONVERT_TO_LONG(x, xi);
608 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000609 switch (i_divmod(xi, yi, &d, &m)) {
610 case DIVMOD_OK:
611 return PyInt_FromLong(d);
612 case DIVMOD_OVERFLOW:
613 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
614 (PyObject *)y);
615 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000616 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000617 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000618}
619
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000621int_classic_div(PyIntObject *x, PyIntObject *y)
622{
623 long xi, yi;
624 long d, m;
625 CONVERT_TO_LONG(x, xi);
626 CONVERT_TO_LONG(y, yi);
627 if (Py_DivisionWarningFlag &&
628 PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0)
629 return NULL;
630 switch (i_divmod(xi, yi, &d, &m)) {
631 case DIVMOD_OK:
632 return PyInt_FromLong(d);
633 case DIVMOD_OVERFLOW:
634 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
635 (PyObject *)y);
636 default:
637 return NULL;
638 }
639}
640
641static PyObject *
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000642int_true_divide(PyObject *v, PyObject *w)
643{
Tim Peterse2a60002001-09-04 06:17:36 +0000644 /* If they aren't both ints, give someone else a chance. In
645 particular, this lets int/long get handled by longs, which
646 underflows to 0 gracefully if the long is too big to convert
647 to float. */
648 if (PyInt_Check(v) && PyInt_Check(w))
649 return PyFloat_Type.tp_as_number->nb_true_divide(v, w);
650 Py_INCREF(Py_NotImplemented);
651 return Py_NotImplemented;
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000652}
653
654static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000655int_mod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000656{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000657 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000658 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000659 CONVERT_TO_LONG(x, xi);
660 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000661 switch (i_divmod(xi, yi, &d, &m)) {
662 case DIVMOD_OK:
663 return PyInt_FromLong(m);
664 case DIVMOD_OVERFLOW:
665 return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x,
666 (PyObject *)y);
667 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000668 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000669 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000670}
671
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000673int_divmod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000674{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000675 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000676 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000677 CONVERT_TO_LONG(x, xi);
678 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000679 switch (i_divmod(xi, yi, &d, &m)) {
680 case DIVMOD_OK:
681 return Py_BuildValue("(ll)", d, m);
682 case DIVMOD_OVERFLOW:
683 return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x,
684 (PyObject *)y);
685 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000686 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000687 }
Guido van Rossum00466951991-05-05 20:08:27 +0000688}
689
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000691int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000692{
Guido van Rossum9478dd41996-12-06 20:14:43 +0000693 register long iv, iw, iz=0, ix, temp, prev;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000694 CONVERT_TO_LONG(v, iv);
695 CONVERT_TO_LONG(w, iw);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000696 if (iw < 0) {
Tim Peters32f453e2001-09-03 08:35:41 +0000697 if ((PyObject *)z != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +0000698 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
699 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +0000700 return NULL;
701 }
Guido van Rossumb82fedc2001-07-12 11:19:45 +0000702 /* Return a float. This works because we know that
703 this calls float_pow() which converts its
704 arguments to double. */
705 return PyFloat_Type.tp_as_number->nb_power(
706 (PyObject *)v, (PyObject *)w, (PyObject *)z);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000707 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 if ((PyObject *)z != Py_None) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000709 CONVERT_TO_LONG(z, iz);
Guido van Rossum9478dd41996-12-06 20:14:43 +0000710 if (iz == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 PyErr_SetString(PyExc_ValueError,
Tim Peters4c483c42001-09-05 06:24:58 +0000712 "pow() 3rd argument cannot be 0");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000713 return NULL;
714 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000715 }
716 /*
717 * XXX: The original exponentiation code stopped looping
718 * when temp hit zero; this code will continue onwards
719 * unnecessarily, but at least it won't cause any errors.
720 * Hopefully the speed improvement from the fast exponentiation
721 * will compensate for the slight inefficiency.
722 * XXX: Better handling of overflows is desperately needed.
723 */
724 temp = iv;
725 ix = 1;
726 while (iw > 0) {
727 prev = ix; /* Save value for overflow check */
Tim Petersa3c01ce2001-12-04 23:05:10 +0000728 if (iw & 1) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000729 ix = ix*temp;
730 if (temp == 0)
731 break; /* Avoid ix / 0 */
Guido van Rossume27f7952001-08-23 02:59:04 +0000732 if (ix / temp != prev) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000733 return PyLong_Type.tp_as_number->nb_power(
734 (PyObject *)v,
735 (PyObject *)w,
Tim Peters31960db2001-08-23 21:28:33 +0000736 (PyObject *)z);
Guido van Rossume27f7952001-08-23 02:59:04 +0000737 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000738 }
739 iw >>= 1; /* Shift exponent down by 1 bit */
740 if (iw==0) break;
741 prev = temp;
742 temp *= temp; /* Square the value of temp */
Tim Petersc8854432004-08-25 02:14:08 +0000743 if (prev != 0 && temp / prev != prev) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000744 return PyLong_Type.tp_as_number->nb_power(
745 (PyObject *)v, (PyObject *)w, (PyObject *)z);
746 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000747 if (iz) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000748 /* If we did a multiplication, perform a modulo */
749 ix = ix % iz;
750 temp = temp % iz;
751 }
752 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000753 if (iz) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000754 long div, mod;
Guido van Rossume27f7952001-08-23 02:59:04 +0000755 switch (i_divmod(ix, iz, &div, &mod)) {
756 case DIVMOD_OK:
757 ix = mod;
758 break;
759 case DIVMOD_OVERFLOW:
760 return PyLong_Type.tp_as_number->nb_power(
761 (PyObject *)v, (PyObject *)w, (PyObject *)z);
762 default:
763 return NULL;
764 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000765 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 return PyInt_FromLong(ix);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000767}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000768
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000770int_neg(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000771{
Martin v. Löwis820d6ac2006-10-04 05:47:34 +0000772 register long a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000773 a = v->ob_ival;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000774 /* check for overflow */
775 if (UNARY_NEG_WOULD_OVERFLOW(a)) {
Tim Petersc8854432004-08-25 02:14:08 +0000776 PyObject *o = PyLong_FromLong(a);
Neal Norwitzfa56e2d2003-01-19 15:40:09 +0000777 if (o != NULL) {
778 PyObject *result = PyNumber_Negative(o);
779 Py_DECREF(o);
780 return result;
781 }
782 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000783 }
Martin v. Löwis820d6ac2006-10-04 05:47:34 +0000784 return PyInt_FromLong(-a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000785}
786
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000788int_abs(PyIntObject *v)
Guido van Rossum00466951991-05-05 20:08:27 +0000789{
790 if (v->ob_ival >= 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000791 return int_int(v);
Guido van Rossum00466951991-05-05 20:08:27 +0000792 else
793 return int_neg(v);
794}
795
Guido van Rossum0bff0151991-05-14 12:05:32 +0000796static int
Fred Drakea2f55112000-07-09 15:16:51 +0000797int_nonzero(PyIntObject *v)
Guido van Rossum0bff0151991-05-14 12:05:32 +0000798{
799 return v->ob_ival != 0;
800}
801
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000803int_invert(PyIntObject *v)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000804{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000806}
807
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000808static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000809int_lshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000810{
Guido van Rossum078151d2002-08-11 04:24:12 +0000811 long a, b, c;
Raymond Hettingera006c372004-06-26 23:22:57 +0000812 PyObject *vv, *ww, *result;
813
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000814 CONVERT_TO_LONG(v, a);
815 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000816 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000817 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000818 return NULL;
819 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000820 if (a == 0 || b == 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000821 return int_int(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000822 if (b >= LONG_BIT) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000823 vv = PyLong_FromLong(PyInt_AS_LONG(v));
824 if (vv == NULL)
825 return NULL;
826 ww = PyLong_FromLong(PyInt_AS_LONG(w));
827 if (ww == NULL) {
828 Py_DECREF(vv);
829 return NULL;
830 }
831 result = PyNumber_Lshift(vv, ww);
832 Py_DECREF(vv);
833 Py_DECREF(ww);
834 return result;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000835 }
Tim Petersda1a2212002-08-11 17:54:42 +0000836 c = a << b;
837 if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000838 vv = PyLong_FromLong(PyInt_AS_LONG(v));
839 if (vv == NULL)
840 return NULL;
841 ww = PyLong_FromLong(PyInt_AS_LONG(w));
842 if (ww == NULL) {
843 Py_DECREF(vv);
844 return NULL;
845 }
846 result = PyNumber_Lshift(vv, ww);
847 Py_DECREF(vv);
848 Py_DECREF(ww);
849 return result;
Guido van Rossum078151d2002-08-11 04:24:12 +0000850 }
851 return PyInt_FromLong(c);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000852}
853
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000855int_rshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000856{
857 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000858 CONVERT_TO_LONG(v, a);
859 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000860 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000861 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000862 return NULL;
863 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000864 if (a == 0 || b == 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000865 return int_int(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000866 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000867 if (a < 0)
868 a = -1;
869 else
870 a = 0;
871 }
872 else {
Tim Peters7d3a5112000-07-08 04:17:21 +0000873 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000874 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000875 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000876}
877
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000878static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000879int_and(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000880{
881 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000882 CONVERT_TO_LONG(v, a);
883 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 return PyInt_FromLong(a & b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000885}
886
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000887static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000888int_xor(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000889{
890 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000891 CONVERT_TO_LONG(v, a);
892 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 return PyInt_FromLong(a ^ b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000894}
895
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000897int_or(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000898{
899 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000900 CONVERT_TO_LONG(v, a);
901 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000902 return PyInt_FromLong(a | b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000903}
904
Guido van Rossum1952e382001-09-19 01:25:16 +0000905static int
906int_coerce(PyObject **pv, PyObject **pw)
907{
908 if (PyInt_Check(*pw)) {
909 Py_INCREF(*pv);
910 Py_INCREF(*pw);
911 return 0;
912 }
913 return 1; /* Can't do it */
914}
915
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000917int_int(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000918{
Brett Cannonc3647ac2005-04-26 03:45:26 +0000919 if (PyInt_CheckExact(v))
920 Py_INCREF(v);
921 else
922 v = (PyIntObject *)PyInt_FromLong(v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000924}
925
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000927int_long(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000928{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000929 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000930}
931
Mark Dickinson6736cf82009-04-20 21:13:33 +0000932static const unsigned char BitLengthTable[32] = {
933 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
934 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
935};
936
937static int
938bits_in_ulong(unsigned long d)
939{
940 int d_bits = 0;
941 while (d >= 32) {
942 d_bits += 6;
943 d >>= 6;
944 }
945 d_bits += (int)BitLengthTable[d];
946 return d_bits;
947}
948
949#if 8*SIZEOF_LONG-1 <= DBL_MANT_DIG
950/* Every Python int can be exactly represented as a float. */
951
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000953int_float(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000954{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000956}
957
Mark Dickinson6736cf82009-04-20 21:13:33 +0000958#else
959/* Here not all Python ints are exactly representable as floats, so we may
960 have to round. We do this manually, since the C standards don't specify
961 whether converting an integer to a float rounds up or down */
962
963static PyObject *
964int_float(PyIntObject *v)
965{
966 unsigned long abs_ival, lsb;
967 int round_up;
968
969 if (v->ob_ival < 0)
970 abs_ival = 0U-(unsigned long)v->ob_ival;
971 else
972 abs_ival = (unsigned long)v->ob_ival;
973 if (abs_ival < (1L << DBL_MANT_DIG))
974 /* small integer; no need to round */
975 return PyFloat_FromDouble((double)v->ob_ival);
976
977 /* Round abs_ival to MANT_DIG significant bits, using the
978 round-half-to-even rule. abs_ival & lsb picks out the 'rounding'
979 bit: the first bit after the most significant MANT_DIG bits of
980 abs_ival. We round up if this bit is set, provided that either:
981
982 (1) abs_ival isn't exactly halfway between two floats, in which
983 case at least one of the bits following the rounding bit must be
984 set; i.e., abs_ival & lsb-1 != 0, or:
985
986 (2) the resulting rounded value has least significant bit 0; or
987 in other words the bit above the rounding bit is set (this is the
988 'to-even' bit of round-half-to-even); i.e., abs_ival & 2*lsb != 0
989
990 The condition "(1) or (2)" equates to abs_ival & 3*lsb-1 != 0. */
991
992 lsb = 1L << (bits_in_ulong(abs_ival)-DBL_MANT_DIG-1);
993 round_up = (abs_ival & lsb) && (abs_ival & (3*lsb-1));
994 abs_ival &= -2*lsb;
995 if (round_up)
996 abs_ival += 2*lsb;
997 return PyFloat_FromDouble(v->ob_ival < 0 ?
998 -(double)abs_ival :
999 (double)abs_ival);
1000}
1001
1002#endif
1003
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001004static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001005int_oct(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001006{
Eric Smith5e527eb2008-02-10 01:36:53 +00001007 return _PyInt_Format(v, 8, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001008}
1009
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001010static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +00001011int_hex(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001012{
Eric Smith5e527eb2008-02-10 01:36:53 +00001013 return _PyInt_Format(v, 16, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001014}
1015
Jeremy Hylton938ace62002-07-17 16:30:39 +00001016static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00001017int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1018
Tim Peters6d6c1a32001-08-02 04:15:00 +00001019static PyObject *
1020int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1021{
1022 PyObject *x = NULL;
1023 int base = -909;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001024 static char *kwlist[] = {"x", "base", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00001025
Guido van Rossumbef14172001-08-29 15:47:46 +00001026 if (type != &PyInt_Type)
1027 return int_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001028 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
1029 &x, &base))
1030 return NULL;
1031 if (x == NULL)
1032 return PyInt_FromLong(0L);
1033 if (base == -909)
1034 return PyNumber_Int(x);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001035 if (PyString_Check(x)) {
Georg Brandl2c1375c2006-10-12 11:27:59 +00001036 /* Since PyInt_FromString doesn't have a length parameter,
1037 * check here for possible NULs in the string. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001038 char *string = PyString_AS_STRING(x);
1039 if (strlen(string) != PyString_Size(x)) {
Georg Brandl2c1375c2006-10-12 11:27:59 +00001040 /* create a repr() of the input string,
1041 * just like PyInt_FromString does */
1042 PyObject *srepr;
1043 srepr = PyObject_Repr(x);
1044 if (srepr == NULL)
1045 return NULL;
1046 PyErr_Format(PyExc_ValueError,
1047 "invalid literal for int() with base %d: %s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001048 base, PyString_AS_STRING(srepr));
Georg Brandl2c1375c2006-10-12 11:27:59 +00001049 Py_DECREF(srepr);
1050 return NULL;
1051 }
1052 return PyInt_FromString(string, NULL, base);
1053 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001054#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00001055 if (PyUnicode_Check(x))
1056 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
1057 PyUnicode_GET_SIZE(x),
1058 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001059#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00001060 PyErr_SetString(PyExc_TypeError,
1061 "int() can't convert non-string with explicit base");
1062 return NULL;
1063}
1064
Guido van Rossumbef14172001-08-29 15:47:46 +00001065/* Wimpy, slow approach to tp_new calls for subtypes of int:
1066 first create a regular int from whatever arguments we got,
1067 then allocate a subtype instance and initialize its ob_ival
1068 from the regular int. The regular int is then thrown away.
1069*/
1070static PyObject *
1071int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1072{
Anthony Baxter377be112006-04-11 06:54:30 +00001073 PyObject *tmp, *newobj;
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001074 long ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001075
1076 assert(PyType_IsSubtype(type, &PyInt_Type));
1077 tmp = int_new(&PyInt_Type, args, kwds);
1078 if (tmp == NULL)
1079 return NULL;
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001080 if (!PyInt_Check(tmp)) {
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001081 ival = PyLong_AsLong(tmp);
Michael W. Hudson71665dc2003-08-11 17:32:02 +00001082 if (ival == -1 && PyErr_Occurred()) {
1083 Py_DECREF(tmp);
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001084 return NULL;
Michael W. Hudson71665dc2003-08-11 17:32:02 +00001085 }
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001086 } else {
1087 ival = ((PyIntObject *)tmp)->ob_ival;
1088 }
1089
Anthony Baxter377be112006-04-11 06:54:30 +00001090 newobj = type->tp_alloc(type, 0);
1091 if (newobj == NULL) {
Raymond Hettingerf4667932003-06-28 20:04:25 +00001092 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00001093 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00001094 }
Anthony Baxter377be112006-04-11 06:54:30 +00001095 ((PyIntObject *)newobj)->ob_ival = ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001096 Py_DECREF(tmp);
Anthony Baxter377be112006-04-11 06:54:30 +00001097 return newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00001098}
1099
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001100static PyObject *
1101int_getnewargs(PyIntObject *v)
1102{
1103 return Py_BuildValue("(l)", v->ob_ival);
1104}
1105
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001106static PyObject *
Mark Dickinson85e269b2009-05-03 20:39:06 +00001107int_get0(PyIntObject *v, void *context) {
1108 return PyInt_FromLong(0L);
1109}
1110
1111static PyObject *
1112int_get1(PyIntObject *v, void *context) {
1113 return PyInt_FromLong(1L);
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001114}
1115
Eric Smith5e527eb2008-02-10 01:36:53 +00001116/* Convert an integer to the given base. Returns a string.
1117 If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'.
1118 If newstyle is zero, then use the pre-2.6 behavior of octal having
1119 a leading "0" */
1120PyAPI_FUNC(PyObject*)
1121_PyInt_Format(PyIntObject *v, int base, int newstyle)
1122{
1123 /* There are no doubt many, many ways to optimize this, using code
1124 similar to _PyLong_Format */
1125 long n = v->ob_ival;
1126 int negative = n < 0;
1127 int is_zero = n == 0;
1128
1129 /* For the reasoning behind this size, see
1130 http://c-faq.com/misc/hexio.html. Then, add a few bytes for
1131 the possible sign and prefix "0[box]" */
1132 char buf[sizeof(n)*CHAR_BIT+6];
1133
1134 /* Start by pointing to the end of the buffer. We fill in from
1135 the back forward. */
1136 char* p = &buf[sizeof(buf)];
1137
1138 assert(base >= 2 && base <= 36);
1139
1140 do {
1141 /* I'd use i_divmod, except it doesn't produce the results
1142 I want when n is negative. So just duplicate the salient
1143 part here. */
1144 long div = n / base;
1145 long mod = n - div * base;
1146
1147 /* convert abs(mod) to the right character in [0-9, a-z] */
1148 char cdigit = (char)(mod < 0 ? -mod : mod);
1149 cdigit += (cdigit < 10) ? '0' : 'a'-10;
1150 *--p = cdigit;
1151
1152 n = div;
1153 } while(n);
1154
1155 if (base == 2) {
1156 *--p = 'b';
1157 *--p = '0';
1158 }
1159 else if (base == 8) {
1160 if (newstyle) {
1161 *--p = 'o';
1162 *--p = '0';
1163 }
1164 else
1165 if (!is_zero)
1166 *--p = '0';
1167 }
1168 else if (base == 16) {
1169 *--p = 'x';
1170 *--p = '0';
1171 }
1172 else if (base != 10) {
1173 *--p = '#';
1174 *--p = '0' + base%10;
1175 if (base > 10)
1176 *--p = '0' + base/10;
1177 }
1178 if (negative)
1179 *--p = '-';
1180
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001181 return PyString_FromStringAndSize(p, &buf[sizeof(buf)] - p);
Eric Smith5e527eb2008-02-10 01:36:53 +00001182}
1183
Eric Smitha9f7d622008-02-17 19:46:49 +00001184static PyObject *
1185int__format__(PyObject *self, PyObject *args)
1186{
1187 PyObject *format_spec;
1188
1189 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
1190 return NULL;
Christian Heimes593daf52008-05-26 12:51:38 +00001191 if (PyBytes_Check(format_spec))
Eric Smithdc13b792008-05-30 18:10:04 +00001192 return _PyInt_FormatAdvanced(self,
1193 PyBytes_AS_STRING(format_spec),
1194 PyBytes_GET_SIZE(format_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00001195 if (PyUnicode_Check(format_spec)) {
1196 /* Convert format_spec to a str */
Eric Smithdc13b792008-05-30 18:10:04 +00001197 PyObject *result;
1198 PyObject *str_spec = PyObject_Str(format_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00001199
Eric Smithdc13b792008-05-30 18:10:04 +00001200 if (str_spec == NULL)
1201 return NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +00001202
Eric Smithdc13b792008-05-30 18:10:04 +00001203 result = _PyInt_FormatAdvanced(self,
1204 PyBytes_AS_STRING(str_spec),
1205 PyBytes_GET_SIZE(str_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00001206
Eric Smithdc13b792008-05-30 18:10:04 +00001207 Py_DECREF(str_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00001208 return result;
1209 }
1210 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
1211 return NULL;
1212}
1213
Mark Dickinson1a707982008-12-17 16:14:37 +00001214static PyObject *
1215int_bit_length(PyIntObject *v)
1216{
1217 unsigned long n;
Mark Dickinson1a707982008-12-17 16:14:37 +00001218
1219 if (v->ob_ival < 0)
1220 /* avoid undefined behaviour when v->ob_ival == -LONG_MAX-1 */
1221 n = 0U-(unsigned long)v->ob_ival;
1222 else
1223 n = (unsigned long)v->ob_ival;
1224
Mark Dickinson6736cf82009-04-20 21:13:33 +00001225 return PyInt_FromLong(bits_in_ulong(n));
Mark Dickinson1a707982008-12-17 16:14:37 +00001226}
1227
1228PyDoc_STRVAR(int_bit_length_doc,
1229"int.bit_length() -> int\n\
1230\n\
1231Number of bits necessary to represent self in binary.\n\
1232>>> bin(37)\n\
1233'0b100101'\n\
1234>>> (37).bit_length()\n\
12356");
1236
Christian Heimes6f341092008-04-18 23:13:07 +00001237#if 0
1238static PyObject *
1239int_is_finite(PyObject *v)
1240{
1241 Py_RETURN_TRUE;
1242}
1243#endif
1244
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001245static PyMethodDef int_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001246 {"conjugate", (PyCFunction)int_int, METH_NOARGS,
1247 "Returns self, the complex conjugate of any int."},
Mark Dickinson1a707982008-12-17 16:14:37 +00001248 {"bit_length", (PyCFunction)int_bit_length, METH_NOARGS,
1249 int_bit_length_doc},
Christian Heimes6f341092008-04-18 23:13:07 +00001250#if 0
1251 {"is_finite", (PyCFunction)int_is_finite, METH_NOARGS,
1252 "Returns always True."},
1253#endif
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001254 {"__trunc__", (PyCFunction)int_int, METH_NOARGS,
1255 "Truncating an Integral returns itself."},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001256 {"__getnewargs__", (PyCFunction)int_getnewargs, METH_NOARGS},
Eric Smitha9f7d622008-02-17 19:46:49 +00001257 {"__format__", (PyCFunction)int__format__, METH_VARARGS},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001258 {NULL, NULL} /* sentinel */
1259};
1260
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001261static PyGetSetDef int_getset[] = {
Mark Dickinson85e269b2009-05-03 20:39:06 +00001262 {"real",
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001263 (getter)int_int, (setter)NULL,
1264 "the real part of a complex number",
1265 NULL},
Mark Dickinson85e269b2009-05-03 20:39:06 +00001266 {"imag",
1267 (getter)int_get0, (setter)NULL,
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001268 "the imaginary part of a complex number",
Mark Dickinson85e269b2009-05-03 20:39:06 +00001269 NULL},
1270 {"numerator",
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001271 (getter)int_int, (setter)NULL,
1272 "the numerator of a rational number in lowest terms",
1273 NULL},
Mark Dickinson85e269b2009-05-03 20:39:06 +00001274 {"denominator",
1275 (getter)int_get1, (setter)NULL,
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001276 "the denominator of a rational number in lowest terms",
Mark Dickinson85e269b2009-05-03 20:39:06 +00001277 NULL},
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001278 {NULL} /* Sentinel */
1279};
1280
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001281PyDoc_STRVAR(int_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001282"int(x[, base]) -> integer\n\
1283\n\
1284Convert a string or number to an integer, if possible. A floating point\n\
1285argument will be truncated towards zero (this does not include a string\n\
1286representation of a floating point number!) When converting a string, use\n\
1287the optional base. It is an error to supply a base when converting a\n\
Gustavo Niemeyer37e65022007-01-10 16:15:48 +00001288non-string. If base is zero, the proper base is guessed based on the\n\
Gustavo Niemeyera443bc82007-01-10 16:13:40 +00001289string content. If the argument is outside the integer range a\n\
1290long object will be returned instead.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001291
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292static PyNumberMethods int_as_number = {
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001293 (binaryfunc)int_add, /*nb_add*/
1294 (binaryfunc)int_sub, /*nb_subtract*/
1295 (binaryfunc)int_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00001296 (binaryfunc)int_classic_div, /*nb_divide*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001297 (binaryfunc)int_mod, /*nb_remainder*/
1298 (binaryfunc)int_divmod, /*nb_divmod*/
1299 (ternaryfunc)int_pow, /*nb_power*/
1300 (unaryfunc)int_neg, /*nb_negative*/
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001301 (unaryfunc)int_int, /*nb_positive*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001302 (unaryfunc)int_abs, /*nb_absolute*/
1303 (inquiry)int_nonzero, /*nb_nonzero*/
1304 (unaryfunc)int_invert, /*nb_invert*/
1305 (binaryfunc)int_lshift, /*nb_lshift*/
1306 (binaryfunc)int_rshift, /*nb_rshift*/
1307 (binaryfunc)int_and, /*nb_and*/
1308 (binaryfunc)int_xor, /*nb_xor*/
1309 (binaryfunc)int_or, /*nb_or*/
Guido van Rossum1952e382001-09-19 01:25:16 +00001310 int_coerce, /*nb_coerce*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001311 (unaryfunc)int_int, /*nb_int*/
1312 (unaryfunc)int_long, /*nb_long*/
1313 (unaryfunc)int_float, /*nb_float*/
1314 (unaryfunc)int_oct, /*nb_oct*/
1315 (unaryfunc)int_hex, /*nb_hex*/
1316 0, /*nb_inplace_add*/
1317 0, /*nb_inplace_subtract*/
1318 0, /*nb_inplace_multiply*/
1319 0, /*nb_inplace_divide*/
1320 0, /*nb_inplace_remainder*/
1321 0, /*nb_inplace_power*/
1322 0, /*nb_inplace_lshift*/
1323 0, /*nb_inplace_rshift*/
1324 0, /*nb_inplace_and*/
1325 0, /*nb_inplace_xor*/
1326 0, /*nb_inplace_or*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001327 (binaryfunc)int_div, /* nb_floor_divide */
1328 int_true_divide, /* nb_true_divide */
1329 0, /* nb_inplace_floor_divide */
1330 0, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001331 (unaryfunc)int_int, /* nb_index */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001332};
1333
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334PyTypeObject PyInt_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001335 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001336 "int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337 sizeof(PyIntObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001338 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001339 (destructor)int_dealloc, /* tp_dealloc */
1340 (printfunc)int_print, /* tp_print */
1341 0, /* tp_getattr */
1342 0, /* tp_setattr */
1343 (cmpfunc)int_compare, /* tp_compare */
1344 (reprfunc)int_repr, /* tp_repr */
1345 &int_as_number, /* tp_as_number */
1346 0, /* tp_as_sequence */
1347 0, /* tp_as_mapping */
1348 (hashfunc)int_hash, /* tp_hash */
1349 0, /* tp_call */
Guido van Rossume75bfde2002-02-01 15:34:10 +00001350 (reprfunc)int_repr, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001351 PyObject_GenericGetAttr, /* tp_getattro */
1352 0, /* tp_setattro */
1353 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00001354 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00001355 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001356 int_doc, /* tp_doc */
1357 0, /* tp_traverse */
1358 0, /* tp_clear */
1359 0, /* tp_richcompare */
1360 0, /* tp_weaklistoffset */
1361 0, /* tp_iter */
1362 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001363 int_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001364 0, /* tp_members */
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001365 int_getset, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001366 0, /* tp_base */
1367 0, /* tp_dict */
1368 0, /* tp_descr_get */
1369 0, /* tp_descr_set */
1370 0, /* tp_dictoffset */
1371 0, /* tp_init */
1372 0, /* tp_alloc */
1373 int_new, /* tp_new */
Guido van Rossum93646982002-04-26 00:53:34 +00001374 (freefunc)int_free, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001375};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001376
Neal Norwitzc91ed402002-12-30 22:29:22 +00001377int
Neal Norwitzb2501f42002-12-31 03:42:13 +00001378_PyInt_Init(void)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001379{
1380 PyIntObject *v;
1381 int ival;
1382#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1383 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
Raymond Hettingerb32e6402004-02-08 18:54:37 +00001384 if (!free_list && (free_list = fill_free_list()) == NULL)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001385 return 0;
1386 /* PyObject_New is inlined */
1387 v = free_list;
Christian Heimese93237d2007-12-19 02:37:44 +00001388 free_list = (PyIntObject *)Py_TYPE(v);
Neal Norwitzc91ed402002-12-30 22:29:22 +00001389 PyObject_INIT(v, &PyInt_Type);
1390 v->ob_ival = ival;
1391 small_ints[ival + NSMALLNEGINTS] = v;
1392 }
1393#endif
1394 return 1;
1395}
1396
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001397int
1398PyInt_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001399{
Guido van Rossum3fce8831999-03-12 19:43:17 +00001400 PyIntObject *p;
1401 PyIntBlock *list, *next;
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001402 int i;
1403 int u; /* remaining unfreed ints per block */
1404 int freelist_size = 0;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001405
Guido van Rossumda084ed1999-03-10 22:55:24 +00001406 list = block_list;
1407 block_list = NULL;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001408 free_list = NULL;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001409 while (list != NULL) {
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001410 u = 0;
1411 for (i = 0, p = &list->objects[0];
1412 i < N_INTOBJECTS;
1413 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001414 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001415 u++;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001416 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001417 next = list->next;
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001418 if (u) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001419 list->next = block_list;
1420 block_list = list;
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001421 for (i = 0, p = &list->objects[0];
1422 i < N_INTOBJECTS;
1423 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001424 if (!PyInt_CheckExact(p) ||
Guido van Rossumbef14172001-08-29 15:47:46 +00001425 p->ob_refcnt == 0) {
Christian Heimese93237d2007-12-19 02:37:44 +00001426 Py_TYPE(p) = (struct _typeobject *)
Guido van Rossum51288bc1999-03-19 20:30:39 +00001427 free_list;
1428 free_list = p;
1429 }
1430#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1431 else if (-NSMALLNEGINTS <= p->ob_ival &&
1432 p->ob_ival < NSMALLPOSINTS &&
1433 small_ints[p->ob_ival +
1434 NSMALLNEGINTS] == NULL) {
1435 Py_INCREF(p);
1436 small_ints[p->ob_ival +
1437 NSMALLNEGINTS] = p;
1438 }
1439#endif
1440 }
Guido van Rossumda084ed1999-03-10 22:55:24 +00001441 }
1442 else {
Tim Peters29c0afc2002-04-28 16:57:34 +00001443 PyMem_FREE(list);
Guido van Rossumda084ed1999-03-10 22:55:24 +00001444 }
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001445 freelist_size += u;
Guido van Rossum3fce8831999-03-12 19:43:17 +00001446 list = next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001447 }
Christian Heimes422051a2008-02-04 18:00:12 +00001448
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001449 return freelist_size;
Christian Heimes422051a2008-02-04 18:00:12 +00001450}
1451
1452void
1453PyInt_Fini(void)
1454{
1455 PyIntObject *p;
1456 PyIntBlock *list;
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001457 int i;
1458 int u; /* total unfreed ints per block */
Christian Heimes422051a2008-02-04 18:00:12 +00001459
1460#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Christian Heimes422051a2008-02-04 18:00:12 +00001461 PyIntObject **q;
1462
1463 i = NSMALLNEGINTS + NSMALLPOSINTS;
1464 q = small_ints;
1465 while (--i >= 0) {
1466 Py_XDECREF(*q);
1467 *q++ = NULL;
1468 }
1469#endif
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001470 u = PyInt_ClearFreeList();
Guido van Rossum3fce8831999-03-12 19:43:17 +00001471 if (!Py_VerboseFlag)
1472 return;
1473 fprintf(stderr, "# cleanup ints");
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001474 if (!u) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001475 fprintf(stderr, "\n");
1476 }
1477 else {
1478 fprintf(stderr,
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001479 ": %d unfreed int%s\n",
1480 u, u == 1 ? "" : "s");
Guido van Rossum3fce8831999-03-12 19:43:17 +00001481 }
1482 if (Py_VerboseFlag > 1) {
1483 list = block_list;
1484 while (list != NULL) {
Gregory P. Smith2fe77062008-07-06 03:35:58 +00001485 for (i = 0, p = &list->objects[0];
1486 i < N_INTOBJECTS;
1487 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001488 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001489 /* XXX(twouters) cast refcount to
1490 long until %zd is universally
1491 available
1492 */
Guido van Rossum3fce8831999-03-12 19:43:17 +00001493 fprintf(stderr,
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001494 "# <int at %p, refcnt=%ld, val=%ld>\n",
1495 p, (long)p->ob_refcnt,
1496 p->ob_ival);
Guido van Rossum3fce8831999-03-12 19:43:17 +00001497 }
1498 list = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001499 }
1500 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001501}