blob: bb5ad16c9a5eb0548a299479cd7785d6d23332ec [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 Rossum85a5fbb1990-10-14 12:07:46 +000013/* Standard Booleans */
Guido van Rossum3f5da241990-12-20 15:06:42 +000014
Guido van Rossumc0b618a1997-05-02 03:12:38 +000015PyIntObject _Py_ZeroStruct = {
16 PyObject_HEAD_INIT(&PyInt_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017 0
18};
Guido van Rossum3f5da241990-12-20 15:06:42 +000019
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020PyIntObject _Py_TrueStruct = {
21 PyObject_HEAD_INIT(&PyInt_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022 1
23};
24
Guido van Rossume27f7952001-08-23 02:59:04 +000025/* Return 1 if exception raised, 0 if caller should retry using longs */
26static int
Fred Drakea2f55112000-07-09 15:16:51 +000027err_ovf(char *msg)
Guido van Rossum165e67e1990-10-14 20:02:26 +000028{
Guido van Rossume27f7952001-08-23 02:59:04 +000029 if (PyErr_Warn(PyExc_OverflowWarning, msg) < 0) {
Guido van Rossum0b131162001-08-23 21:32:40 +000030 if (PyErr_ExceptionMatches(PyExc_OverflowWarning))
31 PyErr_SetString(PyExc_OverflowError, msg);
Guido van Rossume27f7952001-08-23 02:59:04 +000032 return 1;
33 }
34 else
35 return 0;
Guido van Rossum165e67e1990-10-14 20:02:26 +000036}
37
Guido van Rossum3f5da241990-12-20 15:06:42 +000038/* Integers are quite normal objects, to make object handling uniform.
39 (Using odd pointers to represent integers would save much space
40 but require extra checks for this special case throughout the code.)
41 Since, a typical Python program spends much of its time allocating
42 and deallocating integers, these operations should be very fast.
43 Therefore we use a dedicated allocation scheme with a much lower
44 overhead (in space and time) than straight malloc(): a simple
45 dedicated free list, filled when necessary with memory from malloc().
46*/
47
48#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000049#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
50#define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
Guido van Rossumda084ed1999-03-10 22:55:24 +000051
Guido van Rossum3fce8831999-03-12 19:43:17 +000052struct _intblock {
53 struct _intblock *next;
54 PyIntObject objects[N_INTOBJECTS];
55};
56
57typedef struct _intblock PyIntBlock;
58
59static PyIntBlock *block_list = NULL;
60static PyIntObject *free_list = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000061
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062static PyIntObject *
Fred Drakea2f55112000-07-09 15:16:51 +000063fill_free_list(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +000064{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065 PyIntObject *p, *q;
Guido van Rossumb18618d2000-05-03 23:44:39 +000066 /* XXX Int blocks escape the object heap. Use PyObject_MALLOC ??? */
67 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
Guido van Rossum3f5da241990-12-20 15:06:42 +000068 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +000069 return (PyIntObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +000070 ((PyIntBlock *)p)->next = block_list;
71 block_list = (PyIntBlock *)p;
72 p = &((PyIntBlock *)p)->objects[0];
Guido van Rossum3f5da241990-12-20 15:06:42 +000073 q = p + N_INTOBJECTS;
74 while (--q > p)
Guido van Rossumda084ed1999-03-10 22:55:24 +000075 q->ob_type = (struct _typeobject *)(q-1);
76 q->ob_type = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000077 return p + N_INTOBJECTS - 1;
78}
79
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000080#ifndef NSMALLPOSINTS
81#define NSMALLPOSINTS 100
82#endif
83#ifndef NSMALLNEGINTS
84#define NSMALLNEGINTS 1
85#endif
86#if NSMALLNEGINTS + NSMALLPOSINTS > 0
87/* References to small integers are saved in this array so that they
88 can be shared.
89 The integers that are saved are those in the range
90 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
91*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000093#endif
94#ifdef COUNT_ALLOCS
95int quick_int_allocs, quick_neg_int_allocs;
96#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +000097
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000099PyInt_FromLong(long ival)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101 register PyIntObject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000102#if NSMALLNEGINTS + NSMALLPOSINTS > 0
103 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS &&
104 (v = small_ints[ival + NSMALLNEGINTS]) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000106#ifdef COUNT_ALLOCS
107 if (ival >= 0)
108 quick_int_allocs++;
109 else
110 quick_neg_int_allocs++;
111#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 return (PyObject *) v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000113 }
114#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000115 if (free_list == NULL) {
116 if ((free_list = fill_free_list()) == NULL)
117 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000119 /* PyObject_New is inlined */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000120 v = free_list;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000121 free_list = (PyIntObject *)v->ob_type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000122 PyObject_INIT(v, &PyInt_Type);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000123 v->ob_ival = ival;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000124#if NSMALLNEGINTS + NSMALLPOSINTS > 0
125 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
126 /* save this one for a following allocation */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000128 small_ints[ival + NSMALLNEGINTS] = v;
129 }
130#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 return (PyObject *) v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000132}
133
134static void
Fred Drakea2f55112000-07-09 15:16:51 +0000135int_dealloc(PyIntObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000136{
Guido van Rossumdea6ef92001-09-11 16:13:52 +0000137 if (PyInt_CheckExact(v)) {
Guido van Rossumbef14172001-08-29 15:47:46 +0000138 v->ob_type = (struct _typeobject *)free_list;
139 free_list = v;
140 }
141 else
142 v->ob_type->tp_free((PyObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143}
144
145long
Fred Drakea2f55112000-07-09 15:16:51 +0000146PyInt_AsLong(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148 PyNumberMethods *nb;
149 PyIntObject *io;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000150 long val;
151
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 if (op && PyInt_Check(op))
153 return PyInt_AS_LONG((PyIntObject*) op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000154
155 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
156 nb->nb_int == NULL) {
Guido van Rossumc18a6f42000-05-09 14:27:48 +0000157 PyErr_SetString(PyExc_TypeError, "an integer is required");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158 return -1;
159 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000160
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 io = (PyIntObject*) (*nb->nb_int) (op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000162 if (io == NULL)
163 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 if (!PyInt_Check(io)) {
165 PyErr_SetString(PyExc_TypeError,
166 "nb_int should return int object");
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000167 return -1;
168 }
169
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 val = PyInt_AS_LONG(io);
171 Py_DECREF(io);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000172
173 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174}
175
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000176PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000177PyInt_FromString(char *s, char **pend, int base)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000178{
179 char *end;
180 long x;
181 char buffer[256]; /* For errors */
182
183 if ((base != 0 && base < 2) || base > 36) {
Fred Drake661ea262000-10-24 19:57:45 +0000184 PyErr_SetString(PyExc_ValueError, "int() base must be >= 2 and <= 36");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000185 return NULL;
186 }
187
188 while (*s && isspace(Py_CHARMASK(*s)))
189 s++;
190 errno = 0;
191 if (base == 0 && s[0] == '0')
192 x = (long) PyOS_strtoul(s, &end, base);
193 else
194 x = PyOS_strtol(s, &end, base);
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000195 if (end == s || !isalnum(Py_CHARMASK(end[-1])))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000196 goto bad;
197 while (*end && isspace(Py_CHARMASK(*end)))
198 end++;
199 if (*end != '\0') {
200 bad:
201 sprintf(buffer, "invalid literal for int(): %.200s", s);
202 PyErr_SetString(PyExc_ValueError, buffer);
203 return NULL;
204 }
205 else if (errno != 0) {
206 sprintf(buffer, "int() literal too large: %.200s", s);
207 PyErr_SetString(PyExc_ValueError, buffer);
208 return NULL;
209 }
210 if (pend)
211 *pend = end;
212 return PyInt_FromLong(x);
213}
214
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000215#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000216PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000217PyInt_FromUnicode(Py_UNICODE *s, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000218{
219 char buffer[256];
220
221 if (length >= sizeof(buffer)) {
222 PyErr_SetString(PyExc_ValueError,
223 "int() literal too large to convert");
224 return NULL;
225 }
226 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL))
227 return NULL;
228 return PyInt_FromString(buffer, NULL, base);
229}
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000230#endif
Guido van Rossum9e896b32000-04-05 20:11:21 +0000231
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232/* Methods */
233
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000234/* Integers are seen as the "smallest" of all numeric types and thus
235 don't have any knowledge about conversion of other types to
236 integers. */
237
238#define CONVERT_TO_LONG(obj, lng) \
239 if (PyInt_Check(obj)) { \
240 lng = PyInt_AS_LONG(obj); \
241 } \
242 else { \
243 Py_INCREF(Py_NotImplemented); \
244 return Py_NotImplemented; \
245 }
246
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000247/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000248static int
Fred Drakea2f55112000-07-09 15:16:51 +0000249int_print(PyIntObject *v, FILE *fp, int flags)
250 /* flags -- not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251{
252 fprintf(fp, "%ld", v->ob_ival);
Guido van Rossum90933611991-06-07 16:10:43 +0000253 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254}
255
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000257int_repr(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000258{
259 char buf[20];
260 sprintf(buf, "%ld", v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000261 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262}
263
264static int
Fred Drakea2f55112000-07-09 15:16:51 +0000265int_compare(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000266{
267 register long i = v->ob_ival;
268 register long j = w->ob_ival;
269 return (i < j) ? -1 : (i > j) ? 1 : 0;
270}
271
Guido van Rossum9bfef441993-03-29 10:43:31 +0000272static long
Fred Drakea2f55112000-07-09 15:16:51 +0000273int_hash(PyIntObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000274{
Guido van Rossum541cdd81997-01-06 22:53:20 +0000275 /* XXX If this is changed, you also need to change the way
276 Python's long, float and complex types are hashed. */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000277 long x = v -> ob_ival;
278 if (x == -1)
279 x = -2;
280 return x;
281}
282
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000283static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000284int_add(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285{
286 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000287 CONVERT_TO_LONG(v, a);
288 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289 x = a + b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000290 if ((x^a) >= 0 || (x^b) >= 0)
291 return PyInt_FromLong(x);
292 if (err_ovf("integer addition"))
293 return NULL;
294 return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295}
296
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000298int_sub(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299{
300 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000301 CONVERT_TO_LONG(v, a);
302 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 x = a - b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000304 if ((x^a) >= 0 || (x^~b) >= 0)
305 return PyInt_FromLong(x);
306 if (err_ovf("integer subtraction"))
307 return NULL;
308 return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
309 (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310}
311
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000312/*
313Integer overflow checking used to be done using a double, but on 64
314bit machines (where both long and double are 64 bit) this fails
Thomas Wouters7e474022000-07-16 12:04:32 +0000315because the double doesn't have enough precision. John Tromp suggests
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000316the following algorithm:
317
318Suppose again we normalize a and b to be nonnegative.
319Let ah and al (bh and bl) be the high and low 32 bits of a (b, resp.).
320Now we test ah and bh against zero and get essentially 3 possible outcomes.
321
3221) both ah and bh > 0 : then report overflow
323
3242) both ah and bh = 0 : then compute a*b and report overflow if it comes out
325 negative
326
3273) ah > 0 and bh = 0 : compute ah*bl and report overflow if it's >= 2^31
328 compute al*bl and report overflow if it's negative
329 add (ah*bl)<<32 to al*bl and report overflow if
330 it's negative
331
332In case of no overflow the result is then negated if necessary.
333
334The majority of cases will be 2), in which case this method is the same as
335what I suggested before. If multiplication is expensive enough, then the
336other method is faster on case 3), but also more work to program, so I
337guess the above is the preferred solution.
338
339*/
340
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341static PyObject *
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000342int_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343{
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000344 long a, b, ah, bh, x, y;
345 int s = 1;
346
Guido van Rossum7e35d572001-09-15 03:14:32 +0000347 if (!PyInt_Check(v) &&
348 v->ob_type->tp_as_sequence &&
349 v->ob_type->tp_as_sequence->sq_repeat) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000350 /* sequence * int */
351 a = PyInt_AsLong(w);
352 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, a);
353 }
Guido van Rossum7e35d572001-09-15 03:14:32 +0000354 if (!PyInt_Check(w) &&
355 w->ob_type->tp_as_sequence &&
356 w->ob_type->tp_as_sequence->sq_repeat) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000357 /* int * sequence */
358 a = PyInt_AsLong(v);
359 return (*w->ob_type->tp_as_sequence->sq_repeat)(w, a);
360 }
361
362 CONVERT_TO_LONG(v, a);
363 CONVERT_TO_LONG(w, b);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000364 ah = a >> (LONG_BIT/2);
365 bh = b >> (LONG_BIT/2);
366
367 /* Quick test for common case: two small positive ints */
368
369 if (ah == 0 && bh == 0) {
370 x = a*b;
371 if (x < 0)
372 goto bad;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 return PyInt_FromLong(x);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000374 }
375
376 /* Arrange that a >= b >= 0 */
377
378 if (a < 0) {
379 a = -a;
380 if (a < 0) {
381 /* Largest negative */
382 if (b == 0 || b == 1) {
383 x = a*b;
384 goto ok;
385 }
386 else
387 goto bad;
388 }
389 s = -s;
390 ah = a >> (LONG_BIT/2);
391 }
392 if (b < 0) {
393 b = -b;
394 if (b < 0) {
395 /* Largest negative */
Guido van Rossum9478dd41996-12-06 20:14:43 +0000396 if (a == 0 || (a == 1 && s == 1)) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000397 x = a*b;
398 goto ok;
399 }
400 else
401 goto bad;
402 }
403 s = -s;
404 bh = b >> (LONG_BIT/2);
405 }
406
407 /* 1) both ah and bh > 0 : then report overflow */
408
409 if (ah != 0 && bh != 0)
410 goto bad;
411
412 /* 2) both ah and bh = 0 : then compute a*b and report
413 overflow if it comes out negative */
414
415 if (ah == 0 && bh == 0) {
416 x = a*b;
417 if (x < 0)
418 goto bad;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 return PyInt_FromLong(x*s);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000420 }
421
422 if (a < b) {
423 /* Swap */
424 x = a;
425 a = b;
426 b = x;
427 ah = bh;
428 /* bh not used beyond this point */
429 }
430
431 /* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if
432 it's >= 2^31
433 compute al*bl and report overflow if it's negative
434 add (ah*bl)<<32 to al*bl and report overflow if
435 it's negative
436 (NB b == bl in this case, and we make a = al) */
437
438 y = ah*b;
Guido van Rossum541cdd81997-01-06 22:53:20 +0000439 if (y >= (1L << (LONG_BIT/2 - 1)))
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000440 goto bad;
441 a &= (1L << (LONG_BIT/2)) - 1;
442 x = a*b;
443 if (x < 0)
444 goto bad;
Guido van Rossum541cdd81997-01-06 22:53:20 +0000445 x += y << (LONG_BIT/2);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000446 if (x < 0)
447 goto bad;
448 ok:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 return PyInt_FromLong(x * s);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000450
451 bad:
Guido van Rossume27f7952001-08-23 02:59:04 +0000452 if (err_ovf("integer multiplication"))
453 return NULL;
454 return PyLong_Type.tp_as_number->nb_multiply(v, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000455}
456
Guido van Rossume27f7952001-08-23 02:59:04 +0000457/* Return type of i_divmod */
458enum divmod_result {
459 DIVMOD_OK, /* Correct result */
460 DIVMOD_OVERFLOW, /* Overflow, try again using longs */
461 DIVMOD_ERROR /* Exception raised */
462};
463
464static enum divmod_result
Tim Peters1dad6a82001-06-18 19:21:11 +0000465i_divmod(register long x, register long y,
Fred Drakea2f55112000-07-09 15:16:51 +0000466 long *p_xdivy, long *p_xmody)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000467{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000468 long xdivy, xmody;
469
Tim Peters1dad6a82001-06-18 19:21:11 +0000470 if (y == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000472 "integer division or modulo by zero");
Guido van Rossume27f7952001-08-23 02:59:04 +0000473 return DIVMOD_ERROR;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474 }
Tim Peters1dad6a82001-06-18 19:21:11 +0000475 /* (-sys.maxint-1)/-1 is the only overflow case. */
476 if (y == -1 && x < 0 && x == -x) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000477 if (err_ovf("integer division"))
478 return DIVMOD_ERROR;
479 return DIVMOD_OVERFLOW;
Guido van Rossum00466951991-05-05 20:08:27 +0000480 }
Tim Peters1dad6a82001-06-18 19:21:11 +0000481 xdivy = x / y;
482 xmody = x - xdivy * y;
483 /* If the signs of x and y differ, and the remainder is non-0,
484 * C89 doesn't define whether xdivy is now the floor or the
485 * ceiling of the infinitely precise quotient. We want the floor,
486 * and we have it iff the remainder's sign matches y's.
487 */
488 if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
489 xmody += y;
490 --xdivy;
491 assert(xmody && ((y ^ xmody) >= 0));
Guido van Rossum00466951991-05-05 20:08:27 +0000492 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000493 *p_xdivy = xdivy;
494 *p_xmody = xmody;
Guido van Rossume27f7952001-08-23 02:59:04 +0000495 return DIVMOD_OK;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000496}
497
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000499int_div(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000500{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000501 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000502 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000503 CONVERT_TO_LONG(x, xi);
504 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000505 switch (i_divmod(xi, yi, &d, &m)) {
506 case DIVMOD_OK:
507 return PyInt_FromLong(d);
508 case DIVMOD_OVERFLOW:
509 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
510 (PyObject *)y);
511 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000512 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000513 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000514}
515
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000517int_classic_div(PyIntObject *x, PyIntObject *y)
518{
519 long xi, yi;
520 long d, m;
521 CONVERT_TO_LONG(x, xi);
522 CONVERT_TO_LONG(y, yi);
523 if (Py_DivisionWarningFlag &&
524 PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0)
525 return NULL;
526 switch (i_divmod(xi, yi, &d, &m)) {
527 case DIVMOD_OK:
528 return PyInt_FromLong(d);
529 case DIVMOD_OVERFLOW:
530 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
531 (PyObject *)y);
532 default:
533 return NULL;
534 }
535}
536
537static PyObject *
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000538int_true_divide(PyObject *v, PyObject *w)
539{
Tim Peterse2a60002001-09-04 06:17:36 +0000540 /* If they aren't both ints, give someone else a chance. In
541 particular, this lets int/long get handled by longs, which
542 underflows to 0 gracefully if the long is too big to convert
543 to float. */
544 if (PyInt_Check(v) && PyInt_Check(w))
545 return PyFloat_Type.tp_as_number->nb_true_divide(v, w);
546 Py_INCREF(Py_NotImplemented);
547 return Py_NotImplemented;
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000548}
549
550static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000551int_mod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000552{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000553 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000554 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000555 CONVERT_TO_LONG(x, xi);
556 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000557 switch (i_divmod(xi, yi, &d, &m)) {
558 case DIVMOD_OK:
559 return PyInt_FromLong(m);
560 case DIVMOD_OVERFLOW:
561 return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x,
562 (PyObject *)y);
563 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000564 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000565 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000566}
567
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000569int_divmod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000570{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000571 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000572 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000573 CONVERT_TO_LONG(x, xi);
574 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000575 switch (i_divmod(xi, yi, &d, &m)) {
576 case DIVMOD_OK:
577 return Py_BuildValue("(ll)", d, m);
578 case DIVMOD_OVERFLOW:
579 return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x,
580 (PyObject *)y);
581 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000582 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000583 }
Guido van Rossum00466951991-05-05 20:08:27 +0000584}
585
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000587int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000588{
Guido van Rossum9478dd41996-12-06 20:14:43 +0000589 register long iv, iw, iz=0, ix, temp, prev;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000590 CONVERT_TO_LONG(v, iv);
591 CONVERT_TO_LONG(w, iw);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000592 if (iw < 0) {
Tim Peters32f453e2001-09-03 08:35:41 +0000593 if ((PyObject *)z != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +0000594 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
595 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +0000596 return NULL;
597 }
Guido van Rossumb82fedc2001-07-12 11:19:45 +0000598 /* Return a float. This works because we know that
599 this calls float_pow() which converts its
600 arguments to double. */
601 return PyFloat_Type.tp_as_number->nb_power(
602 (PyObject *)v, (PyObject *)w, (PyObject *)z);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000603 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 if ((PyObject *)z != Py_None) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000605 CONVERT_TO_LONG(z, iz);
Guido van Rossum9478dd41996-12-06 20:14:43 +0000606 if (iz == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 PyErr_SetString(PyExc_ValueError,
Tim Peters4c483c42001-09-05 06:24:58 +0000608 "pow() 3rd argument cannot be 0");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000609 return NULL;
610 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000611 }
612 /*
613 * XXX: The original exponentiation code stopped looping
614 * when temp hit zero; this code will continue onwards
615 * unnecessarily, but at least it won't cause any errors.
616 * Hopefully the speed improvement from the fast exponentiation
617 * will compensate for the slight inefficiency.
618 * XXX: Better handling of overflows is desperately needed.
619 */
620 temp = iv;
621 ix = 1;
622 while (iw > 0) {
623 prev = ix; /* Save value for overflow check */
624 if (iw & 1) {
625 ix = ix*temp;
626 if (temp == 0)
627 break; /* Avoid ix / 0 */
Guido van Rossume27f7952001-08-23 02:59:04 +0000628 if (ix / temp != prev) {
629 if (err_ovf("integer exponentiation"))
630 return NULL;
631 return PyLong_Type.tp_as_number->nb_power(
632 (PyObject *)v,
633 (PyObject *)w,
Tim Peters31960db2001-08-23 21:28:33 +0000634 (PyObject *)z);
Guido van Rossume27f7952001-08-23 02:59:04 +0000635 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000636 }
637 iw >>= 1; /* Shift exponent down by 1 bit */
638 if (iw==0) break;
639 prev = temp;
640 temp *= temp; /* Square the value of temp */
Guido van Rossume27f7952001-08-23 02:59:04 +0000641 if (prev!=0 && temp/prev!=prev) {
642 if (err_ovf("integer exponentiation"))
643 return NULL;
644 return PyLong_Type.tp_as_number->nb_power(
645 (PyObject *)v, (PyObject *)w, (PyObject *)z);
646 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000647 if (iz) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000648 /* If we did a multiplication, perform a modulo */
649 ix = ix % iz;
650 temp = temp % iz;
651 }
652 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000653 if (iz) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000654 long div, mod;
Guido van Rossume27f7952001-08-23 02:59:04 +0000655 switch (i_divmod(ix, iz, &div, &mod)) {
656 case DIVMOD_OK:
657 ix = mod;
658 break;
659 case DIVMOD_OVERFLOW:
660 return PyLong_Type.tp_as_number->nb_power(
661 (PyObject *)v, (PyObject *)w, (PyObject *)z);
662 default:
663 return NULL;
664 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000665 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 return PyInt_FromLong(ix);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000667}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000668
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000670int_neg(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000671{
672 register long a, x;
673 a = v->ob_ival;
674 x = -a;
Guido van Rossume27f7952001-08-23 02:59:04 +0000675 if (a < 0 && x < 0) {
676 if (err_ovf("integer negation"))
677 return NULL;
678 return PyNumber_Negative(PyLong_FromLong(a));
679 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000681}
682
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000684int_pos(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000685{
Tim Peters73a1dfe2001-09-11 21:44:14 +0000686 if (PyInt_CheckExact(v)) {
687 Py_INCREF(v);
688 return (PyObject *)v;
689 }
690 else
691 return PyInt_FromLong(v->ob_ival);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000692}
693
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000695int_abs(PyIntObject *v)
Guido van Rossum00466951991-05-05 20:08:27 +0000696{
697 if (v->ob_ival >= 0)
698 return int_pos(v);
699 else
700 return int_neg(v);
701}
702
Guido van Rossum0bff0151991-05-14 12:05:32 +0000703static int
Fred Drakea2f55112000-07-09 15:16:51 +0000704int_nonzero(PyIntObject *v)
Guido van Rossum0bff0151991-05-14 12:05:32 +0000705{
706 return v->ob_ival != 0;
707}
708
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000710int_invert(PyIntObject *v)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000711{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000713}
714
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000716int_lshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000717{
718 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000719 CONVERT_TO_LONG(v, a);
720 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000721 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000723 return NULL;
724 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000725 if (a == 0 || b == 0)
726 return int_pos(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000727 if (b >= LONG_BIT) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 return PyInt_FromLong(0L);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000729 }
Fred Drake1bc8fab2001-07-19 21:49:38 +0000730 a = (long)((unsigned long)a << b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000732}
733
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000734static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000735int_rshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000736{
737 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000738 CONVERT_TO_LONG(v, a);
739 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000740 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000742 return NULL;
743 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000744 if (a == 0 || b == 0)
745 return int_pos(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000746 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000747 if (a < 0)
748 a = -1;
749 else
750 a = 0;
751 }
752 else {
Tim Peters7d3a5112000-07-08 04:17:21 +0000753 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000754 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000756}
757
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000758static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000759int_and(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000760{
761 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000762 CONVERT_TO_LONG(v, a);
763 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000764 return PyInt_FromLong(a & b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000765}
766
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000768int_xor(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000769{
770 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000771 CONVERT_TO_LONG(v, a);
772 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773 return PyInt_FromLong(a ^ b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000774}
775
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000776static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000777int_or(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000778{
779 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000780 CONVERT_TO_LONG(v, a);
781 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 return PyInt_FromLong(a | b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000783}
784
Guido van Rossum1952e382001-09-19 01:25:16 +0000785static int
786int_coerce(PyObject **pv, PyObject **pw)
787{
788 if (PyInt_Check(*pw)) {
789 Py_INCREF(*pv);
790 Py_INCREF(*pw);
791 return 0;
792 }
793 return 1; /* Can't do it */
794}
795
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000797int_int(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000798{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799 Py_INCREF(v);
800 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000801}
802
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000804int_long(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000805{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000807}
808
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000809static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000810int_float(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000811{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000813}
814
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000816int_oct(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000817{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000818 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000819 long x = v -> ob_ival;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000820 if (x == 0)
821 strcpy(buf, "0");
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000822 else
Guido van Rossumebee0251997-01-12 19:48:03 +0000823 sprintf(buf, "0%lo", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000825}
826
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000827static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000828int_hex(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000829{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000830 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000831 long x = v -> ob_ival;
Guido van Rossumebee0251997-01-12 19:48:03 +0000832 sprintf(buf, "0x%lx", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000834}
835
Guido van Rossumbef14172001-08-29 15:47:46 +0000836staticforward PyObject *
837int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
838
Tim Peters6d6c1a32001-08-02 04:15:00 +0000839static PyObject *
840int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
841{
842 PyObject *x = NULL;
843 int base = -909;
844 static char *kwlist[] = {"x", "base", 0};
845
Guido van Rossumbef14172001-08-29 15:47:46 +0000846 if (type != &PyInt_Type)
847 return int_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000848 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
849 &x, &base))
850 return NULL;
851 if (x == NULL)
852 return PyInt_FromLong(0L);
853 if (base == -909)
854 return PyNumber_Int(x);
855 if (PyString_Check(x))
856 return PyInt_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000857#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000858 if (PyUnicode_Check(x))
859 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
860 PyUnicode_GET_SIZE(x),
861 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000862#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000863 PyErr_SetString(PyExc_TypeError,
864 "int() can't convert non-string with explicit base");
865 return NULL;
866}
867
Guido van Rossumbef14172001-08-29 15:47:46 +0000868/* Wimpy, slow approach to tp_new calls for subtypes of int:
869 first create a regular int from whatever arguments we got,
870 then allocate a subtype instance and initialize its ob_ival
871 from the regular int. The regular int is then thrown away.
872*/
873static PyObject *
874int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
875{
876 PyObject *tmp, *new;
877
878 assert(PyType_IsSubtype(type, &PyInt_Type));
879 tmp = int_new(&PyInt_Type, args, kwds);
880 if (tmp == NULL)
881 return NULL;
882 assert(PyInt_Check(tmp));
Guido van Rossumd93dce12001-08-30 03:09:31 +0000883 new = type->tp_alloc(type, 0);
Guido van Rossumbef14172001-08-29 15:47:46 +0000884 if (new == NULL)
885 return NULL;
886 ((PyIntObject *)new)->ob_ival = ((PyIntObject *)tmp)->ob_ival;
887 Py_DECREF(tmp);
888 return new;
889}
890
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891static char int_doc[] =
892"int(x[, base]) -> integer\n\
893\n\
894Convert a string or number to an integer, if possible. A floating point\n\
895argument will be truncated towards zero (this does not include a string\n\
896representation of a floating point number!) When converting a string, use\n\
897the optional base. It is an error to supply a base when converting a\n\
898non-string.";
899
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900static PyNumberMethods int_as_number = {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000901 (binaryfunc)int_add, /*nb_add*/
902 (binaryfunc)int_sub, /*nb_subtract*/
903 (binaryfunc)int_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +0000904 (binaryfunc)int_classic_div, /*nb_divide*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000905 (binaryfunc)int_mod, /*nb_remainder*/
906 (binaryfunc)int_divmod, /*nb_divmod*/
907 (ternaryfunc)int_pow, /*nb_power*/
908 (unaryfunc)int_neg, /*nb_negative*/
909 (unaryfunc)int_pos, /*nb_positive*/
910 (unaryfunc)int_abs, /*nb_absolute*/
911 (inquiry)int_nonzero, /*nb_nonzero*/
912 (unaryfunc)int_invert, /*nb_invert*/
913 (binaryfunc)int_lshift, /*nb_lshift*/
914 (binaryfunc)int_rshift, /*nb_rshift*/
915 (binaryfunc)int_and, /*nb_and*/
916 (binaryfunc)int_xor, /*nb_xor*/
917 (binaryfunc)int_or, /*nb_or*/
Guido van Rossum1952e382001-09-19 01:25:16 +0000918 int_coerce, /*nb_coerce*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000919 (unaryfunc)int_int, /*nb_int*/
920 (unaryfunc)int_long, /*nb_long*/
921 (unaryfunc)int_float, /*nb_float*/
922 (unaryfunc)int_oct, /*nb_oct*/
923 (unaryfunc)int_hex, /*nb_hex*/
924 0, /*nb_inplace_add*/
925 0, /*nb_inplace_subtract*/
926 0, /*nb_inplace_multiply*/
927 0, /*nb_inplace_divide*/
928 0, /*nb_inplace_remainder*/
929 0, /*nb_inplace_power*/
930 0, /*nb_inplace_lshift*/
931 0, /*nb_inplace_rshift*/
932 0, /*nb_inplace_and*/
933 0, /*nb_inplace_xor*/
934 0, /*nb_inplace_or*/
Guido van Rossum4668b002001-08-08 05:00:18 +0000935 (binaryfunc)int_div, /* nb_floor_divide */
936 int_true_divide, /* nb_true_divide */
937 0, /* nb_inplace_floor_divide */
938 0, /* nb_inplace_true_divide */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000939};
940
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000941PyTypeObject PyInt_Type = {
942 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000943 0,
944 "int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945 sizeof(PyIntObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000946 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000947 (destructor)int_dealloc, /* tp_dealloc */
948 (printfunc)int_print, /* tp_print */
949 0, /* tp_getattr */
950 0, /* tp_setattr */
951 (cmpfunc)int_compare, /* tp_compare */
952 (reprfunc)int_repr, /* tp_repr */
953 &int_as_number, /* tp_as_number */
954 0, /* tp_as_sequence */
955 0, /* tp_as_mapping */
956 (hashfunc)int_hash, /* tp_hash */
957 0, /* tp_call */
958 0, /* tp_str */
959 PyObject_GenericGetAttr, /* tp_getattro */
960 0, /* tp_setattro */
961 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +0000962 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
963 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000964 int_doc, /* tp_doc */
965 0, /* tp_traverse */
966 0, /* tp_clear */
967 0, /* tp_richcompare */
968 0, /* tp_weaklistoffset */
969 0, /* tp_iter */
970 0, /* tp_iternext */
971 0, /* tp_methods */
972 0, /* tp_members */
973 0, /* tp_getset */
974 0, /* tp_base */
975 0, /* tp_dict */
976 0, /* tp_descr_get */
977 0, /* tp_descr_set */
978 0, /* tp_dictoffset */
979 0, /* tp_init */
980 0, /* tp_alloc */
981 int_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000982};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000983
984void
Fred Drakea2f55112000-07-09 15:16:51 +0000985PyInt_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000986{
Guido van Rossum3fce8831999-03-12 19:43:17 +0000987 PyIntObject *p;
988 PyIntBlock *list, *next;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000989 int i;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000990 int bc, bf; /* block count, number of freed blocks */
991 int irem, isum; /* remaining unfreed ints per block, total */
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000992
Guido van Rossumda084ed1999-03-10 22:55:24 +0000993#if NSMALLNEGINTS + NSMALLPOSINTS > 0
994 PyIntObject **q;
995
996 i = NSMALLNEGINTS + NSMALLPOSINTS;
997 q = small_ints;
998 while (--i >= 0) {
999 Py_XDECREF(*q);
1000 *q++ = NULL;
1001 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001002#endif
Guido van Rossumda084ed1999-03-10 22:55:24 +00001003 bc = 0;
1004 bf = 0;
1005 isum = 0;
1006 list = block_list;
1007 block_list = NULL;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001008 free_list = NULL;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001009 while (list != NULL) {
Guido van Rossumda084ed1999-03-10 22:55:24 +00001010 bc++;
1011 irem = 0;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001012 for (i = 0, p = &list->objects[0];
1013 i < N_INTOBJECTS;
1014 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001015 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Guido van Rossumda084ed1999-03-10 22:55:24 +00001016 irem++;
1017 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001018 next = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001019 if (irem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001020 list->next = block_list;
1021 block_list = list;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001022 for (i = 0, p = &list->objects[0];
1023 i < N_INTOBJECTS;
1024 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001025 if (!PyInt_CheckExact(p) ||
Guido van Rossumbef14172001-08-29 15:47:46 +00001026 p->ob_refcnt == 0) {
Guido van Rossum51288bc1999-03-19 20:30:39 +00001027 p->ob_type = (struct _typeobject *)
1028 free_list;
1029 free_list = p;
1030 }
1031#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1032 else if (-NSMALLNEGINTS <= p->ob_ival &&
1033 p->ob_ival < NSMALLPOSINTS &&
1034 small_ints[p->ob_ival +
1035 NSMALLNEGINTS] == NULL) {
1036 Py_INCREF(p);
1037 small_ints[p->ob_ival +
1038 NSMALLNEGINTS] = p;
1039 }
1040#endif
1041 }
Guido van Rossumda084ed1999-03-10 22:55:24 +00001042 }
1043 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001044 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
Guido van Rossumda084ed1999-03-10 22:55:24 +00001045 bf++;
1046 }
1047 isum += irem;
Guido van Rossum3fce8831999-03-12 19:43:17 +00001048 list = next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001049 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001050 if (!Py_VerboseFlag)
1051 return;
1052 fprintf(stderr, "# cleanup ints");
1053 if (!isum) {
1054 fprintf(stderr, "\n");
1055 }
1056 else {
1057 fprintf(stderr,
1058 ": %d unfreed int%s in %d out of %d block%s\n",
1059 isum, isum == 1 ? "" : "s",
1060 bc - bf, bc, bc == 1 ? "" : "s");
1061 }
1062 if (Py_VerboseFlag > 1) {
1063 list = block_list;
1064 while (list != NULL) {
Guido van Rossum51288bc1999-03-19 20:30:39 +00001065 for (i = 0, p = &list->objects[0];
1066 i < N_INTOBJECTS;
1067 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001068 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Guido van Rossum3fce8831999-03-12 19:43:17 +00001069 fprintf(stderr,
Fred Drakea44d3532000-06-30 15:01:00 +00001070 "# <int at %p, refcnt=%d, val=%ld>\n",
1071 p, p->ob_refcnt, p->ob_ival);
Guido van Rossum3fce8831999-03-12 19:43:17 +00001072 }
1073 list = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001074 }
1075 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001076}