1
2 /* Integer object implementation */
3
4 #include "Python.h"
5 #include <ctype.h>
6 #include <float.h>
7
8 static PyObject *int_int(PyIntObject *v);
9
10 long
PyInt_GetMax(void)11 PyInt_GetMax(void)
12 {
13 return LONG_MAX; /* To initialize sys.maxint */
14 }
15
16 /* Integers are quite normal objects, to make object handling uniform.
17 (Using odd pointers to represent integers would save much space
18 but require extra checks for this special case throughout the code.)
19 Since a typical Python program spends much of its time allocating
20 and deallocating integers, these operations should be very fast.
21 Therefore we use a dedicated allocation scheme with a much lower
22 overhead (in space and time) than straight malloc(): a simple
23 dedicated free list, filled when necessary with memory from malloc().
24
25 block_list is a singly-linked list of all PyIntBlocks ever allocated,
26 linked via their next members. PyIntBlocks are never returned to the
27 system before shutdown (PyInt_Fini).
28
29 free_list is a singly-linked list of available PyIntObjects, linked
30 via abuse of their ob_type members.
31 */
32
33 #define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
34 #define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
35 #define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
36
37 struct _intblock {
38 struct _intblock *next;
39 PyIntObject objects[N_INTOBJECTS];
40 };
41
42 typedef struct _intblock PyIntBlock;
43
44 static PyIntBlock *block_list = NULL;
45 static PyIntObject *free_list = NULL;
46
47 static PyIntObject *
fill_free_list(void)48 fill_free_list(void)
49 {
50 PyIntObject *p, *q;
51 /* Python's object allocator isn't appropriate for large blocks. */
52 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
53 if (p == NULL)
54 return (PyIntObject *) PyErr_NoMemory();
55 ((PyIntBlock *)p)->next = block_list;
56 block_list = (PyIntBlock *)p;
57 /* Link the int objects together, from rear to front, then return
58 the address of the last int object in the block. */
59 p = &((PyIntBlock *)p)->objects[0];
60 q = p + N_INTOBJECTS;
61 while (--q > p)
62 Py_TYPE(q) = (struct _typeobject *)(q-1);
63 Py_TYPE(q) = NULL;
64 return p + N_INTOBJECTS - 1;
65 }
66
67 #ifndef NSMALLPOSINTS
68 #define NSMALLPOSINTS 257
69 #endif
70 #ifndef NSMALLNEGINTS
71 #define NSMALLNEGINTS 5
72 #endif
73 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
74 /* References to small integers are saved in this array so that they
75 can be shared.
76 The integers that are saved are those in the range
77 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
78 */
79 static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
80 #endif
81 #ifdef COUNT_ALLOCS
82 Py_ssize_t quick_int_allocs;
83 Py_ssize_t quick_neg_int_allocs;
84 #endif
85
86 PyObject *
PyInt_FromLong(long ival)87 PyInt_FromLong(long ival)
88 {
89 register PyIntObject *v;
90 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
91 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
92 v = small_ints[ival + NSMALLNEGINTS];
93 Py_INCREF(v);
94 #ifdef COUNT_ALLOCS
95 if (ival >= 0)
96 quick_int_allocs++;
97 else
98 quick_neg_int_allocs++;
99 #endif
100 return (PyObject *) v;
101 }
102 #endif
103 if (free_list == NULL) {
104 if ((free_list = fill_free_list()) == NULL)
105 return NULL;
106 }
107 /* Inline PyObject_New */
108 v = free_list;
109 free_list = (PyIntObject *)Py_TYPE(v);
110 PyObject_INIT(v, &PyInt_Type);
111 v->ob_ival = ival;
112 return (PyObject *) v;
113 }
114
115 PyObject *
PyInt_FromSize_t(size_t ival)116 PyInt_FromSize_t(size_t ival)
117 {
118 if (ival <= LONG_MAX)
119 return PyInt_FromLong((long)ival);
120 return _PyLong_FromSize_t(ival);
121 }
122
123 PyObject *
PyInt_FromSsize_t(Py_ssize_t ival)124 PyInt_FromSsize_t(Py_ssize_t ival)
125 {
126 if (ival >= LONG_MIN && ival <= LONG_MAX)
127 return PyInt_FromLong((long)ival);
128 return _PyLong_FromSsize_t(ival);
129 }
130
131 static void
int_dealloc(PyIntObject * v)132 int_dealloc(PyIntObject *v)
133 {
134 if (PyInt_CheckExact(v)) {
135 Py_TYPE(v) = (struct _typeobject *)free_list;
136 free_list = v;
137 }
138 else
139 Py_TYPE(v)->tp_free((PyObject *)v);
140 }
141
142 static void
int_free(PyIntObject * v)143 int_free(PyIntObject *v)
144 {
145 Py_TYPE(v) = (struct _typeobject *)free_list;
146 free_list = v;
147 }
148
149 long
PyInt_AsLong(register PyObject * op)150 PyInt_AsLong(register PyObject *op)
151 {
152 PyNumberMethods *nb;
153 PyIntObject *io;
154 long val;
155
156 if (op && PyInt_Check(op))
157 return PyInt_AS_LONG((PyIntObject*) op);
158
159 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
160 nb->nb_int == NULL) {
161 PyErr_SetString(PyExc_TypeError, "an integer is required");
162 return -1;
163 }
164
165 io = (PyIntObject*) (*nb->nb_int) (op);
166 if (io == NULL)
167 return -1;
168 if (!PyInt_Check(io)) {
169 if (PyLong_Check(io)) {
170 /* got a long? => retry int conversion */
171 val = PyLong_AsLong((PyObject *)io);
172 Py_DECREF(io);
173 if ((val == -1) && PyErr_Occurred())
174 return -1;
175 return val;
176 }
177 else
178 {
179 Py_DECREF(io);
180 PyErr_SetString(PyExc_TypeError,
181 "__int__ method should return an integer");
182 return -1;
183 }
184 }
185
186 val = PyInt_AS_LONG(io);
187 Py_DECREF(io);
188
189 return val;
190 }
191
192 Py_ssize_t
PyInt_AsSsize_t(register PyObject * op)193 PyInt_AsSsize_t(register PyObject *op)
194 {
195 #if SIZEOF_SIZE_T != SIZEOF_LONG
196 PyNumberMethods *nb;
197 PyIntObject *io;
198 Py_ssize_t val;
199 #endif
200
201 if (op == NULL) {
202 PyErr_SetString(PyExc_TypeError, "an integer is required");
203 return -1;
204 }
205
206 if (PyInt_Check(op))
207 return PyInt_AS_LONG((PyIntObject*) op);
208 if (PyLong_Check(op))
209 return _PyLong_AsSsize_t(op);
210 #if SIZEOF_SIZE_T == SIZEOF_LONG
211 return PyInt_AsLong(op);
212 #else
213
214 if ((nb = Py_TYPE(op)->tp_as_number) == NULL ||
215 (nb->nb_int == NULL && nb->nb_long == 0)) {
216 PyErr_SetString(PyExc_TypeError, "an integer is required");
217 return -1;
218 }
219
220 if (nb->nb_long != 0)
221 io = (PyIntObject*) (*nb->nb_long) (op);
222 else
223 io = (PyIntObject*) (*nb->nb_int) (op);
224 if (io == NULL)
225 return -1;
226 if (!PyInt_Check(io)) {
227 if (PyLong_Check(io)) {
228 /* got a long? => retry int conversion */
229 val = _PyLong_AsSsize_t((PyObject *)io);
230 Py_DECREF(io);
231 if ((val == -1) && PyErr_Occurred())
232 return -1;
233 return val;
234 }
235 else
236 {
237 Py_DECREF(io);
238 PyErr_SetString(PyExc_TypeError,
239 "__int__ method should return an integer");
240 return -1;
241 }
242 }
243
244 val = PyInt_AS_LONG(io);
245 Py_DECREF(io);
246
247 return val;
248 #endif
249 }
250
251 unsigned long
PyInt_AsUnsignedLongMask(register PyObject * op)252 PyInt_AsUnsignedLongMask(register PyObject *op)
253 {
254 PyNumberMethods *nb;
255 PyIntObject *io;
256 unsigned long val;
257
258 if (op && PyInt_Check(op))
259 return PyInt_AS_LONG((PyIntObject*) op);
260 if (op && PyLong_Check(op))
261 return PyLong_AsUnsignedLongMask(op);
262
263 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
264 nb->nb_int == NULL) {
265 PyErr_SetString(PyExc_TypeError, "an integer is required");
266 return (unsigned long)-1;
267 }
268
269 io = (PyIntObject*) (*nb->nb_int) (op);
270 if (io == NULL)
271 return (unsigned long)-1;
272 if (!PyInt_Check(io)) {
273 if (PyLong_Check(io)) {
274 val = PyLong_AsUnsignedLongMask((PyObject *)io);
275 Py_DECREF(io);
276 if (PyErr_Occurred())
277 return (unsigned long)-1;
278 return val;
279 }
280 else
281 {
282 Py_DECREF(io);
283 PyErr_SetString(PyExc_TypeError,
284 "__int__ method should return an integer");
285 return (unsigned long)-1;
286 }
287 }
288
289 val = PyInt_AS_LONG(io);
290 Py_DECREF(io);
291
292 return val;
293 }
294
295 #ifdef HAVE_LONG_LONG
296 unsigned PY_LONG_LONG
PyInt_AsUnsignedLongLongMask(register PyObject * op)297 PyInt_AsUnsignedLongLongMask(register PyObject *op)
298 {
299 PyNumberMethods *nb;
300 PyIntObject *io;
301 unsigned PY_LONG_LONG val;
302
303 if (op && PyInt_Check(op))
304 return PyInt_AS_LONG((PyIntObject*) op);
305 if (op && PyLong_Check(op))
306 return PyLong_AsUnsignedLongLongMask(op);
307
308 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
309 nb->nb_int == NULL) {
310 PyErr_SetString(PyExc_TypeError, "an integer is required");
311 return (unsigned PY_LONG_LONG)-1;
312 }
313
314 io = (PyIntObject*) (*nb->nb_int) (op);
315 if (io == NULL)
316 return (unsigned PY_LONG_LONG)-1;
317 if (!PyInt_Check(io)) {
318 if (PyLong_Check(io)) {
319 val = PyLong_AsUnsignedLongLongMask((PyObject *)io);
320 Py_DECREF(io);
321 if (PyErr_Occurred())
322 return (unsigned PY_LONG_LONG)-1;
323 return val;
324 }
325 else
326 {
327 Py_DECREF(io);
328 PyErr_SetString(PyExc_TypeError,
329 "__int__ method should return an integer");
330 return (unsigned PY_LONG_LONG)-1;
331 }
332 }
333
334 val = PyInt_AS_LONG(io);
335 Py_DECREF(io);
336
337 return val;
338 }
339 #endif
340
341 PyObject *
PyInt_FromString(char * s,char ** pend,int base)342 PyInt_FromString(char *s, char **pend, int base)
343 {
344 char *end;
345 long x;
346 Py_ssize_t slen;
347 PyObject *sobj, *srepr;
348
349 if ((base != 0 && base < 2) || base > 36) {
350 PyErr_SetString(PyExc_ValueError,
351 "int() base must be >= 2 and <= 36");
352 return NULL;
353 }
354
355 while (*s && isspace(Py_CHARMASK(*s)))
356 s++;
357 errno = 0;
358 if (base == 0 && s[0] == '0') {
359 x = (long) PyOS_strtoul(s, &end, base);
360 if (x < 0)
361 return PyLong_FromString(s, pend, base);
362 }
363 else
364 x = PyOS_strtol(s, &end, base);
365 if (end == s || !isalnum(Py_CHARMASK(end[-1])))
366 goto bad;
367 while (*end && isspace(Py_CHARMASK(*end)))
368 end++;
369 if (*end != '\0') {
370 bad:
371 slen = strlen(s) < 200 ? strlen(s) : 200;
372 sobj = PyString_FromStringAndSize(s, slen);
373 if (sobj == NULL)
374 return NULL;
375 srepr = PyObject_Repr(sobj);
376 Py_DECREF(sobj);
377 if (srepr == NULL)
378 return NULL;
379 PyErr_Format(PyExc_ValueError,
380 "invalid literal for int() with base %d: %s",
381 base, PyString_AS_STRING(srepr));
382 Py_DECREF(srepr);
383 return NULL;
384 }
385 else if (errno != 0)
386 return PyLong_FromString(s, pend, base);
387 if (pend)
388 *pend = end;
389 return PyInt_FromLong(x);
390 }
391
392 #ifdef Py_USING_UNICODE
393 PyObject *
PyInt_FromUnicode(Py_UNICODE * s,Py_ssize_t length,int base)394 PyInt_FromUnicode(Py_UNICODE *s, Py_ssize_t length, int base)
395 {
396 PyObject *result;
397 char *buffer = (char *)PyMem_MALLOC(length+1);
398
399 if (buffer == NULL)
400 return PyErr_NoMemory();
401
402 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) {
403 PyMem_FREE(buffer);
404 return NULL;
405 }
406 result = PyInt_FromString(buffer, NULL, base);
407 PyMem_FREE(buffer);
408 return result;
409 }
410 #endif
411
412 /* Methods */
413
414 /* Integers are seen as the "smallest" of all numeric types and thus
415 don't have any knowledge about conversion of other types to
416 integers. */
417
418 #define CONVERT_TO_LONG(obj, lng) \
419 if (PyInt_Check(obj)) { \
420 lng = PyInt_AS_LONG(obj); \
421 } \
422 else { \
423 Py_INCREF(Py_NotImplemented); \
424 return Py_NotImplemented; \
425 }
426
427 /* ARGSUSED */
428 static int
int_print(PyIntObject * v,FILE * fp,int flags)429 int_print(PyIntObject *v, FILE *fp, int flags)
430 /* flags -- not used but required by interface */
431 {
432 long int_val = v->ob_ival;
433 Py_BEGIN_ALLOW_THREADS
434 fprintf(fp, "%ld", int_val);
435 Py_END_ALLOW_THREADS
436 return 0;
437 }
438
439 static int
int_compare(PyIntObject * v,PyIntObject * w)440 int_compare(PyIntObject *v, PyIntObject *w)
441 {
442 register long i = v->ob_ival;
443 register long j = w->ob_ival;
444 return (i < j) ? -1 : (i > j) ? 1 : 0;
445 }
446
447 static long
int_hash(PyIntObject * v)448 int_hash(PyIntObject *v)
449 {
450 /* XXX If this is changed, you also need to change the way
451 Python's long, float and complex types are hashed. */
452 long x = v -> ob_ival;
453 if (x == -1)
454 x = -2;
455 return x;
456 }
457
458 static PyObject *
int_add(PyIntObject * v,PyIntObject * w)459 int_add(PyIntObject *v, PyIntObject *w)
460 {
461 register long a, b, x;
462 CONVERT_TO_LONG(v, a);
463 CONVERT_TO_LONG(w, b);
464 /* casts in the line below avoid undefined behaviour on overflow */
465 x = (long)((unsigned long)a + b);
466 if ((x^a) >= 0 || (x^b) >= 0)
467 return PyInt_FromLong(x);
468 return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
469 }
470
471 static PyObject *
int_sub(PyIntObject * v,PyIntObject * w)472 int_sub(PyIntObject *v, PyIntObject *w)
473 {
474 register long a, b, x;
475 CONVERT_TO_LONG(v, a);
476 CONVERT_TO_LONG(w, b);
477 /* casts in the line below avoid undefined behaviour on overflow */
478 x = (long)((unsigned long)a - b);
479 if ((x^a) >= 0 || (x^~b) >= 0)
480 return PyInt_FromLong(x);
481 return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
482 (PyObject *)w);
483 }
484
485 /*
486 Integer overflow checking for * is painful: Python tried a couple ways, but
487 they didn't work on all platforms, or failed in endcases (a product of
488 -sys.maxint-1 has been a particular pain).
489
490 Here's another way:
491
492 The native long product x*y is either exactly right or *way* off, being
493 just the last n bits of the true product, where n is the number of bits
494 in a long (the delivered product is the true product plus i*2**n for
495 some integer i).
496
497 The native double product (double)x * (double)y is subject to three
498 rounding errors: on a sizeof(long)==8 box, each cast to double can lose
499 info, and even on a sizeof(long)==4 box, the multiplication can lose info.
500 But, unlike the native long product, it's not in *range* trouble: even
501 if sizeof(long)==32 (256-bit longs), the product easily fits in the
502 dynamic range of a double. So the leading 50 (or so) bits of the double
503 product are correct.
504
505 We check these two ways against each other, and declare victory if they're
506 approximately the same. Else, because the native long product is the only
507 one that can lose catastrophic amounts of information, it's the native long
508 product that must have overflowed.
509 */
510
511 static PyObject *
int_mul(PyObject * v,PyObject * w)512 int_mul(PyObject *v, PyObject *w)
513 {
514 long a, b;
515 long longprod; /* a*b in native long arithmetic */
516 double doubled_longprod; /* (double)longprod */
517 double doubleprod; /* (double)a * (double)b */
518
519 CONVERT_TO_LONG(v, a);
520 CONVERT_TO_LONG(w, b);
521 /* casts in the next line avoid undefined behaviour on overflow */
522 longprod = (long)((unsigned long)a * b);
523 doubleprod = (double)a * (double)b;
524 doubled_longprod = (double)longprod;
525
526 /* Fast path for normal case: small multiplicands, and no info
527 is lost in either method. */
528 if (doubled_longprod == doubleprod)
529 return PyInt_FromLong(longprod);
530
531 /* Somebody somewhere lost info. Close enough, or way off? Note
532 that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0).
533 The difference either is or isn't significant compared to the
534 true value (of which doubleprod is a good approximation).
535 */
536 {
537 const double diff = doubled_longprod - doubleprod;
538 const double absdiff = diff >= 0.0 ? diff : -diff;
539 const double absprod = doubleprod >= 0.0 ? doubleprod :
540 -doubleprod;
541 /* absdiff/absprod <= 1/32 iff
542 32 * absdiff <= absprod -- 5 good bits is "close enough" */
543 if (32.0 * absdiff <= absprod)
544 return PyInt_FromLong(longprod);
545 else
546 return PyLong_Type.tp_as_number->nb_multiply(v, w);
547 }
548 }
549
550 /* Integer overflow checking for unary negation: on a 2's-complement
551 * box, -x overflows iff x is the most negative long. In this case we
552 * get -x == x. However, -x is undefined (by C) if x /is/ the most
553 * negative long (it's a signed overflow case), and some compilers care.
554 * So we cast x to unsigned long first. However, then other compilers
555 * warn about applying unary minus to an unsigned operand. Hence the
556 * weird "0-".
557 */
558 #define UNARY_NEG_WOULD_OVERFLOW(x) \
559 ((x) < 0 && (unsigned long)(x) == 0-(unsigned long)(x))
560
561 /* Return type of i_divmod */
562 enum divmod_result {
563 DIVMOD_OK, /* Correct result */
564 DIVMOD_OVERFLOW, /* Overflow, try again using longs */
565 DIVMOD_ERROR /* Exception raised */
566 };
567
568 static enum divmod_result
i_divmod(register long x,register long y,long * p_xdivy,long * p_xmody)569 i_divmod(register long x, register long y,
570 long *p_xdivy, long *p_xmody)
571 {
572 long xdivy, xmody;
573
574 if (y == 0) {
575 PyErr_SetString(PyExc_ZeroDivisionError,
576 "integer division or modulo by zero");
577 return DIVMOD_ERROR;
578 }
579 /* (-sys.maxint-1)/-1 is the only overflow case. */
580 if (y == -1 && UNARY_NEG_WOULD_OVERFLOW(x))
581 return DIVMOD_OVERFLOW;
582 xdivy = x / y;
583 /* xdiv*y can overflow on platforms where x/y gives floor(x/y)
584 * for x and y with differing signs. (This is unusual
585 * behaviour, and C99 prohibits it, but it's allowed by C89;
586 * for an example of overflow, take x = LONG_MIN, y = 5 or x =
587 * LONG_MAX, y = -5.) However, x - xdivy*y is always
588 * representable as a long, since it lies strictly between
589 * -abs(y) and abs(y). We add casts to avoid intermediate
590 * overflow.
591 */
592 xmody = (long)(x - (unsigned long)xdivy * y);
593 /* If the signs of x and y differ, and the remainder is non-0,
594 * C89 doesn't define whether xdivy is now the floor or the
595 * ceiling of the infinitely precise quotient. We want the floor,
596 * and we have it iff the remainder's sign matches y's.
597 */
598 if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
599 xmody += y;
600 --xdivy;
601 assert(xmody && ((y ^ xmody) >= 0));
602 }
603 *p_xdivy = xdivy;
604 *p_xmody = xmody;
605 return DIVMOD_OK;
606 }
607
608 static PyObject *
int_div(PyIntObject * x,PyIntObject * y)609 int_div(PyIntObject *x, PyIntObject *y)
610 {
611 long xi, yi;
612 long d, m;
613 CONVERT_TO_LONG(x, xi);
614 CONVERT_TO_LONG(y, yi);
615 switch (i_divmod(xi, yi, &d, &m)) {
616 case DIVMOD_OK:
617 return PyInt_FromLong(d);
618 case DIVMOD_OVERFLOW:
619 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
620 (PyObject *)y);
621 default:
622 return NULL;
623 }
624 }
625
626 static PyObject *
int_classic_div(PyIntObject * x,PyIntObject * y)627 int_classic_div(PyIntObject *x, PyIntObject *y)
628 {
629 long xi, yi;
630 long d, m;
631 CONVERT_TO_LONG(x, xi);
632 CONVERT_TO_LONG(y, yi);
633 if (Py_DivisionWarningFlag &&
634 PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0)
635 return NULL;
636 switch (i_divmod(xi, yi, &d, &m)) {
637 case DIVMOD_OK:
638 return PyInt_FromLong(d);
639 case DIVMOD_OVERFLOW:
640 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
641 (PyObject *)y);
642 default:
643 return NULL;
644 }
645 }
646
647 static PyObject *
int_true_divide(PyIntObject * x,PyIntObject * y)648 int_true_divide(PyIntObject *x, PyIntObject *y)
649 {
650 long xi, yi;
651 /* If they aren't both ints, give someone else a chance. In
652 particular, this lets int/long get handled by longs, which
653 underflows to 0 gracefully if the long is too big to convert
654 to float. */
655 CONVERT_TO_LONG(x, xi);
656 CONVERT_TO_LONG(y, yi);
657 if (yi == 0) {
658 PyErr_SetString(PyExc_ZeroDivisionError,
659 "division by zero");
660 return NULL;
661 }
662 if (xi == 0)
663 return PyFloat_FromDouble(yi < 0 ? -0.0 : 0.0);
664
665 #define WIDTH_OF_ULONG (CHAR_BIT*SIZEOF_LONG)
666 #if DBL_MANT_DIG < WIDTH_OF_ULONG
667 if ((xi >= 0 ? 0UL + xi : 0UL - xi) >> DBL_MANT_DIG ||
668 (yi >= 0 ? 0UL + yi : 0UL - yi) >> DBL_MANT_DIG)
669 /* Large x or y. Use long integer arithmetic. */
670 return PyLong_Type.tp_as_number->nb_true_divide(
671 (PyObject *)x, (PyObject *)y);
672 else
673 #endif
674 /* Both ints can be exactly represented as doubles. Do a
675 floating-point division. */
676 return PyFloat_FromDouble((double)xi / (double)yi);
677 }
678
679 static PyObject *
int_mod(PyIntObject * x,PyIntObject * y)680 int_mod(PyIntObject *x, PyIntObject *y)
681 {
682 long xi, yi;
683 long d, m;
684 CONVERT_TO_LONG(x, xi);
685 CONVERT_TO_LONG(y, yi);
686 switch (i_divmod(xi, yi, &d, &m)) {
687 case DIVMOD_OK:
688 return PyInt_FromLong(m);
689 case DIVMOD_OVERFLOW:
690 return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x,
691 (PyObject *)y);
692 default:
693 return NULL;
694 }
695 }
696
697 static PyObject *
int_divmod(PyIntObject * x,PyIntObject * y)698 int_divmod(PyIntObject *x, PyIntObject *y)
699 {
700 long xi, yi;
701 long d, m;
702 CONVERT_TO_LONG(x, xi);
703 CONVERT_TO_LONG(y, yi);
704 switch (i_divmod(xi, yi, &d, &m)) {
705 case DIVMOD_OK:
706 return Py_BuildValue("(ll)", d, m);
707 case DIVMOD_OVERFLOW:
708 return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x,
709 (PyObject *)y);
710 default:
711 return NULL;
712 }
713 }
714
715 static PyObject *
int_pow(PyIntObject * v,PyIntObject * w,PyIntObject * z)716 int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
717 {
718 register long iv, iw, iz=0, ix, temp, prev;
719 CONVERT_TO_LONG(v, iv);
720 CONVERT_TO_LONG(w, iw);
721 if (iw < 0) {
722 if ((PyObject *)z != Py_None) {
723 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
724 "cannot be negative when 3rd argument specified");
725 return NULL;
726 }
727 /* Return a float. This works because we know that
728 this calls float_pow() which converts its
729 arguments to double. */
730 return PyFloat_Type.tp_as_number->nb_power(
731 (PyObject *)v, (PyObject *)w, (PyObject *)z);
732 }
733 if ((PyObject *)z != Py_None) {
734 CONVERT_TO_LONG(z, iz);
735 if (iz == 0) {
736 PyErr_SetString(PyExc_ValueError,
737 "pow() 3rd argument cannot be 0");
738 return NULL;
739 }
740 }
741 /*
742 * XXX: The original exponentiation code stopped looping
743 * when temp hit zero; this code will continue onwards
744 * unnecessarily, but at least it won't cause any errors.
745 * Hopefully the speed improvement from the fast exponentiation
746 * will compensate for the slight inefficiency.
747 * XXX: Better handling of overflows is desperately needed.
748 */
749 temp = iv;
750 ix = 1;
751 while (iw > 0) {
752 prev = ix; /* Save value for overflow check */
753 if (iw & 1) {
754 ix = ix*temp;
755 if (temp == 0)
756 break; /* Avoid ix / 0 */
757 if (ix / temp != prev) {
758 return PyLong_Type.tp_as_number->nb_power(
759 (PyObject *)v,
760 (PyObject *)w,
761 (PyObject *)z);
762 }
763 }
764 iw >>= 1; /* Shift exponent down by 1 bit */
765 if (iw==0) break;
766 prev = temp;
767 temp *= temp; /* Square the value of temp */
768 if (prev != 0 && temp / prev != prev) {
769 return PyLong_Type.tp_as_number->nb_power(
770 (PyObject *)v, (PyObject *)w, (PyObject *)z);
771 }
772 if (iz) {
773 /* If we did a multiplication, perform a modulo */
774 ix = ix % iz;
775 temp = temp % iz;
776 }
777 }
778 if (iz) {
779 long div, mod;
780 switch (i_divmod(ix, iz, &div, &mod)) {
781 case DIVMOD_OK:
782 ix = mod;
783 break;
784 case DIVMOD_OVERFLOW:
785 return PyLong_Type.tp_as_number->nb_power(
786 (PyObject *)v, (PyObject *)w, (PyObject *)z);
787 default:
788 return NULL;
789 }
790 }
791 return PyInt_FromLong(ix);
792 }
793
794 static PyObject *
int_neg(PyIntObject * v)795 int_neg(PyIntObject *v)
796 {
797 register long a;
798 a = v->ob_ival;
799 /* check for overflow */
800 if (UNARY_NEG_WOULD_OVERFLOW(a)) {
801 PyObject *o = PyLong_FromLong(a);
802 if (o != NULL) {
803 PyObject *result = PyNumber_Negative(o);
804 Py_DECREF(o);
805 return result;
806 }
807 return NULL;
808 }
809 return PyInt_FromLong(-a);
810 }
811
812 static PyObject *
int_abs(PyIntObject * v)813 int_abs(PyIntObject *v)
814 {
815 if (v->ob_ival >= 0)
816 return int_int(v);
817 else
818 return int_neg(v);
819 }
820
821 static int
int_nonzero(PyIntObject * v)822 int_nonzero(PyIntObject *v)
823 {
824 return v->ob_ival != 0;
825 }
826
827 static PyObject *
int_invert(PyIntObject * v)828 int_invert(PyIntObject *v)
829 {
830 return PyInt_FromLong(~v->ob_ival);
831 }
832
833 static PyObject *
int_lshift(PyIntObject * v,PyIntObject * w)834 int_lshift(PyIntObject *v, PyIntObject *w)
835 {
836 long a, b, c;
837 PyObject *vv, *ww, *result;
838
839 CONVERT_TO_LONG(v, a);
840 CONVERT_TO_LONG(w, b);
841 if (b < 0) {
842 PyErr_SetString(PyExc_ValueError, "negative shift count");
843 return NULL;
844 }
845 if (a == 0 || b == 0)
846 return int_int(v);
847 if (b >= LONG_BIT) {
848 vv = PyLong_FromLong(PyInt_AS_LONG(v));
849 if (vv == NULL)
850 return NULL;
851 ww = PyLong_FromLong(PyInt_AS_LONG(w));
852 if (ww == NULL) {
853 Py_DECREF(vv);
854 return NULL;
855 }
856 result = PyNumber_Lshift(vv, ww);
857 Py_DECREF(vv);
858 Py_DECREF(ww);
859 return result;
860 }
861 c = a << b;
862 if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) {
863 vv = PyLong_FromLong(PyInt_AS_LONG(v));
864 if (vv == NULL)
865 return NULL;
866 ww = PyLong_FromLong(PyInt_AS_LONG(w));
867 if (ww == NULL) {
868 Py_DECREF(vv);
869 return NULL;
870 }
871 result = PyNumber_Lshift(vv, ww);
872 Py_DECREF(vv);
873 Py_DECREF(ww);
874 return result;
875 }
876 return PyInt_FromLong(c);
877 }
878
879 static PyObject *
int_rshift(PyIntObject * v,PyIntObject * w)880 int_rshift(PyIntObject *v, PyIntObject *w)
881 {
882 register long a, b;
883 CONVERT_TO_LONG(v, a);
884 CONVERT_TO_LONG(w, b);
885 if (b < 0) {
886 PyErr_SetString(PyExc_ValueError, "negative shift count");
887 return NULL;
888 }
889 if (a == 0 || b == 0)
890 return int_int(v);
891 if (b >= LONG_BIT) {
892 if (a < 0)
893 a = -1;
894 else
895 a = 0;
896 }
897 else {
898 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
899 }
900 return PyInt_FromLong(a);
901 }
902
903 static PyObject *
int_and(PyIntObject * v,PyIntObject * w)904 int_and(PyIntObject *v, PyIntObject *w)
905 {
906 register long a, b;
907 CONVERT_TO_LONG(v, a);
908 CONVERT_TO_LONG(w, b);
909 return PyInt_FromLong(a & b);
910 }
911
912 static PyObject *
int_xor(PyIntObject * v,PyIntObject * w)913 int_xor(PyIntObject *v, PyIntObject *w)
914 {
915 register long a, b;
916 CONVERT_TO_LONG(v, a);
917 CONVERT_TO_LONG(w, b);
918 return PyInt_FromLong(a ^ b);
919 }
920
921 static PyObject *
int_or(PyIntObject * v,PyIntObject * w)922 int_or(PyIntObject *v, PyIntObject *w)
923 {
924 register long a, b;
925 CONVERT_TO_LONG(v, a);
926 CONVERT_TO_LONG(w, b);
927 return PyInt_FromLong(a | b);
928 }
929
930 static int
int_coerce(PyObject ** pv,PyObject ** pw)931 int_coerce(PyObject **pv, PyObject **pw)
932 {
933 if (PyInt_Check(*pw)) {
934 Py_INCREF(*pv);
935 Py_INCREF(*pw);
936 return 0;
937 }
938 return 1; /* Can't do it */
939 }
940
941 static PyObject *
int_int(PyIntObject * v)942 int_int(PyIntObject *v)
943 {
944 if (PyInt_CheckExact(v))
945 Py_INCREF(v);
946 else
947 v = (PyIntObject *)PyInt_FromLong(v->ob_ival);
948 return (PyObject *)v;
949 }
950
951 static PyObject *
int_long(PyIntObject * v)952 int_long(PyIntObject *v)
953 {
954 return PyLong_FromLong((v -> ob_ival));
955 }
956
957 static const unsigned char BitLengthTable[32] = {
958 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
959 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
960 };
961
962 static int
bits_in_ulong(unsigned long d)963 bits_in_ulong(unsigned long d)
964 {
965 int d_bits = 0;
966 while (d >= 32) {
967 d_bits += 6;
968 d >>= 6;
969 }
970 d_bits += (int)BitLengthTable[d];
971 return d_bits;
972 }
973
974 #if 8*SIZEOF_LONG-1 <= DBL_MANT_DIG
975 /* Every Python int can be exactly represented as a float. */
976
977 static PyObject *
int_float(PyIntObject * v)978 int_float(PyIntObject *v)
979 {
980 return PyFloat_FromDouble((double)(v -> ob_ival));
981 }
982
983 #else
984 /* Here not all Python ints are exactly representable as floats, so we may
985 have to round. We do this manually, since the C standards don't specify
986 whether converting an integer to a float rounds up or down */
987
988 static PyObject *
int_float(PyIntObject * v)989 int_float(PyIntObject *v)
990 {
991 unsigned long abs_ival, lsb;
992 int round_up;
993
994 if (v->ob_ival < 0)
995 abs_ival = 0U-(unsigned long)v->ob_ival;
996 else
997 abs_ival = (unsigned long)v->ob_ival;
998 if (abs_ival < (1L << DBL_MANT_DIG))
999 /* small integer; no need to round */
1000 return PyFloat_FromDouble((double)v->ob_ival);
1001
1002 /* Round abs_ival to MANT_DIG significant bits, using the
1003 round-half-to-even rule. abs_ival & lsb picks out the 'rounding'
1004 bit: the first bit after the most significant MANT_DIG bits of
1005 abs_ival. We round up if this bit is set, provided that either:
1006
1007 (1) abs_ival isn't exactly halfway between two floats, in which
1008 case at least one of the bits following the rounding bit must be
1009 set; i.e., abs_ival & lsb-1 != 0, or:
1010
1011 (2) the resulting rounded value has least significant bit 0; or
1012 in other words the bit above the rounding bit is set (this is the
1013 'to-even' bit of round-half-to-even); i.e., abs_ival & 2*lsb != 0
1014
1015 The condition "(1) or (2)" equates to abs_ival & 3*lsb-1 != 0. */
1016
1017 lsb = 1L << (bits_in_ulong(abs_ival)-DBL_MANT_DIG-1);
1018 round_up = (abs_ival & lsb) && (abs_ival & (3*lsb-1));
1019 abs_ival &= -2*lsb;
1020 if (round_up)
1021 abs_ival += 2*lsb;
1022 return PyFloat_FromDouble(v->ob_ival < 0 ?
1023 -(double)abs_ival :
1024 (double)abs_ival);
1025 }
1026
1027 #endif
1028
1029 static PyObject *
int_oct(PyIntObject * v)1030 int_oct(PyIntObject *v)
1031 {
1032 return _PyInt_Format(v, 8, 0);
1033 }
1034
1035 static PyObject *
int_hex(PyIntObject * v)1036 int_hex(PyIntObject *v)
1037 {
1038 return _PyInt_Format(v, 16, 0);
1039 }
1040
1041 static PyObject *
1042 int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1043
1044 static PyObject *
int_new(PyTypeObject * type,PyObject * args,PyObject * kwds)1045 int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1046 {
1047 PyObject *x = NULL;
1048 int base = -909;
1049 static char *kwlist[] = {"x", "base", 0};
1050
1051 if (type != &PyInt_Type)
1052 return int_subtype_new(type, args, kwds); /* Wimp out */
1053 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
1054 &x, &base))
1055 return NULL;
1056 if (x == NULL)
1057 return PyInt_FromLong(0L);
1058 if (base == -909)
1059 return PyNumber_Int(x);
1060 if (PyString_Check(x)) {
1061 /* Since PyInt_FromString doesn't have a length parameter,
1062 * check here for possible NULs in the string. */
1063 char *string = PyString_AS_STRING(x);
1064 if (strlen(string) != PyString_Size(x)) {
1065 /* create a repr() of the input string,
1066 * just like PyInt_FromString does */
1067 PyObject *srepr;
1068 srepr = PyObject_Repr(x);
1069 if (srepr == NULL)
1070 return NULL;
1071 PyErr_Format(PyExc_ValueError,
1072 "invalid literal for int() with base %d: %s",
1073 base, PyString_AS_STRING(srepr));
1074 Py_DECREF(srepr);
1075 return NULL;
1076 }
1077 return PyInt_FromString(string, NULL, base);
1078 }
1079 #ifdef Py_USING_UNICODE
1080 if (PyUnicode_Check(x))
1081 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
1082 PyUnicode_GET_SIZE(x),
1083 base);
1084 #endif
1085 PyErr_SetString(PyExc_TypeError,
1086 "int() can't convert non-string with explicit base");
1087 return NULL;
1088 }
1089
1090 /* Wimpy, slow approach to tp_new calls for subtypes of int:
1091 first create a regular int from whatever arguments we got,
1092 then allocate a subtype instance and initialize its ob_ival
1093 from the regular int. The regular int is then thrown away.
1094 */
1095 static PyObject *
int_subtype_new(PyTypeObject * type,PyObject * args,PyObject * kwds)1096 int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1097 {
1098 PyObject *tmp, *newobj;
1099 long ival;
1100
1101 assert(PyType_IsSubtype(type, &PyInt_Type));
1102 tmp = int_new(&PyInt_Type, args, kwds);
1103 if (tmp == NULL)
1104 return NULL;
1105 if (!PyInt_Check(tmp)) {
1106 ival = PyLong_AsLong(tmp);
1107 if (ival == -1 && PyErr_Occurred()) {
1108 Py_DECREF(tmp);
1109 return NULL;
1110 }
1111 } else {
1112 ival = ((PyIntObject *)tmp)->ob_ival;
1113 }
1114
1115 newobj = type->tp_alloc(type, 0);
1116 if (newobj == NULL) {
1117 Py_DECREF(tmp);
1118 return NULL;
1119 }
1120 ((PyIntObject *)newobj)->ob_ival = ival;
1121 Py_DECREF(tmp);
1122 return newobj;
1123 }
1124
1125 static PyObject *
int_getnewargs(PyIntObject * v)1126 int_getnewargs(PyIntObject *v)
1127 {
1128 return Py_BuildValue("(l)", v->ob_ival);
1129 }
1130
1131 static PyObject *
int_get0(PyIntObject * v,void * context)1132 int_get0(PyIntObject *v, void *context) {
1133 return PyInt_FromLong(0L);
1134 }
1135
1136 static PyObject *
int_get1(PyIntObject * v,void * context)1137 int_get1(PyIntObject *v, void *context) {
1138 return PyInt_FromLong(1L);
1139 }
1140
1141 /* Convert an integer to a decimal string. On many platforms, this
1142 will be significantly faster than the general arbitrary-base
1143 conversion machinery in _PyInt_Format, thanks to optimization
1144 opportunities offered by division by a compile-time constant. */
1145 static PyObject *
int_to_decimal_string(PyIntObject * v)1146 int_to_decimal_string(PyIntObject *v) {
1147 char buf[sizeof(long)*CHAR_BIT/3+6], *p, *bufend;
1148 long n = v->ob_ival;
1149 unsigned long absn;
1150 p = bufend = buf + sizeof(buf);
1151 absn = n < 0 ? 0UL - n : n;
1152 do {
1153 *--p = '0' + (char)(absn % 10);
1154 absn /= 10;
1155 } while (absn);
1156 if (n < 0)
1157 *--p = '-';
1158 return PyString_FromStringAndSize(p, bufend - p);
1159 }
1160
1161 /* Convert an integer to the given base. Returns a string.
1162 If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'.
1163 If newstyle is zero, then use the pre-2.6 behavior of octal having
1164 a leading "0" */
1165 PyAPI_FUNC(PyObject*)
_PyInt_Format(PyIntObject * v,int base,int newstyle)1166 _PyInt_Format(PyIntObject *v, int base, int newstyle)
1167 {
1168 /* There are no doubt many, many ways to optimize this, using code
1169 similar to _PyLong_Format */
1170 long n = v->ob_ival;
1171 int negative = n < 0;
1172 int is_zero = n == 0;
1173
1174 /* For the reasoning behind this size, see
1175 http://c-faq.com/misc/hexio.html. Then, add a few bytes for
1176 the possible sign and prefix "0[box]" */
1177 char buf[sizeof(n)*CHAR_BIT+6];
1178
1179 /* Start by pointing to the end of the buffer. We fill in from
1180 the back forward. */
1181 char* p = &buf[sizeof(buf)];
1182
1183 assert(base >= 2 && base <= 36);
1184
1185 /* Special case base 10, for speed */
1186 if (base == 10)
1187 return int_to_decimal_string(v);
1188
1189 do {
1190 /* I'd use i_divmod, except it doesn't produce the results
1191 I want when n is negative. So just duplicate the salient
1192 part here. */
1193 long div = n / base;
1194 long mod = n - div * base;
1195
1196 /* convert abs(mod) to the right character in [0-9, a-z] */
1197 char cdigit = (char)(mod < 0 ? -mod : mod);
1198 cdigit += (cdigit < 10) ? '0' : 'a'-10;
1199 *--p = cdigit;
1200
1201 n = div;
1202 } while(n);
1203
1204 if (base == 2) {
1205 *--p = 'b';
1206 *--p = '0';
1207 }
1208 else if (base == 8) {
1209 if (newstyle) {
1210 *--p = 'o';
1211 *--p = '0';
1212 }
1213 else
1214 if (!is_zero)
1215 *--p = '0';
1216 }
1217 else if (base == 16) {
1218 *--p = 'x';
1219 *--p = '0';
1220 }
1221 else {
1222 *--p = '#';
1223 *--p = '0' + base%10;
1224 if (base > 10)
1225 *--p = '0' + base/10;
1226 }
1227 if (negative)
1228 *--p = '-';
1229
1230 return PyString_FromStringAndSize(p, &buf[sizeof(buf)] - p);
1231 }
1232
1233 static PyObject *
int__format__(PyObject * self,PyObject * args)1234 int__format__(PyObject *self, PyObject *args)
1235 {
1236 PyObject *format_spec;
1237
1238 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
1239 return NULL;
1240 if (PyBytes_Check(format_spec))
1241 return _PyInt_FormatAdvanced(self,
1242 PyBytes_AS_STRING(format_spec),
1243 PyBytes_GET_SIZE(format_spec));
1244 if (PyUnicode_Check(format_spec)) {
1245 /* Convert format_spec to a str */
1246 PyObject *result;
1247 PyObject *str_spec = PyObject_Str(format_spec);
1248
1249 if (str_spec == NULL)
1250 return NULL;
1251
1252 result = _PyInt_FormatAdvanced(self,
1253 PyBytes_AS_STRING(str_spec),
1254 PyBytes_GET_SIZE(str_spec));
1255
1256 Py_DECREF(str_spec);
1257 return result;
1258 }
1259 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
1260 return NULL;
1261 }
1262
1263 static PyObject *
int_bit_length(PyIntObject * v)1264 int_bit_length(PyIntObject *v)
1265 {
1266 unsigned long n;
1267
1268 if (v->ob_ival < 0)
1269 /* avoid undefined behaviour when v->ob_ival == -LONG_MAX-1 */
1270 n = 0U-(unsigned long)v->ob_ival;
1271 else
1272 n = (unsigned long)v->ob_ival;
1273
1274 return PyInt_FromLong(bits_in_ulong(n));
1275 }
1276
1277 PyDoc_STRVAR(int_bit_length_doc,
1278 "int.bit_length() -> int\n\
1279 \n\
1280 Number of bits necessary to represent self in binary.\n\
1281 >>> bin(37)\n\
1282 '0b100101'\n\
1283 >>> (37).bit_length()\n\
1284 6");
1285
1286 #if 0
1287 static PyObject *
1288 int_is_finite(PyObject *v)
1289 {
1290 Py_RETURN_TRUE;
1291 }
1292 #endif
1293
1294 static PyMethodDef int_methods[] = {
1295 {"conjugate", (PyCFunction)int_int, METH_NOARGS,
1296 "Returns self, the complex conjugate of any int."},
1297 {"bit_length", (PyCFunction)int_bit_length, METH_NOARGS,
1298 int_bit_length_doc},
1299 #if 0
1300 {"is_finite", (PyCFunction)int_is_finite, METH_NOARGS,
1301 "Returns always True."},
1302 #endif
1303 {"__trunc__", (PyCFunction)int_int, METH_NOARGS,
1304 "Truncating an Integral returns itself."},
1305 {"__getnewargs__", (PyCFunction)int_getnewargs, METH_NOARGS},
1306 {"__format__", (PyCFunction)int__format__, METH_VARARGS},
1307 {NULL, NULL} /* sentinel */
1308 };
1309
1310 static PyGetSetDef int_getset[] = {
1311 {"real",
1312 (getter)int_int, (setter)NULL,
1313 "the real part of a complex number",
1314 NULL},
1315 {"imag",
1316 (getter)int_get0, (setter)NULL,
1317 "the imaginary part of a complex number",
1318 NULL},
1319 {"numerator",
1320 (getter)int_int, (setter)NULL,
1321 "the numerator of a rational number in lowest terms",
1322 NULL},
1323 {"denominator",
1324 (getter)int_get1, (setter)NULL,
1325 "the denominator of a rational number in lowest terms",
1326 NULL},
1327 {NULL} /* Sentinel */
1328 };
1329
1330 PyDoc_STRVAR(int_doc,
1331 "int(x[, base]) -> integer\n\
1332 \n\
1333 Convert a string or number to an integer, if possible. A floating point\n\
1334 argument will be truncated towards zero (this does not include a string\n\
1335 representation of a floating point number!) When converting a string, use\n\
1336 the optional base. It is an error to supply a base when converting a\n\
1337 non-string. If base is zero, the proper base is guessed based on the\n\
1338 string content. If the argument is outside the integer range a\n\
1339 long object will be returned instead.");
1340
1341 static PyNumberMethods int_as_number = {
1342 (binaryfunc)int_add, /*nb_add*/
1343 (binaryfunc)int_sub, /*nb_subtract*/
1344 (binaryfunc)int_mul, /*nb_multiply*/
1345 (binaryfunc)int_classic_div, /*nb_divide*/
1346 (binaryfunc)int_mod, /*nb_remainder*/
1347 (binaryfunc)int_divmod, /*nb_divmod*/
1348 (ternaryfunc)int_pow, /*nb_power*/
1349 (unaryfunc)int_neg, /*nb_negative*/
1350 (unaryfunc)int_int, /*nb_positive*/
1351 (unaryfunc)int_abs, /*nb_absolute*/
1352 (inquiry)int_nonzero, /*nb_nonzero*/
1353 (unaryfunc)int_invert, /*nb_invert*/
1354 (binaryfunc)int_lshift, /*nb_lshift*/
1355 (binaryfunc)int_rshift, /*nb_rshift*/
1356 (binaryfunc)int_and, /*nb_and*/
1357 (binaryfunc)int_xor, /*nb_xor*/
1358 (binaryfunc)int_or, /*nb_or*/
1359 int_coerce, /*nb_coerce*/
1360 (unaryfunc)int_int, /*nb_int*/
1361 (unaryfunc)int_long, /*nb_long*/
1362 (unaryfunc)int_float, /*nb_float*/
1363 (unaryfunc)int_oct, /*nb_oct*/
1364 (unaryfunc)int_hex, /*nb_hex*/
1365 0, /*nb_inplace_add*/
1366 0, /*nb_inplace_subtract*/
1367 0, /*nb_inplace_multiply*/
1368 0, /*nb_inplace_divide*/
1369 0, /*nb_inplace_remainder*/
1370 0, /*nb_inplace_power*/
1371 0, /*nb_inplace_lshift*/
1372 0, /*nb_inplace_rshift*/
1373 0, /*nb_inplace_and*/
1374 0, /*nb_inplace_xor*/
1375 0, /*nb_inplace_or*/
1376 (binaryfunc)int_div, /* nb_floor_divide */
1377 (binaryfunc)int_true_divide, /* nb_true_divide */
1378 0, /* nb_inplace_floor_divide */
1379 0, /* nb_inplace_true_divide */
1380 (unaryfunc)int_int, /* nb_index */
1381 };
1382
1383 PyTypeObject PyInt_Type = {
1384 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1385 "int",
1386 sizeof(PyIntObject),
1387 0,
1388 (destructor)int_dealloc, /* tp_dealloc */
1389 (printfunc)int_print, /* tp_print */
1390 0, /* tp_getattr */
1391 0, /* tp_setattr */
1392 (cmpfunc)int_compare, /* tp_compare */
1393 (reprfunc)int_to_decimal_string, /* tp_repr */
1394 &int_as_number, /* tp_as_number */
1395 0, /* tp_as_sequence */
1396 0, /* tp_as_mapping */
1397 (hashfunc)int_hash, /* tp_hash */
1398 0, /* tp_call */
1399 (reprfunc)int_to_decimal_string, /* tp_str */
1400 PyObject_GenericGetAttr, /* tp_getattro */
1401 0, /* tp_setattro */
1402 0, /* tp_as_buffer */
1403 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
1404 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS, /* tp_flags */
1405 int_doc, /* tp_doc */
1406 0, /* tp_traverse */
1407 0, /* tp_clear */
1408 0, /* tp_richcompare */
1409 0, /* tp_weaklistoffset */
1410 0, /* tp_iter */
1411 0, /* tp_iternext */
1412 int_methods, /* tp_methods */
1413 0, /* tp_members */
1414 int_getset, /* tp_getset */
1415 0, /* tp_base */
1416 0, /* tp_dict */
1417 0, /* tp_descr_get */
1418 0, /* tp_descr_set */
1419 0, /* tp_dictoffset */
1420 0, /* tp_init */
1421 0, /* tp_alloc */
1422 int_new, /* tp_new */
1423 (freefunc)int_free, /* tp_free */
1424 };
1425
1426 int
_PyInt_Init(void)1427 _PyInt_Init(void)
1428 {
1429 PyIntObject *v;
1430 int ival;
1431 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
1432 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
1433 if (!free_list && (free_list = fill_free_list()) == NULL)
1434 return 0;
1435 /* PyObject_New is inlined */
1436 v = free_list;
1437 free_list = (PyIntObject *)Py_TYPE(v);
1438 PyObject_INIT(v, &PyInt_Type);
1439 v->ob_ival = ival;
1440 small_ints[ival + NSMALLNEGINTS] = v;
1441 }
1442 #endif
1443 return 1;
1444 }
1445
1446 int
PyInt_ClearFreeList(void)1447 PyInt_ClearFreeList(void)
1448 {
1449 PyIntObject *p;
1450 PyIntBlock *list, *next;
1451 int i;
1452 int u; /* remaining unfreed ints per block */
1453 int freelist_size = 0;
1454
1455 list = block_list;
1456 block_list = NULL;
1457 free_list = NULL;
1458 while (list != NULL) {
1459 u = 0;
1460 for (i = 0, p = &list->objects[0];
1461 i < N_INTOBJECTS;
1462 i++, p++) {
1463 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
1464 u++;
1465 }
1466 next = list->next;
1467 if (u) {
1468 list->next = block_list;
1469 block_list = list;
1470 for (i = 0, p = &list->objects[0];
1471 i < N_INTOBJECTS;
1472 i++, p++) {
1473 if (!PyInt_CheckExact(p) ||
1474 p->ob_refcnt == 0) {
1475 Py_TYPE(p) = (struct _typeobject *)
1476 free_list;
1477 free_list = p;
1478 }
1479 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
1480 else if (-NSMALLNEGINTS <= p->ob_ival &&
1481 p->ob_ival < NSMALLPOSINTS &&
1482 small_ints[p->ob_ival +
1483 NSMALLNEGINTS] == NULL) {
1484 Py_INCREF(p);
1485 small_ints[p->ob_ival +
1486 NSMALLNEGINTS] = p;
1487 }
1488 #endif
1489 }
1490 }
1491 else {
1492 PyMem_FREE(list);
1493 }
1494 freelist_size += u;
1495 list = next;
1496 }
1497
1498 return freelist_size;
1499 }
1500
1501 void
PyInt_Fini(void)1502 PyInt_Fini(void)
1503 {
1504 PyIntObject *p;
1505 PyIntBlock *list;
1506 int i;
1507 int u; /* total unfreed ints per block */
1508
1509 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
1510 PyIntObject **q;
1511
1512 i = NSMALLNEGINTS + NSMALLPOSINTS;
1513 q = small_ints;
1514 while (--i >= 0) {
1515 Py_XDECREF(*q);
1516 *q++ = NULL;
1517 }
1518 #endif
1519 u = PyInt_ClearFreeList();
1520 if (!Py_VerboseFlag)
1521 return;
1522 fprintf(stderr, "# cleanup ints");
1523 if (!u) {
1524 fprintf(stderr, "\n");
1525 }
1526 else {
1527 fprintf(stderr,
1528 ": %d unfreed int%s\n",
1529 u, u == 1 ? "" : "s");
1530 }
1531 if (Py_VerboseFlag > 1) {
1532 list = block_list;
1533 while (list != NULL) {
1534 for (i = 0, p = &list->objects[0];
1535 i < N_INTOBJECTS;
1536 i++, p++) {
1537 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
1538 /* XXX(twouters) cast refcount to
1539 long until %zd is universally
1540 available
1541 */
1542 fprintf(stderr,
1543 "# <int at %p, refcnt=%ld, val=%ld>\n",
1544 p, (long)p->ob_refcnt,
1545 p->ob_ival);
1546 }
1547 list = list->next;
1548 }
1549 }
1550 }
1551