blob: 7404e980836b493bb648d6691e986d68f98a0a01 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Integer object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Barry Warsaw226ae6c1999-10-12 19:54:53 +00005#include <ctype.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006
Guido van Rossum2e1d4331993-12-24 10:22:45 +00007long
Fred Drakea2f55112000-07-09 15:16:51 +00008PyInt_GetMax(void)
Guido van Rossum2e1d4331993-12-24 10:22:45 +00009{
10 return LONG_MAX; /* To initialize sys.maxint */
11}
12
Guido van Rossume27f7952001-08-23 02:59:04 +000013/* Return 1 if exception raised, 0 if caller should retry using longs */
14static int
Fred Drakea2f55112000-07-09 15:16:51 +000015err_ovf(char *msg)
Guido van Rossum165e67e1990-10-14 20:02:26 +000016{
Guido van Rossume27f7952001-08-23 02:59:04 +000017 if (PyErr_Warn(PyExc_OverflowWarning, msg) < 0) {
Guido van Rossum0b131162001-08-23 21:32:40 +000018 if (PyErr_ExceptionMatches(PyExc_OverflowWarning))
19 PyErr_SetString(PyExc_OverflowError, msg);
Guido van Rossume27f7952001-08-23 02:59:04 +000020 return 1;
21 }
22 else
23 return 0;
Guido van Rossum165e67e1990-10-14 20:02:26 +000024}
25
Guido van Rossum3f5da241990-12-20 15:06:42 +000026/* Integers are quite normal objects, to make object handling uniform.
27 (Using odd pointers to represent integers would save much space
28 but require extra checks for this special case throughout the code.)
Tim Peters29c0afc2002-04-28 16:57:34 +000029 Since a typical Python program spends much of its time allocating
Guido van Rossum3f5da241990-12-20 15:06:42 +000030 and deallocating integers, these operations should be very fast.
31 Therefore we use a dedicated allocation scheme with a much lower
32 overhead (in space and time) than straight malloc(): a simple
33 dedicated free list, filled when necessary with memory from malloc().
Tim Peters29c0afc2002-04-28 16:57:34 +000034
35 block_list is a singly-linked list of all PyIntBlocks ever allocated,
36 linked via their next members. PyIntBlocks are never returned to the
37 system before shutdown (PyInt_Fini).
38
39 free_list is a singly-linked list of available PyIntObjects, linked
40 via abuse of their ob_type members.
Guido van Rossum3f5da241990-12-20 15:06:42 +000041*/
42
43#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000044#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
45#define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
Guido van Rossumda084ed1999-03-10 22:55:24 +000046
Guido van Rossum3fce8831999-03-12 19:43:17 +000047struct _intblock {
48 struct _intblock *next;
49 PyIntObject objects[N_INTOBJECTS];
50};
51
52typedef struct _intblock PyIntBlock;
53
54static PyIntBlock *block_list = NULL;
55static PyIntObject *free_list = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000056
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057static PyIntObject *
Fred Drakea2f55112000-07-09 15:16:51 +000058fill_free_list(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +000059{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060 PyIntObject *p, *q;
Tim Peters29c0afc2002-04-28 16:57:34 +000061 /* Python's object allocator isn't appropriate for large blocks. */
Guido van Rossumb18618d2000-05-03 23:44:39 +000062 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
Guido van Rossum3f5da241990-12-20 15:06:42 +000063 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +000064 return (PyIntObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +000065 ((PyIntBlock *)p)->next = block_list;
66 block_list = (PyIntBlock *)p;
Tim Peters29c0afc2002-04-28 16:57:34 +000067 /* Link the int objects together, from rear to front, then return
68 the address of the last int object in the block. */
Guido van Rossum3fce8831999-03-12 19:43:17 +000069 p = &((PyIntBlock *)p)->objects[0];
Guido van Rossum3f5da241990-12-20 15:06:42 +000070 q = p + N_INTOBJECTS;
71 while (--q > p)
Guido van Rossumda084ed1999-03-10 22:55:24 +000072 q->ob_type = (struct _typeobject *)(q-1);
73 q->ob_type = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000074 return p + N_INTOBJECTS - 1;
75}
76
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000077#ifndef NSMALLPOSINTS
78#define NSMALLPOSINTS 100
79#endif
80#ifndef NSMALLNEGINTS
81#define NSMALLNEGINTS 1
82#endif
83#if NSMALLNEGINTS + NSMALLPOSINTS > 0
84/* References to small integers are saved in this array so that they
85 can be shared.
86 The integers that are saved are those in the range
87 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
88*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000090#endif
91#ifdef COUNT_ALLOCS
92int quick_int_allocs, quick_neg_int_allocs;
93#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +000094
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000096PyInt_FromLong(long ival)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098 register PyIntObject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000099#if NSMALLNEGINTS + NSMALLPOSINTS > 0
100 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS &&
101 (v = small_ints[ival + NSMALLNEGINTS]) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000103#ifdef COUNT_ALLOCS
104 if (ival >= 0)
105 quick_int_allocs++;
106 else
107 quick_neg_int_allocs++;
108#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000109 return (PyObject *) v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000110 }
111#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000112 if (free_list == NULL) {
113 if ((free_list = fill_free_list()) == NULL)
114 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115 }
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000116 /* Inline PyObject_New */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000117 v = free_list;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000118 free_list = (PyIntObject *)v->ob_type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000119 PyObject_INIT(v, &PyInt_Type);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000120 v->ob_ival = ival;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000121#if NSMALLNEGINTS + NSMALLPOSINTS > 0
122 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
123 /* save this one for a following allocation */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000124 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000125 small_ints[ival + NSMALLNEGINTS] = v;
126 }
127#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128 return (PyObject *) v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000129}
130
131static 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)) {
Guido van Rossumbef14172001-08-29 15:47:46 +0000135 v->ob_type = (struct _typeobject *)free_list;
136 free_list = v;
137 }
138 else
139 v->ob_type->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{
145 v->ob_type = (struct _typeobject *)free_list;
146 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
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000159 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
160 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)) {
169 PyErr_SetString(PyExc_TypeError,
170 "nb_int should return int object");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000171 return -1;
172 }
Tim Petersa3c01ce2001-12-04 23:05:10 +0000173
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000174 val = PyInt_AS_LONG(io);
175 Py_DECREF(io);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000176
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000177 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000178}
179
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000180PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000181PyInt_FromString(char *s, char **pend, int base)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000182{
183 char *end;
184 long x;
185 char buffer[256]; /* For errors */
186
187 if ((base != 0 && base < 2) || base > 36) {
Fred Drake661ea262000-10-24 19:57:45 +0000188 PyErr_SetString(PyExc_ValueError, "int() base must be >= 2 and <= 36");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000189 return NULL;
190 }
191
192 while (*s && isspace(Py_CHARMASK(*s)))
193 s++;
194 errno = 0;
195 if (base == 0 && s[0] == '0')
196 x = (long) PyOS_strtoul(s, &end, base);
197 else
198 x = PyOS_strtol(s, &end, base);
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000199 if (end == s || !isalnum(Py_CHARMASK(end[-1])))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000200 goto bad;
201 while (*end && isspace(Py_CHARMASK(*end)))
202 end++;
203 if (*end != '\0') {
204 bad:
Barry Warsaw61975092001-11-28 20:55:34 +0000205 PyOS_snprintf(buffer, sizeof(buffer),
206 "invalid literal for int(): %.200s", s);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000207 PyErr_SetString(PyExc_ValueError, buffer);
208 return NULL;
209 }
210 else if (errno != 0) {
Barry Warsaw61975092001-11-28 20:55:34 +0000211 PyOS_snprintf(buffer, sizeof(buffer),
212 "int() literal too large: %.200s", s);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000213 PyErr_SetString(PyExc_ValueError, buffer);
214 return NULL;
215 }
216 if (pend)
217 *pend = end;
218 return PyInt_FromLong(x);
219}
220
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000221#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000222PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000223PyInt_FromUnicode(Py_UNICODE *s, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000224{
225 char buffer[256];
Tim Petersa3c01ce2001-12-04 23:05:10 +0000226
Guido van Rossum9e896b32000-04-05 20:11:21 +0000227 if (length >= sizeof(buffer)) {
228 PyErr_SetString(PyExc_ValueError,
229 "int() literal too large to convert");
230 return NULL;
231 }
232 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL))
233 return NULL;
234 return PyInt_FromString(buffer, NULL, base);
235}
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000236#endif
Guido van Rossum9e896b32000-04-05 20:11:21 +0000237
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238/* Methods */
239
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000240/* Integers are seen as the "smallest" of all numeric types and thus
241 don't have any knowledge about conversion of other types to
242 integers. */
243
244#define CONVERT_TO_LONG(obj, lng) \
245 if (PyInt_Check(obj)) { \
246 lng = PyInt_AS_LONG(obj); \
247 } \
248 else { \
249 Py_INCREF(Py_NotImplemented); \
250 return Py_NotImplemented; \
251 }
252
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000253/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000254static int
Fred Drakea2f55112000-07-09 15:16:51 +0000255int_print(PyIntObject *v, FILE *fp, int flags)
256 /* flags -- not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257{
258 fprintf(fp, "%ld", v->ob_ival);
Guido van Rossum90933611991-06-07 16:10:43 +0000259 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260}
261
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000263int_repr(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264{
Tim Peters42221042001-12-01 02:52:56 +0000265 char buf[64];
Barry Warsaw61975092001-11-28 20:55:34 +0000266 PyOS_snprintf(buf, sizeof(buf), "%ld", v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268}
269
270static int
Fred Drakea2f55112000-07-09 15:16:51 +0000271int_compare(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272{
273 register long i = v->ob_ival;
274 register long j = w->ob_ival;
275 return (i < j) ? -1 : (i > j) ? 1 : 0;
276}
277
Guido van Rossum9bfef441993-03-29 10:43:31 +0000278static long
Fred Drakea2f55112000-07-09 15:16:51 +0000279int_hash(PyIntObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000280{
Guido van Rossum541cdd81997-01-06 22:53:20 +0000281 /* XXX If this is changed, you also need to change the way
282 Python's long, float and complex types are hashed. */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000283 long x = v -> ob_ival;
284 if (x == -1)
285 x = -2;
286 return x;
287}
288
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000290int_add(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291{
292 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000293 CONVERT_TO_LONG(v, a);
294 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295 x = a + b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000296 if ((x^a) >= 0 || (x^b) >= 0)
297 return PyInt_FromLong(x);
298 if (err_ovf("integer addition"))
299 return NULL;
300 return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301}
302
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000303static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000304int_sub(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305{
306 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000307 CONVERT_TO_LONG(v, a);
308 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309 x = a - b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000310 if ((x^a) >= 0 || (x^~b) >= 0)
311 return PyInt_FromLong(x);
312 if (err_ovf("integer subtraction"))
313 return NULL;
314 return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
315 (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316}
317
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000318/*
Tim Petersa3c01ce2001-12-04 23:05:10 +0000319Integer overflow checking for * is painful: Python tried a couple ways, but
320they didn't work on all platforms, or failed in endcases (a product of
321-sys.maxint-1 has been a particular pain).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000322
Tim Petersa3c01ce2001-12-04 23:05:10 +0000323Here's another way:
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000324
Tim Petersa3c01ce2001-12-04 23:05:10 +0000325The native long product x*y is either exactly right or *way* off, being
326just the last n bits of the true product, where n is the number of bits
327in a long (the delivered product is the true product plus i*2**n for
328some integer i).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000329
Tim Petersa3c01ce2001-12-04 23:05:10 +0000330The native double product (double)x * (double)y is subject to three
331rounding errors: on a sizeof(long)==8 box, each cast to double can lose
332info, and even on a sizeof(long)==4 box, the multiplication can lose info.
333But, unlike the native long product, it's not in *range* trouble: even
334if sizeof(long)==32 (256-bit longs), the product easily fits in the
335dynamic range of a double. So the leading 50 (or so) bits of the double
336product are correct.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000337
Tim Petersa3c01ce2001-12-04 23:05:10 +0000338We check these two ways against each other, and declare victory if they're
339approximately the same. Else, because the native long product is the only
340one that can lose catastrophic amounts of information, it's the native long
341product that must have overflowed.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000342*/
343
Neil Schemenauer3bc3f282002-08-09 15:20:48 +0000344/* Return true if the sq_repeat method should be used */
345#define USE_SQ_REPEAT(o) (!PyInt_Check(o) && \
346 o->ob_type->tp_as_sequence && \
347 o->ob_type->tp_as_sequence->sq_repeat && \
Guido van Rossum4571e9d2002-08-13 10:05:56 +0000348 !(o->ob_type->tp_as_number && \
349 o->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES && \
350 o->ob_type->tp_as_number->nb_multiply))
351
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352static PyObject *
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000353int_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354{
Tim Petersa3c01ce2001-12-04 23:05:10 +0000355 long a, b;
356 long longprod; /* a*b in native long arithmetic */
357 double doubled_longprod; /* (double)longprod */
358 double doubleprod; /* (double)a * (double)b */
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000359
Neil Schemenauer3bc3f282002-08-09 15:20:48 +0000360 if (USE_SQ_REPEAT(v)) {
Guido van Rossum02fe6472002-09-11 19:00:52 +0000361 repeat:
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000362 /* sequence * int */
363 a = PyInt_AsLong(w);
Guido van Rossum02fe6472002-09-11 19:00:52 +0000364#if LONG_MAX != INT_MAX
365 if (a > INT_MAX) {
366 PyErr_SetString(PyExc_ValueError,
367 "sequence repeat count too large");
368 return NULL;
369 }
370 else if (a < INT_MIN)
371 a = INT_MIN;
372 /* XXX Why don't I either
373
374 - set a to -1 whenever it's negative (after all,
375 sequence repeat usually treats negative numbers
376 as zero(); or
377
378 - raise an exception when it's less than INT_MIN?
379
380 I'm thinking about a hypothetical use case where some
381 sequence type might use a negative value as a flag of
382 some kind. In those cases I don't want to break the
383 code by mapping all negative values to -1. But I also
384 don't want to break e.g. []*(-sys.maxint), which is
385 perfectly safe, returning []. As a compromise, I do
386 map out-of-range negative values.
387 */
388#endif
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000389 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, a);
390 }
Neil Schemenauer3bc3f282002-08-09 15:20:48 +0000391 if (USE_SQ_REPEAT(w)) {
Guido van Rossum02fe6472002-09-11 19:00:52 +0000392 PyObject *tmp = v;
393 v = w;
394 w = tmp;
395 goto repeat;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000396 }
397
398 CONVERT_TO_LONG(v, a);
399 CONVERT_TO_LONG(w, b);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000400 longprod = a * b;
401 doubleprod = (double)a * (double)b;
402 doubled_longprod = (double)longprod;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000403
Tim Petersa3c01ce2001-12-04 23:05:10 +0000404 /* Fast path for normal case: small multiplicands, and no info
405 is lost in either method. */
406 if (doubled_longprod == doubleprod)
407 return PyInt_FromLong(longprod);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000408
Tim Petersa3c01ce2001-12-04 23:05:10 +0000409 /* Somebody somewhere lost info. Close enough, or way off? Note
410 that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0).
411 The difference either is or isn't significant compared to the
412 true value (of which doubleprod is a good approximation).
413 */
414 {
415 const double diff = doubled_longprod - doubleprod;
416 const double absdiff = diff >= 0.0 ? diff : -diff;
417 const double absprod = doubleprod >= 0.0 ? doubleprod :
418 -doubleprod;
419 /* absdiff/absprod <= 1/32 iff
420 32 * absdiff <= absprod -- 5 good bits is "close enough" */
421 if (32.0 * absdiff <= absprod)
422 return PyInt_FromLong(longprod);
423 else if (err_ovf("integer multiplication"))
424 return NULL;
425 else
426 return PyLong_Type.tp_as_number->nb_multiply(v, w);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000427 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428}
429
Guido van Rossume27f7952001-08-23 02:59:04 +0000430/* Return type of i_divmod */
431enum divmod_result {
432 DIVMOD_OK, /* Correct result */
433 DIVMOD_OVERFLOW, /* Overflow, try again using longs */
434 DIVMOD_ERROR /* Exception raised */
435};
436
437static enum divmod_result
Tim Peters1dad6a82001-06-18 19:21:11 +0000438i_divmod(register long x, register long y,
Fred Drakea2f55112000-07-09 15:16:51 +0000439 long *p_xdivy, long *p_xmody)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000441 long xdivy, xmody;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000442
Tim Peters1dad6a82001-06-18 19:21:11 +0000443 if (y == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000445 "integer division or modulo by zero");
Guido van Rossume27f7952001-08-23 02:59:04 +0000446 return DIVMOD_ERROR;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447 }
Tim Peters1dad6a82001-06-18 19:21:11 +0000448 /* (-sys.maxint-1)/-1 is the only overflow case. */
449 if (y == -1 && x < 0 && x == -x) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000450 if (err_ovf("integer division"))
451 return DIVMOD_ERROR;
452 return DIVMOD_OVERFLOW;
Guido van Rossum00466951991-05-05 20:08:27 +0000453 }
Tim Peters1dad6a82001-06-18 19:21:11 +0000454 xdivy = x / y;
455 xmody = x - xdivy * y;
456 /* If the signs of x and y differ, and the remainder is non-0,
457 * C89 doesn't define whether xdivy is now the floor or the
458 * ceiling of the infinitely precise quotient. We want the floor,
459 * and we have it iff the remainder's sign matches y's.
460 */
461 if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
462 xmody += y;
463 --xdivy;
464 assert(xmody && ((y ^ xmody) >= 0));
Guido van Rossum00466951991-05-05 20:08:27 +0000465 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000466 *p_xdivy = xdivy;
467 *p_xmody = xmody;
Guido van Rossume27f7952001-08-23 02:59:04 +0000468 return DIVMOD_OK;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000469}
470
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000472int_div(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000473{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000474 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000475 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000476 CONVERT_TO_LONG(x, xi);
477 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000478 switch (i_divmod(xi, yi, &d, &m)) {
479 case DIVMOD_OK:
480 return PyInt_FromLong(d);
481 case DIVMOD_OVERFLOW:
482 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
483 (PyObject *)y);
484 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000485 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000486 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000487}
488
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000490int_classic_div(PyIntObject *x, PyIntObject *y)
491{
492 long xi, yi;
493 long d, m;
494 CONVERT_TO_LONG(x, xi);
495 CONVERT_TO_LONG(y, yi);
496 if (Py_DivisionWarningFlag &&
497 PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0)
498 return NULL;
499 switch (i_divmod(xi, yi, &d, &m)) {
500 case DIVMOD_OK:
501 return PyInt_FromLong(d);
502 case DIVMOD_OVERFLOW:
503 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
504 (PyObject *)y);
505 default:
506 return NULL;
507 }
508}
509
510static PyObject *
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000511int_true_divide(PyObject *v, PyObject *w)
512{
Tim Peterse2a60002001-09-04 06:17:36 +0000513 /* If they aren't both ints, give someone else a chance. In
514 particular, this lets int/long get handled by longs, which
515 underflows to 0 gracefully if the long is too big to convert
516 to float. */
517 if (PyInt_Check(v) && PyInt_Check(w))
518 return PyFloat_Type.tp_as_number->nb_true_divide(v, w);
519 Py_INCREF(Py_NotImplemented);
520 return Py_NotImplemented;
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000521}
522
523static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000524int_mod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000525{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000526 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000527 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000528 CONVERT_TO_LONG(x, xi);
529 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000530 switch (i_divmod(xi, yi, &d, &m)) {
531 case DIVMOD_OK:
532 return PyInt_FromLong(m);
533 case DIVMOD_OVERFLOW:
534 return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x,
535 (PyObject *)y);
536 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000537 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000538 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000539}
540
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000542int_divmod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000543{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000544 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000545 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000546 CONVERT_TO_LONG(x, xi);
547 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000548 switch (i_divmod(xi, yi, &d, &m)) {
549 case DIVMOD_OK:
550 return Py_BuildValue("(ll)", d, m);
551 case DIVMOD_OVERFLOW:
552 return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x,
553 (PyObject *)y);
554 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000555 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000556 }
Guido van Rossum00466951991-05-05 20:08:27 +0000557}
558
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000560int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000561{
Guido van Rossum9478dd41996-12-06 20:14:43 +0000562 register long iv, iw, iz=0, ix, temp, prev;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000563 CONVERT_TO_LONG(v, iv);
564 CONVERT_TO_LONG(w, iw);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000565 if (iw < 0) {
Tim Peters32f453e2001-09-03 08:35:41 +0000566 if ((PyObject *)z != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +0000567 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
568 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +0000569 return NULL;
570 }
Guido van Rossumb82fedc2001-07-12 11:19:45 +0000571 /* Return a float. This works because we know that
572 this calls float_pow() which converts its
573 arguments to double. */
574 return PyFloat_Type.tp_as_number->nb_power(
575 (PyObject *)v, (PyObject *)w, (PyObject *)z);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000576 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 if ((PyObject *)z != Py_None) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000578 CONVERT_TO_LONG(z, iz);
Guido van Rossum9478dd41996-12-06 20:14:43 +0000579 if (iz == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 PyErr_SetString(PyExc_ValueError,
Tim Peters4c483c42001-09-05 06:24:58 +0000581 "pow() 3rd argument cannot be 0");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000582 return NULL;
583 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000584 }
585 /*
586 * XXX: The original exponentiation code stopped looping
587 * when temp hit zero; this code will continue onwards
588 * unnecessarily, but at least it won't cause any errors.
589 * Hopefully the speed improvement from the fast exponentiation
590 * will compensate for the slight inefficiency.
591 * XXX: Better handling of overflows is desperately needed.
592 */
593 temp = iv;
594 ix = 1;
595 while (iw > 0) {
596 prev = ix; /* Save value for overflow check */
Tim Petersa3c01ce2001-12-04 23:05:10 +0000597 if (iw & 1) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000598 ix = ix*temp;
599 if (temp == 0)
600 break; /* Avoid ix / 0 */
Guido van Rossume27f7952001-08-23 02:59:04 +0000601 if (ix / temp != prev) {
602 if (err_ovf("integer exponentiation"))
603 return NULL;
604 return PyLong_Type.tp_as_number->nb_power(
605 (PyObject *)v,
606 (PyObject *)w,
Tim Peters31960db2001-08-23 21:28:33 +0000607 (PyObject *)z);
Guido van Rossume27f7952001-08-23 02:59:04 +0000608 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000609 }
610 iw >>= 1; /* Shift exponent down by 1 bit */
611 if (iw==0) break;
612 prev = temp;
613 temp *= temp; /* Square the value of temp */
Guido van Rossume27f7952001-08-23 02:59:04 +0000614 if (prev!=0 && temp/prev!=prev) {
615 if (err_ovf("integer exponentiation"))
616 return NULL;
617 return PyLong_Type.tp_as_number->nb_power(
618 (PyObject *)v, (PyObject *)w, (PyObject *)z);
619 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000620 if (iz) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000621 /* If we did a multiplication, perform a modulo */
622 ix = ix % iz;
623 temp = temp % iz;
624 }
625 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000626 if (iz) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000627 long div, mod;
Guido van Rossume27f7952001-08-23 02:59:04 +0000628 switch (i_divmod(ix, iz, &div, &mod)) {
629 case DIVMOD_OK:
630 ix = mod;
631 break;
632 case DIVMOD_OVERFLOW:
633 return PyLong_Type.tp_as_number->nb_power(
634 (PyObject *)v, (PyObject *)w, (PyObject *)z);
635 default:
636 return NULL;
637 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000638 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 return PyInt_FromLong(ix);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000640}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000641
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000643int_neg(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000644{
645 register long a, x;
646 a = v->ob_ival;
647 x = -a;
Guido van Rossume27f7952001-08-23 02:59:04 +0000648 if (a < 0 && x < 0) {
649 if (err_ovf("integer negation"))
650 return NULL;
651 return PyNumber_Negative(PyLong_FromLong(a));
652 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000653 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000654}
655
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000657int_pos(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000658{
Tim Peters73a1dfe2001-09-11 21:44:14 +0000659 if (PyInt_CheckExact(v)) {
660 Py_INCREF(v);
661 return (PyObject *)v;
662 }
663 else
664 return PyInt_FromLong(v->ob_ival);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000665}
666
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000668int_abs(PyIntObject *v)
Guido van Rossum00466951991-05-05 20:08:27 +0000669{
670 if (v->ob_ival >= 0)
671 return int_pos(v);
672 else
673 return int_neg(v);
674}
675
Guido van Rossum0bff0151991-05-14 12:05:32 +0000676static int
Fred Drakea2f55112000-07-09 15:16:51 +0000677int_nonzero(PyIntObject *v)
Guido van Rossum0bff0151991-05-14 12:05:32 +0000678{
679 return v->ob_ival != 0;
680}
681
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000683int_invert(PyIntObject *v)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000684{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000686}
687
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000689int_lshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000690{
Guido van Rossum078151d2002-08-11 04:24:12 +0000691 long a, b, c;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000692 CONVERT_TO_LONG(v, a);
693 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000694 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000696 return NULL;
697 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000698 if (a == 0 || b == 0)
699 return int_pos(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000700 if (b >= LONG_BIT) {
Guido van Rossum54df53a2002-08-14 18:38:27 +0000701 if (PyErr_Warn(PyExc_FutureWarning,
Guido van Rossum078151d2002-08-11 04:24:12 +0000702 "x<<y losing bits or changing sign "
703 "will return a long in Python 2.4 and up") < 0)
704 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705 return PyInt_FromLong(0L);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000706 }
Tim Petersda1a2212002-08-11 17:54:42 +0000707 c = a << b;
708 if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) {
Guido van Rossum54df53a2002-08-14 18:38:27 +0000709 if (PyErr_Warn(PyExc_FutureWarning,
Guido van Rossum078151d2002-08-11 04:24:12 +0000710 "x<<y losing bits or changing sign "
711 "will return a long in Python 2.4 and up") < 0)
712 return NULL;
713 }
714 return PyInt_FromLong(c);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000715}
716
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000718int_rshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000719{
720 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000721 CONVERT_TO_LONG(v, a);
722 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000723 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000725 return NULL;
726 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000727 if (a == 0 || b == 0)
728 return int_pos(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000729 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000730 if (a < 0)
731 a = -1;
732 else
733 a = 0;
734 }
735 else {
Tim Peters7d3a5112000-07-08 04:17:21 +0000736 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000737 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000738 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000739}
740
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000742int_and(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000743{
744 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000745 CONVERT_TO_LONG(v, a);
746 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747 return PyInt_FromLong(a & b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000748}
749
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000750static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000751int_xor(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000752{
753 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000754 CONVERT_TO_LONG(v, a);
755 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 return PyInt_FromLong(a ^ b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000757}
758
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000760int_or(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000761{
762 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000763 CONVERT_TO_LONG(v, a);
764 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 return PyInt_FromLong(a | b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000766}
767
Guido van Rossum1952e382001-09-19 01:25:16 +0000768static int
769int_coerce(PyObject **pv, PyObject **pw)
770{
771 if (PyInt_Check(*pw)) {
772 Py_INCREF(*pv);
773 Py_INCREF(*pw);
774 return 0;
775 }
776 return 1; /* Can't do it */
777}
778
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000780int_int(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000781{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 Py_INCREF(v);
783 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000784}
785
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000787int_long(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000788{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000790}
791
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000793int_float(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000794{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000796}
797
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000799int_oct(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000800{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000801 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000802 long x = v -> ob_ival;
Guido van Rossum078151d2002-08-11 04:24:12 +0000803 if (x < 0) {
Guido van Rossum54df53a2002-08-14 18:38:27 +0000804 if (PyErr_Warn(PyExc_FutureWarning,
Guido van Rossum078151d2002-08-11 04:24:12 +0000805 "hex()/oct() of negative int will return "
806 "a signed string in Python 2.4 and up") < 0)
807 return NULL;
808 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000809 if (x == 0)
810 strcpy(buf, "0");
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000811 else
Barry Warsaw61975092001-11-28 20:55:34 +0000812 PyOS_snprintf(buf, sizeof(buf), "0%lo", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000814}
815
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000816static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000817int_hex(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000818{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000819 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000820 long x = v -> ob_ival;
Guido van Rossum078151d2002-08-11 04:24:12 +0000821 if (x < 0) {
Guido van Rossum54df53a2002-08-14 18:38:27 +0000822 if (PyErr_Warn(PyExc_FutureWarning,
Guido van Rossum078151d2002-08-11 04:24:12 +0000823 "hex()/oct() of negative int will return "
824 "a signed string in Python 2.4 and up") < 0)
825 return NULL;
826 }
Barry Warsaw61975092001-11-28 20:55:34 +0000827 PyOS_snprintf(buf, sizeof(buf), "0x%lx", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000828 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000829}
830
Jeremy Hylton938ace62002-07-17 16:30:39 +0000831static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +0000832int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
833
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834static PyObject *
835int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
836{
837 PyObject *x = NULL;
838 int base = -909;
839 static char *kwlist[] = {"x", "base", 0};
840
Guido van Rossumbef14172001-08-29 15:47:46 +0000841 if (type != &PyInt_Type)
842 return int_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
844 &x, &base))
845 return NULL;
846 if (x == NULL)
847 return PyInt_FromLong(0L);
848 if (base == -909)
849 return PyNumber_Int(x);
850 if (PyString_Check(x))
851 return PyInt_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000852#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000853 if (PyUnicode_Check(x))
854 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
855 PyUnicode_GET_SIZE(x),
856 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000857#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000858 PyErr_SetString(PyExc_TypeError,
859 "int() can't convert non-string with explicit base");
860 return NULL;
861}
862
Guido van Rossumbef14172001-08-29 15:47:46 +0000863/* Wimpy, slow approach to tp_new calls for subtypes of int:
864 first create a regular int from whatever arguments we got,
865 then allocate a subtype instance and initialize its ob_ival
866 from the regular int. The regular int is then thrown away.
867*/
868static PyObject *
869int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
870{
871 PyObject *tmp, *new;
872
873 assert(PyType_IsSubtype(type, &PyInt_Type));
874 tmp = int_new(&PyInt_Type, args, kwds);
875 if (tmp == NULL)
876 return NULL;
877 assert(PyInt_Check(tmp));
Guido van Rossumd93dce12001-08-30 03:09:31 +0000878 new = type->tp_alloc(type, 0);
Guido van Rossumbef14172001-08-29 15:47:46 +0000879 if (new == NULL)
880 return NULL;
881 ((PyIntObject *)new)->ob_ival = ((PyIntObject *)tmp)->ob_ival;
882 Py_DECREF(tmp);
883 return new;
884}
885
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000886PyDoc_STRVAR(int_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000887"int(x[, base]) -> integer\n\
888\n\
889Convert a string or number to an integer, if possible. A floating point\n\
890argument will be truncated towards zero (this does not include a string\n\
891representation of a floating point number!) When converting a string, use\n\
892the optional base. It is an error to supply a base when converting a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000893non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000894
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895static PyNumberMethods int_as_number = {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000896 (binaryfunc)int_add, /*nb_add*/
897 (binaryfunc)int_sub, /*nb_subtract*/
898 (binaryfunc)int_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +0000899 (binaryfunc)int_classic_div, /*nb_divide*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000900 (binaryfunc)int_mod, /*nb_remainder*/
901 (binaryfunc)int_divmod, /*nb_divmod*/
902 (ternaryfunc)int_pow, /*nb_power*/
903 (unaryfunc)int_neg, /*nb_negative*/
904 (unaryfunc)int_pos, /*nb_positive*/
905 (unaryfunc)int_abs, /*nb_absolute*/
906 (inquiry)int_nonzero, /*nb_nonzero*/
907 (unaryfunc)int_invert, /*nb_invert*/
908 (binaryfunc)int_lshift, /*nb_lshift*/
909 (binaryfunc)int_rshift, /*nb_rshift*/
910 (binaryfunc)int_and, /*nb_and*/
911 (binaryfunc)int_xor, /*nb_xor*/
912 (binaryfunc)int_or, /*nb_or*/
Guido van Rossum1952e382001-09-19 01:25:16 +0000913 int_coerce, /*nb_coerce*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000914 (unaryfunc)int_int, /*nb_int*/
915 (unaryfunc)int_long, /*nb_long*/
916 (unaryfunc)int_float, /*nb_float*/
917 (unaryfunc)int_oct, /*nb_oct*/
918 (unaryfunc)int_hex, /*nb_hex*/
919 0, /*nb_inplace_add*/
920 0, /*nb_inplace_subtract*/
921 0, /*nb_inplace_multiply*/
922 0, /*nb_inplace_divide*/
923 0, /*nb_inplace_remainder*/
924 0, /*nb_inplace_power*/
925 0, /*nb_inplace_lshift*/
926 0, /*nb_inplace_rshift*/
927 0, /*nb_inplace_and*/
928 0, /*nb_inplace_xor*/
929 0, /*nb_inplace_or*/
Guido van Rossum4668b002001-08-08 05:00:18 +0000930 (binaryfunc)int_div, /* nb_floor_divide */
931 int_true_divide, /* nb_true_divide */
932 0, /* nb_inplace_floor_divide */
933 0, /* nb_inplace_true_divide */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000934};
935
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936PyTypeObject PyInt_Type = {
937 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000938 0,
939 "int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 sizeof(PyIntObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000941 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000942 (destructor)int_dealloc, /* tp_dealloc */
943 (printfunc)int_print, /* tp_print */
944 0, /* tp_getattr */
945 0, /* tp_setattr */
946 (cmpfunc)int_compare, /* tp_compare */
947 (reprfunc)int_repr, /* tp_repr */
948 &int_as_number, /* tp_as_number */
949 0, /* tp_as_sequence */
950 0, /* tp_as_mapping */
951 (hashfunc)int_hash, /* tp_hash */
952 0, /* tp_call */
Guido van Rossume75bfde2002-02-01 15:34:10 +0000953 (reprfunc)int_repr, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000954 PyObject_GenericGetAttr, /* tp_getattro */
955 0, /* tp_setattro */
956 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +0000957 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
958 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000959 int_doc, /* tp_doc */
960 0, /* tp_traverse */
961 0, /* tp_clear */
962 0, /* tp_richcompare */
963 0, /* tp_weaklistoffset */
964 0, /* tp_iter */
965 0, /* tp_iternext */
966 0, /* tp_methods */
967 0, /* tp_members */
968 0, /* tp_getset */
969 0, /* tp_base */
970 0, /* tp_dict */
971 0, /* tp_descr_get */
972 0, /* tp_descr_set */
973 0, /* tp_dictoffset */
974 0, /* tp_init */
975 0, /* tp_alloc */
976 int_new, /* tp_new */
Guido van Rossum93646982002-04-26 00:53:34 +0000977 (freefunc)int_free, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000978};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000979
980void
Fred Drakea2f55112000-07-09 15:16:51 +0000981PyInt_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000982{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000983 PyIntObject *p;
984 PyIntBlock *list, *next;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000985 int i;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000986 int bc, bf; /* block count, number of freed blocks */
987 int irem, isum; /* remaining unfreed ints per block, total */
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000988
Guido van Rossumda084ed1999-03-10 22:55:24 +0000989#if NSMALLNEGINTS + NSMALLPOSINTS > 0
990 PyIntObject **q;
991
992 i = NSMALLNEGINTS + NSMALLPOSINTS;
993 q = small_ints;
994 while (--i >= 0) {
995 Py_XDECREF(*q);
996 *q++ = NULL;
997 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000998#endif
Guido van Rossumda084ed1999-03-10 22:55:24 +0000999 bc = 0;
1000 bf = 0;
1001 isum = 0;
1002 list = block_list;
1003 block_list = NULL;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001004 free_list = NULL;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001005 while (list != NULL) {
Guido van Rossumda084ed1999-03-10 22:55:24 +00001006 bc++;
1007 irem = 0;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001008 for (i = 0, p = &list->objects[0];
1009 i < N_INTOBJECTS;
1010 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001011 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Guido van Rossumda084ed1999-03-10 22:55:24 +00001012 irem++;
1013 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001014 next = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001015 if (irem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001016 list->next = block_list;
1017 block_list = list;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001018 for (i = 0, p = &list->objects[0];
1019 i < N_INTOBJECTS;
1020 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001021 if (!PyInt_CheckExact(p) ||
Guido van Rossumbef14172001-08-29 15:47:46 +00001022 p->ob_refcnt == 0) {
Guido van Rossum51288bc1999-03-19 20:30:39 +00001023 p->ob_type = (struct _typeobject *)
1024 free_list;
1025 free_list = p;
1026 }
1027#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1028 else if (-NSMALLNEGINTS <= p->ob_ival &&
1029 p->ob_ival < NSMALLPOSINTS &&
1030 small_ints[p->ob_ival +
1031 NSMALLNEGINTS] == NULL) {
1032 Py_INCREF(p);
1033 small_ints[p->ob_ival +
1034 NSMALLNEGINTS] = p;
1035 }
1036#endif
1037 }
Guido van Rossumda084ed1999-03-10 22:55:24 +00001038 }
1039 else {
Tim Peters29c0afc2002-04-28 16:57:34 +00001040 PyMem_FREE(list);
Guido van Rossumda084ed1999-03-10 22:55:24 +00001041 bf++;
1042 }
1043 isum += irem;
Guido van Rossum3fce8831999-03-12 19:43:17 +00001044 list = next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001045 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001046 if (!Py_VerboseFlag)
1047 return;
1048 fprintf(stderr, "# cleanup ints");
1049 if (!isum) {
1050 fprintf(stderr, "\n");
1051 }
1052 else {
1053 fprintf(stderr,
1054 ": %d unfreed int%s in %d out of %d block%s\n",
1055 isum, isum == 1 ? "" : "s",
1056 bc - bf, bc, bc == 1 ? "" : "s");
1057 }
1058 if (Py_VerboseFlag > 1) {
1059 list = block_list;
1060 while (list != NULL) {
Guido van Rossum51288bc1999-03-19 20:30:39 +00001061 for (i = 0, p = &list->objects[0];
1062 i < N_INTOBJECTS;
1063 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001064 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Guido van Rossum3fce8831999-03-12 19:43:17 +00001065 fprintf(stderr,
Fred Drakea44d3532000-06-30 15:01:00 +00001066 "# <int at %p, refcnt=%d, val=%ld>\n",
1067 p, p->ob_refcnt, p->ob_ival);
Guido van Rossum3fce8831999-03-12 19:43:17 +00001068 }
1069 list = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001070 }
1071 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001072}