The Objects directory from the cPython 2.7.10 distribution, along with the LICENSE and README files. These files are unchanged and set the baseline for subsequent commits. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Daryl McDaniel <edk2-lists@mc2research.org> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18739 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			1582 lines
		
	
	
		
			47 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1582 lines
		
	
	
		
			47 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;
 | |
| }
 | |
| 
 | |
| int
 | |
| _PyInt_AsInt(PyObject *obj)
 | |
| {
 | |
|     long result = PyInt_AsLong(obj);
 | |
|     if (result == -1 && PyErr_Occurred())
 | |
|         return -1;
 | |
|     if (result > INT_MAX || result < INT_MIN) {
 | |
|         PyErr_SetString(PyExc_OverflowError,
 | |
|                         "Python int too large to convert to C int");
 | |
|         return -1;
 | |
|     }
 | |
|     return (int)result;
 | |
| }
 | |
| 
 | |
| Py_ssize_t
 | |
| PyInt_AsSsize_t(register PyObject *op)
 | |
| {
 | |
| #if SIZEOF_SIZE_T != SIZEOF_LONG
 | |
|     PyNumberMethods *nb;
 | |
|     PyObject *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 = (*nb->nb_long)(op);
 | |
|     else
 | |
|         io = (*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(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) {
 | |
|             /*
 | |
|              * The (unsigned long) cast below ensures that the multiplication
 | |
|              * is interpreted as an unsigned operation rather than a signed one
 | |
|              * (C99 6.3.1.8p1), thus avoiding the perils of undefined behaviour
 | |
|              * from signed arithmetic overflow (C99 6.5p5).  See issue #12973.
 | |
|              */
 | |
|             ix = (unsigned long)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 = (unsigned long)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) {
 | |
|         if (base != -909) {
 | |
|             PyErr_SetString(PyExc_TypeError,
 | |
|                             "int() missing string argument");
 | |
|             return 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=0) -> int or long\n\
 | |
| int(x, base=10) -> int or long\n\
 | |
| \n\
 | |
| Convert a number or string to an integer, or return 0 if no arguments\n\
 | |
| are given.  If x is floating point, the conversion truncates towards zero.\n\
 | |
| If x is outside the integer range, the function returns a long instead.\n\
 | |
| \n\
 | |
| If x is not a number or if base is given, then x must be a string or\n\
 | |
| Unicode object representing an integer literal in the given base.  The\n\
 | |
| literal can be preceded by '+' or '-' and be surrounded by whitespace.\n\
 | |
| The base defaults to 10.  Valid bases are 0 and 2-36.  Base 0 means to\n\
 | |
| interpret the base from the string as an integer literal.\n\
 | |
| >>> int('0b100', base=0)\n\
 | |
| 4");
 | |
| 
 | |
| 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;
 | |
|         }
 | |
|     }
 | |
| }
 |