mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1550 lines
		
	
	
	
		
			45 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1550 lines
		
	
	
	
		
			45 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
 | 
						|
/* Integer object implementation */
 | 
						|
 | 
						|
#include "Python.h"
 | 
						|
#include <ctype.h>
 | 
						|
#include <float.h>
 | 
						|
 | 
						|
static PyObject *int_int(PyIntObject *v);
 | 
						|
 | 
						|
long
 | 
						|
PyInt_GetMax(void)
 | 
						|
{
 | 
						|
    return LONG_MAX;            /* To initialize sys.maxint */
 | 
						|
}
 | 
						|
 | 
						|
/* Integers are quite normal objects, to make object handling uniform.
 | 
						|
   (Using odd pointers to represent integers would save much space
 | 
						|
   but require extra checks for this special case throughout the code.)
 | 
						|
   Since a typical Python program spends much of its time allocating
 | 
						|
   and deallocating integers, these operations should be very fast.
 | 
						|
   Therefore we use a dedicated allocation scheme with a much lower
 | 
						|
   overhead (in space and time) than straight malloc(): a simple
 | 
						|
   dedicated free list, filled when necessary with memory from malloc().
 | 
						|
 | 
						|
   block_list is a singly-linked list of all PyIntBlocks ever allocated,
 | 
						|
   linked via their next members.  PyIntBlocks are never returned to the
 | 
						|
   system before shutdown (PyInt_Fini).
 | 
						|
 | 
						|
   free_list is a singly-linked list of available PyIntObjects, linked
 | 
						|
   via abuse of their ob_type members.
 | 
						|
*/
 | 
						|
 | 
						|
#define BLOCK_SIZE      1000    /* 1K less typical malloc overhead */
 | 
						|
#define BHEAD_SIZE      8       /* Enough for a 64-bit pointer */
 | 
						|
#define N_INTOBJECTS    ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
 | 
						|
 | 
						|
struct _intblock {
 | 
						|
    struct _intblock *next;
 | 
						|
    PyIntObject objects[N_INTOBJECTS];
 | 
						|
};
 | 
						|
 | 
						|
typedef struct _intblock PyIntBlock;
 | 
						|
 | 
						|
static PyIntBlock *block_list = NULL;
 | 
						|
static PyIntObject *free_list = NULL;
 | 
						|
 | 
						|
static PyIntObject *
 | 
						|
fill_free_list(void)
 | 
						|
{
 | 
						|
    PyIntObject *p, *q;
 | 
						|
    /* Python's object allocator isn't appropriate for large blocks. */
 | 
						|
    p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
 | 
						|
    if (p == NULL)
 | 
						|
        return (PyIntObject *) PyErr_NoMemory();
 | 
						|
    ((PyIntBlock *)p)->next = block_list;
 | 
						|
    block_list = (PyIntBlock *)p;
 | 
						|
    /* Link the int objects together, from rear to front, then return
 | 
						|
       the address of the last int object in the block. */
 | 
						|
    p = &((PyIntBlock *)p)->objects[0];
 | 
						|
    q = p + N_INTOBJECTS;
 | 
						|
    while (--q > p)
 | 
						|
        Py_TYPE(q) = (struct _typeobject *)(q-1);
 | 
						|
    Py_TYPE(q) = NULL;
 | 
						|
    return p + N_INTOBJECTS - 1;
 | 
						|
}
 | 
						|
 | 
						|
#ifndef NSMALLPOSINTS
 | 
						|
#define NSMALLPOSINTS           257
 | 
						|
#endif
 | 
						|
#ifndef NSMALLNEGINTS
 | 
						|
#define NSMALLNEGINTS           5
 | 
						|
#endif
 | 
						|
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
 | 
						|
/* References to small integers are saved in this array so that they
 | 
						|
   can be shared.
 | 
						|
   The integers that are saved are those in the range
 | 
						|
   -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
 | 
						|
*/
 | 
						|
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
 | 
						|
#endif
 | 
						|
#ifdef COUNT_ALLOCS
 | 
						|
Py_ssize_t quick_int_allocs;
 | 
						|
Py_ssize_t quick_neg_int_allocs;
 | 
						|
#endif
 | 
						|
 | 
						|
PyObject *
 | 
						|
PyInt_FromLong(long ival)
 | 
						|
{
 | 
						|
    register PyIntObject *v;
 | 
						|
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
 | 
						|
    if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
 | 
						|
        v = small_ints[ival + NSMALLNEGINTS];
 | 
						|
        Py_INCREF(v);
 | 
						|
#ifdef COUNT_ALLOCS
 | 
						|
        if (ival >= 0)
 | 
						|
            quick_int_allocs++;
 | 
						|
        else
 | 
						|
            quick_neg_int_allocs++;
 | 
						|
#endif
 | 
						|
        return (PyObject *) v;
 | 
						|
    }
 | 
						|
#endif
 | 
						|
    if (free_list == NULL) {
 | 
						|
        if ((free_list = fill_free_list()) == NULL)
 | 
						|
            return NULL;
 | 
						|
    }
 | 
						|
    /* Inline PyObject_New */
 | 
						|
    v = free_list;
 | 
						|
    free_list = (PyIntObject *)Py_TYPE(v);
 | 
						|
    PyObject_INIT(v, &PyInt_Type);
 | 
						|
    v->ob_ival = ival;
 | 
						|
    return (PyObject *) v;
 | 
						|
}
 | 
						|
 | 
						|
PyObject *
 | 
						|
PyInt_FromSize_t(size_t ival)
 | 
						|
{
 | 
						|
    if (ival <= LONG_MAX)
 | 
						|
        return PyInt_FromLong((long)ival);
 | 
						|
    return _PyLong_FromSize_t(ival);
 | 
						|
}
 | 
						|
 | 
						|
PyObject *
 | 
						|
PyInt_FromSsize_t(Py_ssize_t ival)
 | 
						|
{
 | 
						|
    if (ival >= LONG_MIN && ival <= LONG_MAX)
 | 
						|
        return PyInt_FromLong((long)ival);
 | 
						|
    return _PyLong_FromSsize_t(ival);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
int_dealloc(PyIntObject *v)
 | 
						|
{
 | 
						|
    if (PyInt_CheckExact(v)) {
 | 
						|
        Py_TYPE(v) = (struct _typeobject *)free_list;
 | 
						|
        free_list = v;
 | 
						|
    }
 | 
						|
    else
 | 
						|
        Py_TYPE(v)->tp_free((PyObject *)v);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
int_free(PyIntObject *v)
 | 
						|
{
 | 
						|
    Py_TYPE(v) = (struct _typeobject *)free_list;
 | 
						|
    free_list = v;
 | 
						|
}
 | 
						|
 | 
						|
long
 | 
						|
PyInt_AsLong(register PyObject *op)
 | 
						|
{
 | 
						|
    PyNumberMethods *nb;
 | 
						|
    PyIntObject *io;
 | 
						|
    long val;
 | 
						|
 | 
						|
    if (op && PyInt_Check(op))
 | 
						|
        return PyInt_AS_LONG((PyIntObject*) op);
 | 
						|
 | 
						|
    if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
 | 
						|
        nb->nb_int == NULL) {
 | 
						|
        PyErr_SetString(PyExc_TypeError, "an integer is required");
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    io = (PyIntObject*) (*nb->nb_int) (op);
 | 
						|
    if (io == NULL)
 | 
						|
        return -1;
 | 
						|
    if (!PyInt_Check(io)) {
 | 
						|
        if (PyLong_Check(io)) {
 | 
						|
            /* got a long? => retry int conversion */
 | 
						|
            val = PyLong_AsLong((PyObject *)io);
 | 
						|
            Py_DECREF(io);
 | 
						|
            if ((val == -1) && PyErr_Occurred())
 | 
						|
                return -1;
 | 
						|
            return val;
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            Py_DECREF(io);
 | 
						|
            PyErr_SetString(PyExc_TypeError,
 | 
						|
                        "__int__ method should return an integer");
 | 
						|
            return -1;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    val = PyInt_AS_LONG(io);
 | 
						|
    Py_DECREF(io);
 | 
						|
 | 
						|
    return val;
 | 
						|
}
 | 
						|
 | 
						|
Py_ssize_t
 | 
						|
PyInt_AsSsize_t(register PyObject *op)
 | 
						|
{
 | 
						|
#if SIZEOF_SIZE_T != SIZEOF_LONG
 | 
						|
    PyNumberMethods *nb;
 | 
						|
    PyIntObject *io;
 | 
						|
    Py_ssize_t val;
 | 
						|
#endif
 | 
						|
 | 
						|
    if (op == NULL) {
 | 
						|
        PyErr_SetString(PyExc_TypeError, "an integer is required");
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    if (PyInt_Check(op))
 | 
						|
        return PyInt_AS_LONG((PyIntObject*) op);
 | 
						|
    if (PyLong_Check(op))
 | 
						|
        return _PyLong_AsSsize_t(op);
 | 
						|
#if SIZEOF_SIZE_T == SIZEOF_LONG
 | 
						|
    return PyInt_AsLong(op);
 | 
						|
#else
 | 
						|
 | 
						|
    if ((nb = Py_TYPE(op)->tp_as_number) == NULL ||
 | 
						|
        (nb->nb_int == NULL && nb->nb_long == 0)) {
 | 
						|
        PyErr_SetString(PyExc_TypeError, "an integer is required");
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    if (nb->nb_long != 0)
 | 
						|
        io = (PyIntObject*) (*nb->nb_long) (op);
 | 
						|
    else
 | 
						|
        io = (PyIntObject*) (*nb->nb_int) (op);
 | 
						|
    if (io == NULL)
 | 
						|
        return -1;
 | 
						|
    if (!PyInt_Check(io)) {
 | 
						|
        if (PyLong_Check(io)) {
 | 
						|
            /* got a long? => retry int conversion */
 | 
						|
            val = _PyLong_AsSsize_t((PyObject *)io);
 | 
						|
            Py_DECREF(io);
 | 
						|
            if ((val == -1) && PyErr_Occurred())
 | 
						|
                return -1;
 | 
						|
            return val;
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            Py_DECREF(io);
 | 
						|
            PyErr_SetString(PyExc_TypeError,
 | 
						|
                        "__int__ method should return an integer");
 | 
						|
            return -1;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    val = PyInt_AS_LONG(io);
 | 
						|
    Py_DECREF(io);
 | 
						|
 | 
						|
    return val;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
unsigned long
 | 
						|
PyInt_AsUnsignedLongMask(register PyObject *op)
 | 
						|
{
 | 
						|
    PyNumberMethods *nb;
 | 
						|
    PyIntObject *io;
 | 
						|
    unsigned long val;
 | 
						|
 | 
						|
    if (op && PyInt_Check(op))
 | 
						|
        return PyInt_AS_LONG((PyIntObject*) op);
 | 
						|
    if (op && PyLong_Check(op))
 | 
						|
        return PyLong_AsUnsignedLongMask(op);
 | 
						|
 | 
						|
    if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
 | 
						|
        nb->nb_int == NULL) {
 | 
						|
        PyErr_SetString(PyExc_TypeError, "an integer is required");
 | 
						|
        return (unsigned long)-1;
 | 
						|
    }
 | 
						|
 | 
						|
    io = (PyIntObject*) (*nb->nb_int) (op);
 | 
						|
    if (io == NULL)
 | 
						|
        return (unsigned long)-1;
 | 
						|
    if (!PyInt_Check(io)) {
 | 
						|
        if (PyLong_Check(io)) {
 | 
						|
            val = PyLong_AsUnsignedLongMask((PyObject *)io);
 | 
						|
            Py_DECREF(io);
 | 
						|
            if (PyErr_Occurred())
 | 
						|
                return (unsigned long)-1;
 | 
						|
            return val;
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            Py_DECREF(io);
 | 
						|
            PyErr_SetString(PyExc_TypeError,
 | 
						|
                        "__int__ method should return an integer");
 | 
						|
            return (unsigned long)-1;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    val = PyInt_AS_LONG(io);
 | 
						|
    Py_DECREF(io);
 | 
						|
 | 
						|
    return val;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef HAVE_LONG_LONG
 | 
						|
unsigned PY_LONG_LONG
 | 
						|
PyInt_AsUnsignedLongLongMask(register PyObject *op)
 | 
						|
{
 | 
						|
    PyNumberMethods *nb;
 | 
						|
    PyIntObject *io;
 | 
						|
    unsigned PY_LONG_LONG val;
 | 
						|
 | 
						|
    if (op && PyInt_Check(op))
 | 
						|
        return PyInt_AS_LONG((PyIntObject*) op);
 | 
						|
    if (op && PyLong_Check(op))
 | 
						|
        return PyLong_AsUnsignedLongLongMask(op);
 | 
						|
 | 
						|
    if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
 | 
						|
        nb->nb_int == NULL) {
 | 
						|
        PyErr_SetString(PyExc_TypeError, "an integer is required");
 | 
						|
        return (unsigned PY_LONG_LONG)-1;
 | 
						|
    }
 | 
						|
 | 
						|
    io = (PyIntObject*) (*nb->nb_int) (op);
 | 
						|
    if (io == NULL)
 | 
						|
        return (unsigned PY_LONG_LONG)-1;
 | 
						|
    if (!PyInt_Check(io)) {
 | 
						|
        if (PyLong_Check(io)) {
 | 
						|
            val = PyLong_AsUnsignedLongLongMask((PyObject *)io);
 | 
						|
            Py_DECREF(io);
 | 
						|
            if (PyErr_Occurred())
 | 
						|
                return (unsigned PY_LONG_LONG)-1;
 | 
						|
            return val;
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            Py_DECREF(io);
 | 
						|
            PyErr_SetString(PyExc_TypeError,
 | 
						|
                        "__int__ method should return an integer");
 | 
						|
            return (unsigned PY_LONG_LONG)-1;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    val = PyInt_AS_LONG(io);
 | 
						|
    Py_DECREF(io);
 | 
						|
 | 
						|
    return val;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
PyObject *
 | 
						|
PyInt_FromString(char *s, char **pend, int base)
 | 
						|
{
 | 
						|
    char *end;
 | 
						|
    long x;
 | 
						|
    Py_ssize_t slen;
 | 
						|
    PyObject *sobj, *srepr;
 | 
						|
 | 
						|
    if ((base != 0 && base < 2) || base > 36) {
 | 
						|
        PyErr_SetString(PyExc_ValueError,
 | 
						|
                        "int() base must be >= 2 and <= 36");
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    while (*s && isspace(Py_CHARMASK(*s)))
 | 
						|
        s++;
 | 
						|
    errno = 0;
 | 
						|
    if (base == 0 && s[0] == '0') {
 | 
						|
        x = (long) PyOS_strtoul(s, &end, base);
 | 
						|
        if (x < 0)
 | 
						|
            return PyLong_FromString(s, pend, base);
 | 
						|
    }
 | 
						|
    else
 | 
						|
        x = PyOS_strtol(s, &end, base);
 | 
						|
    if (end == s || !isalnum(Py_CHARMASK(end[-1])))
 | 
						|
        goto bad;
 | 
						|
    while (*end && isspace(Py_CHARMASK(*end)))
 | 
						|
        end++;
 | 
						|
    if (*end != '\0') {
 | 
						|
  bad:
 | 
						|
        slen = strlen(s) < 200 ? strlen(s) : 200;
 | 
						|
        sobj = PyString_FromStringAndSize(s, slen);
 | 
						|
        if (sobj == NULL)
 | 
						|
            return NULL;
 | 
						|
        srepr = PyObject_Repr(sobj);
 | 
						|
        Py_DECREF(sobj);
 | 
						|
        if (srepr == NULL)
 | 
						|
            return NULL;
 | 
						|
        PyErr_Format(PyExc_ValueError,
 | 
						|
                     "invalid literal for int() with base %d: %s",
 | 
						|
                     base, PyString_AS_STRING(srepr));
 | 
						|
        Py_DECREF(srepr);
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
    else if (errno != 0)
 | 
						|
        return PyLong_FromString(s, pend, base);
 | 
						|
    if (pend)
 | 
						|
        *pend = end;
 | 
						|
    return PyInt_FromLong(x);
 | 
						|
}
 | 
						|
 | 
						|
#ifdef Py_USING_UNICODE
 | 
						|
PyObject *
 | 
						|
PyInt_FromUnicode(Py_UNICODE *s, Py_ssize_t length, int base)
 | 
						|
{
 | 
						|
    PyObject *result;
 | 
						|
    char *buffer = (char *)PyMem_MALLOC(length+1);
 | 
						|
 | 
						|
    if (buffer == NULL)
 | 
						|
        return PyErr_NoMemory();
 | 
						|
 | 
						|
    if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) {
 | 
						|
        PyMem_FREE(buffer);
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
    result = PyInt_FromString(buffer, NULL, base);
 | 
						|
    PyMem_FREE(buffer);
 | 
						|
    return result;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
/* Methods */
 | 
						|
 | 
						|
/* Integers are seen as the "smallest" of all numeric types and thus
 | 
						|
   don't have any knowledge about conversion of other types to
 | 
						|
   integers. */
 | 
						|
 | 
						|
#define CONVERT_TO_LONG(obj, lng)               \
 | 
						|
    if (PyInt_Check(obj)) {                     \
 | 
						|
        lng = PyInt_AS_LONG(obj);               \
 | 
						|
    }                                           \
 | 
						|
    else {                                      \
 | 
						|
        Py_INCREF(Py_NotImplemented);           \
 | 
						|
        return Py_NotImplemented;               \
 | 
						|
    }
 | 
						|
 | 
						|
/* ARGSUSED */
 | 
						|
static int
 | 
						|
int_print(PyIntObject *v, FILE *fp, int flags)
 | 
						|
     /* flags -- not used but required by interface */
 | 
						|
{
 | 
						|
    long int_val = v->ob_ival;
 | 
						|
    Py_BEGIN_ALLOW_THREADS
 | 
						|
    fprintf(fp, "%ld", int_val);
 | 
						|
    Py_END_ALLOW_THREADS
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
int_compare(PyIntObject *v, PyIntObject *w)
 | 
						|
{
 | 
						|
    register long i = v->ob_ival;
 | 
						|
    register long j = w->ob_ival;
 | 
						|
    return (i < j) ? -1 : (i > j) ? 1 : 0;
 | 
						|
}
 | 
						|
 | 
						|
static long
 | 
						|
int_hash(PyIntObject *v)
 | 
						|
{
 | 
						|
    /* XXX If this is changed, you also need to change the way
 | 
						|
       Python's long, float and complex types are hashed. */
 | 
						|
    long x = v -> ob_ival;
 | 
						|
    if (x == -1)
 | 
						|
        x = -2;
 | 
						|
    return x;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_add(PyIntObject *v, PyIntObject *w)
 | 
						|
{
 | 
						|
    register long a, b, x;
 | 
						|
    CONVERT_TO_LONG(v, a);
 | 
						|
    CONVERT_TO_LONG(w, b);
 | 
						|
    /* casts in the line below avoid undefined behaviour on overflow */
 | 
						|
    x = (long)((unsigned long)a + b);
 | 
						|
    if ((x^a) >= 0 || (x^b) >= 0)
 | 
						|
        return PyInt_FromLong(x);
 | 
						|
    return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_sub(PyIntObject *v, PyIntObject *w)
 | 
						|
{
 | 
						|
    register long a, b, x;
 | 
						|
    CONVERT_TO_LONG(v, a);
 | 
						|
    CONVERT_TO_LONG(w, b);
 | 
						|
    /* casts in the line below avoid undefined behaviour on overflow */
 | 
						|
    x = (long)((unsigned long)a - b);
 | 
						|
    if ((x^a) >= 0 || (x^~b) >= 0)
 | 
						|
        return PyInt_FromLong(x);
 | 
						|
    return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
 | 
						|
                                                 (PyObject *)w);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
Integer overflow checking for * is painful:  Python tried a couple ways, but
 | 
						|
they didn't work on all platforms, or failed in endcases (a product of
 | 
						|
-sys.maxint-1 has been a particular pain).
 | 
						|
 | 
						|
Here's another way:
 | 
						|
 | 
						|
The native long product x*y is either exactly right or *way* off, being
 | 
						|
just the last n bits of the true product, where n is the number of bits
 | 
						|
in a long (the delivered product is the true product plus i*2**n for
 | 
						|
some integer i).
 | 
						|
 | 
						|
The native double product (double)x * (double)y is subject to three
 | 
						|
rounding errors:  on a sizeof(long)==8 box, each cast to double can lose
 | 
						|
info, and even on a sizeof(long)==4 box, the multiplication can lose info.
 | 
						|
But, unlike the native long product, it's not in *range* trouble:  even
 | 
						|
if sizeof(long)==32 (256-bit longs), the product easily fits in the
 | 
						|
dynamic range of a double.  So the leading 50 (or so) bits of the double
 | 
						|
product are correct.
 | 
						|
 | 
						|
We check these two ways against each other, and declare victory if they're
 | 
						|
approximately the same.  Else, because the native long product is the only
 | 
						|
one that can lose catastrophic amounts of information, it's the native long
 | 
						|
product that must have overflowed.
 | 
						|
*/
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_mul(PyObject *v, PyObject *w)
 | 
						|
{
 | 
						|
    long a, b;
 | 
						|
    long longprod;                      /* a*b in native long arithmetic */
 | 
						|
    double doubled_longprod;            /* (double)longprod */
 | 
						|
    double doubleprod;                  /* (double)a * (double)b */
 | 
						|
 | 
						|
    CONVERT_TO_LONG(v, a);
 | 
						|
    CONVERT_TO_LONG(w, b);
 | 
						|
    /* casts in the next line avoid undefined behaviour on overflow */
 | 
						|
    longprod = (long)((unsigned long)a * b);
 | 
						|
    doubleprod = (double)a * (double)b;
 | 
						|
    doubled_longprod = (double)longprod;
 | 
						|
 | 
						|
    /* Fast path for normal case:  small multiplicands, and no info
 | 
						|
       is lost in either method. */
 | 
						|
    if (doubled_longprod == doubleprod)
 | 
						|
        return PyInt_FromLong(longprod);
 | 
						|
 | 
						|
    /* Somebody somewhere lost info.  Close enough, or way off?  Note
 | 
						|
       that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0).
 | 
						|
       The difference either is or isn't significant compared to the
 | 
						|
       true value (of which doubleprod is a good approximation).
 | 
						|
    */
 | 
						|
    {
 | 
						|
        const double diff = doubled_longprod - doubleprod;
 | 
						|
        const double absdiff = diff >= 0.0 ? diff : -diff;
 | 
						|
        const double absprod = doubleprod >= 0.0 ? doubleprod :
 | 
						|
                              -doubleprod;
 | 
						|
        /* absdiff/absprod <= 1/32 iff
 | 
						|
           32 * absdiff <= absprod -- 5 good bits is "close enough" */
 | 
						|
        if (32.0 * absdiff <= absprod)
 | 
						|
            return PyInt_FromLong(longprod);
 | 
						|
        else
 | 
						|
            return PyLong_Type.tp_as_number->nb_multiply(v, w);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/* Integer overflow checking for unary negation: on a 2's-complement
 | 
						|
 * box, -x overflows iff x is the most negative long.  In this case we
 | 
						|
 * get -x == x.  However, -x is undefined (by C) if x /is/ the most
 | 
						|
 * negative long (it's a signed overflow case), and some compilers care.
 | 
						|
 * So we cast x to unsigned long first.  However, then other compilers
 | 
						|
 * warn about applying unary minus to an unsigned operand.  Hence the
 | 
						|
 * weird "0-".
 | 
						|
 */
 | 
						|
#define UNARY_NEG_WOULD_OVERFLOW(x)     \
 | 
						|
    ((x) < 0 && (unsigned long)(x) == 0-(unsigned long)(x))
 | 
						|
 | 
						|
/* Return type of i_divmod */
 | 
						|
enum divmod_result {
 | 
						|
    DIVMOD_OK,                  /* Correct result */
 | 
						|
    DIVMOD_OVERFLOW,            /* Overflow, try again using longs */
 | 
						|
    DIVMOD_ERROR                /* Exception raised */
 | 
						|
};
 | 
						|
 | 
						|
static enum divmod_result
 | 
						|
i_divmod(register long x, register long y,
 | 
						|
         long *p_xdivy, long *p_xmody)
 | 
						|
{
 | 
						|
    long xdivy, xmody;
 | 
						|
 | 
						|
    if (y == 0) {
 | 
						|
        PyErr_SetString(PyExc_ZeroDivisionError,
 | 
						|
                        "integer division or modulo by zero");
 | 
						|
        return DIVMOD_ERROR;
 | 
						|
    }
 | 
						|
    /* (-sys.maxint-1)/-1 is the only overflow case. */
 | 
						|
    if (y == -1 && UNARY_NEG_WOULD_OVERFLOW(x))
 | 
						|
        return DIVMOD_OVERFLOW;
 | 
						|
    xdivy = x / y;
 | 
						|
    /* xdiv*y can overflow on platforms where x/y gives floor(x/y)
 | 
						|
     * for x and y with differing signs. (This is unusual
 | 
						|
     * behaviour, and C99 prohibits it, but it's allowed by C89;
 | 
						|
     * for an example of overflow, take x = LONG_MIN, y = 5 or x =
 | 
						|
     * LONG_MAX, y = -5.)  However, x - xdivy*y is always
 | 
						|
     * representable as a long, since it lies strictly between
 | 
						|
     * -abs(y) and abs(y).  We add casts to avoid intermediate
 | 
						|
     * overflow.
 | 
						|
     */
 | 
						|
    xmody = (long)(x - (unsigned long)xdivy * y);
 | 
						|
    /* If the signs of x and y differ, and the remainder is non-0,
 | 
						|
     * C89 doesn't define whether xdivy is now the floor or the
 | 
						|
     * ceiling of the infinitely precise quotient.  We want the floor,
 | 
						|
     * and we have it iff the remainder's sign matches y's.
 | 
						|
     */
 | 
						|
    if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
 | 
						|
        xmody += y;
 | 
						|
        --xdivy;
 | 
						|
        assert(xmody && ((y ^ xmody) >= 0));
 | 
						|
    }
 | 
						|
    *p_xdivy = xdivy;
 | 
						|
    *p_xmody = xmody;
 | 
						|
    return DIVMOD_OK;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_div(PyIntObject *x, PyIntObject *y)
 | 
						|
{
 | 
						|
    long xi, yi;
 | 
						|
    long d, m;
 | 
						|
    CONVERT_TO_LONG(x, xi);
 | 
						|
    CONVERT_TO_LONG(y, yi);
 | 
						|
    switch (i_divmod(xi, yi, &d, &m)) {
 | 
						|
    case DIVMOD_OK:
 | 
						|
        return PyInt_FromLong(d);
 | 
						|
    case DIVMOD_OVERFLOW:
 | 
						|
        return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
 | 
						|
                                                   (PyObject *)y);
 | 
						|
    default:
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_classic_div(PyIntObject *x, PyIntObject *y)
 | 
						|
{
 | 
						|
    long xi, yi;
 | 
						|
    long d, m;
 | 
						|
    CONVERT_TO_LONG(x, xi);
 | 
						|
    CONVERT_TO_LONG(y, yi);
 | 
						|
    if (Py_DivisionWarningFlag &&
 | 
						|
        PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0)
 | 
						|
        return NULL;
 | 
						|
    switch (i_divmod(xi, yi, &d, &m)) {
 | 
						|
    case DIVMOD_OK:
 | 
						|
        return PyInt_FromLong(d);
 | 
						|
    case DIVMOD_OVERFLOW:
 | 
						|
        return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
 | 
						|
                                                   (PyObject *)y);
 | 
						|
    default:
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_true_divide(PyIntObject *x, PyIntObject *y)
 | 
						|
{
 | 
						|
    long xi, yi;
 | 
						|
    /* If they aren't both ints, give someone else a chance.  In
 | 
						|
       particular, this lets int/long get handled by longs, which
 | 
						|
       underflows to 0 gracefully if the long is too big to convert
 | 
						|
       to float. */
 | 
						|
    CONVERT_TO_LONG(x, xi);
 | 
						|
    CONVERT_TO_LONG(y, yi);
 | 
						|
    if (yi == 0) {
 | 
						|
        PyErr_SetString(PyExc_ZeroDivisionError,
 | 
						|
                        "division by zero");
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
    if (xi == 0)
 | 
						|
        return PyFloat_FromDouble(yi < 0 ? -0.0 : 0.0);
 | 
						|
 | 
						|
#define WIDTH_OF_ULONG (CHAR_BIT*SIZEOF_LONG)
 | 
						|
#if DBL_MANT_DIG < WIDTH_OF_ULONG
 | 
						|
    if ((xi >= 0 ? 0UL + xi : 0UL - xi) >> DBL_MANT_DIG ||
 | 
						|
        (yi >= 0 ? 0UL + yi : 0UL - yi) >> DBL_MANT_DIG)
 | 
						|
        /* Large x or y.  Use long integer arithmetic. */
 | 
						|
        return PyLong_Type.tp_as_number->nb_true_divide(
 | 
						|
            (PyObject *)x, (PyObject *)y);
 | 
						|
    else
 | 
						|
#endif
 | 
						|
        /* Both ints can be exactly represented as doubles.  Do a
 | 
						|
           floating-point division. */
 | 
						|
        return PyFloat_FromDouble((double)xi / (double)yi);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_mod(PyIntObject *x, PyIntObject *y)
 | 
						|
{
 | 
						|
    long xi, yi;
 | 
						|
    long d, m;
 | 
						|
    CONVERT_TO_LONG(x, xi);
 | 
						|
    CONVERT_TO_LONG(y, yi);
 | 
						|
    switch (i_divmod(xi, yi, &d, &m)) {
 | 
						|
    case DIVMOD_OK:
 | 
						|
        return PyInt_FromLong(m);
 | 
						|
    case DIVMOD_OVERFLOW:
 | 
						|
        return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x,
 | 
						|
                                                      (PyObject *)y);
 | 
						|
    default:
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_divmod(PyIntObject *x, PyIntObject *y)
 | 
						|
{
 | 
						|
    long xi, yi;
 | 
						|
    long d, m;
 | 
						|
    CONVERT_TO_LONG(x, xi);
 | 
						|
    CONVERT_TO_LONG(y, yi);
 | 
						|
    switch (i_divmod(xi, yi, &d, &m)) {
 | 
						|
    case DIVMOD_OK:
 | 
						|
        return Py_BuildValue("(ll)", d, m);
 | 
						|
    case DIVMOD_OVERFLOW:
 | 
						|
        return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x,
 | 
						|
                                                   (PyObject *)y);
 | 
						|
    default:
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
 | 
						|
{
 | 
						|
    register long iv, iw, iz=0, ix, temp, prev;
 | 
						|
    CONVERT_TO_LONG(v, iv);
 | 
						|
    CONVERT_TO_LONG(w, iw);
 | 
						|
    if (iw < 0) {
 | 
						|
        if ((PyObject *)z != Py_None) {
 | 
						|
            PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
 | 
						|
                 "cannot be negative when 3rd argument specified");
 | 
						|
            return NULL;
 | 
						|
        }
 | 
						|
        /* Return a float.  This works because we know that
 | 
						|
           this calls float_pow() which converts its
 | 
						|
           arguments to double. */
 | 
						|
        return PyFloat_Type.tp_as_number->nb_power(
 | 
						|
            (PyObject *)v, (PyObject *)w, (PyObject *)z);
 | 
						|
    }
 | 
						|
    if ((PyObject *)z != Py_None) {
 | 
						|
        CONVERT_TO_LONG(z, iz);
 | 
						|
        if (iz == 0) {
 | 
						|
            PyErr_SetString(PyExc_ValueError,
 | 
						|
                            "pow() 3rd argument cannot be 0");
 | 
						|
            return NULL;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    /*
 | 
						|
     * XXX: The original exponentiation code stopped looping
 | 
						|
     * when temp hit zero; this code will continue onwards
 | 
						|
     * unnecessarily, but at least it won't cause any errors.
 | 
						|
     * Hopefully the speed improvement from the fast exponentiation
 | 
						|
     * will compensate for the slight inefficiency.
 | 
						|
     * XXX: Better handling of overflows is desperately needed.
 | 
						|
     */
 | 
						|
    temp = iv;
 | 
						|
    ix = 1;
 | 
						|
    while (iw > 0) {
 | 
						|
        prev = ix;              /* Save value for overflow check */
 | 
						|
        if (iw & 1) {
 | 
						|
            ix = ix*temp;
 | 
						|
            if (temp == 0)
 | 
						|
                break; /* Avoid ix / 0 */
 | 
						|
            if (ix / temp != prev) {
 | 
						|
                return PyLong_Type.tp_as_number->nb_power(
 | 
						|
                    (PyObject *)v,
 | 
						|
                    (PyObject *)w,
 | 
						|
                    (PyObject *)z);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        iw >>= 1;               /* Shift exponent down by 1 bit */
 | 
						|
        if (iw==0) break;
 | 
						|
        prev = temp;
 | 
						|
        temp *= temp;           /* Square the value of temp */
 | 
						|
        if (prev != 0 && temp / prev != prev) {
 | 
						|
            return PyLong_Type.tp_as_number->nb_power(
 | 
						|
                (PyObject *)v, (PyObject *)w, (PyObject *)z);
 | 
						|
        }
 | 
						|
        if (iz) {
 | 
						|
            /* If we did a multiplication, perform a modulo */
 | 
						|
            ix = ix % iz;
 | 
						|
            temp = temp % iz;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    if (iz) {
 | 
						|
        long div, mod;
 | 
						|
        switch (i_divmod(ix, iz, &div, &mod)) {
 | 
						|
        case DIVMOD_OK:
 | 
						|
            ix = mod;
 | 
						|
            break;
 | 
						|
        case DIVMOD_OVERFLOW:
 | 
						|
            return PyLong_Type.tp_as_number->nb_power(
 | 
						|
                (PyObject *)v, (PyObject *)w, (PyObject *)z);
 | 
						|
        default:
 | 
						|
            return NULL;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    return PyInt_FromLong(ix);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_neg(PyIntObject *v)
 | 
						|
{
 | 
						|
    register long a;
 | 
						|
    a = v->ob_ival;
 | 
						|
    /* check for overflow */
 | 
						|
    if (UNARY_NEG_WOULD_OVERFLOW(a)) {
 | 
						|
        PyObject *o = PyLong_FromLong(a);
 | 
						|
        if (o != NULL) {
 | 
						|
            PyObject *result = PyNumber_Negative(o);
 | 
						|
            Py_DECREF(o);
 | 
						|
            return result;
 | 
						|
        }
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
    return PyInt_FromLong(-a);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_abs(PyIntObject *v)
 | 
						|
{
 | 
						|
    if (v->ob_ival >= 0)
 | 
						|
        return int_int(v);
 | 
						|
    else
 | 
						|
        return int_neg(v);
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
int_nonzero(PyIntObject *v)
 | 
						|
{
 | 
						|
    return v->ob_ival != 0;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_invert(PyIntObject *v)
 | 
						|
{
 | 
						|
    return PyInt_FromLong(~v->ob_ival);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_lshift(PyIntObject *v, PyIntObject *w)
 | 
						|
{
 | 
						|
    long a, b, c;
 | 
						|
    PyObject *vv, *ww, *result;
 | 
						|
 | 
						|
    CONVERT_TO_LONG(v, a);
 | 
						|
    CONVERT_TO_LONG(w, b);
 | 
						|
    if (b < 0) {
 | 
						|
        PyErr_SetString(PyExc_ValueError, "negative shift count");
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
    if (a == 0 || b == 0)
 | 
						|
        return int_int(v);
 | 
						|
    if (b >= LONG_BIT) {
 | 
						|
        vv = PyLong_FromLong(PyInt_AS_LONG(v));
 | 
						|
        if (vv == NULL)
 | 
						|
            return NULL;
 | 
						|
        ww = PyLong_FromLong(PyInt_AS_LONG(w));
 | 
						|
        if (ww == NULL) {
 | 
						|
            Py_DECREF(vv);
 | 
						|
            return NULL;
 | 
						|
        }
 | 
						|
        result = PyNumber_Lshift(vv, ww);
 | 
						|
        Py_DECREF(vv);
 | 
						|
        Py_DECREF(ww);
 | 
						|
        return result;
 | 
						|
    }
 | 
						|
    c = a << b;
 | 
						|
    if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) {
 | 
						|
        vv = PyLong_FromLong(PyInt_AS_LONG(v));
 | 
						|
        if (vv == NULL)
 | 
						|
            return NULL;
 | 
						|
        ww = PyLong_FromLong(PyInt_AS_LONG(w));
 | 
						|
        if (ww == NULL) {
 | 
						|
            Py_DECREF(vv);
 | 
						|
            return NULL;
 | 
						|
        }
 | 
						|
        result = PyNumber_Lshift(vv, ww);
 | 
						|
        Py_DECREF(vv);
 | 
						|
        Py_DECREF(ww);
 | 
						|
        return result;
 | 
						|
    }
 | 
						|
    return PyInt_FromLong(c);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_rshift(PyIntObject *v, PyIntObject *w)
 | 
						|
{
 | 
						|
    register long a, b;
 | 
						|
    CONVERT_TO_LONG(v, a);
 | 
						|
    CONVERT_TO_LONG(w, b);
 | 
						|
    if (b < 0) {
 | 
						|
        PyErr_SetString(PyExc_ValueError, "negative shift count");
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
    if (a == 0 || b == 0)
 | 
						|
        return int_int(v);
 | 
						|
    if (b >= LONG_BIT) {
 | 
						|
        if (a < 0)
 | 
						|
            a = -1;
 | 
						|
        else
 | 
						|
            a = 0;
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
 | 
						|
    }
 | 
						|
    return PyInt_FromLong(a);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_and(PyIntObject *v, PyIntObject *w)
 | 
						|
{
 | 
						|
    register long a, b;
 | 
						|
    CONVERT_TO_LONG(v, a);
 | 
						|
    CONVERT_TO_LONG(w, b);
 | 
						|
    return PyInt_FromLong(a & b);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_xor(PyIntObject *v, PyIntObject *w)
 | 
						|
{
 | 
						|
    register long a, b;
 | 
						|
    CONVERT_TO_LONG(v, a);
 | 
						|
    CONVERT_TO_LONG(w, b);
 | 
						|
    return PyInt_FromLong(a ^ b);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_or(PyIntObject *v, PyIntObject *w)
 | 
						|
{
 | 
						|
    register long a, b;
 | 
						|
    CONVERT_TO_LONG(v, a);
 | 
						|
    CONVERT_TO_LONG(w, b);
 | 
						|
    return PyInt_FromLong(a | b);
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
int_coerce(PyObject **pv, PyObject **pw)
 | 
						|
{
 | 
						|
    if (PyInt_Check(*pw)) {
 | 
						|
        Py_INCREF(*pv);
 | 
						|
        Py_INCREF(*pw);
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
    return 1; /* Can't do it */
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_int(PyIntObject *v)
 | 
						|
{
 | 
						|
    if (PyInt_CheckExact(v))
 | 
						|
        Py_INCREF(v);
 | 
						|
    else
 | 
						|
        v = (PyIntObject *)PyInt_FromLong(v->ob_ival);
 | 
						|
    return (PyObject *)v;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_long(PyIntObject *v)
 | 
						|
{
 | 
						|
    return PyLong_FromLong((v -> ob_ival));
 | 
						|
}
 | 
						|
 | 
						|
static const unsigned char BitLengthTable[32] = {
 | 
						|
    0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
 | 
						|
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
 | 
						|
};
 | 
						|
 | 
						|
static int
 | 
						|
bits_in_ulong(unsigned long d)
 | 
						|
{
 | 
						|
    int d_bits = 0;
 | 
						|
    while (d >= 32) {
 | 
						|
        d_bits += 6;
 | 
						|
        d >>= 6;
 | 
						|
    }
 | 
						|
    d_bits += (int)BitLengthTable[d];
 | 
						|
    return d_bits;
 | 
						|
}
 | 
						|
 | 
						|
#if 8*SIZEOF_LONG-1 <= DBL_MANT_DIG
 | 
						|
/* Every Python int can be exactly represented as a float. */
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_float(PyIntObject *v)
 | 
						|
{
 | 
						|
    return PyFloat_FromDouble((double)(v -> ob_ival));
 | 
						|
}
 | 
						|
 | 
						|
#else
 | 
						|
/* Here not all Python ints are exactly representable as floats, so we may
 | 
						|
   have to round.  We do this manually, since the C standards don't specify
 | 
						|
   whether converting an integer to a float rounds up or down */
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_float(PyIntObject *v)
 | 
						|
{
 | 
						|
    unsigned long abs_ival, lsb;
 | 
						|
    int round_up;
 | 
						|
 | 
						|
    if (v->ob_ival < 0)
 | 
						|
        abs_ival = 0U-(unsigned long)v->ob_ival;
 | 
						|
    else
 | 
						|
        abs_ival = (unsigned long)v->ob_ival;
 | 
						|
    if (abs_ival < (1L << DBL_MANT_DIG))
 | 
						|
        /* small integer;  no need to round */
 | 
						|
        return PyFloat_FromDouble((double)v->ob_ival);
 | 
						|
 | 
						|
    /* Round abs_ival to MANT_DIG significant bits, using the
 | 
						|
       round-half-to-even rule.  abs_ival & lsb picks out the 'rounding'
 | 
						|
       bit: the first bit after the most significant MANT_DIG bits of
 | 
						|
       abs_ival.  We round up if this bit is set, provided that either:
 | 
						|
 | 
						|
         (1) abs_ival isn't exactly halfway between two floats, in which
 | 
						|
         case at least one of the bits following the rounding bit must be
 | 
						|
         set; i.e., abs_ival & lsb-1 != 0, or:
 | 
						|
 | 
						|
         (2) the resulting rounded value has least significant bit 0; or
 | 
						|
         in other words the bit above the rounding bit is set (this is the
 | 
						|
         'to-even' bit of round-half-to-even); i.e., abs_ival & 2*lsb != 0
 | 
						|
 | 
						|
       The condition "(1) or (2)" equates to abs_ival & 3*lsb-1 != 0. */
 | 
						|
 | 
						|
    lsb = 1L << (bits_in_ulong(abs_ival)-DBL_MANT_DIG-1);
 | 
						|
    round_up = (abs_ival & lsb) && (abs_ival & (3*lsb-1));
 | 
						|
    abs_ival &= -2*lsb;
 | 
						|
    if (round_up)
 | 
						|
        abs_ival += 2*lsb;
 | 
						|
    return PyFloat_FromDouble(v->ob_ival < 0 ?
 | 
						|
                              -(double)abs_ival :
 | 
						|
                  (double)abs_ival);
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_oct(PyIntObject *v)
 | 
						|
{
 | 
						|
    return _PyInt_Format(v, 8, 0);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_hex(PyIntObject *v)
 | 
						|
{
 | 
						|
    return _PyInt_Format(v, 16, 0);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 | 
						|
{
 | 
						|
    PyObject *x = NULL;
 | 
						|
    int base = -909;
 | 
						|
    static char *kwlist[] = {"x", "base", 0};
 | 
						|
 | 
						|
    if (type != &PyInt_Type)
 | 
						|
        return int_subtype_new(type, args, kwds); /* Wimp out */
 | 
						|
    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
 | 
						|
                                     &x, &base))
 | 
						|
        return NULL;
 | 
						|
    if (x == NULL)
 | 
						|
        return PyInt_FromLong(0L);
 | 
						|
    if (base == -909)
 | 
						|
        return PyNumber_Int(x);
 | 
						|
    if (PyString_Check(x)) {
 | 
						|
        /* Since PyInt_FromString doesn't have a length parameter,
 | 
						|
         * check here for possible NULs in the string. */
 | 
						|
        char *string = PyString_AS_STRING(x);
 | 
						|
        if (strlen(string) != PyString_Size(x)) {
 | 
						|
            /* create a repr() of the input string,
 | 
						|
             * just like PyInt_FromString does */
 | 
						|
            PyObject *srepr;
 | 
						|
            srepr = PyObject_Repr(x);
 | 
						|
            if (srepr == NULL)
 | 
						|
                return NULL;
 | 
						|
            PyErr_Format(PyExc_ValueError,
 | 
						|
                 "invalid literal for int() with base %d: %s",
 | 
						|
                 base, PyString_AS_STRING(srepr));
 | 
						|
            Py_DECREF(srepr);
 | 
						|
            return NULL;
 | 
						|
        }
 | 
						|
        return PyInt_FromString(string, NULL, base);
 | 
						|
    }
 | 
						|
#ifdef Py_USING_UNICODE
 | 
						|
    if (PyUnicode_Check(x))
 | 
						|
        return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
 | 
						|
                                 PyUnicode_GET_SIZE(x),
 | 
						|
                                 base);
 | 
						|
#endif
 | 
						|
    PyErr_SetString(PyExc_TypeError,
 | 
						|
                    "int() can't convert non-string with explicit base");
 | 
						|
    return NULL;
 | 
						|
}
 | 
						|
 | 
						|
/* Wimpy, slow approach to tp_new calls for subtypes of int:
 | 
						|
   first create a regular int from whatever arguments we got,
 | 
						|
   then allocate a subtype instance and initialize its ob_ival
 | 
						|
   from the regular int.  The regular int is then thrown away.
 | 
						|
*/
 | 
						|
static PyObject *
 | 
						|
int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 | 
						|
{
 | 
						|
    PyObject *tmp, *newobj;
 | 
						|
    long ival;
 | 
						|
 | 
						|
    assert(PyType_IsSubtype(type, &PyInt_Type));
 | 
						|
    tmp = int_new(&PyInt_Type, args, kwds);
 | 
						|
    if (tmp == NULL)
 | 
						|
        return NULL;
 | 
						|
    if (!PyInt_Check(tmp)) {
 | 
						|
        ival = PyLong_AsLong(tmp);
 | 
						|
        if (ival == -1 && PyErr_Occurred()) {
 | 
						|
            Py_DECREF(tmp);
 | 
						|
            return NULL;
 | 
						|
        }
 | 
						|
    } else {
 | 
						|
        ival = ((PyIntObject *)tmp)->ob_ival;
 | 
						|
    }
 | 
						|
 | 
						|
    newobj = type->tp_alloc(type, 0);
 | 
						|
    if (newobj == NULL) {
 | 
						|
        Py_DECREF(tmp);
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
    ((PyIntObject *)newobj)->ob_ival = ival;
 | 
						|
    Py_DECREF(tmp);
 | 
						|
    return newobj;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_getnewargs(PyIntObject *v)
 | 
						|
{
 | 
						|
    return Py_BuildValue("(l)", v->ob_ival);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_get0(PyIntObject *v, void *context) {
 | 
						|
    return PyInt_FromLong(0L);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_get1(PyIntObject *v, void *context) {
 | 
						|
    return PyInt_FromLong(1L);
 | 
						|
}
 | 
						|
 | 
						|
/* Convert an integer to a decimal string.  On many platforms, this
 | 
						|
   will be significantly faster than the general arbitrary-base
 | 
						|
   conversion machinery in _PyInt_Format, thanks to optimization
 | 
						|
   opportunities offered by division by a compile-time constant. */
 | 
						|
static PyObject *
 | 
						|
int_to_decimal_string(PyIntObject *v) {
 | 
						|
    char buf[sizeof(long)*CHAR_BIT/3+6], *p, *bufend;
 | 
						|
    long n = v->ob_ival;
 | 
						|
    unsigned long absn;
 | 
						|
    p = bufend = buf + sizeof(buf);
 | 
						|
    absn = n < 0 ? 0UL - n : n;
 | 
						|
    do {
 | 
						|
        *--p = '0' + (char)(absn % 10);
 | 
						|
        absn /= 10;
 | 
						|
    } while (absn);
 | 
						|
    if (n < 0)
 | 
						|
        *--p = '-';
 | 
						|
    return PyString_FromStringAndSize(p, bufend - p);
 | 
						|
}
 | 
						|
 | 
						|
/* Convert an integer to the given base.  Returns a string.
 | 
						|
   If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'.
 | 
						|
   If newstyle is zero, then use the pre-2.6 behavior of octal having
 | 
						|
   a leading "0" */
 | 
						|
PyAPI_FUNC(PyObject*)
 | 
						|
_PyInt_Format(PyIntObject *v, int base, int newstyle)
 | 
						|
{
 | 
						|
    /* There are no doubt many, many ways to optimize this, using code
 | 
						|
       similar to _PyLong_Format */
 | 
						|
    long n = v->ob_ival;
 | 
						|
    int  negative = n < 0;
 | 
						|
    int is_zero = n == 0;
 | 
						|
 | 
						|
    /* For the reasoning behind this size, see
 | 
						|
       http://c-faq.com/misc/hexio.html. Then, add a few bytes for
 | 
						|
       the possible sign and prefix "0[box]" */
 | 
						|
    char buf[sizeof(n)*CHAR_BIT+6];
 | 
						|
 | 
						|
    /* Start by pointing to the end of the buffer.  We fill in from
 | 
						|
       the back forward. */
 | 
						|
    char* p = &buf[sizeof(buf)];
 | 
						|
 | 
						|
    assert(base >= 2 && base <= 36);
 | 
						|
 | 
						|
    /* Special case base 10, for speed */
 | 
						|
    if (base == 10)
 | 
						|
        return int_to_decimal_string(v);
 | 
						|
 | 
						|
    do {
 | 
						|
        /* I'd use i_divmod, except it doesn't produce the results
 | 
						|
           I want when n is negative.  So just duplicate the salient
 | 
						|
           part here. */
 | 
						|
        long div = n / base;
 | 
						|
        long mod = n - div * base;
 | 
						|
 | 
						|
        /* convert abs(mod) to the right character in [0-9, a-z] */
 | 
						|
        char cdigit = (char)(mod < 0 ? -mod : mod);
 | 
						|
        cdigit += (cdigit < 10) ? '0' : 'a'-10;
 | 
						|
        *--p = cdigit;
 | 
						|
 | 
						|
        n = div;
 | 
						|
    } while(n);
 | 
						|
 | 
						|
    if (base == 2) {
 | 
						|
        *--p = 'b';
 | 
						|
        *--p = '0';
 | 
						|
    }
 | 
						|
    else if (base == 8) {
 | 
						|
        if (newstyle) {
 | 
						|
            *--p = 'o';
 | 
						|
            *--p = '0';
 | 
						|
        }
 | 
						|
        else
 | 
						|
            if (!is_zero)
 | 
						|
                *--p = '0';
 | 
						|
    }
 | 
						|
    else if (base == 16) {
 | 
						|
        *--p = 'x';
 | 
						|
        *--p = '0';
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        *--p = '#';
 | 
						|
        *--p = '0' + base%10;
 | 
						|
        if (base > 10)
 | 
						|
            *--p = '0' + base/10;
 | 
						|
    }
 | 
						|
    if (negative)
 | 
						|
        *--p = '-';
 | 
						|
 | 
						|
    return PyString_FromStringAndSize(p, &buf[sizeof(buf)] - p);
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int__format__(PyObject *self, PyObject *args)
 | 
						|
{
 | 
						|
    PyObject *format_spec;
 | 
						|
 | 
						|
    if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
 | 
						|
        return NULL;
 | 
						|
    if (PyBytes_Check(format_spec))
 | 
						|
        return _PyInt_FormatAdvanced(self,
 | 
						|
                                     PyBytes_AS_STRING(format_spec),
 | 
						|
                                     PyBytes_GET_SIZE(format_spec));
 | 
						|
    if (PyUnicode_Check(format_spec)) {
 | 
						|
        /* Convert format_spec to a str */
 | 
						|
        PyObject *result;
 | 
						|
        PyObject *str_spec = PyObject_Str(format_spec);
 | 
						|
 | 
						|
        if (str_spec == NULL)
 | 
						|
            return NULL;
 | 
						|
 | 
						|
        result = _PyInt_FormatAdvanced(self,
 | 
						|
                                       PyBytes_AS_STRING(str_spec),
 | 
						|
                                       PyBytes_GET_SIZE(str_spec));
 | 
						|
 | 
						|
        Py_DECREF(str_spec);
 | 
						|
        return result;
 | 
						|
    }
 | 
						|
    PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
 | 
						|
    return NULL;
 | 
						|
}
 | 
						|
 | 
						|
static PyObject *
 | 
						|
int_bit_length(PyIntObject *v)
 | 
						|
{
 | 
						|
    unsigned long n;
 | 
						|
 | 
						|
    if (v->ob_ival < 0)
 | 
						|
        /* avoid undefined behaviour when v->ob_ival == -LONG_MAX-1 */
 | 
						|
        n = 0U-(unsigned long)v->ob_ival;
 | 
						|
    else
 | 
						|
        n = (unsigned long)v->ob_ival;
 | 
						|
 | 
						|
    return PyInt_FromLong(bits_in_ulong(n));
 | 
						|
}
 | 
						|
 | 
						|
PyDoc_STRVAR(int_bit_length_doc,
 | 
						|
"int.bit_length() -> int\n\
 | 
						|
\n\
 | 
						|
Number of bits necessary to represent self in binary.\n\
 | 
						|
>>> bin(37)\n\
 | 
						|
'0b100101'\n\
 | 
						|
>>> (37).bit_length()\n\
 | 
						|
6");
 | 
						|
 | 
						|
#if 0
 | 
						|
static PyObject *
 | 
						|
int_is_finite(PyObject *v)
 | 
						|
{
 | 
						|
    Py_RETURN_TRUE;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
static PyMethodDef int_methods[] = {
 | 
						|
    {"conjugate",       (PyCFunction)int_int,   METH_NOARGS,
 | 
						|
     "Returns self, the complex conjugate of any int."},
 | 
						|
    {"bit_length", (PyCFunction)int_bit_length, METH_NOARGS,
 | 
						|
     int_bit_length_doc},
 | 
						|
#if 0
 | 
						|
    {"is_finite",       (PyCFunction)int_is_finite,     METH_NOARGS,
 | 
						|
     "Returns always True."},
 | 
						|
#endif
 | 
						|
    {"__trunc__",       (PyCFunction)int_int,   METH_NOARGS,
 | 
						|
     "Truncating an Integral returns itself."},
 | 
						|
    {"__getnewargs__",          (PyCFunction)int_getnewargs,    METH_NOARGS},
 | 
						|
    {"__format__", (PyCFunction)int__format__, METH_VARARGS},
 | 
						|
    {NULL,              NULL}           /* sentinel */
 | 
						|
};
 | 
						|
 | 
						|
static PyGetSetDef int_getset[] = {
 | 
						|
    {"real",
 | 
						|
     (getter)int_int, (setter)NULL,
 | 
						|
     "the real part of a complex number",
 | 
						|
     NULL},
 | 
						|
    {"imag",
 | 
						|
     (getter)int_get0, (setter)NULL,
 | 
						|
     "the imaginary part of a complex number",
 | 
						|
     NULL},
 | 
						|
    {"numerator",
 | 
						|
     (getter)int_int, (setter)NULL,
 | 
						|
     "the numerator of a rational number in lowest terms",
 | 
						|
     NULL},
 | 
						|
    {"denominator",
 | 
						|
     (getter)int_get1, (setter)NULL,
 | 
						|
     "the denominator of a rational number in lowest terms",
 | 
						|
     NULL},
 | 
						|
    {NULL}  /* Sentinel */
 | 
						|
};
 | 
						|
 | 
						|
PyDoc_STRVAR(int_doc,
 | 
						|
"int(x[, base]) -> integer\n\
 | 
						|
\n\
 | 
						|
Convert a string or number to an integer, if possible.  A floating point\n\
 | 
						|
argument will be truncated towards zero (this does not include a string\n\
 | 
						|
representation of a floating point number!)  When converting a string, use\n\
 | 
						|
the optional base.  It is an error to supply a base when converting a\n\
 | 
						|
non-string.  If base is zero, the proper base is guessed based on the\n\
 | 
						|
string content.  If the argument is outside the integer range a\n\
 | 
						|
long object will be returned instead.");
 | 
						|
 | 
						|
static PyNumberMethods int_as_number = {
 | 
						|
    (binaryfunc)int_add,        /*nb_add*/
 | 
						|
    (binaryfunc)int_sub,        /*nb_subtract*/
 | 
						|
    (binaryfunc)int_mul,        /*nb_multiply*/
 | 
						|
    (binaryfunc)int_classic_div, /*nb_divide*/
 | 
						|
    (binaryfunc)int_mod,        /*nb_remainder*/
 | 
						|
    (binaryfunc)int_divmod,     /*nb_divmod*/
 | 
						|
    (ternaryfunc)int_pow,       /*nb_power*/
 | 
						|
    (unaryfunc)int_neg,         /*nb_negative*/
 | 
						|
    (unaryfunc)int_int,         /*nb_positive*/
 | 
						|
    (unaryfunc)int_abs,         /*nb_absolute*/
 | 
						|
    (inquiry)int_nonzero,       /*nb_nonzero*/
 | 
						|
    (unaryfunc)int_invert,      /*nb_invert*/
 | 
						|
    (binaryfunc)int_lshift,     /*nb_lshift*/
 | 
						|
    (binaryfunc)int_rshift,     /*nb_rshift*/
 | 
						|
    (binaryfunc)int_and,        /*nb_and*/
 | 
						|
    (binaryfunc)int_xor,        /*nb_xor*/
 | 
						|
    (binaryfunc)int_or,         /*nb_or*/
 | 
						|
    int_coerce,                 /*nb_coerce*/
 | 
						|
    (unaryfunc)int_int,         /*nb_int*/
 | 
						|
    (unaryfunc)int_long,        /*nb_long*/
 | 
						|
    (unaryfunc)int_float,       /*nb_float*/
 | 
						|
    (unaryfunc)int_oct,         /*nb_oct*/
 | 
						|
    (unaryfunc)int_hex,         /*nb_hex*/
 | 
						|
    0,                          /*nb_inplace_add*/
 | 
						|
    0,                          /*nb_inplace_subtract*/
 | 
						|
    0,                          /*nb_inplace_multiply*/
 | 
						|
    0,                          /*nb_inplace_divide*/
 | 
						|
    0,                          /*nb_inplace_remainder*/
 | 
						|
    0,                          /*nb_inplace_power*/
 | 
						|
    0,                          /*nb_inplace_lshift*/
 | 
						|
    0,                          /*nb_inplace_rshift*/
 | 
						|
    0,                          /*nb_inplace_and*/
 | 
						|
    0,                          /*nb_inplace_xor*/
 | 
						|
    0,                          /*nb_inplace_or*/
 | 
						|
    (binaryfunc)int_div,        /* nb_floor_divide */
 | 
						|
    (binaryfunc)int_true_divide, /* nb_true_divide */
 | 
						|
    0,                          /* nb_inplace_floor_divide */
 | 
						|
    0,                          /* nb_inplace_true_divide */
 | 
						|
    (unaryfunc)int_int,         /* nb_index */
 | 
						|
};
 | 
						|
 | 
						|
PyTypeObject PyInt_Type = {
 | 
						|
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
 | 
						|
    "int",
 | 
						|
    sizeof(PyIntObject),
 | 
						|
    0,
 | 
						|
    (destructor)int_dealloc,                    /* tp_dealloc */
 | 
						|
    (printfunc)int_print,                       /* tp_print */
 | 
						|
    0,                                          /* tp_getattr */
 | 
						|
    0,                                          /* tp_setattr */
 | 
						|
    (cmpfunc)int_compare,                       /* tp_compare */
 | 
						|
    (reprfunc)int_to_decimal_string,            /* tp_repr */
 | 
						|
    &int_as_number,                             /* tp_as_number */
 | 
						|
    0,                                          /* tp_as_sequence */
 | 
						|
    0,                                          /* tp_as_mapping */
 | 
						|
    (hashfunc)int_hash,                         /* tp_hash */
 | 
						|
    0,                                          /* tp_call */
 | 
						|
    (reprfunc)int_to_decimal_string,            /* tp_str */
 | 
						|
    PyObject_GenericGetAttr,                    /* tp_getattro */
 | 
						|
    0,                                          /* tp_setattro */
 | 
						|
    0,                                          /* tp_as_buffer */
 | 
						|
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
 | 
						|
        Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS,          /* tp_flags */
 | 
						|
    int_doc,                                    /* tp_doc */
 | 
						|
    0,                                          /* tp_traverse */
 | 
						|
    0,                                          /* tp_clear */
 | 
						|
    0,                                          /* tp_richcompare */
 | 
						|
    0,                                          /* tp_weaklistoffset */
 | 
						|
    0,                                          /* tp_iter */
 | 
						|
    0,                                          /* tp_iternext */
 | 
						|
    int_methods,                                /* tp_methods */
 | 
						|
    0,                                          /* tp_members */
 | 
						|
    int_getset,                                 /* tp_getset */
 | 
						|
    0,                                          /* tp_base */
 | 
						|
    0,                                          /* tp_dict */
 | 
						|
    0,                                          /* tp_descr_get */
 | 
						|
    0,                                          /* tp_descr_set */
 | 
						|
    0,                                          /* tp_dictoffset */
 | 
						|
    0,                                          /* tp_init */
 | 
						|
    0,                                          /* tp_alloc */
 | 
						|
    int_new,                                    /* tp_new */
 | 
						|
    (freefunc)int_free,                         /* tp_free */
 | 
						|
};
 | 
						|
 | 
						|
int
 | 
						|
_PyInt_Init(void)
 | 
						|
{
 | 
						|
    PyIntObject *v;
 | 
						|
    int ival;
 | 
						|
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
 | 
						|
    for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
 | 
						|
          if (!free_list && (free_list = fill_free_list()) == NULL)
 | 
						|
                    return 0;
 | 
						|
        /* PyObject_New is inlined */
 | 
						|
        v = free_list;
 | 
						|
        free_list = (PyIntObject *)Py_TYPE(v);
 | 
						|
        PyObject_INIT(v, &PyInt_Type);
 | 
						|
        v->ob_ival = ival;
 | 
						|
        small_ints[ival + NSMALLNEGINTS] = v;
 | 
						|
    }
 | 
						|
#endif
 | 
						|
    return 1;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
PyInt_ClearFreeList(void)
 | 
						|
{
 | 
						|
    PyIntObject *p;
 | 
						|
    PyIntBlock *list, *next;
 | 
						|
    int i;
 | 
						|
    int u;                      /* remaining unfreed ints per block */
 | 
						|
    int freelist_size = 0;
 | 
						|
 | 
						|
    list = block_list;
 | 
						|
    block_list = NULL;
 | 
						|
    free_list = NULL;
 | 
						|
    while (list != NULL) {
 | 
						|
        u = 0;
 | 
						|
        for (i = 0, p = &list->objects[0];
 | 
						|
             i < N_INTOBJECTS;
 | 
						|
             i++, p++) {
 | 
						|
            if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
 | 
						|
                u++;
 | 
						|
        }
 | 
						|
        next = list->next;
 | 
						|
        if (u) {
 | 
						|
            list->next = block_list;
 | 
						|
            block_list = list;
 | 
						|
            for (i = 0, p = &list->objects[0];
 | 
						|
                 i < N_INTOBJECTS;
 | 
						|
                 i++, p++) {
 | 
						|
                if (!PyInt_CheckExact(p) ||
 | 
						|
                    p->ob_refcnt == 0) {
 | 
						|
                    Py_TYPE(p) = (struct _typeobject *)
 | 
						|
                        free_list;
 | 
						|
                    free_list = p;
 | 
						|
                }
 | 
						|
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
 | 
						|
                else if (-NSMALLNEGINTS <= p->ob_ival &&
 | 
						|
                         p->ob_ival < NSMALLPOSINTS &&
 | 
						|
                         small_ints[p->ob_ival +
 | 
						|
                                    NSMALLNEGINTS] == NULL) {
 | 
						|
                    Py_INCREF(p);
 | 
						|
                    small_ints[p->ob_ival +
 | 
						|
                               NSMALLNEGINTS] = p;
 | 
						|
                }
 | 
						|
#endif
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            PyMem_FREE(list);
 | 
						|
        }
 | 
						|
        freelist_size += u;
 | 
						|
        list = next;
 | 
						|
    }
 | 
						|
 | 
						|
    return freelist_size;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
PyInt_Fini(void)
 | 
						|
{
 | 
						|
    PyIntObject *p;
 | 
						|
    PyIntBlock *list;
 | 
						|
    int i;
 | 
						|
    int u;                      /* total unfreed ints per block */
 | 
						|
 | 
						|
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
 | 
						|
    PyIntObject **q;
 | 
						|
 | 
						|
    i = NSMALLNEGINTS + NSMALLPOSINTS;
 | 
						|
    q = small_ints;
 | 
						|
    while (--i >= 0) {
 | 
						|
        Py_XDECREF(*q);
 | 
						|
        *q++ = NULL;
 | 
						|
    }
 | 
						|
#endif
 | 
						|
    u = PyInt_ClearFreeList();
 | 
						|
    if (!Py_VerboseFlag)
 | 
						|
        return;
 | 
						|
    fprintf(stderr, "# cleanup ints");
 | 
						|
    if (!u) {
 | 
						|
        fprintf(stderr, "\n");
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        fprintf(stderr,
 | 
						|
            ": %d unfreed int%s\n",
 | 
						|
            u, u == 1 ? "" : "s");
 | 
						|
    }
 | 
						|
    if (Py_VerboseFlag > 1) {
 | 
						|
        list = block_list;
 | 
						|
        while (list != NULL) {
 | 
						|
            for (i = 0, p = &list->objects[0];
 | 
						|
                 i < N_INTOBJECTS;
 | 
						|
                 i++, p++) {
 | 
						|
                if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
 | 
						|
                    /* XXX(twouters) cast refcount to
 | 
						|
                       long until %zd is universally
 | 
						|
                       available
 | 
						|
                     */
 | 
						|
                    fprintf(stderr,
 | 
						|
                "#   <int at %p, refcnt=%ld, val=%ld>\n",
 | 
						|
                                p, (long)p->ob_refcnt,
 | 
						|
                                p->ob_ival);
 | 
						|
            }
 | 
						|
            list = list->next;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |