summaryrefslogtreecommitdiffstats
path: root/Objects/longobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r--Objects/longobject.c3743
1 files changed, 1158 insertions, 2585 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c
index bc87fb2..c05f67c 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -4,105 +4,15 @@
#include "Python.h"
#include "longintrepr.h"
+#include "structseq.h"
#include <float.h>
#include <ctype.h>
#include <stddef.h>
-#include "clinic/longobject.c.h"
-/*[clinic input]
-class int "PyObject *" "&PyLong_Type"
-[clinic start generated code]*/
-/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ec0275e3422a36e3]*/
-
-#ifndef NSMALLPOSINTS
-#define NSMALLPOSINTS 257
-#endif
-#ifndef NSMALLNEGINTS
-#define NSMALLNEGINTS 5
-#endif
-
-_Py_IDENTIFIER(little);
-_Py_IDENTIFIER(big);
-
-/* convert a PyLong of size 1, 0 or -1 to an sdigit */
-#define MEDIUM_VALUE(x) (assert(-1 <= Py_SIZE(x) && Py_SIZE(x) <= 1), \
- Py_SIZE(x) < 0 ? -(sdigit)(x)->ob_digit[0] : \
- (Py_SIZE(x) == 0 ? (sdigit)0 : \
- (sdigit)(x)->ob_digit[0]))
-
-PyObject *_PyLong_Zero = NULL;
-PyObject *_PyLong_One = NULL;
-
-#if NSMALLNEGINTS + NSMALLPOSINTS > 0
-/* Small integers are preallocated in this array so that they
- can be shared.
- The integers that are preallocated are those in the range
- -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
-*/
-static PyLongObject* small_ints[NSMALLNEGINTS + NSMALLPOSINTS] = {0};
-
-#define IS_SMALL_INT(ival) (-NSMALLNEGINTS <= (ival) && (ival) < NSMALLPOSINTS)
-#define IS_SMALL_UINT(ival) ((ival) < NSMALLPOSINTS)
-
-#ifdef COUNT_ALLOCS
-Py_ssize_t _Py_quick_int_allocs, _Py_quick_neg_int_allocs;
-#endif
-
-static PyObject *
-get_small_int(sdigit ival)
-{
- assert(IS_SMALL_INT(ival));
- PyObject *v = (PyObject*)small_ints[ival + NSMALLNEGINTS];
- Py_INCREF(v);
-#ifdef COUNT_ALLOCS
- if (ival >= 0)
- _Py_quick_int_allocs++;
- else
- _Py_quick_neg_int_allocs++;
-#endif
- return v;
-}
-
-static PyLongObject *
-maybe_small_long(PyLongObject *v)
-{
- if (v && Py_ABS(Py_SIZE(v)) <= 1) {
- sdigit ival = MEDIUM_VALUE(v);
- if (IS_SMALL_INT(ival)) {
- Py_DECREF(v);
- return (PyLongObject *)get_small_int(ival);
- }
- }
- return v;
-}
-#else
-#define IS_SMALL_INT(ival) 0
-#define IS_SMALL_UINT(ival) 0
-#define get_small_int(ival) (Py_UNREACHABLE(), NULL)
-#define maybe_small_long(val) (val)
-#endif
-
-/* If a freshly-allocated int is already shared, it must
- be a small integer, so negating it must go to PyLong_FromLong */
-Py_LOCAL_INLINE(void)
-_PyLong_Negate(PyLongObject **x_p)
-{
- PyLongObject *x;
-
- x = (PyLongObject *)*x_p;
- if (Py_REFCNT(x) == 1) {
- Py_SIZE(x) = -Py_SIZE(x);
- return;
- }
-
- *x_p = (PyLongObject *)PyLong_FromLong(-MEDIUM_VALUE(x));
- Py_DECREF(x);
-}
-
-/* For int multiplication, use the O(N**2) school algorithm unless
+/* For long multiplication, use the O(N**2) school algorithm unless
* both operands contain more than KARATSUBA_CUTOFF digits (this
- * being an internal Python int digit, in base BASE).
+ * being an internal Python long digit, in base PyLong_BASE).
*/
#define KARATSUBA_CUTOFF 70
#define KARATSUBA_SQUARE_CUTOFF (2 * KARATSUBA_CUTOFF)
@@ -114,19 +24,29 @@ _PyLong_Negate(PyLongObject **x_p)
*/
#define FIVEARY_CUTOFF 8
-#define SIGCHECK(PyTryBlock) \
- do { \
- if (PyErr_CheckSignals()) PyTryBlock \
+#define ABS(x) ((x) < 0 ? -(x) : (x))
+
+#undef MIN
+#undef MAX
+#define MAX(x, y) ((x) < (y) ? (y) : (x))
+#define MIN(x, y) ((x) > (y) ? (y) : (x))
+
+#define SIGCHECK(PyTryBlock) \
+ do { \
+ if (--_Py_Ticker < 0) { \
+ _Py_Ticker = _Py_CheckInterval; \
+ if (PyErr_CheckSignals()) PyTryBlock \
+ } \
} while(0)
-/* Normalize (remove leading zeros from) an int object.
+/* Normalize (remove leading zeros from) a long int object.
Doesn't attempt to free the storage--in most cases, due to the nature
of the algorithms used, this could save at most be one word anyway. */
static PyLongObject *
-long_normalize(PyLongObject *v)
+long_normalize(register PyLongObject *v)
{
- Py_ssize_t j = Py_ABS(Py_SIZE(v));
+ Py_ssize_t j = ABS(Py_SIZE(v));
Py_ssize_t i = j;
while (i > 0 && v->ob_digit[i-1] == 0)
@@ -136,124 +56,7 @@ long_normalize(PyLongObject *v)
return v;
}
-/* _PyLong_FromNbInt: Convert the given object to a PyLongObject
- using the nb_int slot, if available. Raise TypeError if either the
- nb_int slot is not available or the result of the call to nb_int
- returns something not of type int.
-*/
-PyObject *
-_PyLong_FromNbInt(PyObject *integral)
-{
- PyNumberMethods *nb;
- PyObject *result;
-
- /* Fast path for the case that we already have an int. */
- if (PyLong_CheckExact(integral)) {
- Py_INCREF(integral);
- return integral;
- }
-
- nb = Py_TYPE(integral)->tp_as_number;
- if (nb == NULL || nb->nb_int == NULL) {
- PyErr_Format(PyExc_TypeError,
- "an integer is required (got type %.200s)",
- Py_TYPE(integral)->tp_name);
- return NULL;
- }
-
- /* Convert using the nb_int slot, which should return something
- of exact type int. */
- result = nb->nb_int(integral);
- if (!result || PyLong_CheckExact(result))
- return result;
- if (!PyLong_Check(result)) {
- PyErr_Format(PyExc_TypeError,
- "__int__ returned non-int (type %.200s)",
- result->ob_type->tp_name);
- Py_DECREF(result);
- return NULL;
- }
- /* Issue #17576: warn if 'result' not of exact type int. */
- if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
- "__int__ returned non-int (type %.200s). "
- "The ability to return an instance of a strict subclass of int "
- "is deprecated, and may be removed in a future version of Python.",
- result->ob_type->tp_name)) {
- Py_DECREF(result);
- return NULL;
- }
- return result;
-}
-
-/* Convert the given object to a PyLongObject using the nb_index or
- nb_int slots, if available (the latter is deprecated).
- Raise TypeError if either nb_index and nb_int slots are not
- available or the result of the call to nb_index or nb_int
- returns something not of type int.
- Should be replaced with PyNumber_Index after the end of the
- deprecation period.
-*/
-PyObject *
-_PyLong_FromNbIndexOrNbInt(PyObject *integral)
-{
- PyNumberMethods *nb;
- PyObject *result;
-
- /* Fast path for the case that we already have an int. */
- if (PyLong_CheckExact(integral)) {
- Py_INCREF(integral);
- return integral;
- }
-
- nb = Py_TYPE(integral)->tp_as_number;
- if (nb == NULL || (nb->nb_index == NULL && nb->nb_int == NULL)) {
- PyErr_Format(PyExc_TypeError,
- "an integer is required (got type %.200s)",
- Py_TYPE(integral)->tp_name);
- return NULL;
- }
-
- if (nb->nb_index) {
- /* Convert using the nb_index slot, which should return something
- of exact type int. */
- result = nb->nb_index(integral);
- if (!result || PyLong_CheckExact(result))
- return result;
- if (!PyLong_Check(result)) {
- PyErr_Format(PyExc_TypeError,
- "__index__ returned non-int (type %.200s)",
- result->ob_type->tp_name);
- Py_DECREF(result);
- return NULL;
- }
- /* Issue #17576: warn if 'result' not of exact type int. */
- if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
- "__index__ returned non-int (type %.200s). "
- "The ability to return an instance of a strict subclass of int "
- "is deprecated, and may be removed in a future version of Python.",
- result->ob_type->tp_name))
- {
- Py_DECREF(result);
- return NULL;
- }
- return result;
- }
-
- result = _PyLong_FromNbInt(integral);
- if (result && PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
- "an integer is required (got type %.200s). "
- "Implicit conversion to integers using __int__ is deprecated, "
- "and may be removed in a future version of Python.",
- Py_TYPE(integral)->tp_name))
- {
- Py_DECREF(result);
- return NULL;
- }
- return result;
-}
-
-
-/* Allocate a new int object with size digits.
+/* Allocate a new long int object with size digits.
Return NULL and set exception if we run out of memory. */
#define MAX_LONG_DIGITS \
@@ -262,24 +65,15 @@ _PyLong_FromNbIndexOrNbInt(PyObject *integral)
PyLongObject *
_PyLong_New(Py_ssize_t size)
{
- PyLongObject *result;
- /* Number of bytes needed is: offsetof(PyLongObject, ob_digit) +
- sizeof(digit)*size. Previous incarnations of this code used
- sizeof(PyVarObject) instead of the offsetof, but this risks being
- incorrect in the presence of padding between the PyVarObject header
- and the digits. */
if (size > (Py_ssize_t)MAX_LONG_DIGITS) {
PyErr_SetString(PyExc_OverflowError,
"too many digits in integer");
return NULL;
}
- result = PyObject_MALLOC(offsetof(PyLongObject, ob_digit) +
- size*sizeof(digit));
- if (!result) {
- PyErr_NoMemory();
- return NULL;
- }
- return (PyLongObject*)PyObject_INIT_VAR(result, &PyLong_Type, size);
+ /* coverity[ampersand_in_size] */
+ /* XXX(nnorwitz): PyObject_NEW_VAR / _PyObject_VAR_SIZE need to detect
+ overflow */
+ return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
}
PyObject *
@@ -292,12 +86,6 @@ _PyLong_Copy(PyLongObject *src)
i = Py_SIZE(src);
if (i < 0)
i = -(i);
- if (i < 2) {
- sdigit ival = MEDIUM_VALUE(src);
- if (IS_SMALL_INT(ival)) {
- return get_small_int(ival);
- }
- }
result = _PyLong_New(i);
if (result != NULL) {
Py_SIZE(result) = Py_SIZE(src);
@@ -307,7 +95,7 @@ _PyLong_Copy(PyLongObject *src)
return (PyObject *)result;
}
-/* Create a new int object from a C long int */
+/* Create a new long int object from a C long int */
PyObject *
PyLong_FromLong(long ival)
@@ -316,50 +104,23 @@ PyLong_FromLong(long ival)
unsigned long abs_ival;
unsigned long t; /* unsigned so >> doesn't propagate sign bit */
int ndigits = 0;
- int sign;
-
- if (IS_SMALL_INT(ival)) {
- return get_small_int((sdigit)ival);
- }
+ int negative = 0;
if (ival < 0) {
- /* negate: can't write this as abs_ival = -ival since that
- invokes undefined behaviour when ival is LONG_MIN */
- abs_ival = 0U-(unsigned long)ival;
- sign = -1;
+ /* if LONG_MIN == -LONG_MAX-1 (true on most platforms) then
+ ANSI C says that the result of -ival is undefined when ival
+ == LONG_MIN. Hence the following workaround. */
+ abs_ival = (unsigned long)(-1-ival) + 1;
+ negative = 1;
}
else {
abs_ival = (unsigned long)ival;
- sign = ival == 0 ? 0 : 1;
}
- /* Fast path for single-digit ints */
- if (!(abs_ival >> PyLong_SHIFT)) {
- v = _PyLong_New(1);
- if (v) {
- Py_SIZE(v) = sign;
- v->ob_digit[0] = Py_SAFE_DOWNCAST(
- abs_ival, unsigned long, digit);
- }
- return (PyObject*)v;
- }
-
-#if PyLong_SHIFT==15
- /* 2 digits */
- if (!(abs_ival >> 2*PyLong_SHIFT)) {
- v = _PyLong_New(2);
- if (v) {
- Py_SIZE(v) = 2*sign;
- v->ob_digit[0] = Py_SAFE_DOWNCAST(
- abs_ival & PyLong_MASK, unsigned long, digit);
- v->ob_digit[1] = Py_SAFE_DOWNCAST(
- abs_ival >> PyLong_SHIFT, unsigned long, digit);
- }
- return (PyObject*)v;
- }
-#endif
-
- /* Larger numbers: loop to determine number of digits */
+ /* Count the number of Python digits.
+ We used to pick 5 ("big enough for anything"), but that's a
+ waste of time and space given that 5*15 = 75 bits are rarely
+ needed. */
t = abs_ival;
while (t) {
++ndigits;
@@ -368,66 +129,44 @@ PyLong_FromLong(long ival)
v = _PyLong_New(ndigits);
if (v != NULL) {
digit *p = v->ob_digit;
- Py_SIZE(v) = ndigits*sign;
+ Py_SIZE(v) = negative ? -ndigits : ndigits;
t = abs_ival;
while (t) {
- *p++ = Py_SAFE_DOWNCAST(
- t & PyLong_MASK, unsigned long, digit);
+ *p++ = (digit)(t & PyLong_MASK);
t >>= PyLong_SHIFT;
}
}
return (PyObject *)v;
}
-#define PYLONG_FROM_UINT(INT_TYPE, ival) \
- do { \
- if (IS_SMALL_UINT(ival)) { \
- return get_small_int((sdigit)(ival)); \
- } \
- /* Count the number of Python digits. */ \
- Py_ssize_t ndigits = 0; \
- INT_TYPE t = (ival); \
- while (t) { \
- ++ndigits; \
- t >>= PyLong_SHIFT; \
- } \
- PyLongObject *v = _PyLong_New(ndigits); \
- if (v == NULL) { \
- return NULL; \
- } \
- digit *p = v->ob_digit; \
- while ((ival)) { \
- *p++ = (digit)((ival) & PyLong_MASK); \
- (ival) >>= PyLong_SHIFT; \
- } \
- return (PyObject *)v; \
- } while(0)
-
-/* Create a new int object from a C unsigned long int */
+/* Create a new long int object from a C unsigned long int */
PyObject *
PyLong_FromUnsignedLong(unsigned long ival)
{
- PYLONG_FROM_UINT(unsigned long, ival);
-}
-
-/* Create a new int object from a C unsigned long long int. */
-
-PyObject *
-PyLong_FromUnsignedLongLong(unsigned long long ival)
-{
- PYLONG_FROM_UINT(unsigned long long, ival);
-}
-
-/* Create a new int object from a C size_t. */
+ PyLongObject *v;
+ unsigned long t;
+ int ndigits = 0;
-PyObject *
-PyLong_FromSize_t(size_t ival)
-{
- PYLONG_FROM_UINT(size_t, ival);
+ /* Count the number of Python digits. */
+ t = (unsigned long)ival;
+ while (t) {
+ ++ndigits;
+ t >>= PyLong_SHIFT;
+ }
+ v = _PyLong_New(ndigits);
+ if (v != NULL) {
+ digit *p = v->ob_digit;
+ Py_SIZE(v) = ndigits;
+ while (ival) {
+ *p++ = (digit)(ival & PyLong_MASK);
+ ival >>= PyLong_SHIFT;
+ }
+ }
+ return (PyObject *)v;
}
-/* Create a new int object from a C double */
+/* Create a new long int object from a C double */
PyObject *
PyLong_FromDouble(double dval)
@@ -481,21 +220,19 @@ PyLong_FromDouble(double dval)
#define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN)
#define PY_ABS_SSIZE_T_MIN (0-(size_t)PY_SSIZE_T_MIN)
-/* Get a C long int from an int object or any object that has an __int__
- method.
-
- On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
- the result. Otherwise *overflow is 0.
+/* Get a C long int from a Python long or Python int object.
+ On overflow, returns -1 and sets *overflow to 1 or -1 depending
+ on the sign of the result. Otherwise *overflow is 0.
- For other errors (e.g., TypeError), return -1 and set an error condition.
- In this case *overflow will be 0.
+ For other errors (e.g., type error), returns -1 and sets an error
+ condition.
*/
long
PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
{
/* This version by Tim Peters */
- PyLongObject *v;
+ register PyLongObject *v;
unsigned long x, prev;
long res;
Py_ssize_t i;
@@ -508,17 +245,35 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
return -1;
}
- if (PyLong_Check(vv)) {
- v = (PyLongObject *)vv;
- }
- else {
- v = (PyLongObject *)_PyLong_FromNbIndexOrNbInt(vv);
- if (v == NULL)
+ if(PyInt_Check(vv))
+ return PyInt_AsLong(vv);
+
+ if (!PyLong_Check(vv)) {
+ PyNumberMethods *nb;
+ nb = vv->ob_type->tp_as_number;
+ if (nb == NULL || nb->nb_int == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "an integer is required");
+ return -1;
+ }
+ vv = (*nb->nb_int) (vv);
+ if (vv == NULL)
return -1;
do_decref = 1;
+ if(PyInt_Check(vv)) {
+ res = PyInt_AsLong(vv);
+ goto exit;
+ }
+ if (!PyLong_Check(vv)) {
+ Py_DECREF(vv);
+ PyErr_SetString(PyExc_TypeError,
+ "nb_int should return int object");
+ return -1;
+ }
}
res = -1;
+ v = (PyLongObject *)vv;
i = Py_SIZE(v);
switch (i) {
@@ -540,7 +295,7 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
}
while (--i >= 0) {
prev = x;
- x = (x << PyLong_SHIFT) | v->ob_digit[i];
+ x = (x << PyLong_SHIFT) + v->ob_digit[i];
if ((x >> PyLong_SHIFT) != prev) {
*overflow = sign;
goto exit;
@@ -562,13 +317,13 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
}
exit:
if (do_decref) {
- Py_DECREF(v);
+ Py_DECREF(vv);
}
return res;
}
-/* Get a C long int from an int object or any object that has an __int__
- method. Return -1 and set an error if overflow occurs. */
+/* Get a C long int from a long int object.
+ Returns -1 and sets an error condition if overflow occurs. */
long
PyLong_AsLong(PyObject *obj)
@@ -584,7 +339,7 @@ PyLong_AsLong(PyObject *obj)
return result;
}
-/* Get a C int from an int object or any object that has an __int__
+/* Get a C int from a long int object or any object that has an __int__
method. Return -1 and set an error if overflow occurs. */
int
@@ -602,32 +357,22 @@ _PyLong_AsInt(PyObject *obj)
return (int)result;
}
-/* Get a Py_ssize_t from an int object.
+/* Get a Py_ssize_t from a long int object.
Returns -1 and sets an error condition if overflow occurs. */
Py_ssize_t
PyLong_AsSsize_t(PyObject *vv) {
- PyLongObject *v;
+ register PyLongObject *v;
size_t x, prev;
Py_ssize_t i;
int sign;
- if (vv == NULL) {
+ if (vv == NULL || !PyLong_Check(vv)) {
PyErr_BadInternalCall();
return -1;
}
- if (!PyLong_Check(vv)) {
- PyErr_SetString(PyExc_TypeError, "an integer is required");
- return -1;
- }
-
v = (PyLongObject *)vv;
i = Py_SIZE(v);
- switch (i) {
- case -1: return -(sdigit)v->ob_digit[0];
- case 0: return 0;
- case 1: return v->ob_digit[0];
- }
sign = 1;
x = 0;
if (i < 0) {
@@ -653,118 +398,73 @@ PyLong_AsSsize_t(PyObject *vv) {
overflow:
PyErr_SetString(PyExc_OverflowError,
- "Python int too large to convert to C ssize_t");
+ "long int too large to convert to int");
return -1;
}
-/* Get a C unsigned long int from an int object.
+/* Get a C unsigned long int from a long int object.
Returns -1 and sets an error condition if overflow occurs. */
unsigned long
PyLong_AsUnsignedLong(PyObject *vv)
{
- PyLongObject *v;
+ register PyLongObject *v;
unsigned long x, prev;
Py_ssize_t i;
- if (vv == NULL) {
+ if (vv == NULL || !PyLong_Check(vv)) {
+ if (vv != NULL && PyInt_Check(vv)) {
+ long val = PyInt_AsLong(vv);
+ if (val < 0) {
+ PyErr_SetString(PyExc_OverflowError,
+ "can't convert negative value "
+ "to unsigned long");
+ return (unsigned long) -1;
+ }
+ return val;
+ }
PyErr_BadInternalCall();
- return (unsigned long)-1;
- }
- if (!PyLong_Check(vv)) {
- PyErr_SetString(PyExc_TypeError, "an integer is required");
- return (unsigned long)-1;
+ return (unsigned long) -1;
}
-
v = (PyLongObject *)vv;
i = Py_SIZE(v);
x = 0;
if (i < 0) {
PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to unsigned int");
+ "can't convert negative value to unsigned long");
return (unsigned long) -1;
}
- switch (i) {
- case 0: return 0;
- case 1: return v->ob_digit[0];
- }
while (--i >= 0) {
prev = x;
x = (x << PyLong_SHIFT) | v->ob_digit[i];
if ((x >> PyLong_SHIFT) != prev) {
PyErr_SetString(PyExc_OverflowError,
- "Python int too large to convert "
- "to C unsigned long");
+ "long int too large to convert");
return (unsigned long) -1;
}
}
return x;
}
-/* Get a C size_t from an int object. Returns (size_t)-1 and sets
- an error condition if overflow occurs. */
-
-size_t
-PyLong_AsSize_t(PyObject *vv)
-{
- PyLongObject *v;
- size_t x, prev;
- Py_ssize_t i;
-
- if (vv == NULL) {
- PyErr_BadInternalCall();
- return (size_t) -1;
- }
- if (!PyLong_Check(vv)) {
- PyErr_SetString(PyExc_TypeError, "an integer is required");
- return (size_t)-1;
- }
-
- v = (PyLongObject *)vv;
- i = Py_SIZE(v);
- x = 0;
- if (i < 0) {
- PyErr_SetString(PyExc_OverflowError,
- "can't convert negative value to size_t");
- return (size_t) -1;
- }
- switch (i) {
- case 0: return 0;
- case 1: return v->ob_digit[0];
- }
- while (--i >= 0) {
- prev = x;
- x = (x << PyLong_SHIFT) | v->ob_digit[i];
- if ((x >> PyLong_SHIFT) != prev) {
- PyErr_SetString(PyExc_OverflowError,
- "Python int too large to convert to C size_t");
- return (size_t) -1;
- }
- }
- return x;
-}
-
-/* Get a C unsigned long int from an int object, ignoring the high bits.
+/* Get a C unsigned long int from a long int object, ignoring the high bits.
Returns -1 and sets an error condition if an error occurs. */
-static unsigned long
-_PyLong_AsUnsignedLongMask(PyObject *vv)
+unsigned long
+PyLong_AsUnsignedLongMask(PyObject *vv)
{
- PyLongObject *v;
+ register PyLongObject *v;
unsigned long x;
Py_ssize_t i;
int sign;
if (vv == NULL || !PyLong_Check(vv)) {
+ if (vv != NULL && PyInt_Check(vv))
+ return PyInt_AsUnsignedLongMask(vv);
PyErr_BadInternalCall();
return (unsigned long) -1;
}
v = (PyLongObject *)vv;
i = Py_SIZE(v);
- switch (i) {
- case 0: return 0;
- case 1: return v->ob_digit[0];
- }
sign = 1;
x = 0;
if (i < 0) {
@@ -777,30 +477,6 @@ _PyLong_AsUnsignedLongMask(PyObject *vv)
return x * sign;
}
-unsigned long
-PyLong_AsUnsignedLongMask(PyObject *op)
-{
- PyLongObject *lo;
- unsigned long val;
-
- if (op == NULL) {
- PyErr_BadInternalCall();
- return (unsigned long)-1;
- }
-
- if (PyLong_Check(op)) {
- return _PyLong_AsUnsignedLongMask(op);
- }
-
- lo = (PyLongObject *)_PyLong_FromNbIndexOrNbInt(op);
- if (lo == NULL)
- return (unsigned long)-1;
-
- val = _PyLong_AsUnsignedLongMask((PyObject *)lo);
- Py_DECREF(lo);
- return val;
-}
-
int
_PyLong_Sign(PyObject *vv)
{
@@ -812,52 +488,34 @@ _PyLong_Sign(PyObject *vv)
return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1);
}
-/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
- 2**k if d is nonzero, else 0. */
-
-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_digit(digit d)
-{
- int d_bits = 0;
- while (d >= 32) {
- d_bits += 6;
- d >>= 6;
- }
- d_bits += (int)BitLengthTable[d];
- return d_bits;
-}
-
size_t
_PyLong_NumBits(PyObject *vv)
{
PyLongObject *v = (PyLongObject *)vv;
size_t result = 0;
Py_ssize_t ndigits;
- int msd_bits;
assert(v != NULL);
assert(PyLong_Check(v));
- ndigits = Py_ABS(Py_SIZE(v));
+ ndigits = ABS(Py_SIZE(v));
assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
if (ndigits > 0) {
digit msd = v->ob_digit[ndigits - 1];
- if ((size_t)(ndigits - 1) > SIZE_MAX / (size_t)PyLong_SHIFT)
- goto Overflow;
- result = (size_t)(ndigits - 1) * (size_t)PyLong_SHIFT;
- msd_bits = bits_in_digit(msd);
- if (SIZE_MAX - msd_bits < result)
+
+ result = (ndigits - 1) * PyLong_SHIFT;
+ if (result / PyLong_SHIFT != (size_t)(ndigits - 1))
goto Overflow;
- result += msd_bits;
+ do {
+ ++result;
+ if (result == 0)
+ goto Overflow;
+ msd >>= 1;
+ } while (msd);
}
return result;
Overflow:
- PyErr_SetString(PyExc_OverflowError, "int has too many bits "
+ PyErr_SetString(PyExc_OverflowError, "long has too many bits "
"to express in a platform size_t");
return (size_t)-1;
}
@@ -870,7 +528,7 @@ _PyLong_FromByteArray(const unsigned char* bytes, size_t n,
int incr; /* direction to move pstartbyte */
const unsigned char* pendbyte; /* MSB of bytes */
size_t numsignificantbytes; /* number of bytes that matter */
- Py_ssize_t ndigits; /* number of Python int digits */
+ Py_ssize_t ndigits; /* number of Python long digits */
PyLongObject* v; /* result */
Py_ssize_t idigit = 0; /* next free index in v->ob_digit */
@@ -914,8 +572,8 @@ _PyLong_FromByteArray(const unsigned char* bytes, size_t n,
++numsignificantbytes;
}
- /* How many Python int digits do we need? We have
- 8*numsignificantbytes bits, and each Python int digit has
+ /* How many Python long digits do we need? We have
+ 8*numsignificantbytes bits, and each Python long digit has
PyLong_SHIFT bits, so it's the ceiling of the quotient. */
/* catch overflow before it happens */
if (numsignificantbytes > (PY_SSIZE_T_MAX - PyLong_SHIFT) / 8) {
@@ -949,7 +607,7 @@ _PyLong_FromByteArray(const unsigned char* bytes, size_t n,
/* Because we're going LSB to MSB, thisbyte is
more significant than what's already in accum,
so needs to be prepended to accum. */
- accum |= thisbyte << accumbits;
+ accum |= (twodigits)thisbyte << accumbits;
accumbits += 8;
if (accumbits >= PyLong_SHIFT) {
/* There's enough to fill a Python digit. */
@@ -994,7 +652,7 @@ _PyLong_AsByteArray(PyLongObject* v,
ndigits = -(Py_SIZE(v));
if (!is_signed) {
PyErr_SetString(PyExc_OverflowError,
- "can't convert negative int to unsigned");
+ "can't convert negative long to unsigned");
return -1;
}
do_twos_comp = 1;
@@ -1015,7 +673,7 @@ _PyLong_AsByteArray(PyLongObject* v,
/* Copy over all the Python digits.
It's crucial that every Python digit except for the MSD contribute
- exactly PyLong_SHIFT bits to the total, so first assert that the int is
+ exactly PyLong_SHIFT bits to the total, so first assert that the long is
normalized. */
assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
j = 0;
@@ -1070,7 +728,7 @@ _PyLong_AsByteArray(PyLongObject* v,
++j;
if (do_twos_comp) {
/* Fill leading bits of the byte with sign bits
- (appropriately pretending that the int had an
+ (appropriately pretending that the long had an
infinite supply of sign bits). */
accum |= (~(twodigits)0) << accumbits;
}
@@ -1101,48 +759,67 @@ _PyLong_AsByteArray(PyLongObject* v,
return 0;
Overflow:
- PyErr_SetString(PyExc_OverflowError, "int too big to convert");
+ PyErr_SetString(PyExc_OverflowError, "long too big to convert");
return -1;
}
-/* Create a new int object from a C pointer */
+/* Create a new long (or int) object from a C pointer */
PyObject *
PyLong_FromVoidPtr(void *p)
{
#if SIZEOF_VOID_P <= SIZEOF_LONG
- return PyLong_FromUnsignedLong((unsigned long)(uintptr_t)p);
+ if ((long)p < 0)
+ return PyLong_FromUnsignedLong((unsigned long)p);
+ return PyInt_FromLong((long)p);
#else
+#ifndef HAVE_LONG_LONG
+# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
+#endif
#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
-# error "PyLong_FromVoidPtr: sizeof(long long) < sizeof(void*)"
+# error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
#endif
- return PyLong_FromUnsignedLongLong((unsigned long long)(uintptr_t)p);
-#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
+ /* optimize null pointers */
+ if (p == NULL)
+ return PyInt_FromLong(0);
+ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)p);
+#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
}
-/* Get a C pointer from an int object. */
+/* Get a C pointer from a long object (or an int object in some cases) */
void *
PyLong_AsVoidPtr(PyObject *vv)
{
+ /* This function will allow int or long objects. If vv is neither,
+ then the PyLong_AsLong*() functions will raise the exception:
+ PyExc_SystemError, "bad argument to internal function"
+ */
#if SIZEOF_VOID_P <= SIZEOF_LONG
long x;
- if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
+ if (PyInt_Check(vv))
+ x = PyInt_AS_LONG(vv);
+ else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
x = PyLong_AsLong(vv);
else
x = PyLong_AsUnsignedLong(vv);
#else
+#ifndef HAVE_LONG_LONG
+# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
+#endif
#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
-# error "PyLong_AsVoidPtr: sizeof(long long) < sizeof(void*)"
+# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
#endif
- long long x;
+ PY_LONG_LONG x;
- if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
+ if (PyInt_Check(vv))
+ x = PyInt_AS_LONG(vv);
+ else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
x = PyLong_AsLongLong(vv);
else
x = PyLong_AsUnsignedLongLong(vv);
@@ -1154,35 +831,34 @@ PyLong_AsVoidPtr(PyObject *vv)
return (void *)x;
}
-/* Initial long long support by Chris Herborth (chrish@qnx.com), later
+#ifdef HAVE_LONG_LONG
+
+/* Initial PY_LONG_LONG support by Chris Herborth (chrish@qnx.com), later
* rewritten to use the newer PyLong_{As,From}ByteArray API.
*/
-#define PY_ABS_LLONG_MIN (0-(unsigned long long)LLONG_MIN)
+#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
+#define PY_ABS_LLONG_MIN (0-(unsigned PY_LONG_LONG)PY_LLONG_MIN)
-/* Create a new int object from a C long long int. */
+/* Create a new long int object from a C PY_LONG_LONG int. */
PyObject *
-PyLong_FromLongLong(long long ival)
+PyLong_FromLongLong(PY_LONG_LONG ival)
{
PyLongObject *v;
- unsigned long long abs_ival;
- unsigned long long t; /* unsigned so >> doesn't propagate sign bit */
+ unsigned PY_LONG_LONG abs_ival;
+ unsigned PY_LONG_LONG t; /* unsigned so >> doesn't propagate sign bit */
int ndigits = 0;
int negative = 0;
- if (IS_SMALL_INT(ival)) {
- return get_small_int((sdigit)ival);
- }
-
if (ival < 0) {
/* avoid signed overflow on negation; see comments
in PyLong_FromLong above. */
- abs_ival = (unsigned long long)(-1-ival) + 1;
+ abs_ival = (unsigned PY_LONG_LONG)(-1-ival) + 1;
negative = 1;
}
else {
- abs_ival = (unsigned long long)ival;
+ abs_ival = (unsigned PY_LONG_LONG)ival;
}
/* Count the number of Python digits.
@@ -1207,32 +883,17 @@ PyLong_FromLongLong(long long ival)
return (PyObject *)v;
}
-/* Create a new int object from a C Py_ssize_t. */
+/* Create a new long int object from a C unsigned PY_LONG_LONG int. */
PyObject *
-PyLong_FromSsize_t(Py_ssize_t ival)
+PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG ival)
{
PyLongObject *v;
- size_t abs_ival;
- size_t t; /* unsigned so >> doesn't propagate sign bit */
+ unsigned PY_LONG_LONG t;
int ndigits = 0;
- int negative = 0;
-
- if (IS_SMALL_INT(ival)) {
- return get_small_int((sdigit)ival);
- }
-
- if (ival < 0) {
- /* avoid signed overflow when ival = SIZE_T_MIN */
- abs_ival = (size_t)(-1-ival)+1;
- negative = 1;
- }
- else {
- abs_ival = (size_t)ival;
- }
/* Count the number of Python digits. */
- t = abs_ival;
+ t = (unsigned PY_LONG_LONG)ival;
while (t) {
++ndigits;
t >>= PyLong_SHIFT;
@@ -1240,123 +901,130 @@ PyLong_FromSsize_t(Py_ssize_t ival)
v = _PyLong_New(ndigits);
if (v != NULL) {
digit *p = v->ob_digit;
- Py_SIZE(v) = negative ? -ndigits : ndigits;
- t = abs_ival;
- while (t) {
- *p++ = (digit)(t & PyLong_MASK);
- t >>= PyLong_SHIFT;
+ Py_SIZE(v) = ndigits;
+ while (ival) {
+ *p++ = (digit)(ival & PyLong_MASK);
+ ival >>= PyLong_SHIFT;
}
}
return (PyObject *)v;
}
-/* Get a C long long int from an int object or any object that has an
- __int__ method. Return -1 and set an error if overflow occurs. */
+/* Create a new long int object from a C Py_ssize_t. */
-long long
+PyObject *
+PyLong_FromSsize_t(Py_ssize_t ival)
+{
+ Py_ssize_t bytes = ival;
+ int one = 1;
+ return _PyLong_FromByteArray((unsigned char *)&bytes,
+ SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 1);
+}
+
+/* Create a new long int object from a C size_t. */
+
+PyObject *
+PyLong_FromSize_t(size_t ival)
+{
+ size_t bytes = ival;
+ int one = 1;
+ return _PyLong_FromByteArray((unsigned char *)&bytes,
+ SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0);
+}
+
+/* Get a C PY_LONG_LONG int from a long int object.
+ Return -1 and set an error if overflow occurs. */
+
+PY_LONG_LONG
PyLong_AsLongLong(PyObject *vv)
{
- PyLongObject *v;
- long long bytes;
+ PY_LONG_LONG bytes;
+ int one = 1;
int res;
- int do_decref = 0; /* if nb_int was called */
if (vv == NULL) {
PyErr_BadInternalCall();
return -1;
}
-
- if (PyLong_Check(vv)) {
- v = (PyLongObject *)vv;
- }
- else {
- v = (PyLongObject *)_PyLong_FromNbIndexOrNbInt(vv);
- if (v == NULL)
+ if (!PyLong_Check(vv)) {
+ PyNumberMethods *nb;
+ PyObject *io;
+ if (PyInt_Check(vv))
+ return (PY_LONG_LONG)PyInt_AsLong(vv);
+ if ((nb = Py_TYPE(vv)->tp_as_number) == NULL ||
+ nb->nb_int == NULL) {
+ PyErr_SetString(PyExc_TypeError, "an integer is required");
return -1;
- do_decref = 1;
+ }
+ io = (*nb->nb_int) (vv);
+ if (io == NULL)
+ return -1;
+ if (PyInt_Check(io)) {
+ bytes = PyInt_AsLong(io);
+ Py_DECREF(io);
+ return bytes;
+ }
+ if (PyLong_Check(io)) {
+ bytes = PyLong_AsLongLong(io);
+ Py_DECREF(io);
+ return bytes;
+ }
+ Py_DECREF(io);
+ PyErr_SetString(PyExc_TypeError, "integer conversion failed");
+ return -1;
}
- res = 0;
- switch(Py_SIZE(v)) {
- case -1:
- bytes = -(sdigit)v->ob_digit[0];
- break;
- case 0:
- bytes = 0;
- break;
- case 1:
- bytes = v->ob_digit[0];
- break;
- default:
- res = _PyLong_AsByteArray((PyLongObject *)v, (unsigned char *)&bytes,
- SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 1);
- }
- if (do_decref) {
- Py_DECREF(v);
- }
+ res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes,
+ SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
- /* Plan 9 can't handle long long in ? : expressions */
+ /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
if (res < 0)
- return (long long)-1;
+ return (PY_LONG_LONG)-1;
else
return bytes;
}
-/* Get a C unsigned long long int from an int object.
+/* Get a C unsigned PY_LONG_LONG int from a long int object.
Return -1 and set an error if overflow occurs. */
-unsigned long long
+unsigned PY_LONG_LONG
PyLong_AsUnsignedLongLong(PyObject *vv)
{
- PyLongObject *v;
- unsigned long long bytes;
+ unsigned PY_LONG_LONG bytes;
+ int one = 1;
int res;
- if (vv == NULL) {
+ if (vv == NULL || !PyLong_Check(vv)) {
PyErr_BadInternalCall();
- return (unsigned long long)-1;
- }
- if (!PyLong_Check(vv)) {
- PyErr_SetString(PyExc_TypeError, "an integer is required");
- return (unsigned long long)-1;
- }
-
- v = (PyLongObject*)vv;
- switch(Py_SIZE(v)) {
- case 0: return 0;
- case 1: return v->ob_digit[0];
+ return (unsigned PY_LONG_LONG)-1;
}
res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes,
- SIZEOF_LONG_LONG, PY_LITTLE_ENDIAN, 0);
+ SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
- /* Plan 9 can't handle long long in ? : expressions */
+ /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
if (res < 0)
- return (unsigned long long)res;
+ return (unsigned PY_LONG_LONG)res;
else
return bytes;
}
-/* Get a C unsigned long int from an int object, ignoring the high bits.
+/* Get a C unsigned long int from a long int object, ignoring the high bits.
Returns -1 and sets an error condition if an error occurs. */
-static unsigned long long
-_PyLong_AsUnsignedLongLongMask(PyObject *vv)
+unsigned PY_LONG_LONG
+PyLong_AsUnsignedLongLongMask(PyObject *vv)
{
- PyLongObject *v;
- unsigned long long x;
+ register PyLongObject *v;
+ unsigned PY_LONG_LONG x;
Py_ssize_t i;
int sign;
if (vv == NULL || !PyLong_Check(vv)) {
PyErr_BadInternalCall();
- return (unsigned long long) -1;
+ return (unsigned PY_LONG_LONG) -1;
}
v = (PyLongObject *)vv;
- switch(Py_SIZE(v)) {
- case 0: return 0;
- case 1: return v->ob_digit[0];
- }
i = Py_SIZE(v);
sign = 1;
x = 0;
@@ -1370,47 +1038,21 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv)
return x * sign;
}
-unsigned long long
-PyLong_AsUnsignedLongLongMask(PyObject *op)
-{
- PyLongObject *lo;
- unsigned long long val;
-
- if (op == NULL) {
- PyErr_BadInternalCall();
- return (unsigned long long)-1;
- }
+/* Get a C long long int from a Python long or Python int object.
+ On overflow, returns -1 and sets *overflow to 1 or -1 depending
+ on the sign of the result. Otherwise *overflow is 0.
- if (PyLong_Check(op)) {
- return _PyLong_AsUnsignedLongLongMask(op);
- }
-
- lo = (PyLongObject *)_PyLong_FromNbIndexOrNbInt(op);
- if (lo == NULL)
- return (unsigned long long)-1;
-
- val = _PyLong_AsUnsignedLongLongMask((PyObject *)lo);
- Py_DECREF(lo);
- return val;
-}
-
-/* Get a C long long int from an int object or any object that has an
- __int__ method.
-
- On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of
- the result. Otherwise *overflow is 0.
-
- For other errors (e.g., TypeError), return -1 and set an error condition.
- In this case *overflow will be 0.
+ For other errors (e.g., type error), returns -1 and sets an error
+ condition.
*/
-long long
+PY_LONG_LONG
PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
{
/* This version by Tim Peters */
- PyLongObject *v;
- unsigned long long x, prev;
- long long res;
+ register PyLongObject *v;
+ unsigned PY_LONG_LONG x, prev;
+ PY_LONG_LONG res;
Py_ssize_t i;
int sign;
int do_decref = 0; /* if nb_int was called */
@@ -1421,17 +1063,35 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
return -1;
}
- if (PyLong_Check(vv)) {
- v = (PyLongObject *)vv;
- }
- else {
- v = (PyLongObject *)_PyLong_FromNbIndexOrNbInt(vv);
- if (v == NULL)
+ if (PyInt_Check(vv))
+ return PyInt_AsLong(vv);
+
+ if (!PyLong_Check(vv)) {
+ PyNumberMethods *nb;
+ nb = Py_TYPE(vv)->tp_as_number;
+ if (nb == NULL || nb->nb_int == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "an integer is required");
+ return -1;
+ }
+ vv = (*nb->nb_int) (vv);
+ if (vv == NULL)
return -1;
do_decref = 1;
+ if(PyInt_Check(vv)) {
+ res = PyInt_AsLong(vv);
+ goto exit;
+ }
+ if (!PyLong_Check(vv)) {
+ Py_DECREF(vv);
+ PyErr_SetString(PyExc_TypeError,
+ "nb_int should return int object");
+ return -1;
+ }
}
res = -1;
+ v = (PyLongObject *)vv;
i = Py_SIZE(v);
switch (i) {
@@ -1462,11 +1122,11 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
/* Haven't lost any bits, but casting to long requires extra
* care (see comment above).
*/
- if (x <= (unsigned long long)LLONG_MAX) {
- res = (long long)x * sign;
+ if (x <= (unsigned PY_LONG_LONG)PY_LLONG_MAX) {
+ res = (PY_LONG_LONG)x * sign;
}
else if (sign < 0 && x == PY_ABS_LLONG_MIN) {
- res = LLONG_MIN;
+ res = PY_LLONG_MIN;
}
else {
*overflow = sign;
@@ -1475,113 +1135,70 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
}
exit:
if (do_decref) {
- Py_DECREF(v);
+ Py_DECREF(vv);
}
return res;
}
-int
-_PyLong_UnsignedShort_Converter(PyObject *obj, void *ptr)
-{
- unsigned long uval;
+#undef IS_LITTLE_ENDIAN
- if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
- PyErr_SetString(PyExc_ValueError, "value must be positive");
- return 0;
- }
- uval = PyLong_AsUnsignedLong(obj);
- if (uval == (unsigned long)-1 && PyErr_Occurred())
- return 0;
- if (uval > USHRT_MAX) {
- PyErr_SetString(PyExc_OverflowError,
- "Python int too large for C unsigned short");
- return 0;
- }
-
- *(unsigned short *)ptr = Py_SAFE_DOWNCAST(uval, unsigned long, unsigned short);
- return 1;
-}
+#endif /* HAVE_LONG_LONG */
-int
-_PyLong_UnsignedInt_Converter(PyObject *obj, void *ptr)
-{
- unsigned long uval;
- if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
- PyErr_SetString(PyExc_ValueError, "value must be positive");
- return 0;
+static int
+convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
+ if (PyLong_Check(v)) {
+ *a = (PyLongObject *) v;
+ Py_INCREF(v);
}
- uval = PyLong_AsUnsignedLong(obj);
- if (uval == (unsigned long)-1 && PyErr_Occurred())
- return 0;
- if (uval > UINT_MAX) {
- PyErr_SetString(PyExc_OverflowError,
- "Python int too large for C unsigned int");
- return 0;
+ else if (PyInt_Check(v)) {
+ *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
}
-
- *(unsigned int *)ptr = Py_SAFE_DOWNCAST(uval, unsigned long, unsigned int);
- return 1;
-}
-
-int
-_PyLong_UnsignedLong_Converter(PyObject *obj, void *ptr)
-{
- unsigned long uval;
-
- if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
- PyErr_SetString(PyExc_ValueError, "value must be positive");
+ else {
return 0;
}
- uval = PyLong_AsUnsignedLong(obj);
- if (uval == (unsigned long)-1 && PyErr_Occurred())
+ if (PyLong_Check(w)) {
+ *b = (PyLongObject *) w;
+ Py_INCREF(w);
+ }
+ else if (PyInt_Check(w)) {
+ *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
+ }
+ else {
+ Py_DECREF(*a);
return 0;
-
- *(unsigned long *)ptr = uval;
+ }
return 1;
}
-int
-_PyLong_UnsignedLongLong_Converter(PyObject *obj, void *ptr)
-{
- unsigned long long uval;
+#define CONVERT_BINOP(v, w, a, b) \
+ do { \
+ if (!convert_binop(v, w, a, b)) { \
+ Py_INCREF(Py_NotImplemented); \
+ return Py_NotImplemented; \
+ } \
+ } while(0) \
- if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
- PyErr_SetString(PyExc_ValueError, "value must be positive");
- return 0;
- }
- uval = PyLong_AsUnsignedLongLong(obj);
- if (uval == (unsigned long long)-1 && PyErr_Occurred())
- return 0;
+/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
+ 2**k if d is nonzero, else 0. */
- *(unsigned long long *)ptr = uval;
- return 1;
-}
+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
+};
-int
-_PyLong_Size_t_Converter(PyObject *obj, void *ptr)
+static int
+bits_in_digit(digit d)
{
- size_t uval;
-
- if (PyLong_Check(obj) && _PyLong_Sign(obj) < 0) {
- PyErr_SetString(PyExc_ValueError, "value must be positive");
- return 0;
+ int d_bits = 0;
+ while (d >= 32) {
+ d_bits += 6;
+ d >>= 6;
}
- uval = PyLong_AsSize_t(obj);
- if (uval == (size_t)-1 && PyErr_Occurred())
- return 0;
-
- *(size_t *)ptr = uval;
- return 1;
+ d_bits += (int)BitLengthTable[d];
+ return d_bits;
}
-
-#define CHECK_BINOP(v,w) \
- do { \
- if (!PyLong_Check(v) || !PyLong_Check(w)) \
- Py_RETURN_NOTIMPLEMENTED; \
- } while(0)
-
/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
* is modified in place, by adding y to it. Carries are propagated as far as
* x[m-1], and the remaining carry (0 or 1) is returned.
@@ -1674,7 +1291,7 @@ v_rshift(digit *z, digit *a, Py_ssize_t m, int d)
/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
in pout, and returning the remainder. pin and pout point at the LSD.
It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
- _PyLong_Format, but that should be done with great care since ints are
+ _PyLong_Format, but that should be done with great care since longs are
immutable. */
static digit
@@ -1694,14 +1311,14 @@ inplace_divrem1(digit *pout, digit *pin, Py_ssize_t size, digit n)
return (digit)rem;
}
-/* Divide an integer by a digit, returning both the quotient
+/* Divide a long integer by a digit, returning both the quotient
(as function result) and the remainder (through *prem).
The sign of a is ignored; n should not be zero. */
static PyLongObject *
divrem1(PyLongObject *a, digit n, digit *prem)
{
- const Py_ssize_t size = Py_ABS(Py_SIZE(a));
+ const Py_ssize_t size = ABS(Py_SIZE(a));
PyLongObject *z;
assert(n > 0 && n <= PyLong_MASK);
@@ -1712,31 +1329,26 @@ divrem1(PyLongObject *a, digit n, digit *prem)
return long_normalize(z);
}
-/* Convert an integer to a base 10 string. Returns a new non-shared
+/* Convert a long integer to a base 10 string. Returns a new non-shared
string. (Return value is non-shared so that callers can modify the
returned value if necessary.) */
-static int
-long_to_decimal_string_internal(PyObject *aa,
- PyObject **p_output,
- _PyUnicodeWriter *writer,
- _PyBytesWriter *bytes_writer,
- char **bytes_str)
+static PyObject *
+long_to_decimal_string(PyObject *aa, int addL)
{
PyLongObject *scratch, *a;
- PyObject *str = NULL;
+ PyObject *str;
Py_ssize_t size, strlen, size_a, i, j;
digit *pout, *pin, rem, tenpow;
+ char *p;
int negative;
- int d;
- enum PyUnicode_Kind kind;
a = (PyLongObject *)aa;
if (a == NULL || !PyLong_Check(a)) {
PyErr_BadInternalCall();
- return -1;
+ return NULL;
}
- size_a = Py_ABS(Py_SIZE(a));
+ size_a = ABS(Py_SIZE(a));
negative = Py_SIZE(a) < 0;
/* quick and dirty upper bound for the number of digits
@@ -1746,20 +1358,18 @@ long_to_decimal_string_internal(PyObject *aa,
But log2(a) < size_a * PyLong_SHIFT, and
log2(_PyLong_DECIMAL_BASE) = log2(10) * _PyLong_DECIMAL_SHIFT
- > 3.3 * _PyLong_DECIMAL_SHIFT
-
- size_a * PyLong_SHIFT / (3.3 * _PyLong_DECIMAL_SHIFT) =
- size_a + size_a / d < size_a + size_a / floor(d),
- where d = (3.3 * _PyLong_DECIMAL_SHIFT) /
- (PyLong_SHIFT - 3.3 * _PyLong_DECIMAL_SHIFT)
+ > 3 * _PyLong_DECIMAL_SHIFT
*/
- d = (33 * _PyLong_DECIMAL_SHIFT) /
- (10 * PyLong_SHIFT - 33 * _PyLong_DECIMAL_SHIFT);
- assert(size_a < PY_SSIZE_T_MAX/2);
- size = 1 + size_a + size_a / d;
+ if (size_a > PY_SSIZE_T_MAX / PyLong_SHIFT) {
+ PyErr_SetString(PyExc_OverflowError,
+ "long is too large to format");
+ return NULL;
+ }
+ /* the expression size_a * PyLong_SHIFT is now safe from overflow */
+ size = 1 + size_a * PyLong_SHIFT / (3 * _PyLong_DECIMAL_SHIFT);
scratch = _PyLong_New(size);
if (scratch == NULL)
- return -1;
+ return NULL;
/* convert array of base _PyLong_BASE digits in pin to an array of
base _PyLong_DECIMAL_BASE digits in pout, following Knuth (TAOCP,
@@ -1782,7 +1392,7 @@ long_to_decimal_string_internal(PyObject *aa,
/* check for keyboard interrupt */
SIGCHECK({
Py_DECREF(scratch);
- return -1;
+ return NULL;
});
}
/* pout should have at least one digit, so that the case when a = 0
@@ -1791,332 +1401,222 @@ long_to_decimal_string_internal(PyObject *aa,
pout[size++] = 0;
/* calculate exact length of output string, and allocate */
- strlen = negative + 1 + (size - 1) * _PyLong_DECIMAL_SHIFT;
+ strlen = (addL != 0) + negative +
+ 1 + (size - 1) * _PyLong_DECIMAL_SHIFT;
tenpow = 10;
rem = pout[size-1];
while (rem >= tenpow) {
tenpow *= 10;
strlen++;
}
- if (writer) {
- if (_PyUnicodeWriter_Prepare(writer, strlen, '9') == -1) {
- Py_DECREF(scratch);
- return -1;
- }
- kind = writer->kind;
- }
- else if (bytes_writer) {
- *bytes_str = _PyBytesWriter_Prepare(bytes_writer, *bytes_str, strlen);
- if (*bytes_str == NULL) {
- Py_DECREF(scratch);
- return -1;
- }
+ str = PyString_FromStringAndSize(NULL, strlen);
+ if (str == NULL) {
+ Py_DECREF(scratch);
+ return NULL;
}
- else {
- str = PyUnicode_New(strlen, '9');
- if (str == NULL) {
- Py_DECREF(scratch);
- return -1;
- }
- kind = PyUnicode_KIND(str);
- }
-
-#define WRITE_DIGITS(p) \
- do { \
- /* pout[0] through pout[size-2] contribute exactly \
- _PyLong_DECIMAL_SHIFT digits each */ \
- for (i=0; i < size - 1; i++) { \
- rem = pout[i]; \
- for (j = 0; j < _PyLong_DECIMAL_SHIFT; j++) { \
- *--p = '0' + rem % 10; \
- rem /= 10; \
- } \
- } \
- /* pout[size-1]: always produce at least one decimal digit */ \
- rem = pout[i]; \
- do { \
- *--p = '0' + rem % 10; \
- rem /= 10; \
- } while (rem != 0); \
- \
- /* and sign */ \
- if (negative) \
- *--p = '-'; \
- } while (0)
-
-#define WRITE_UNICODE_DIGITS(TYPE) \
- do { \
- if (writer) \
- p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + strlen; \
- else \
- p = (TYPE*)PyUnicode_DATA(str) + strlen; \
- \
- WRITE_DIGITS(p); \
- \
- /* check we've counted correctly */ \
- if (writer) \
- assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \
- else \
- assert(p == (TYPE*)PyUnicode_DATA(str)); \
- } while (0)
/* fill the string right-to-left */
- if (bytes_writer) {
- char *p = *bytes_str + strlen;
- WRITE_DIGITS(p);
- assert(p == *bytes_str);
- }
- else if (kind == PyUnicode_1BYTE_KIND) {
- Py_UCS1 *p;
- WRITE_UNICODE_DIGITS(Py_UCS1);
- }
- else if (kind == PyUnicode_2BYTE_KIND) {
- Py_UCS2 *p;
- WRITE_UNICODE_DIGITS(Py_UCS2);
- }
- else {
- Py_UCS4 *p;
- assert (kind == PyUnicode_4BYTE_KIND);
- WRITE_UNICODE_DIGITS(Py_UCS4);
+ p = PyString_AS_STRING(str) + strlen;
+ *p = '\0';
+ if (addL)
+ *--p = 'L';
+ /* pout[0] through pout[size-2] contribute exactly
+ _PyLong_DECIMAL_SHIFT digits each */
+ for (i=0; i < size - 1; i++) {
+ rem = pout[i];
+ for (j = 0; j < _PyLong_DECIMAL_SHIFT; j++) {
+ *--p = '0' + rem % 10;
+ rem /= 10;
+ }
}
-#undef WRITE_DIGITS
-#undef WRITE_UNICODE_DIGITS
+ /* pout[size-1]: always produce at least one decimal digit */
+ rem = pout[i];
+ do {
+ *--p = '0' + rem % 10;
+ rem /= 10;
+ } while (rem != 0);
- Py_DECREF(scratch);
- if (writer) {
- writer->pos += strlen;
- }
- else if (bytes_writer) {
- (*bytes_str) += strlen;
- }
- else {
- assert(_PyUnicode_CheckConsistency(str, 1));
- *p_output = (PyObject *)str;
- }
- return 0;
-}
+ /* and sign */
+ if (negative)
+ *--p = '-';
-static PyObject *
-long_to_decimal_string(PyObject *aa)
-{
- PyObject *v;
- if (long_to_decimal_string_internal(aa, &v, NULL, NULL, NULL) == -1)
- return NULL;
- return v;
+ /* check we've counted correctly */
+ assert(p == PyString_AS_STRING(str));
+ Py_DECREF(scratch);
+ return (PyObject *)str;
}
-/* Convert an int object to a string, using a given conversion base,
- which should be one of 2, 8 or 16. Return a string object.
- If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'
- if alternate is nonzero. */
-
-static int
-long_format_binary(PyObject *aa, int base, int alternate,
- PyObject **p_output, _PyUnicodeWriter *writer,
- _PyBytesWriter *bytes_writer, char **bytes_str)
+/* Convert the long to a string object with given base,
+ appending a base prefix of 0[box] if base is 2, 8 or 16.
+ Add a trailing "L" if addL is non-zero.
+ If newstyle is zero, then use the pre-2.6 behavior of octal having
+ a leading "0", instead of the prefix "0o" */
+PyAPI_FUNC(PyObject *)
+_PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
{
- PyLongObject *a = (PyLongObject *)aa;
- PyObject *v = NULL;
- Py_ssize_t sz;
+ register PyLongObject *a = (PyLongObject *)aa;
+ PyStringObject *str;
+ Py_ssize_t i, sz;
Py_ssize_t size_a;
- enum PyUnicode_Kind kind;
- int negative;
+ char *p;
int bits;
+ char sign = '\0';
+
+ if (base == 10)
+ return long_to_decimal_string((PyObject *)a, addL);
- assert(base == 2 || base == 8 || base == 16);
if (a == NULL || !PyLong_Check(a)) {
PyErr_BadInternalCall();
- return -1;
+ return NULL;
}
- size_a = Py_ABS(Py_SIZE(a));
- negative = Py_SIZE(a) < 0;
+ assert(base >= 2 && base <= 36);
+ size_a = ABS(Py_SIZE(a));
/* Compute a rough upper bound for the length of the string */
- switch (base) {
- case 16:
- bits = 4;
- break;
- case 8:
- bits = 3;
- break;
- case 2:
- bits = 1;
- break;
- default:
- Py_UNREACHABLE();
- }
-
- /* Compute exact length 'sz' of output string. */
- if (size_a == 0) {
- sz = 1;
- }
- else {
- Py_ssize_t size_a_in_bits;
- /* Ensure overflow doesn't occur during computation of sz. */
- if (size_a > (PY_SSIZE_T_MAX - 3) / PyLong_SHIFT) {
- PyErr_SetString(PyExc_OverflowError,
- "int too large to format");
- return -1;
- }
- size_a_in_bits = (size_a - 1) * PyLong_SHIFT +
- bits_in_digit(a->ob_digit[size_a - 1]);
- /* Allow 1 character for a '-' sign. */
- sz = negative + (size_a_in_bits + (bits - 1)) / bits;
- }
- if (alternate) {
- /* 2 characters for prefix */
- sz += 2;
+ i = base;
+ bits = 0;
+ while (i > 1) {
+ ++bits;
+ i >>= 1;
+ }
+ i = 5 + (addL ? 1 : 0);
+ /* ensure we don't get signed overflow in sz calculation */
+ if (size_a > (PY_SSIZE_T_MAX - i) / PyLong_SHIFT) {
+ PyErr_SetString(PyExc_OverflowError,
+ "long is too large to format");
+ return NULL;
}
+ sz = i + 1 + (size_a * PyLong_SHIFT - 1) / bits;
+ assert(sz >= 0);
+ str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz);
+ if (str == NULL)
+ return NULL;
+ p = PyString_AS_STRING(str) + sz;
+ *p = '\0';
+ if (addL)
+ *--p = 'L';
+ if (Py_SIZE(a) < 0)
+ sign = '-';
- if (writer) {
- if (_PyUnicodeWriter_Prepare(writer, sz, 'x') == -1)
- return -1;
- kind = writer->kind;
- }
- else if (bytes_writer) {
- *bytes_str = _PyBytesWriter_Prepare(bytes_writer, *bytes_str, sz);
- if (*bytes_str == NULL)
- return -1;
- }
- else {
- v = PyUnicode_New(sz, 'x');
- if (v == NULL)
- return -1;
- kind = PyUnicode_KIND(v);
- }
-
-#define WRITE_DIGITS(p) \
- do { \
- if (size_a == 0) { \
- *--p = '0'; \
- } \
- else { \
- /* JRH: special case for power-of-2 bases */ \
- twodigits accum = 0; \
- int accumbits = 0; /* # of bits in accum */ \
- Py_ssize_t i; \
- for (i = 0; i < size_a; ++i) { \
- accum |= (twodigits)a->ob_digit[i] << accumbits; \
- accumbits += PyLong_SHIFT; \
- assert(accumbits >= bits); \
- do { \
- char cdigit; \
- cdigit = (char)(accum & (base - 1)); \
- cdigit += (cdigit < 10) ? '0' : 'a'-10; \
- *--p = cdigit; \
- accumbits -= bits; \
- accum >>= bits; \
- } while (i < size_a-1 ? accumbits >= bits : accum > 0); \
- } \
- } \
- \
- if (alternate) { \
- if (base == 16) \
- *--p = 'x'; \
- else if (base == 8) \
- *--p = 'o'; \
- else /* (base == 2) */ \
- *--p = 'b'; \
- *--p = '0'; \
- } \
- if (negative) \
- *--p = '-'; \
- } while (0)
-
-#define WRITE_UNICODE_DIGITS(TYPE) \
- do { \
- if (writer) \
- p = (TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos + sz; \
- else \
- p = (TYPE*)PyUnicode_DATA(v) + sz; \
- \
- WRITE_DIGITS(p); \
- \
- if (writer) \
- assert(p == ((TYPE*)PyUnicode_DATA(writer->buffer) + writer->pos)); \
- else \
- assert(p == (TYPE*)PyUnicode_DATA(v)); \
- } while (0)
-
- if (bytes_writer) {
- char *p = *bytes_str + sz;
- WRITE_DIGITS(p);
- assert(p == *bytes_str);
- }
- else if (kind == PyUnicode_1BYTE_KIND) {
- Py_UCS1 *p;
- WRITE_UNICODE_DIGITS(Py_UCS1);
- }
- else if (kind == PyUnicode_2BYTE_KIND) {
- Py_UCS2 *p;
- WRITE_UNICODE_DIGITS(Py_UCS2);
- }
- else {
- Py_UCS4 *p;
- assert (kind == PyUnicode_4BYTE_KIND);
- WRITE_UNICODE_DIGITS(Py_UCS4);
+ if (Py_SIZE(a) == 0) {
+ *--p = '0';
}
-#undef WRITE_DIGITS
-#undef WRITE_UNICODE_DIGITS
+ else if ((base & (base - 1)) == 0) {
+ /* JRH: special case for power-of-2 bases */
+ twodigits accum = 0;
+ int accumbits = 0; /* # of bits in accum */
+ int basebits = 1; /* # of bits in base-1 */
+ i = base;
+ while ((i >>= 1) > 1)
+ ++basebits;
- if (writer) {
- writer->pos += sz;
- }
- else if (bytes_writer) {
- (*bytes_str) += sz;
+ for (i = 0; i < size_a; ++i) {
+ accum |= (twodigits)a->ob_digit[i] << accumbits;
+ accumbits += PyLong_SHIFT;
+ assert(accumbits >= basebits);
+ do {
+ char cdigit = (char)(accum & (base - 1));
+ cdigit += (cdigit < 10) ? '0' : 'a'-10;
+ assert(p > PyString_AS_STRING(str));
+ *--p = cdigit;
+ accumbits -= basebits;
+ accum >>= basebits;
+ } while (i < size_a-1 ? accumbits >= basebits : accum > 0);
+ }
}
else {
- assert(_PyUnicode_CheckConsistency(v, 1));
- *p_output = v;
- }
- return 0;
-}
+ /* Not 0, and base not a power of 2. Divide repeatedly by
+ base, but for speed use the highest power of base that
+ fits in a digit. */
+ Py_ssize_t size = size_a;
+ digit *pin = a->ob_digit;
+ PyLongObject *scratch;
+ /* powbasw <- largest power of base that fits in a digit. */
+ digit powbase = base; /* powbase == base ** power */
+ int power = 1;
+ for (;;) {
+ twodigits newpow = powbase * (twodigits)base;
+ if (newpow >> PyLong_SHIFT)
+ /* doesn't fit in a digit */
+ break;
+ powbase = (digit)newpow;
+ ++power;
+ }
-PyObject *
-_PyLong_Format(PyObject *obj, int base)
-{
- PyObject *str;
- int err;
- if (base == 10)
- err = long_to_decimal_string_internal(obj, &str, NULL, NULL, NULL);
- else
- err = long_format_binary(obj, base, 1, &str, NULL, NULL, NULL);
- if (err == -1)
- return NULL;
- return str;
-}
+ /* Get a scratch area for repeated division. */
+ scratch = _PyLong_New(size);
+ if (scratch == NULL) {
+ Py_DECREF(str);
+ return NULL;
+ }
-int
-_PyLong_FormatWriter(_PyUnicodeWriter *writer,
- PyObject *obj,
- int base, int alternate)
-{
- if (base == 10)
- return long_to_decimal_string_internal(obj, NULL, writer,
- NULL, NULL);
- else
- return long_format_binary(obj, base, alternate, NULL, writer,
- NULL, NULL);
-}
+ /* Repeatedly divide by powbase. */
+ do {
+ int ntostore = power;
+ digit rem = inplace_divrem1(scratch->ob_digit,
+ pin, size, powbase);
+ pin = scratch->ob_digit; /* no need to use a again */
+ if (pin[size - 1] == 0)
+ --size;
+ SIGCHECK({
+ Py_DECREF(scratch);
+ Py_DECREF(str);
+ return NULL;
+ });
-char*
-_PyLong_FormatBytesWriter(_PyBytesWriter *writer, char *str,
- PyObject *obj,
- int base, int alternate)
-{
- char *str2;
- int res;
- str2 = str;
- if (base == 10)
- res = long_to_decimal_string_internal(obj, NULL, NULL,
- writer, &str2);
- else
- res = long_format_binary(obj, base, alternate, NULL, NULL,
- writer, &str2);
- if (res < 0)
- return NULL;
- assert(str2 != NULL);
- return str2;
+ /* Break rem into digits. */
+ assert(ntostore > 0);
+ do {
+ digit nextrem = (digit)(rem / base);
+ char c = (char)(rem - nextrem * base);
+ assert(p > PyString_AS_STRING(str));
+ c += (c < 10) ? '0' : 'a'-10;
+ *--p = c;
+ rem = nextrem;
+ --ntostore;
+ /* Termination is a bit delicate: must not
+ store leading zeroes, so must get out if
+ remaining quotient and rem are both 0. */
+ } while (ntostore && (size || rem));
+ } while (size != 0);
+ Py_DECREF(scratch);
+ }
+
+ if (base == 2) {
+ *--p = 'b';
+ *--p = '0';
+ }
+ else if (base == 8) {
+ if (newstyle) {
+ *--p = 'o';
+ *--p = '0';
+ }
+ else
+ if (size_a != 0)
+ *--p = '0';
+ }
+ else if (base == 16) {
+ *--p = 'x';
+ *--p = '0';
+ }
+ else if (base != 10) {
+ *--p = '#';
+ *--p = '0' + base%10;
+ if (base > 10)
+ *--p = '0' + base/10;
+ }
+ if (sign)
+ *--p = sign;
+ if (p != PyString_AS_STRING(str)) {
+ char *q = PyString_AS_STRING(str);
+ assert(p > q);
+ do {
+ } while ((*q++ = *p++) != '\0');
+ q--;
+ _PyString_Resize((PyObject **)&str,
+ (Py_ssize_t) (q - PyString_AS_STRING(str)));
+ }
+ return (PyObject *)str;
}
/* Table of digit values for 8-bit string -> integer conversion.
@@ -2124,9 +1624,9 @@ _PyLong_FormatBytesWriter(_PyBytesWriter *writer, char *str,
* 'a' and 'A' map to 10, ..., 'z' and 'Z' map to 35.
* All other indices map to 37.
* Note that when converting a base B string, a char c is a legitimate
- * base B digit iff _PyLong_DigitValue[Py_CHARPyLong_MASK(c)] < B.
+ * base B digit iff _PyLong_DigitValue[Py_CHARMASK(c)] < B.
*/
-unsigned char _PyLong_DigitValue[256] = {
+int _PyLong_DigitValue[256] = {
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
@@ -2147,21 +1647,15 @@ unsigned char _PyLong_DigitValue[256] = {
/* *str points to the first digit in a string of base `base` digits. base
* is a power of 2 (2, 4, 8, 16, or 32). *str is set to point to the first
- * non-digit (which may be *str!). A normalized int is returned.
+ * non-digit (which may be *str!). A normalized long is returned.
* The point to this routine is that it takes time linear in the number of
* string characters.
- *
- * Return values:
- * -1 on syntax error (exception needs to be set, *res is untouched)
- * 0 else (exception may be set, in that case *res is set to NULL)
*/
-static int
-long_from_binary_base(const char **str, int base, PyLongObject **res)
+static PyLongObject *
+long_from_binary_base(char **str, int base)
{
- const char *p = *str;
- const char *start = p;
- char prev = 0;
- Py_ssize_t digits = 0;
+ char *p = *str;
+ char *start = p;
int bits_per_char;
Py_ssize_t n;
PyLongObject *z;
@@ -2171,55 +1665,31 @@ long_from_binary_base(const char **str, int base, PyLongObject **res)
assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
n = base;
- for (bits_per_char = -1; n; ++bits_per_char) {
+ for (bits_per_char = -1; n; ++bits_per_char)
n >>= 1;
- }
- /* count digits and set p to end-of-string */
- while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base || *p == '_') {
- if (*p == '_') {
- if (prev == '_') {
- *str = p - 1;
- return -1;
- }
- } else {
- ++digits;
- }
- prev = *p;
+ /* n <- total # of bits needed, while setting p to end-of-string */
+ while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base)
++p;
- }
- if (prev == '_') {
- /* Trailing underscore not allowed. */
- *str = p - 1;
- return -1;
- }
-
*str = p;
- /* n <- the number of Python digits needed,
- = ceiling((digits * bits_per_char) / PyLong_SHIFT). */
- if (digits > (PY_SSIZE_T_MAX - (PyLong_SHIFT - 1)) / bits_per_char) {
+ /* n <- # of Python digits needed, = ceiling(n/PyLong_SHIFT). */
+ n = (p - start) * bits_per_char + PyLong_SHIFT - 1;
+ if (n / bits_per_char < p - start) {
PyErr_SetString(PyExc_ValueError,
- "int string too large to convert");
- *res = NULL;
- return 0;
+ "long string too large to convert");
+ return NULL;
}
- n = (digits * bits_per_char + PyLong_SHIFT - 1) / PyLong_SHIFT;
+ n = n / PyLong_SHIFT;
z = _PyLong_New(n);
- if (z == NULL) {
- *res = NULL;
- return 0;
- }
- /* Read string from right, and fill in int from left; i.e.,
+ if (z == NULL)
+ return NULL;
+ /* Read string from right, and fill in long from left; i.e.,
* from least to most significant in both.
*/
accum = 0;
bits_in_accum = 0;
pdigit = z->ob_digit;
while (--p >= start) {
- int k;
- if (*p == '_') {
- continue;
- }
- k = (int)_PyLong_DigitValue[Py_CHARMASK(*p)];
+ int k = _PyLong_DigitValue[Py_CHARMASK(*p)];
assert(k >= 0 && k < base);
accum |= (twodigits)k << bits_in_accum;
bits_in_accum += bits_per_char;
@@ -2238,85 +1708,60 @@ long_from_binary_base(const char **str, int base, PyLongObject **res)
}
while (pdigit - z->ob_digit < n)
*pdigit++ = 0;
- *res = long_normalize(z);
- return 0;
+ return long_normalize(z);
}
-/* Parses an int from a bytestring. Leading and trailing whitespace will be
- * ignored.
- *
- * If successful, a PyLong object will be returned and 'pend' will be pointing
- * to the first unused byte unless it's NULL.
- *
- * If unsuccessful, NULL will be returned.
- */
PyObject *
-PyLong_FromString(const char *str, char **pend, int base)
+PyLong_FromString(char *str, char **pend, int base)
{
- int sign = 1, error_if_nonzero = 0;
- const char *start, *orig_str = str;
- PyLongObject *z = NULL;
- PyObject *strobj;
+ int sign = 1;
+ char *start, *orig_str = str;
+ PyLongObject *z;
+ PyObject *strobj, *strrepr;
Py_ssize_t slen;
if ((base != 0 && base < 2) || base > 36) {
PyErr_SetString(PyExc_ValueError,
- "int() arg 2 must be >= 2 and <= 36");
+ "long() base must be >= 2 and <= 36, or 0");
return NULL;
}
- while (*str != '\0' && Py_ISSPACE(*str)) {
+ while (*str != '\0' && isspace(Py_CHARMASK(*str)))
str++;
- }
- if (*str == '+') {
+ if (*str == '+')
++str;
- }
else if (*str == '-') {
++str;
sign = -1;
}
+ while (*str != '\0' && isspace(Py_CHARMASK(*str)))
+ str++;
if (base == 0) {
- if (str[0] != '0') {
+ /* No base given. Deduce the base from the contents
+ of the string */
+ if (str[0] != '0')
base = 10;
- }
- else if (str[1] == 'x' || str[1] == 'X') {
+ else if (str[1] == 'x' || str[1] == 'X')
base = 16;
- }
- else if (str[1] == 'o' || str[1] == 'O') {
+ else if (str[1] == 'o' || str[1] == 'O')
base = 8;
- }
- else if (str[1] == 'b' || str[1] == 'B') {
+ else if (str[1] == 'b' || str[1] == 'B')
base = 2;
- }
- else {
- /* "old" (C-style) octal literal, now invalid.
- it might still be zero though */
- error_if_nonzero = 1;
- base = 10;
- }
+ else
+ /* "old" (C-style) octal literal, still valid in
+ 2.x, although illegal in 3.x */
+ base = 8;
}
+ /* Whether or not we were deducing the base, skip leading chars
+ as needed */
if (str[0] == '0' &&
((base == 16 && (str[1] == 'x' || str[1] == 'X')) ||
(base == 8 && (str[1] == 'o' || str[1] == 'O')) ||
- (base == 2 && (str[1] == 'b' || str[1] == 'B')))) {
+ (base == 2 && (str[1] == 'b' || str[1] == 'B'))))
str += 2;
- /* One underscore allowed here. */
- if (*str == '_') {
- ++str;
- }
- }
- if (str[0] == '_') {
- /* May not start with underscores. */
- goto onError;
- }
start = str;
- if ((base & (base - 1)) == 0) {
- int res = long_from_binary_base(&str, base, &z);
- if (res < 0) {
- /* Syntax error. */
- goto onError;
- }
- }
+ if ((base & (base - 1)) == 0)
+ z = long_from_binary_base(&str, base);
else {
/***
Binary bases can be converted in time linear in the number of digits, because
@@ -2327,18 +1772,19 @@ First some math: the largest integer that can be expressed in N base-B digits
is B**N-1. Consequently, if we have an N-digit input in base B, the worst-
case number of Python digits needed to hold it is the smallest integer n s.t.
- BASE**n-1 >= B**N-1 [or, adding 1 to both sides]
- BASE**n >= B**N [taking logs to base BASE]
- n >= log(B**N)/log(BASE) = N * log(B)/log(BASE)
+ PyLong_BASE**n-1 >= B**N-1 [or, adding 1 to both sides]
+ PyLong_BASE**n >= B**N [taking logs to base PyLong_BASE]
+ n >= log(B**N)/log(PyLong_BASE) = N * log(B)/log(PyLong_BASE)
-The static array log_base_BASE[base] == log(base)/log(BASE) so we can compute
-this quickly. A Python int with that much space is reserved near the start,
-and the result is computed into it.
+The static array log_base_PyLong_BASE[base] == log(base)/log(PyLong_BASE) so
+we can compute this quickly. A Python long with that much space is reserved
+near the start, and the result is computed into it.
The input string is actually treated as being in base base**i (i.e., i digits
are processed at a time), where two more static arrays hold:
- convwidth_base[base] = the largest integer i such that base**i <= BASE
+ convwidth_base[base] = the largest integer i such that
+ base**i <= PyLong_BASE
convmultmax_base[base] = base ** convwidth_base[base]
The first of these is the largest i such that i consecutive input digits
@@ -2355,40 +1801,41 @@ where B = convmultmax_base[base].
Error analysis: as above, the number of Python digits `n` needed is worst-
case
- n >= N * log(B)/log(BASE)
+ n >= N * log(B)/log(PyLong_BASE)
where `N` is the number of input digits in base `B`. This is computed via
- size_z = (Py_ssize_t)((scan - str) * log_base_BASE[base]) + 1;
+ size_z = (Py_ssize_t)((scan - str) * log_base_PyLong_BASE[base]) + 1;
below. Two numeric concerns are how much space this can waste, and whether
-the computed result can be too small. To be concrete, assume BASE = 2**15,
-which is the default (and it's unlikely anyone changes that).
+the computed result can be too small. To be concrete, assume PyLong_BASE =
+2**15, which is the default (and it's unlikely anyone changes that).
-Waste isn't a problem: provided the first input digit isn't 0, the difference
+Waste isn't a problem: provided the first input digit isn't 0, the difference
between the worst-case input with N digits and the smallest input with N
-digits is about a factor of B, but B is small compared to BASE so at most
-one allocated Python digit can remain unused on that count. If
-N*log(B)/log(BASE) is mathematically an exact integer, then truncating that
-and adding 1 returns a result 1 larger than necessary. However, that can't
-happen: whenever B is a power of 2, long_from_binary_base() is called
-instead, and it's impossible for B**i to be an integer power of 2**15 when
-B is not a power of 2 (i.e., it's impossible for N*log(B)/log(BASE) to be
+digits is about a factor of B, but B is small compared to PyLong_BASE so at
+most one allocated Python digit can remain unused on that count. If
+N*log(B)/log(PyLong_BASE) is mathematically an exact integer, then truncating
+that and adding 1 returns a result 1 larger than necessary. However, that
+can't happen: whenever B is a power of 2, long_from_binary_base() is called
+instead, and it's impossible for B**i to be an integer power of 2**15 when B
+is not a power of 2 (i.e., it's impossible for N*log(B)/log(PyLong_BASE) to be
an exact integer when B is not a power of 2, since B**i has a prime factor
other than 2 in that case, but (2**15)**j's only prime factor is 2).
-The computed result can be too small if the true value of N*log(B)/log(BASE)
-is a little bit larger than an exact integer, but due to roundoff errors (in
-computing log(B), log(BASE), their quotient, and/or multiplying that by N)
-yields a numeric result a little less than that integer. Unfortunately, "how
-close can a transcendental function get to an integer over some range?"
-questions are generally theoretically intractable. Computer analysis via
-continued fractions is practical: expand log(B)/log(BASE) via continued
-fractions, giving a sequence i/j of "the best" rational approximations. Then
-j*log(B)/log(BASE) is approximately equal to (the integer) i. This shows that
-we can get very close to being in trouble, but very rarely. For example,
-76573 is a denominator in one of the continued-fraction approximations to
-log(10)/log(2**15), and indeed:
+The computed result can be too small if the true value of
+N*log(B)/log(PyLong_BASE) is a little bit larger than an exact integer, but
+due to roundoff errors (in computing log(B), log(PyLong_BASE), their quotient,
+and/or multiplying that by N) yields a numeric result a little less than that
+integer. Unfortunately, "how close can a transcendental function get to an
+integer over some range?" questions are generally theoretically intractable.
+Computer analysis via continued fractions is practical: expand
+log(B)/log(PyLong_BASE) via continued fractions, giving a sequence i/j of "the
+best" rational approximations. Then j*log(B)/log(PyLong_BASE) is
+approximately equal to (the integer) i. This shows that we can get very close
+to being in trouble, but very rarely. For example, 76573 is a denominator in
+one of the continued-fraction approximations to log(10)/log(2**15), and
+indeed:
>>> log(10)/log(2**15)*76573
16958.000000654003
@@ -2397,37 +1844,34 @@ is very close to an integer. If we were working with IEEE single-precision,
rounding errors could kill us. Finding worst cases in IEEE double-precision
requires better-than-double-precision log() functions, and Tim didn't bother.
Instead the code checks to see whether the allocated space is enough as each
-new Python digit is added, and copies the whole thing to a larger int if not.
+new Python digit is added, and copies the whole thing to a larger long if not.
This should happen extremely rarely, and in fact I don't have a test case
that triggers it(!). Instead the code was tested by artificially allocating
just 1 digit at the start, so that the copying code was exercised for every
digit beyond the first.
***/
- twodigits c; /* current input character */
+ register twodigits c; /* current input character */
Py_ssize_t size_z;
- Py_ssize_t digits = 0;
int i;
int convwidth;
twodigits convmultmax, convmult;
digit *pz, *pzstop;
- const char *scan, *lastdigit;
- char prev = 0;
+ char* scan;
- static double log_base_BASE[37] = {0.0e0,};
+ static double log_base_PyLong_BASE[37] = {0.0e0,};
static int convwidth_base[37] = {0,};
static twodigits convmultmax_base[37] = {0,};
- if (log_base_BASE[base] == 0.0) {
+ if (log_base_PyLong_BASE[base] == 0.0) {
twodigits convmax = base;
int i = 1;
- log_base_BASE[base] = (log((double)base) /
- log((double)PyLong_BASE));
+ log_base_PyLong_BASE[base] = (log((double)base) /
+ log((double)PyLong_BASE));
for (;;) {
twodigits next = convmax * base;
- if (next > PyLong_BASE) {
+ if (next > PyLong_BASE)
break;
- }
convmax = next;
++i;
}
@@ -2438,50 +1882,21 @@ digit beyond the first.
/* Find length of the string of numeric characters. */
scan = str;
- lastdigit = str;
-
- while (_PyLong_DigitValue[Py_CHARMASK(*scan)] < base || *scan == '_') {
- if (*scan == '_') {
- if (prev == '_') {
- /* Only one underscore allowed. */
- str = lastdigit + 1;
- goto onError;
- }
- }
- else {
- ++digits;
- lastdigit = scan;
- }
- prev = *scan;
+ while (_PyLong_DigitValue[Py_CHARMASK(*scan)] < base)
++scan;
- }
- if (prev == '_') {
- /* Trailing underscore not allowed. */
- /* Set error pointer to first underscore. */
- str = lastdigit + 1;
- goto onError;
- }
- /* Create an int object that can contain the largest possible
+ /* Create a long object that can contain the largest possible
* integer with this base and length. Note that there's no
* need to initialize z->ob_digit -- no slot is read up before
* being stored into.
*/
- double fsize_z = (double)digits * log_base_BASE[base] + 1.0;
- if (fsize_z > (double)MAX_LONG_DIGITS) {
- /* The same exception as in _PyLong_New(). */
- PyErr_SetString(PyExc_OverflowError,
- "too many digits in integer");
- return NULL;
- }
- size_z = (Py_ssize_t)fsize_z;
+ size_z = (Py_ssize_t)((scan - str) * log_base_PyLong_BASE[base]) + 1;
/* Uncomment next line to test exceedingly rare copy code */
/* size_z = 1; */
assert(size_z > 0);
z = _PyLong_New(size_z);
- if (z == NULL) {
+ if (z == NULL)
return NULL;
- }
Py_SIZE(z) = 0;
/* `convwidth` consecutive input digits are treated as a single
@@ -2492,19 +1907,11 @@ digit beyond the first.
/* Work ;-) */
while (str < scan) {
- if (*str == '_') {
- str++;
- continue;
- }
/* grab up to convwidth digits from the input string */
c = (digit)_PyLong_DigitValue[Py_CHARMASK(*str++)];
- for (i = 1; i < convwidth && str != scan; ++str) {
- if (*str == '_') {
- continue;
- }
- i++;
+ for (i = 1; i < convwidth && str != scan; ++i, ++str) {
c = (twodigits)(c * base +
- (int)_PyLong_DigitValue[Py_CHARMASK(*str)]);
+ _PyLong_DigitValue[Py_CHARMASK(*str)]);
assert(c < PyLong_BASE);
}
@@ -2514,9 +1921,8 @@ digit beyond the first.
*/
if (i != convwidth) {
convmult = base;
- for ( ; i > 1; --i) {
+ for ( ; i > 1; --i)
convmult *= base;
- }
}
/* Multiply z by convmult, and add c. */
@@ -2554,152 +1960,87 @@ digit beyond the first.
}
}
}
- if (z == NULL) {
+ if (z == NULL)
return NULL;
- }
- if (error_if_nonzero) {
- /* reset the base to 0, else the exception message
- doesn't make too much sense */
- base = 0;
- if (Py_SIZE(z) != 0) {
- goto onError;
- }
- /* there might still be other problems, therefore base
- remains zero here for the same reason */
- }
- if (str == start) {
+ if (str == start)
goto onError;
- }
- if (sign < 0) {
+ if (sign < 0)
Py_SIZE(z) = -(Py_SIZE(z));
- }
- while (*str && Py_ISSPACE(*str)) {
+ if (*str == 'L' || *str == 'l')
str++;
- }
- if (*str != '\0') {
+ while (*str && isspace(Py_CHARMASK(*str)))
+ str++;
+ if (*str != '\0')
goto onError;
- }
- long_normalize(z);
- z = maybe_small_long(z);
- if (z == NULL) {
- return NULL;
- }
- if (pend != NULL) {
- *pend = (char *)str;
- }
+ if (pend)
+ *pend = str;
return (PyObject *) z;
onError:
- if (pend != NULL) {
- *pend = (char *)str;
- }
Py_XDECREF(z);
slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200;
- strobj = PyUnicode_FromStringAndSize(orig_str, slen);
- if (strobj == NULL) {
+ strobj = PyString_FromStringAndSize(orig_str, slen);
+ if (strobj == NULL)
return NULL;
- }
- PyErr_Format(PyExc_ValueError,
- "invalid literal for int() with base %d: %.200R",
- base, strobj);
+ strrepr = PyObject_Repr(strobj);
Py_DECREF(strobj);
+ if (strrepr == NULL)
+ return NULL;
+ PyErr_Format(PyExc_ValueError,
+ "invalid literal for long() with base %d: %s",
+ base, PyString_AS_STRING(strrepr));
+ Py_DECREF(strrepr);
return NULL;
}
-/* Since PyLong_FromString doesn't have a length parameter,
- * check here for possible NULs in the string.
- *
- * Reports an invalid literal as a bytes object.
- */
-PyObject *
-_PyLong_FromBytes(const char *s, Py_ssize_t len, int base)
-{
- PyObject *result, *strobj;
- char *end = NULL;
-
- result = PyLong_FromString(s, &end, base);
- if (end == NULL || (result != NULL && end == s + len))
- return result;
- Py_XDECREF(result);
- strobj = PyBytes_FromStringAndSize(s, Py_MIN(len, 200));
- if (strobj != NULL) {
- PyErr_Format(PyExc_ValueError,
- "invalid literal for int() with base %d: %.200R",
- base, strobj);
- Py_DECREF(strobj);
- }
- return NULL;
-}
-
+#ifdef Py_USING_UNICODE
PyObject *
PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
{
- PyObject *v, *unicode = PyUnicode_FromWideChar(u, length);
- if (unicode == NULL)
- return NULL;
- v = PyLong_FromUnicodeObject(unicode, base);
- Py_DECREF(unicode);
- return v;
-}
+ PyObject *result;
+ char *buffer = (char *)PyMem_MALLOC(length+1);
-PyObject *
-PyLong_FromUnicodeObject(PyObject *u, int base)
-{
- PyObject *result, *asciidig;
- const char *buffer;
- char *end = NULL;
- Py_ssize_t buflen;
+ if (buffer == NULL)
+ return NULL;
- asciidig = _PyUnicode_TransformDecimalAndSpaceToASCII(u);
- if (asciidig == NULL)
+ if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
+ PyMem_FREE(buffer);
return NULL;
- assert(PyUnicode_IS_ASCII(asciidig));
- /* Simply get a pointer to existing ASCII characters. */
- buffer = PyUnicode_AsUTF8AndSize(asciidig, &buflen);
- assert(buffer != NULL);
-
- result = PyLong_FromString(buffer, &end, base);
- if (end == NULL || (result != NULL && end == buffer + buflen)) {
- Py_DECREF(asciidig);
- return result;
}
- Py_DECREF(asciidig);
- Py_XDECREF(result);
- PyErr_Format(PyExc_ValueError,
- "invalid literal for int() with base %d: %.200R",
- base, u);
- return NULL;
+ result = PyLong_FromString(buffer, NULL, base);
+ PyMem_FREE(buffer);
+ return result;
}
+#endif
/* forward */
static PyLongObject *x_divrem
(PyLongObject *, PyLongObject *, PyLongObject **);
static PyObject *long_long(PyObject *v);
-/* Int division with remainder, top-level routine */
+/* Long division with remainder, top-level routine */
static int
long_divrem(PyLongObject *a, PyLongObject *b,
PyLongObject **pdiv, PyLongObject **prem)
{
- Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
+ Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
PyLongObject *z;
if (size_b == 0) {
PyErr_SetString(PyExc_ZeroDivisionError,
- "integer division or modulo by zero");
+ "long division or modulo by zero");
return -1;
}
if (size_a < size_b ||
(size_a == size_b &&
a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
/* |a| < |b|. */
- *prem = (PyLongObject *)long_long((PyObject *)a);
- if (*prem == NULL) {
+ *pdiv = _PyLong_New(0);
+ if (*pdiv == NULL)
return -1;
- }
- Py_INCREF(_PyLong_Zero);
- *pdiv = (PyLongObject*)_PyLong_Zero;
+ Py_INCREF(a);
+ *prem = (PyLongObject *) a;
return 0;
}
if (size_b == 1) {
@@ -2722,27 +2063,16 @@ long_divrem(PyLongObject *a, PyLongObject *b,
The quotient z has the sign of a*b;
the remainder r has the sign of a,
so a = b*z + r. */
- if ((Py_SIZE(a) < 0) != (Py_SIZE(b) < 0)) {
- _PyLong_Negate(&z);
- if (z == NULL) {
- Py_CLEAR(*prem);
- return -1;
- }
- }
- if (Py_SIZE(a) < 0 && Py_SIZE(*prem) != 0) {
- _PyLong_Negate(prem);
- if (*prem == NULL) {
- Py_DECREF(z);
- Py_CLEAR(*prem);
- return -1;
- }
- }
- *pdiv = maybe_small_long(z);
+ if ((Py_SIZE(a) < 0) != (Py_SIZE(b) < 0))
+ Py_SIZE(z) = -(Py_SIZE(z));
+ if (Py_SIZE(a) < 0 && Py_SIZE(*prem) != 0)
+ Py_SIZE(*prem) = -Py_SIZE(*prem);
+ *pdiv = z;
return 0;
}
-/* Unsigned int division with remainder -- the algorithm. The arguments v1
- and w1 should satisfy 2 <= Py_ABS(Py_SIZE(w1)) <= Py_ABS(Py_SIZE(v1)). */
+/* Unsigned long division with remainder -- the algorithm. The arguments v1
+ and w1 should satisfy 2 <= ABS(Py_SIZE(w1)) <= ABS(Py_SIZE(v1)). */
static PyLongObject *
x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
@@ -2762,8 +2092,8 @@ x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
that won't overflow a digit. */
/* allocate space; w will also be used to hold the final remainder */
- size_v = Py_ABS(Py_SIZE(v1));
- size_w = Py_ABS(Py_SIZE(w1));
+ size_v = ABS(Py_SIZE(v1));
+ size_w = ABS(Py_SIZE(w1));
assert(size_v >= size_w && size_w >= 2); /* Assert checks by div() */
v = _PyLong_New(size_v+1);
if (v == NULL) {
@@ -2894,7 +2224,7 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e)
multiple of 4, rounding ties to a multiple of 8. */
static const int half_even_correction[8] = {0, -1, -2, 1, 0, -1, 2, 1};
- a_size = Py_ABS(Py_SIZE(a));
+ a_size = ABS(Py_SIZE(a));
if (a_size == 0) {
/* Special case for 0: significand 0.0, exponent 0. */
*e = 0;
@@ -2964,7 +2294,8 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e)
break;
}
}
- assert(1 <= x_size && x_size <= (Py_ssize_t)Py_ARRAY_LENGTH(x_digits));
+ assert(1 <= x_size &&
+ x_size <= (Py_ssize_t)(sizeof(x_digits)/sizeof(digit)));
/* Round, and convert to double. */
x_digits[0] += half_even_correction[x_digits[0] & 7];
@@ -2992,7 +2323,7 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e)
return -1.0;
}
-/* Get a C double from an int object. Rounds to the nearest double,
+/* Get a C double from a long int object. Rounds to the nearest double,
using the round-half-to-even rule in the case of a tie. */
double
@@ -3001,25 +2332,14 @@ PyLong_AsDouble(PyObject *v)
Py_ssize_t exponent;
double x;
- if (v == NULL) {
+ if (v == NULL || !PyLong_Check(v)) {
PyErr_BadInternalCall();
return -1.0;
}
- if (!PyLong_Check(v)) {
- PyErr_SetString(PyExc_TypeError, "an integer is required");
- return -1.0;
- }
- if (Py_ABS(Py_SIZE(v)) <= 1) {
- /* Fast path; single digit long (31 bits) will cast safely
- to double. This improves performance of FP/long operations
- by 20%.
- */
- return (double)MEDIUM_VALUE((PyLongObject *)v);
- }
x = _PyLong_Frexp((PyLongObject *)v, &exponent);
if ((x == -1.0 && PyErr_Occurred()) || exponent > DBL_MAX_EXP) {
PyErr_SetString(PyExc_OverflowError,
- "int too large to convert to float");
+ "long int too large to convert to float");
return -1.0;
}
return ldexp(x, (int)exponent);
@@ -3027,104 +2347,90 @@ PyLong_AsDouble(PyObject *v)
/* Methods */
-/* if a < b, return a negative number
- if a == b, return 0
- if a > b, return a positive number */
+static void
+long_dealloc(PyObject *v)
+{
+ Py_TYPE(v)->tp_free(v);
+}
-static Py_ssize_t
-long_compare(PyLongObject *a, PyLongObject *b)
+static PyObject *
+long_repr(PyObject *v)
{
- Py_ssize_t sign = Py_SIZE(a) - Py_SIZE(b);
- if (sign == 0) {
- Py_ssize_t i = Py_ABS(Py_SIZE(a));
- sdigit diff = 0;
- while (--i >= 0) {
- diff = (sdigit) a->ob_digit[i] - (sdigit) b->ob_digit[i];
- if (diff) {
- break;
- }
- }
- sign = Py_SIZE(a) < 0 ? -diff : diff;
- }
- return sign;
+ return _PyLong_Format(v, 10, 1, 0);
}
static PyObject *
-long_richcompare(PyObject *self, PyObject *other, int op)
+long_str(PyObject *v)
{
- Py_ssize_t result;
- CHECK_BINOP(self, other);
- if (self == other)
- result = 0;
- else
- result = long_compare((PyLongObject*)self, (PyLongObject*)other);
- Py_RETURN_RICHCOMPARE(result, 0, op);
+ return _PyLong_Format(v, 10, 0, 0);
}
-static Py_hash_t
+static int
+long_compare(PyLongObject *a, PyLongObject *b)
+{
+ Py_ssize_t sign;
+
+ if (Py_SIZE(a) != Py_SIZE(b)) {
+ sign = Py_SIZE(a) - Py_SIZE(b);
+ }
+ else {
+ Py_ssize_t i = ABS(Py_SIZE(a));
+ while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
+ ;
+ if (i < 0)
+ sign = 0;
+ else {
+ sign = (sdigit)a->ob_digit[i] - (sdigit)b->ob_digit[i];
+ if (Py_SIZE(a) < 0)
+ sign = -sign;
+ }
+ }
+ return sign < 0 ? -1 : sign > 0 ? 1 : 0;
+}
+
+static long
long_hash(PyLongObject *v)
{
- Py_uhash_t x;
+ unsigned long x;
Py_ssize_t i;
int sign;
+ /* This is designed so that Python ints and longs with the
+ same value hash to the same value, otherwise comparisons
+ of mapping keys will turn out weird */
i = Py_SIZE(v);
- switch(i) {
- case -1: return v->ob_digit[0]==1 ? -2 : -(sdigit)v->ob_digit[0];
- case 0: return 0;
- case 1: return v->ob_digit[0];
- }
sign = 1;
x = 0;
if (i < 0) {
sign = -1;
i = -(i);
}
+ /* The following loop produces a C unsigned long x such that x is
+ congruent to the absolute value of v modulo ULONG_MAX. The
+ resulting x is nonzero if and only if v is. */
while (--i >= 0) {
- /* Here x is a quantity in the range [0, _PyHASH_MODULUS); we
- want to compute x * 2**PyLong_SHIFT + v->ob_digit[i] modulo
- _PyHASH_MODULUS.
-
- The computation of x * 2**PyLong_SHIFT % _PyHASH_MODULUS
- amounts to a rotation of the bits of x. To see this, write
-
- x * 2**PyLong_SHIFT = y * 2**_PyHASH_BITS + z
-
- where y = x >> (_PyHASH_BITS - PyLong_SHIFT) gives the top
- PyLong_SHIFT bits of x (those that are shifted out of the
- original _PyHASH_BITS bits, and z = (x << PyLong_SHIFT) &
- _PyHASH_MODULUS gives the bottom _PyHASH_BITS - PyLong_SHIFT
- bits of x, shifted up. Then since 2**_PyHASH_BITS is
- congruent to 1 modulo _PyHASH_MODULUS, y*2**_PyHASH_BITS is
- congruent to y modulo _PyHASH_MODULUS. So
-
- x * 2**PyLong_SHIFT = y + z (mod _PyHASH_MODULUS).
-
- The right-hand side is just the result of rotating the
- _PyHASH_BITS bits of x left by PyLong_SHIFT places; since
- not all _PyHASH_BITS bits of x are 1s, the same is true
- after rotation, so 0 <= y+z < _PyHASH_MODULUS and y + z is
- the reduction of x*2**PyLong_SHIFT modulo
- _PyHASH_MODULUS. */
- x = ((x << PyLong_SHIFT) & _PyHASH_MODULUS) |
- (x >> (_PyHASH_BITS - PyLong_SHIFT));
+ /* Force a native long #-bits (32 or 64) circular shift */
+ x = (x >> (8*SIZEOF_LONG-PyLong_SHIFT)) | (x << PyLong_SHIFT);
x += v->ob_digit[i];
- if (x >= _PyHASH_MODULUS)
- x -= _PyHASH_MODULUS;
+ /* If the addition above overflowed we compensate by
+ incrementing. This preserves the value modulo
+ ULONG_MAX. */
+ if (x < v->ob_digit[i])
+ x++;
}
x = x * sign;
- if (x == (Py_uhash_t)-1)
- x = (Py_uhash_t)-2;
- return (Py_hash_t)x;
+ if (x == (unsigned long)-1)
+ x = (unsigned long)-2;
+ return (long)x;
}
-/* Add the absolute values of two integers. */
+/* Add the absolute values of two long integers. */
static PyLongObject *
x_add(PyLongObject *a, PyLongObject *b)
{
- Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
+ Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
PyLongObject *z;
Py_ssize_t i;
digit carry = 0;
@@ -3158,7 +2464,7 @@ x_add(PyLongObject *a, PyLongObject *b)
static PyLongObject *
x_sub(PyLongObject *a, PyLongObject *b)
{
- Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
+ Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
PyLongObject *z;
Py_ssize_t i;
int sign = 1;
@@ -3178,7 +2484,7 @@ x_sub(PyLongObject *a, PyLongObject *b)
while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
;
if (i < 0)
- return (PyLongObject *)PyLong_FromLong(0);
+ return _PyLong_New(0);
if (a->ob_digit[i] < b->ob_digit[i]) {
sign = -1;
{ PyLongObject *temp = a; a = b; b = temp; }
@@ -3203,33 +2509,23 @@ x_sub(PyLongObject *a, PyLongObject *b)
borrow &= 1; /* Keep only one sign bit */
}
assert(borrow == 0);
- if (sign < 0) {
- Py_SIZE(z) = -Py_SIZE(z);
- }
- return maybe_small_long(long_normalize(z));
+ if (sign < 0)
+ Py_SIZE(z) = -(Py_SIZE(z));
+ return long_normalize(z);
}
static PyObject *
-long_add(PyLongObject *a, PyLongObject *b)
+long_add(PyLongObject *v, PyLongObject *w)
{
- PyLongObject *z;
+ PyLongObject *a, *b, *z;
- CHECK_BINOP(a, b);
+ CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
- if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
- return PyLong_FromLong(MEDIUM_VALUE(a) + MEDIUM_VALUE(b));
- }
if (Py_SIZE(a) < 0) {
if (Py_SIZE(b) < 0) {
z = x_add(a, b);
- if (z != NULL) {
- /* x_add received at least one multiple-digit int,
- and thus z must be a multiple-digit int.
- That also means z is not an element of
- small_ints, so negating it in-place is safe. */
- assert(Py_REFCNT(z) == 1);
+ if (z != NULL && Py_SIZE(z) != 0)
Py_SIZE(z) = -(Py_SIZE(z));
- }
}
else
z = x_sub(b, a);
@@ -3240,30 +2536,25 @@ long_add(PyLongObject *a, PyLongObject *b)
else
z = x_add(a, b);
}
+ Py_DECREF(a);
+ Py_DECREF(b);
return (PyObject *)z;
}
static PyObject *
-long_sub(PyLongObject *a, PyLongObject *b)
+long_sub(PyLongObject *v, PyLongObject *w)
{
- PyLongObject *z;
+ PyLongObject *a, *b, *z;
- CHECK_BINOP(a, b);
+ CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
- if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
- return PyLong_FromLong(MEDIUM_VALUE(a) - MEDIUM_VALUE(b));
- }
if (Py_SIZE(a) < 0) {
- if (Py_SIZE(b) < 0) {
- z = x_sub(b, a);
- }
- else {
+ if (Py_SIZE(b) < 0)
+ z = x_sub(a, b);
+ else
z = x_add(a, b);
- if (z != NULL) {
- assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1);
- Py_SIZE(z) = -(Py_SIZE(z));
- }
- }
+ if (z != NULL && Py_SIZE(z) != 0)
+ Py_SIZE(z) = -(Py_SIZE(z));
}
else {
if (Py_SIZE(b) < 0)
@@ -3271,6 +2562,8 @@ long_sub(PyLongObject *a, PyLongObject *b)
else
z = x_sub(a, b);
}
+ Py_DECREF(a);
+ Py_DECREF(b);
return (PyObject *)z;
}
@@ -3281,8 +2574,8 @@ static PyLongObject *
x_mul(PyLongObject *a, PyLongObject *b)
{
PyLongObject *z;
- Py_ssize_t size_a = Py_ABS(Py_SIZE(a));
- Py_ssize_t size_b = Py_ABS(Py_SIZE(b));
+ Py_ssize_t size_a = ABS(Py_SIZE(a));
+ Py_ssize_t size_b = ABS(Py_SIZE(b));
Py_ssize_t i;
z = _PyLong_New(size_a + size_b);
@@ -3334,7 +2627,7 @@ x_mul(PyLongObject *a, PyLongObject *b)
assert((carry >> PyLong_SHIFT) == 0);
}
}
- else { /* a is not the same as b -- gradeschool int mult */
+ else { /* a is not the same as b -- gradeschool long mult */
for (i = 0; i < size_a; ++i) {
twodigits carry = 0;
twodigits f = a->ob_digit[i];
@@ -3362,7 +2655,7 @@ x_mul(PyLongObject *a, PyLongObject *b)
}
/* A helper for Karatsuba multiplication (k_mul).
- Takes an int "n" and an integer "size" representing the place to
+ Takes a long "n" and an integer "size" representing the place to
split, and sets low and high such that abs(n) == (high << size) + low,
viewing the shift as being by digits. The sign bit is ignored, and
the return values are >= 0.
@@ -3376,9 +2669,9 @@ kmul_split(PyLongObject *n,
{
PyLongObject *hi, *lo;
Py_ssize_t size_lo, size_hi;
- const Py_ssize_t size_n = Py_ABS(Py_SIZE(n));
+ const Py_ssize_t size_n = ABS(Py_SIZE(n));
- size_lo = Py_MIN(size_n, size);
+ size_lo = MIN(size_n, size);
size_hi = size_n - size_lo;
if ((hi = _PyLong_New(size_hi)) == NULL)
@@ -3405,8 +2698,8 @@ static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
static PyLongObject *
k_mul(PyLongObject *a, PyLongObject *b)
{
- Py_ssize_t asize = Py_ABS(Py_SIZE(a));
- Py_ssize_t bsize = Py_ABS(Py_SIZE(b));
+ Py_ssize_t asize = ABS(Py_SIZE(a));
+ Py_ssize_t bsize = ABS(Py_SIZE(b));
PyLongObject *ah = NULL;
PyLongObject *al = NULL;
PyLongObject *bh = NULL;
@@ -3441,7 +2734,7 @@ k_mul(PyLongObject *a, PyLongObject *b)
i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF;
if (asize <= i) {
if (asize == 0)
- return (PyLongObject *)PyLong_FromLong(0);
+ return _PyLong_New(0);
else
return x_mul(a, b);
}
@@ -3449,7 +2742,7 @@ k_mul(PyLongObject *a, PyLongObject *b)
/* If a is small compared to b, splitting on b gives a degenerate
* case with ah==0, and Karatsuba may be (even much) less efficient
* than "grade school" then. However, we can still win, by viewing
- * b as a string of "big digits", each of width a->ob_size. That
+ * b as a string of "big digits", each of width Py_SIZE(a). That
* leads to a sequence of balanced calls to k_mul.
*/
if (2 * asize <= bsize)
@@ -3477,7 +2770,7 @@ k_mul(PyLongObject *a, PyLongObject *b)
* 4. Subtract al*bl from the result, starting at shift. This may
* underflow (borrow out of the high digit), but we don't care:
* we're effectively doing unsigned arithmetic mod
- * BASE**(sizea + sizeb), and so long as the *final* result fits,
+ * PyLong_BASE**(sizea + sizeb), and so long as the *final* result fits,
* borrows and carries out of the high digit can be ignored.
* 5. Subtract ah*bh from the result, starting at shift.
* 6. Compute (ah+al)*(bh+bl), and add it into the result starting
@@ -3617,7 +2910,7 @@ ah*bh and al*bl too.
/* b has at least twice the digits of a, and a is big enough that Karatsuba
* would pay off *if* the inputs had balanced sizes. View b as a sequence
- * of slices, each with a->ob_size digits, and multiply the slices by a,
+ * of slices, each with Py_SIZE(a) digits, and multiply the slices by a,
* one at a time. This gives k_mul balanced inputs to work with, and is
* also cache-friendly (we compute one double-width slice of the result
* at a time, then move on, never backtracking except for the helpful
@@ -3626,8 +2919,8 @@ ah*bh and al*bl too.
static PyLongObject *
k_lopsided_mul(PyLongObject *a, PyLongObject *b)
{
- const Py_ssize_t asize = Py_ABS(Py_SIZE(a));
- Py_ssize_t bsize = Py_ABS(Py_SIZE(b));
+ const Py_ssize_t asize = ABS(Py_SIZE(a));
+ Py_ssize_t bsize = ABS(Py_SIZE(b));
Py_ssize_t nbdone; /* # of b digits already multiplied */
PyLongObject *ret;
PyLongObject *bslice = NULL;
@@ -3649,7 +2942,7 @@ k_lopsided_mul(PyLongObject *a, PyLongObject *b)
nbdone = 0;
while (bsize > 0) {
PyLongObject *product;
- const Py_ssize_t nbtouse = Py_MIN(bsize, asize);
+ const Py_ssize_t nbtouse = MIN(bsize, asize);
/* Multiply the next slice of b by a. */
memcpy(bslice->ob_digit, b->ob_digit + nbdone,
@@ -3678,74 +2971,24 @@ k_lopsided_mul(PyLongObject *a, PyLongObject *b)
}
static PyObject *
-long_mul(PyLongObject *a, PyLongObject *b)
+long_mul(PyLongObject *v, PyLongObject *w)
{
- PyLongObject *z;
+ PyLongObject *a, *b, *z;
- CHECK_BINOP(a, b);
-
- /* fast path for single-digit multiplication */
- if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
- stwodigits v = (stwodigits)(MEDIUM_VALUE(a)) * MEDIUM_VALUE(b);
- return PyLong_FromLongLong((long long)v);
+ if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
}
z = k_mul(a, b);
/* Negate if exactly one of the inputs is negative. */
- if (((Py_SIZE(a) ^ Py_SIZE(b)) < 0) && z) {
- _PyLong_Negate(&z);
- if (z == NULL)
- return NULL;
- }
+ if (((Py_SIZE(a) ^ Py_SIZE(b)) < 0) && z)
+ Py_SIZE(z) = -(Py_SIZE(z));
+ Py_DECREF(a);
+ Py_DECREF(b);
return (PyObject *)z;
}
-/* Fast modulo division for single-digit longs. */
-static PyObject *
-fast_mod(PyLongObject *a, PyLongObject *b)
-{
- sdigit left = a->ob_digit[0];
- sdigit right = b->ob_digit[0];
- sdigit mod;
-
- assert(Py_ABS(Py_SIZE(a)) == 1);
- assert(Py_ABS(Py_SIZE(b)) == 1);
-
- if (Py_SIZE(a) == Py_SIZE(b)) {
- /* 'a' and 'b' have the same sign. */
- mod = left % right;
- }
- else {
- /* Either 'a' or 'b' is negative. */
- mod = right - 1 - (left - 1) % right;
- }
-
- return PyLong_FromLong(mod * (sdigit)Py_SIZE(b));
-}
-
-/* Fast floor division for single-digit longs. */
-static PyObject *
-fast_floor_div(PyLongObject *a, PyLongObject *b)
-{
- sdigit left = a->ob_digit[0];
- sdigit right = b->ob_digit[0];
- sdigit div;
-
- assert(Py_ABS(Py_SIZE(a)) == 1);
- assert(Py_ABS(Py_SIZE(b)) == 1);
-
- if (Py_SIZE(a) == Py_SIZE(b)) {
- /* 'a' and 'b' have the same sign. */
- div = left / right;
- }
- else {
- /* Either 'a' or 'b' is negative. */
- div = -1 - (left - 1) / right;
- }
-
- return PyLong_FromLong(div);
-}
-
/* The / and % operators are now defined in terms of divmod().
The expression a mod b has the value a - b*floor(a/b).
The long_divrem function gives the remainder after division of
@@ -3773,35 +3016,12 @@ l_divmod(PyLongObject *v, PyLongObject *w,
{
PyLongObject *div, *mod;
- if (Py_ABS(Py_SIZE(v)) == 1 && Py_ABS(Py_SIZE(w)) == 1) {
- /* Fast path for single-digit longs */
- div = NULL;
- if (pdiv != NULL) {
- div = (PyLongObject *)fast_floor_div(v, w);
- if (div == NULL) {
- return -1;
- }
- }
- if (pmod != NULL) {
- mod = (PyLongObject *)fast_mod(v, w);
- if (mod == NULL) {
- Py_XDECREF(div);
- return -1;
- }
- *pmod = mod;
- }
- if (pdiv != NULL) {
- /* We only want to set `*pdiv` when `*pmod` is
- set successfully. */
- *pdiv = div;
- }
- return 0;
- }
if (long_divrem(v, w, &div, &mod) < 0)
return -1;
if ((Py_SIZE(mod) < 0 && Py_SIZE(w) > 0) ||
(Py_SIZE(mod) > 0 && Py_SIZE(w) < 0)) {
PyLongObject *temp;
+ PyLongObject *one;
temp = (PyLongObject *) long_add(mod, w);
Py_DECREF(mod);
mod = temp;
@@ -3809,12 +3029,15 @@ l_divmod(PyLongObject *v, PyLongObject *w,
Py_DECREF(div);
return -1;
}
- temp = (PyLongObject *) long_sub(div, (PyLongObject *)_PyLong_One);
- if (temp == NULL) {
+ one = (PyLongObject *) PyLong_FromLong(1L);
+ if (one == NULL ||
+ (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
Py_DECREF(mod);
Py_DECREF(div);
+ Py_XDECREF(one);
return -1;
}
+ Py_DECREF(one);
Py_DECREF(div);
div = temp;
}
@@ -3832,18 +3055,31 @@ l_divmod(PyLongObject *v, PyLongObject *w,
}
static PyObject *
-long_div(PyObject *a, PyObject *b)
+long_div(PyObject *v, PyObject *w)
{
- PyLongObject *div;
+ PyLongObject *a, *b, *div;
- CHECK_BINOP(a, b);
+ CONVERT_BINOP(v, w, &a, &b);
+ if (l_divmod(a, b, &div, NULL) < 0)
+ div = NULL;
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return (PyObject *)div;
+}
- if (Py_ABS(Py_SIZE(a)) == 1 && Py_ABS(Py_SIZE(b)) == 1) {
- return fast_floor_div((PyLongObject*)a, (PyLongObject*)b);
- }
+static PyObject *
+long_classic_div(PyObject *v, PyObject *w)
+{
+ PyLongObject *a, *b, *div;
- if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, NULL) < 0)
+ CONVERT_BINOP(v, w, &a, &b);
+ if (Py_DivisionWarningFlag &&
+ PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
div = NULL;
+ else if (l_divmod(a, b, &div, NULL) < 0)
+ div = NULL;
+ Py_DECREF(a);
+ Py_DECREF(b);
return (PyObject *)div;
}
@@ -3861,9 +3097,7 @@ long_true_divide(PyObject *v, PyObject *w)
int inexact, negate, a_is_small, b_is_small;
double dx, result;
- CHECK_BINOP(v, w);
- a = (PyLongObject *)v;
- b = (PyLongObject *)w;
+ CONVERT_BINOP(v, w, &a, &b);
/*
Method in a nutshell:
@@ -3953,8 +3187,8 @@ long_true_divide(PyObject *v, PyObject *w)
*/
/* Reduce to case where a and b are both positive. */
- a_size = Py_ABS(Py_SIZE(a));
- b_size = Py_ABS(Py_SIZE(b));
+ a_size = ABS(Py_SIZE(a));
+ b_size = ABS(Py_SIZE(b));
negate = (Py_SIZE(a) < 0) ^ (Py_SIZE(b) < 0);
if (b_size == 0) {
PyErr_SetString(PyExc_ZeroDivisionError,
@@ -4004,7 +3238,7 @@ long_true_divide(PyObject *v, PyObject *w)
goto underflow_or_zero;
/* Choose value for shift; see comments for step 1 above. */
- shift = Py_MAX(diff, DBL_MIN_EXP) - DBL_MANT_DIG - 2;
+ shift = MAX(diff, DBL_MIN_EXP) - DBL_MANT_DIG - 2;
inexact = 0;
@@ -4070,12 +3304,12 @@ long_true_divide(PyObject *v, PyObject *w)
inexact = 1;
Py_DECREF(rem);
}
- x_size = Py_ABS(Py_SIZE(x));
+ x_size = ABS(Py_SIZE(x));
assert(x_size > 0); /* result of division is never zero */
x_bits = (x_size-1)*PyLong_SHIFT+bits_in_digit(x->ob_digit[x_size-1]);
/* The number of extra bits that have to be rounded away. */
- extra_bits = Py_MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG;
+ extra_bits = MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG;
assert(extra_bits == 2 || extra_bits == 3);
/* Round by directly modifying the low digit of x. */
@@ -4098,149 +3332,65 @@ long_true_divide(PyObject *v, PyObject *w)
result = ldexp(dx, (int)shift);
success:
+ Py_DECREF(a);
+ Py_DECREF(b);
return PyFloat_FromDouble(negate ? -result : result);
underflow_or_zero:
+ Py_DECREF(a);
+ Py_DECREF(b);
return PyFloat_FromDouble(negate ? -0.0 : 0.0);
overflow:
PyErr_SetString(PyExc_OverflowError,
"integer division result too large for a float");
error:
+ Py_DECREF(a);
+ Py_DECREF(b);
return NULL;
}
static PyObject *
-long_mod(PyObject *a, PyObject *b)
+long_mod(PyObject *v, PyObject *w)
{
- PyLongObject *mod;
+ PyLongObject *a, *b, *mod;
- CHECK_BINOP(a, b);
+ CONVERT_BINOP(v, w, &a, &b);
- if (Py_ABS(Py_SIZE(a)) == 1 && Py_ABS(Py_SIZE(b)) == 1) {
- return fast_mod((PyLongObject*)a, (PyLongObject*)b);
- }
-
- if (l_divmod((PyLongObject*)a, (PyLongObject*)b, NULL, &mod) < 0)
+ if (l_divmod(a, b, NULL, &mod) < 0)
mod = NULL;
+ Py_DECREF(a);
+ Py_DECREF(b);
return (PyObject *)mod;
}
static PyObject *
-long_divmod(PyObject *a, PyObject *b)
+long_divmod(PyObject *v, PyObject *w)
{
- PyLongObject *div, *mod;
+ PyLongObject *a, *b, *div, *mod;
PyObject *z;
- CHECK_BINOP(a, b);
+ CONVERT_BINOP(v, w, &a, &b);
- if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, &mod) < 0) {
+ if (l_divmod(a, b, &div, &mod) < 0) {
+ Py_DECREF(a);
+ Py_DECREF(b);
return NULL;
}
z = PyTuple_New(2);
if (z != NULL) {
- PyTuple_SET_ITEM(z, 0, (PyObject *) div);
- PyTuple_SET_ITEM(z, 1, (PyObject *) mod);
+ PyTuple_SetItem(z, 0, (PyObject *) div);
+ PyTuple_SetItem(z, 1, (PyObject *) mod);
}
else {
Py_DECREF(div);
Py_DECREF(mod);
}
- return z;
-}
-
-
-/* Compute an inverse to a modulo n, or raise ValueError if a is not
- invertible modulo n. Assumes n is positive. The inverse returned
- is whatever falls out of the extended Euclidean algorithm: it may
- be either positive or negative, but will be smaller than n in
- absolute value.
-
- Pure Python equivalent for long_invmod:
-
- def invmod(a, n):
- b, c = 1, 0
- while n:
- q, r = divmod(a, n)
- a, b, c, n = n, c, b - q*c, r
-
- # at this point a is the gcd of the original inputs
- if a == 1:
- return b
- raise ValueError("Not invertible")
-*/
-
-static PyLongObject *
-long_invmod(PyLongObject *a, PyLongObject *n)
-{
- PyLongObject *b, *c;
-
- /* Should only ever be called for positive n */
- assert(Py_SIZE(n) > 0);
-
- b = (PyLongObject *)PyLong_FromLong(1L);
- if (b == NULL) {
- return NULL;
- }
- c = (PyLongObject *)PyLong_FromLong(0L);
- if (c == NULL) {
- Py_DECREF(b);
- return NULL;
- }
- Py_INCREF(a);
- Py_INCREF(n);
-
- /* references now owned: a, b, c, n */
- while (Py_SIZE(n) != 0) {
- PyLongObject *q, *r, *s, *t;
-
- if (l_divmod(a, n, &q, &r) == -1) {
- goto Error;
- }
- Py_DECREF(a);
- a = n;
- n = r;
- t = (PyLongObject *)long_mul(q, c);
- Py_DECREF(q);
- if (t == NULL) {
- goto Error;
- }
- s = (PyLongObject *)long_sub(b, t);
- Py_DECREF(t);
- if (s == NULL) {
- goto Error;
- }
- Py_DECREF(b);
- b = c;
- c = s;
- }
- /* references now owned: a, b, c, n */
-
- Py_DECREF(c);
- Py_DECREF(n);
- if (long_compare(a, (PyLongObject *)_PyLong_One)) {
- /* a != 1; we don't have an inverse. */
- Py_DECREF(a);
- Py_DECREF(b);
- PyErr_SetString(PyExc_ValueError,
- "base is not invertible for the given modulus");
- return NULL;
- }
- else {
- /* a == 1; b gives an inverse modulo n */
- Py_DECREF(a);
- return b;
- }
-
- Error:
Py_DECREF(a);
Py_DECREF(b);
- Py_DECREF(c);
- Py_DECREF(n);
- return NULL;
+ return z;
}
-
/* pow(v, w, x) */
static PyObject *
long_pow(PyObject *v, PyObject *w, PyObject *x)
@@ -4259,29 +3409,39 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/* a, b, c = v, w, x */
- CHECK_BINOP(v, w);
- a = (PyLongObject*)v; Py_INCREF(a);
- b = (PyLongObject*)w; Py_INCREF(b);
+ CONVERT_BINOP(v, w, &a, &b);
if (PyLong_Check(x)) {
c = (PyLongObject *)x;
Py_INCREF(x);
}
+ else if (PyInt_Check(x)) {
+ c = (PyLongObject *)PyLong_FromLong(PyInt_AS_LONG(x));
+ if (c == NULL)
+ goto Error;
+ }
else if (x == Py_None)
c = NULL;
else {
Py_DECREF(a);
Py_DECREF(b);
- Py_RETURN_NOTIMPLEMENTED;
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
}
- if (Py_SIZE(b) < 0 && c == NULL) {
- /* if exponent is negative and there's no modulus:
- return a float. This works because we know
+ if (Py_SIZE(b) < 0) { /* if exponent is negative */
+ if (c) {
+ PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
+ "cannot be negative when 3rd argument specified");
+ goto Error;
+ }
+ else {
+ /* else return a float. This works because we know
that this calls float_pow() which converts its
arguments to double. */
- Py_DECREF(a);
- Py_DECREF(b);
- return PyFloat_Type.tp_as_number->nb_power(v, w, x);
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return PyFloat_Type.tp_as_number->nb_power(v, w, x);
+ }
}
if (c) {
@@ -4304,9 +3464,7 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
Py_DECREF(c);
c = temp;
temp = NULL;
- _PyLong_Negate(&c);
- if (c == NULL)
- goto Error;
+ Py_SIZE(c) = - Py_SIZE(c);
}
/* if modulus == 1:
@@ -4316,26 +3474,6 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
goto Done;
}
- /* if exponent is negative, negate the exponent and
- replace the base with a modular inverse */
- if (Py_SIZE(b) < 0) {
- temp = (PyLongObject *)_PyLong_Copy(b);
- if (temp == NULL)
- goto Error;
- Py_DECREF(b);
- b = temp;
- temp = NULL;
- _PyLong_Negate(&b);
- if (b == NULL)
- goto Error;
-
- temp = long_invmod(a, c);
- if (temp == NULL)
- goto Error;
- Py_DECREF(a);
- a = temp;
- }
-
/* Reduce base by modulus in some cases:
1. If base < 0. Forcing the base non-negative makes things easier.
2. If base is obviously larger than the modulus. The "small
@@ -4432,7 +3570,10 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
goto Done;
Error:
- Py_CLEAR(z);
+ if (z != NULL) {
+ Py_DECREF(z);
+ z = NULL;
+ }
/* fall through */
Done:
if (Py_SIZE(b) > FIVEARY_CUTOFF) {
@@ -4451,14 +3592,15 @@ long_invert(PyLongObject *v)
{
/* Implement ~x as -(x+1) */
PyLongObject *x;
- if (Py_ABS(Py_SIZE(v)) <=1)
- return PyLong_FromLong(-(MEDIUM_VALUE(v)+1));
- x = (PyLongObject *) long_add(v, (PyLongObject *)_PyLong_One);
+ PyLongObject *w;
+ w = (PyLongObject *)PyLong_FromLong(1L);
+ if (w == NULL)
+ return NULL;
+ x = (PyLongObject *) long_add(v, w);
+ Py_DECREF(w);
if (x == NULL)
return NULL;
- _PyLong_Negate(&x);
- /* No need for maybe_small_long here, since any small
- longs will have been caught in the Py_SIZE <= 1 fast path. */
+ Py_SIZE(x) = -(Py_SIZE(x));
return (PyObject *)x;
}
@@ -4466,8 +3608,11 @@ static PyObject *
long_neg(PyLongObject *v)
{
PyLongObject *z;
- if (Py_ABS(Py_SIZE(v)) <= 1)
- return PyLong_FromLong(-MEDIUM_VALUE(v));
+ if (Py_SIZE(v) == 0 && PyLong_CheckExact(v)) {
+ /* -0 == 0 */
+ Py_INCREF(v);
+ return (PyObject *) v;
+ }
z = (PyLongObject *)_PyLong_Copy(v);
if (z != NULL)
Py_SIZE(z) = -(Py_SIZE(v));
@@ -4484,139 +3629,111 @@ long_abs(PyLongObject *v)
}
static int
-long_bool(PyLongObject *v)
+long_nonzero(PyLongObject *v)
{
return Py_SIZE(v) != 0;
}
-/* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
-static int
-divmod_shift(PyObject *shiftby, Py_ssize_t *wordshift, digit *remshift)
-{
- assert(PyLong_Check(shiftby));
- assert(Py_SIZE(shiftby) >= 0);
- Py_ssize_t lshiftby = PyLong_AsSsize_t((PyObject *)shiftby);
- if (lshiftby >= 0) {
- *wordshift = lshiftby / PyLong_SHIFT;
- *remshift = lshiftby % PyLong_SHIFT;
- return 0;
- }
- /* PyLong_Check(shiftby) is true and Py_SIZE(shiftby) >= 0, so it must
- be that PyLong_AsSsize_t raised an OverflowError. */
- assert(PyErr_ExceptionMatches(PyExc_OverflowError));
- PyErr_Clear();
- PyLongObject *wordshift_obj = divrem1((PyLongObject *)shiftby, PyLong_SHIFT, remshift);
- if (wordshift_obj == NULL) {
- return -1;
- }
- *wordshift = PyLong_AsSsize_t((PyObject *)wordshift_obj);
- Py_DECREF(wordshift_obj);
- if (*wordshift >= 0 && *wordshift < PY_SSIZE_T_MAX / (Py_ssize_t)sizeof(digit)) {
- return 0;
- }
- PyErr_Clear();
- /* Clip the value. With such large wordshift the right shift
- returns 0 and the left shift raises an error in _PyLong_New(). */
- *wordshift = PY_SSIZE_T_MAX / sizeof(digit);
- *remshift = 0;
- return 0;
-}
-
static PyObject *
-long_rshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift)
+long_rshift(PyLongObject *v, PyLongObject *w)
{
+ PyLongObject *a, *b;
PyLongObject *z = NULL;
- Py_ssize_t newsize, hishift, i, j;
+ Py_ssize_t shiftby, newsize, wordshift, loshift, hishift, i, j;
digit lomask, himask;
+ CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
+
if (Py_SIZE(a) < 0) {
/* Right shifting negative numbers is harder */
PyLongObject *a1, *a2;
a1 = (PyLongObject *) long_invert(a);
if (a1 == NULL)
- return NULL;
- a2 = (PyLongObject *) long_rshift1(a1, wordshift, remshift);
+ goto rshift_error;
+ a2 = (PyLongObject *) long_rshift(a1, b);
Py_DECREF(a1);
if (a2 == NULL)
- return NULL;
+ goto rshift_error;
z = (PyLongObject *) long_invert(a2);
Py_DECREF(a2);
}
else {
- newsize = Py_SIZE(a) - wordshift;
- if (newsize <= 0)
- return PyLong_FromLong(0);
- hishift = PyLong_SHIFT - remshift;
+ shiftby = PyLong_AsSsize_t((PyObject *)b);
+ if (shiftby == -1L && PyErr_Occurred())
+ goto rshift_error;
+ if (shiftby < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "negative shift count");
+ goto rshift_error;
+ }
+ wordshift = shiftby / PyLong_SHIFT;
+ newsize = ABS(Py_SIZE(a)) - wordshift;
+ if (newsize <= 0) {
+ z = _PyLong_New(0);
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return (PyObject *)z;
+ }
+ loshift = shiftby % PyLong_SHIFT;
+ hishift = PyLong_SHIFT - loshift;
lomask = ((digit)1 << hishift) - 1;
himask = PyLong_MASK ^ lomask;
z = _PyLong_New(newsize);
if (z == NULL)
- return NULL;
+ goto rshift_error;
+ if (Py_SIZE(a) < 0)
+ Py_SIZE(z) = -(Py_SIZE(z));
for (i = 0, j = wordshift; i < newsize; i++, j++) {
- z->ob_digit[i] = (a->ob_digit[j] >> remshift) & lomask;
+ z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
if (i+1 < newsize)
z->ob_digit[i] |= (a->ob_digit[j+1] << hishift) & himask;
}
- z = maybe_small_long(long_normalize(z));
+ z = long_normalize(z);
}
- return (PyObject *)z;
+ rshift_error:
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return (PyObject *) z;
+
}
static PyObject *
-long_rshift(PyObject *a, PyObject *b)
+long_lshift(PyObject *v, PyObject *w)
{
- Py_ssize_t wordshift;
- digit remshift;
+ /* This version due to Tim Peters */
+ PyLongObject *a, *b;
+ PyLongObject *z = NULL;
+ Py_ssize_t shiftby, oldsize, newsize, wordshift, remshift, i, j;
+ twodigits accum;
- CHECK_BINOP(a, b);
+ CONVERT_BINOP(v, w, &a, &b);
- if (Py_SIZE(b) < 0) {
+ shiftby = PyLong_AsSsize_t((PyObject *)b);
+ if (shiftby == -1L && PyErr_Occurred())
+ goto out;
+ if (shiftby < 0) {
PyErr_SetString(PyExc_ValueError, "negative shift count");
- return NULL;
+ goto out;
}
- if (Py_SIZE(a) == 0) {
- return PyLong_FromLong(0);
- }
- if (divmod_shift(b, &wordshift, &remshift) < 0)
- return NULL;
- return long_rshift1((PyLongObject *)a, wordshift, remshift);
-}
-/* Return a >> shiftby. */
-PyObject *
-_PyLong_Rshift(PyObject *a, size_t shiftby)
-{
- Py_ssize_t wordshift;
- digit remshift;
-
- assert(PyLong_Check(a));
if (Py_SIZE(a) == 0) {
- return PyLong_FromLong(0);
+ z = (PyLongObject *)PyLong_FromLong(0);
+ goto out;
}
- wordshift = shiftby / PyLong_SHIFT;
- remshift = shiftby % PyLong_SHIFT;
- return long_rshift1((PyLongObject *)a, wordshift, remshift);
-}
-static PyObject *
-long_lshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift)
-{
- /* This version due to Tim Peters */
- PyLongObject *z = NULL;
- Py_ssize_t oldsize, newsize, i, j;
- twodigits accum;
+ /* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
+ wordshift = shiftby / PyLong_SHIFT;
+ remshift = shiftby - wordshift * PyLong_SHIFT;
- oldsize = Py_ABS(Py_SIZE(a));
+ oldsize = ABS(Py_SIZE(a));
newsize = oldsize + wordshift;
if (remshift)
++newsize;
z = _PyLong_New(newsize);
if (z == NULL)
- return NULL;
- if (Py_SIZE(a) < 0) {
- assert(Py_REFCNT(z) == 1);
- Py_SIZE(z) = -Py_SIZE(z);
- }
+ goto out;
+ if (Py_SIZE(a) < 0)
+ Py_SIZE(z) = -(Py_SIZE(z));
for (i = 0; i < wordshift; i++)
z->ob_digit[i] = 0;
accum = 0;
@@ -4630,43 +3747,10 @@ long_lshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift)
else
assert(!accum);
z = long_normalize(z);
- return (PyObject *) maybe_small_long(z);
-}
-
-static PyObject *
-long_lshift(PyObject *a, PyObject *b)
-{
- Py_ssize_t wordshift;
- digit remshift;
-
- CHECK_BINOP(a, b);
-
- if (Py_SIZE(b) < 0) {
- PyErr_SetString(PyExc_ValueError, "negative shift count");
- return NULL;
- }
- if (Py_SIZE(a) == 0) {
- return PyLong_FromLong(0);
- }
- if (divmod_shift(b, &wordshift, &remshift) < 0)
- return NULL;
- return long_lshift1((PyLongObject *)a, wordshift, remshift);
-}
-
-/* Return a << shiftby. */
-PyObject *
-_PyLong_Lshift(PyObject *a, size_t shiftby)
-{
- Py_ssize_t wordshift;
- digit remshift;
-
- assert(PyLong_Check(a));
- if (Py_SIZE(a) == 0) {
- return PyLong_FromLong(0);
- }
- wordshift = shiftby / PyLong_SHIFT;
- remshift = shiftby % PyLong_SHIFT;
- return long_lshift1((PyLongObject *)a, wordshift, remshift);
+ out:
+ Py_DECREF(a);
+ Py_DECREF(b);
+ return (PyObject *) z;
}
/* Compute two's complement of digit vector a[0:m], writing result to
@@ -4690,7 +3774,7 @@ v_complement(digit *z, digit *a, Py_ssize_t m)
static PyObject *
long_bitwise(PyLongObject *a,
- char op, /* '&', '|', '^' */
+ int op, /* '&', '|', '^' */
PyLongObject *b)
{
int nega, negb, negz;
@@ -4703,7 +3787,7 @@ long_bitwise(PyLongObject *a,
result back to sign-magnitude at the end. */
/* If a is negative, replace it by its two's complement. */
- size_a = Py_ABS(Py_SIZE(a));
+ size_a = ABS(Py_SIZE(a));
nega = Py_SIZE(a) < 0;
if (nega) {
z = _PyLong_New(size_a);
@@ -4717,7 +3801,7 @@ long_bitwise(PyLongObject *a,
Py_INCREF(a);
/* Same for b. */
- size_b = Py_ABS(Py_SIZE(b));
+ size_b = ABS(Py_SIZE(b));
negb = Py_SIZE(b) < 0;
if (negb) {
z = _PyLong_New(size_b);
@@ -4759,7 +3843,8 @@ long_bitwise(PyLongObject *a,
size_z = negb ? size_b : size_a;
break;
default:
- Py_UNREACHABLE();
+ PyErr_BadArgument();
+ return NULL;
}
/* We allow an extra digit if z is negative, to make sure that
@@ -4786,7 +3871,8 @@ long_bitwise(PyLongObject *a,
z->ob_digit[i] = a->ob_digit[i] ^ b->ob_digit[i];
break;
default:
- Py_UNREACHABLE();
+ PyErr_BadArgument();
+ return NULL;
}
/* Copy any remaining digits of a, inverting if necessary. */
@@ -4806,36 +3892,63 @@ long_bitwise(PyLongObject *a,
Py_DECREF(a);
Py_DECREF(b);
- return (PyObject *)maybe_small_long(long_normalize(z));
+ return (PyObject *)long_normalize(z);
}
static PyObject *
-long_and(PyObject *a, PyObject *b)
+long_and(PyObject *v, PyObject *w)
{
+ PyLongObject *a, *b;
PyObject *c;
- CHECK_BINOP(a, b);
- c = long_bitwise((PyLongObject*)a, '&', (PyLongObject*)b);
+ CONVERT_BINOP(v, w, &a, &b);
+ c = long_bitwise(a, '&', b);
+ Py_DECREF(a);
+ Py_DECREF(b);
return c;
}
static PyObject *
-long_xor(PyObject *a, PyObject *b)
+long_xor(PyObject *v, PyObject *w)
{
+ PyLongObject *a, *b;
PyObject *c;
- CHECK_BINOP(a, b);
- c = long_bitwise((PyLongObject*)a, '^', (PyLongObject*)b);
+ CONVERT_BINOP(v, w, &a, &b);
+ c = long_bitwise(a, '^', b);
+ Py_DECREF(a);
+ Py_DECREF(b);
return c;
}
static PyObject *
-long_or(PyObject *a, PyObject *b)
+long_or(PyObject *v, PyObject *w)
{
+ PyLongObject *a, *b;
PyObject *c;
- CHECK_BINOP(a, b);
- c = long_bitwise((PyLongObject*)a, '|', (PyLongObject*)b);
+ CONVERT_BINOP(v, w, &a, &b);
+ c = long_bitwise(a, '|', b);
+ Py_DECREF(a);
+ Py_DECREF(b);
return c;
}
+static int
+long_coerce(PyObject **pv, PyObject **pw)
+{
+ if (PyInt_Check(*pw)) {
+ *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
+ if (*pw == NULL)
+ return -1;
+ Py_INCREF(*pv);
+ return 0;
+ }
+ else if (PyLong_Check(*pw)) {
+ Py_INCREF(*pv);
+ Py_INCREF(*pw);
+ return 0;
+ }
+ return 1; /* Can't do it */
+}
+
static PyObject *
long_long(PyObject *v)
{
@@ -4846,211 +3959,25 @@ long_long(PyObject *v)
return v;
}
-PyObject *
-_PyLong_GCD(PyObject *aarg, PyObject *barg)
+static PyObject *
+long_int(PyObject *v)
{
- PyLongObject *a, *b, *c = NULL, *d = NULL, *r;
- stwodigits x, y, q, s, t, c_carry, d_carry;
- stwodigits A, B, C, D, T;
- int nbits, k;
- Py_ssize_t size_a, size_b, alloc_a, alloc_b;
- digit *a_digit, *b_digit, *c_digit, *d_digit, *a_end, *b_end;
-
- a = (PyLongObject *)aarg;
- b = (PyLongObject *)barg;
- size_a = Py_SIZE(a);
- size_b = Py_SIZE(b);
- if (-2 <= size_a && size_a <= 2 && -2 <= size_b && size_b <= 2) {
- Py_INCREF(a);
- Py_INCREF(b);
- goto simple;
- }
-
- /* Initial reduction: make sure that 0 <= b <= a. */
- a = (PyLongObject *)long_abs(a);
- if (a == NULL)
- return NULL;
- b = (PyLongObject *)long_abs(b);
- if (b == NULL) {
- Py_DECREF(a);
- return NULL;
- }
- if (long_compare(a, b) < 0) {
- r = a;
- a = b;
- b = r;
- }
- /* We now own references to a and b */
-
- alloc_a = Py_SIZE(a);
- alloc_b = Py_SIZE(b);
- /* reduce until a fits into 2 digits */
- while ((size_a = Py_SIZE(a)) > 2) {
- nbits = bits_in_digit(a->ob_digit[size_a-1]);
- /* extract top 2*PyLong_SHIFT bits of a into x, along with
- corresponding bits of b into y */
- size_b = Py_SIZE(b);
- assert(size_b <= size_a);
- if (size_b == 0) {
- if (size_a < alloc_a) {
- r = (PyLongObject *)_PyLong_Copy(a);
- Py_DECREF(a);
+ long x;
+ x = PyLong_AsLong(v);
+ if (PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
+ PyErr_Clear();
+ if (PyLong_CheckExact(v)) {
+ Py_INCREF(v);
+ return v;
}
else
- r = a;
- Py_DECREF(b);
- Py_XDECREF(c);
- Py_XDECREF(d);
- return (PyObject *)r;
- }
- x = (((twodigits)a->ob_digit[size_a-1] << (2*PyLong_SHIFT-nbits)) |
- ((twodigits)a->ob_digit[size_a-2] << (PyLong_SHIFT-nbits)) |
- (a->ob_digit[size_a-3] >> nbits));
-
- y = ((size_b >= size_a - 2 ? b->ob_digit[size_a-3] >> nbits : 0) |
- (size_b >= size_a - 1 ? (twodigits)b->ob_digit[size_a-2] << (PyLong_SHIFT-nbits) : 0) |
- (size_b >= size_a ? (twodigits)b->ob_digit[size_a-1] << (2*PyLong_SHIFT-nbits) : 0));
-
- /* inner loop of Lehmer's algorithm; A, B, C, D never grow
- larger than PyLong_MASK during the algorithm. */
- A = 1; B = 0; C = 0; D = 1;
- for (k=0;; k++) {
- if (y-C == 0)
- break;
- q = (x+(A-1))/(y-C);
- s = B+q*D;
- t = x-q*y;
- if (s > t)
- break;
- x = y; y = t;
- t = A+q*C; A = D; B = C; C = s; D = t;
- }
-
- if (k == 0) {
- /* no progress; do a Euclidean step */
- if (l_divmod(a, b, NULL, &r) < 0)
- goto error;
- Py_DECREF(a);
- a = b;
- b = r;
- alloc_a = alloc_b;
- alloc_b = Py_SIZE(b);
- continue;
- }
-
- /*
- a, b = A*b-B*a, D*a-C*b if k is odd
- a, b = A*a-B*b, D*b-C*a if k is even
- */
- if (k&1) {
- T = -A; A = -B; B = T;
- T = -C; C = -D; D = T;
- }
- if (c != NULL)
- Py_SIZE(c) = size_a;
- else if (Py_REFCNT(a) == 1) {
- Py_INCREF(a);
- c = a;
- }
- else {
- alloc_a = size_a;
- c = _PyLong_New(size_a);
- if (c == NULL)
- goto error;
- }
-
- if (d != NULL)
- Py_SIZE(d) = size_a;
- else if (Py_REFCNT(b) == 1 && size_a <= alloc_b) {
- Py_INCREF(b);
- d = b;
- Py_SIZE(d) = size_a;
+ return _PyLong_Copy((PyLongObject *)v);
}
- else {
- alloc_b = size_a;
- d = _PyLong_New(size_a);
- if (d == NULL)
- goto error;
- }
- a_end = a->ob_digit + size_a;
- b_end = b->ob_digit + size_b;
-
- /* compute new a and new b in parallel */
- a_digit = a->ob_digit;
- b_digit = b->ob_digit;
- c_digit = c->ob_digit;
- d_digit = d->ob_digit;
- c_carry = 0;
- d_carry = 0;
- while (b_digit < b_end) {
- c_carry += (A * *a_digit) - (B * *b_digit);
- d_carry += (D * *b_digit++) - (C * *a_digit++);
- *c_digit++ = (digit)(c_carry & PyLong_MASK);
- *d_digit++ = (digit)(d_carry & PyLong_MASK);
- c_carry >>= PyLong_SHIFT;
- d_carry >>= PyLong_SHIFT;
- }
- while (a_digit < a_end) {
- c_carry += A * *a_digit;
- d_carry -= C * *a_digit++;
- *c_digit++ = (digit)(c_carry & PyLong_MASK);
- *d_digit++ = (digit)(d_carry & PyLong_MASK);
- c_carry >>= PyLong_SHIFT;
- d_carry >>= PyLong_SHIFT;
- }
- assert(c_carry == 0);
- assert(d_carry == 0);
-
- Py_INCREF(c);
- Py_INCREF(d);
- Py_DECREF(a);
- Py_DECREF(b);
- a = long_normalize(c);
- b = long_normalize(d);
- }
- Py_XDECREF(c);
- Py_XDECREF(d);
-
-simple:
- assert(Py_REFCNT(a) > 0);
- assert(Py_REFCNT(b) > 0);
-/* Issue #24999: use two shifts instead of ">> 2*PyLong_SHIFT" to avoid
- undefined behaviour when LONG_MAX type is smaller than 60 bits */
-#if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
- /* a fits into a long, so b must too */
- x = PyLong_AsLong((PyObject *)a);
- y = PyLong_AsLong((PyObject *)b);
-#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
- x = PyLong_AsLongLong((PyObject *)a);
- y = PyLong_AsLongLong((PyObject *)b);
-#else
-# error "_PyLong_GCD"
-#endif
- x = Py_ABS(x);
- y = Py_ABS(y);
- Py_DECREF(a);
- Py_DECREF(b);
-
- /* usual Euclidean algorithm for longs */
- while (y != 0) {
- t = y;
- y = x % y;
- x = t;
+ else
+ return NULL;
}
-#if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
- return PyLong_FromLong(x);
-#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT
- return PyLong_FromLongLong(x);
-#else
-# error "_PyLong_GCD"
-#endif
-
-error:
- Py_DECREF(a);
- Py_DECREF(b);
- Py_XDECREF(c);
- Py_XDECREF(d);
- return NULL;
+ return PyInt_FromLong(x);
}
static PyObject *
@@ -5064,74 +3991,87 @@ long_float(PyObject *v)
}
static PyObject *
-long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase);
+long_oct(PyObject *v)
+{
+ return _PyLong_Format(v, 8, 1, 0);
+}
-/*[clinic input]
-@classmethod
-int.__new__ as long_new
- x: object(c_default="NULL") = 0
- /
- base as obase: object(c_default="NULL") = 10
-[clinic start generated code]*/
+static PyObject *
+long_hex(PyObject *v)
+{
+ return _PyLong_Format(v, 16, 1, 0);
+}
+
+static PyObject *
+long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
static PyObject *
-long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase)
-/*[clinic end generated code: output=e47cfe777ab0f24c input=81c98f418af9eb6f]*/
+long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- Py_ssize_t base;
+ PyObject *x = NULL;
+ int base = -909; /* unlikely! */
+ static char *kwlist[] = {"x", "base", 0};
if (type != &PyLong_Type)
- return long_subtype_new(type, x, obase); /* Wimp out */
+ return long_subtype_new(type, args, kwds); /* Wimp out */
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
+ &x, &base))
+ return NULL;
if (x == NULL) {
- if (obase != NULL) {
+ if (base != -909) {
PyErr_SetString(PyExc_TypeError,
- "int() missing string argument");
+ "long() missing string argument");
return NULL;
}
return PyLong_FromLong(0L);
}
- if (obase == NULL)
+ if (base == -909)
return PyNumber_Long(x);
-
- base = PyNumber_AsSsize_t(obase, NULL);
- if (base == -1 && PyErr_Occurred())
- return NULL;
- if ((base != 0 && base < 2) || base > 36) {
- PyErr_SetString(PyExc_ValueError,
- "int() base must be >= 2 and <= 36, or 0");
- return NULL;
- }
-
- if (PyUnicode_Check(x))
- return PyLong_FromUnicodeObject(x, (int)base);
- else if (PyByteArray_Check(x) || PyBytes_Check(x)) {
- char *string;
- if (PyByteArray_Check(x))
- string = PyByteArray_AS_STRING(x);
- else
- string = PyBytes_AS_STRING(x);
- return _PyLong_FromBytes(string, Py_SIZE(x), (int)base);
+ else if (PyString_Check(x)) {
+ /* Since PyLong_FromString doesn't have a length parameter,
+ * check here for possible NULs in the string. */
+ char *string = PyString_AS_STRING(x);
+ if (strlen(string) != (size_t)PyString_Size(x)) {
+ /* create a repr() of the input string,
+ * just like PyLong_FromString does. */
+ PyObject *srepr;
+ srepr = PyObject_Repr(x);
+ if (srepr == NULL)
+ return NULL;
+ PyErr_Format(PyExc_ValueError,
+ "invalid literal for long() with base %d: %s",
+ base, PyString_AS_STRING(srepr));
+ Py_DECREF(srepr);
+ return NULL;
+ }
+ return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
}
+#ifdef Py_USING_UNICODE
+ else if (PyUnicode_Check(x))
+ return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
+ PyUnicode_GET_SIZE(x),
+ base);
+#endif
else {
PyErr_SetString(PyExc_TypeError,
- "int() can't convert non-string with explicit base");
+ "long() 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,
+/* Wimpy, slow approach to tp_new calls for subtypes of long:
+ first create a regular long from whatever arguments we got,
then allocate a subtype instance and initialize it from
- the regular int. The regular int is then thrown away.
+ the regular long. The regular long is then thrown away.
*/
static PyObject *
-long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase)
+long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyLongObject *tmp, *newobj;
Py_ssize_t i, n;
assert(PyType_IsSubtype(type, &PyLong_Type));
- tmp = (PyLongObject *)long_new_impl(&PyLong_Type, x, obase);
+ tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
if (tmp == NULL)
return NULL;
assert(PyLong_Check(tmp));
@@ -5151,263 +4091,84 @@ long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase)
return (PyObject *)newobj;
}
-/*[clinic input]
-int.__getnewargs__
-[clinic start generated code]*/
-
static PyObject *
-int___getnewargs___impl(PyObject *self)
-/*[clinic end generated code: output=839a49de3f00b61b input=5904770ab1fb8c75]*/
+long_getnewargs(PyLongObject *v)
{
- return Py_BuildValue("(N)", _PyLong_Copy((PyLongObject *)self));
+ return Py_BuildValue("(N)", _PyLong_Copy(v));
}
static PyObject *
-long_get0(PyObject *Py_UNUSED(self), void *Py_UNUSED(context))
-{
+long_get0(PyLongObject *v, void *context) {
return PyLong_FromLong(0L);
}
static PyObject *
-long_get1(PyObject *Py_UNUSED(self), void *Py_UNUSED(ignored))
-{
+long_get1(PyLongObject *v, void *context) {
return PyLong_FromLong(1L);
}
-/*[clinic input]
-int.__format__
-
- format_spec: unicode
- /
-[clinic start generated code]*/
-
static PyObject *
-int___format___impl(PyObject *self, PyObject *format_spec)
-/*[clinic end generated code: output=b4929dee9ae18689 input=e31944a9b3e428b7]*/
-{
- _PyUnicodeWriter writer;
- int ret;
-
- _PyUnicodeWriter_Init(&writer);
- ret = _PyLong_FormatAdvancedWriter(
- &writer,
- self,
- format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
- if (ret == -1) {
- _PyUnicodeWriter_Dealloc(&writer);
- return NULL;
- }
- return _PyUnicodeWriter_Finish(&writer);
-}
-
-/* Return a pair (q, r) such that a = b * q + r, and
- abs(r) <= abs(b)/2, with equality possible only if q is even.
- In other words, q == a / b, rounded to the nearest integer using
- round-half-to-even. */
-
-PyObject *
-_PyLong_DivmodNear(PyObject *a, PyObject *b)
+long__format__(PyObject *self, PyObject *args)
{
- PyLongObject *quo = NULL, *rem = NULL;
- PyObject *twice_rem, *result, *temp;
- int quo_is_odd, quo_is_neg;
- Py_ssize_t cmp;
-
- /* Equivalent Python code:
-
- def divmod_near(a, b):
- q, r = divmod(a, b)
- # round up if either r / b > 0.5, or r / b == 0.5 and q is odd.
- # The expression r / b > 0.5 is equivalent to 2 * r > b if b is
- # positive, 2 * r < b if b negative.
- greater_than_half = 2*r > b if b > 0 else 2*r < b
- exactly_half = 2*r == b
- if greater_than_half or exactly_half and q % 2 == 1:
- q += 1
- r -= b
- return q, r
+ PyObject *format_spec;
- */
- if (!PyLong_Check(a) || !PyLong_Check(b)) {
- PyErr_SetString(PyExc_TypeError,
- "non-integer arguments in division");
+ if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
return NULL;
- }
-
- /* Do a and b have different signs? If so, quotient is negative. */
- quo_is_neg = (Py_SIZE(a) < 0) != (Py_SIZE(b) < 0);
-
- if (long_divrem((PyLongObject*)a, (PyLongObject*)b, &quo, &rem) < 0)
- goto error;
+ if (PyBytes_Check(format_spec))
+ return _PyLong_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;
- /* compare twice the remainder with the divisor, to see
- if we need to adjust the quotient and remainder */
- twice_rem = long_lshift((PyObject *)rem, _PyLong_One);
- if (twice_rem == NULL)
- goto error;
- if (quo_is_neg) {
- temp = long_neg((PyLongObject*)twice_rem);
- Py_DECREF(twice_rem);
- twice_rem = temp;
- if (twice_rem == NULL)
- goto error;
- }
- cmp = long_compare((PyLongObject *)twice_rem, (PyLongObject *)b);
- Py_DECREF(twice_rem);
+ result = _PyLong_FormatAdvanced(self,
+ PyBytes_AS_STRING(str_spec),
+ PyBytes_GET_SIZE(str_spec));
- quo_is_odd = Py_SIZE(quo) != 0 && ((quo->ob_digit[0] & 1) != 0);
- if ((Py_SIZE(b) < 0 ? cmp < 0 : cmp > 0) || (cmp == 0 && quo_is_odd)) {
- /* fix up quotient */
- if (quo_is_neg)
- temp = long_sub(quo, (PyLongObject *)_PyLong_One);
- else
- temp = long_add(quo, (PyLongObject *)_PyLong_One);
- Py_DECREF(quo);
- quo = (PyLongObject *)temp;
- if (quo == NULL)
- goto error;
- /* and remainder */
- if (quo_is_neg)
- temp = long_add(rem, (PyLongObject *)b);
- else
- temp = long_sub(rem, (PyLongObject *)b);
- Py_DECREF(rem);
- rem = (PyLongObject *)temp;
- if (rem == NULL)
- goto error;
+ Py_DECREF(str_spec);
+ return result;
}
-
- result = PyTuple_New(2);
- if (result == NULL)
- goto error;
-
- /* PyTuple_SET_ITEM steals references */
- PyTuple_SET_ITEM(result, 0, (PyObject *)quo);
- PyTuple_SET_ITEM(result, 1, (PyObject *)rem);
- return result;
-
- error:
- Py_XDECREF(quo);
- Py_XDECREF(rem);
+ PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
return NULL;
}
static PyObject *
-long_round(PyObject *self, PyObject *args)
-{
- PyObject *o_ndigits=NULL, *temp, *result, *ndigits;
-
- /* To round an integer m to the nearest 10**n (n positive), we make use of
- * the divmod_near operation, defined by:
- *
- * divmod_near(a, b) = (q, r)
- *
- * where q is the nearest integer to the quotient a / b (the
- * nearest even integer in the case of a tie) and r == a - q * b.
- * Hence q * b = a - r is the nearest multiple of b to a,
- * preferring even multiples in the case of a tie.
- *
- * So the nearest multiple of 10**n to m is:
- *
- * m - divmod_near(m, 10**n)[1].
- */
- if (!PyArg_ParseTuple(args, "|O", &o_ndigits))
- return NULL;
- if (o_ndigits == NULL)
- return long_long(self);
-
- ndigits = PyNumber_Index(o_ndigits);
- if (ndigits == NULL)
- return NULL;
-
- /* if ndigits >= 0 then no rounding is necessary; return self unchanged */
- if (Py_SIZE(ndigits) >= 0) {
- Py_DECREF(ndigits);
- return long_long(self);
- }
-
- /* result = self - divmod_near(self, 10 ** -ndigits)[1] */
- temp = long_neg((PyLongObject*)ndigits);
- Py_DECREF(ndigits);
- ndigits = temp;
- if (ndigits == NULL)
- return NULL;
-
- result = PyLong_FromLong(10L);
- if (result == NULL) {
- Py_DECREF(ndigits);
- return NULL;
- }
-
- temp = long_pow(result, ndigits, Py_None);
- Py_DECREF(ndigits);
- Py_DECREF(result);
- result = temp;
- if (result == NULL)
- return NULL;
-
- temp = _PyLong_DivmodNear(self, result);
- Py_DECREF(result);
- result = temp;
- if (result == NULL)
- return NULL;
-
- temp = long_sub((PyLongObject *)self,
- (PyLongObject *)PyTuple_GET_ITEM(result, 1));
- Py_DECREF(result);
- result = temp;
-
- return result;
-}
-
-/*[clinic input]
-int.__sizeof__ -> Py_ssize_t
-
-Returns size in memory, in bytes.
-[clinic start generated code]*/
-
-static Py_ssize_t
-int___sizeof___impl(PyObject *self)
-/*[clinic end generated code: output=3303f008eaa6a0a5 input=9b51620c76fc4507]*/
+long_sizeof(PyLongObject *v)
{
Py_ssize_t res;
- res = offsetof(PyLongObject, ob_digit) + Py_ABS(Py_SIZE(self))*sizeof(digit);
- return res;
+ res = Py_TYPE(v)->tp_basicsize + ABS(Py_SIZE(v))*sizeof(digit);
+ return PyInt_FromSsize_t(res);
}
-/*[clinic input]
-int.bit_length
-
-Number of bits necessary to represent self in binary.
-
->>> bin(37)
-'0b100101'
->>> (37).bit_length()
-6
-[clinic start generated code]*/
-
static PyObject *
-int_bit_length_impl(PyObject *self)
-/*[clinic end generated code: output=fc1977c9353d6a59 input=e4eb7a587e849a32]*/
+long_bit_length(PyLongObject *v)
{
PyLongObject *result, *x, *y;
- Py_ssize_t ndigits;
- int msd_bits;
+ Py_ssize_t ndigits, msd_bits = 0;
digit msd;
- assert(self != NULL);
- assert(PyLong_Check(self));
+ assert(v != NULL);
+ assert(PyLong_Check(v));
- ndigits = Py_ABS(Py_SIZE(self));
+ ndigits = ABS(Py_SIZE(v));
if (ndigits == 0)
- return PyLong_FromLong(0);
+ return PyInt_FromLong(0);
- msd = ((PyLongObject *)self)->ob_digit[ndigits-1];
- msd_bits = bits_in_digit(msd);
+ msd = v->ob_digit[ndigits-1];
+ while (msd >= 32) {
+ msd_bits += 6;
+ msd >>= 6;
+ }
+ msd_bits += (long)(BitLengthTable[msd]);
if (ndigits <= PY_SSIZE_T_MAX/PyLong_SHIFT)
- return PyLong_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits);
+ return PyInt_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits);
/* expression above may overflow; use Python integers instead */
result = (PyLongObject *)PyLong_FromSsize_t(ndigits - 1);
@@ -5440,6 +4201,15 @@ int_bit_length_impl(PyObject *self)
return NULL;
}
+PyDoc_STRVAR(long_bit_length_doc,
+"long.bit_length() -> int or long\n\
+\n\
+Number of bits necessary to represent self in binary.\n\
+>>> bin(37L)\n\
+'0b100101'\n\
+>>> (37L).bit_length()\n\
+6");
+
#if 0
static PyObject *
long_is_finite(PyObject *v)
@@ -5448,242 +4218,87 @@ long_is_finite(PyObject *v)
}
#endif
-/*[clinic input]
-int.as_integer_ratio
-
-Return integer ratio.
-
-Return a pair of integers, whose ratio is exactly equal to the original int
-and with a positive denominator.
-
->>> (10).as_integer_ratio()
-(10, 1)
->>> (-10).as_integer_ratio()
-(-10, 1)
->>> (0).as_integer_ratio()
-(0, 1)
-[clinic start generated code]*/
-
-static PyObject *
-int_as_integer_ratio_impl(PyObject *self)
-/*[clinic end generated code: output=e60803ae1cc8621a input=55ce3058e15de393]*/
-{
- PyObject *ratio_tuple;
- PyObject *numerator = long_long(self);
- if (numerator == NULL) {
- return NULL;
- }
- ratio_tuple = PyTuple_Pack(2, numerator, _PyLong_One);
- Py_DECREF(numerator);
- return ratio_tuple;
-}
-
-/*[clinic input]
-int.to_bytes
-
- length: Py_ssize_t
- Length of bytes object to use. An OverflowError is raised if the
- integer is not representable with the given number of bytes.
- byteorder: unicode
- The byte order used to represent the integer. If byteorder is 'big',
- the most significant byte is at the beginning of the byte array. If
- byteorder is 'little', the most significant byte is at the end of the
- byte array. To request the native byte order of the host system, use
- `sys.byteorder' as the byte order value.
- *
- signed as is_signed: bool = False
- Determines whether two's complement is used to represent the integer.
- If signed is False and a negative integer is given, an OverflowError
- is raised.
-
-Return an array of bytes representing an integer.
-[clinic start generated code]*/
-
-static PyObject *
-int_to_bytes_impl(PyObject *self, Py_ssize_t length, PyObject *byteorder,
- int is_signed)
-/*[clinic end generated code: output=89c801df114050a3 input=ddac63f4c7bf414c]*/
-{
- int little_endian;
- PyObject *bytes;
-
- if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_little))
- little_endian = 1;
- else if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_big))
- little_endian = 0;
- else {
- PyErr_SetString(PyExc_ValueError,
- "byteorder must be either 'little' or 'big'");
- return NULL;
- }
-
- if (length < 0) {
- PyErr_SetString(PyExc_ValueError,
- "length argument must be non-negative");
- return NULL;
- }
-
- bytes = PyBytes_FromStringAndSize(NULL, length);
- if (bytes == NULL)
- return NULL;
-
- if (_PyLong_AsByteArray((PyLongObject *)self,
- (unsigned char *)PyBytes_AS_STRING(bytes),
- length, little_endian, is_signed) < 0) {
- Py_DECREF(bytes);
- return NULL;
- }
-
- return bytes;
-}
-
-/*[clinic input]
-@classmethod
-int.from_bytes
-
- bytes as bytes_obj: object
- Holds the array of bytes to convert. The argument must either
- support the buffer protocol or be an iterable object producing bytes.
- Bytes and bytearray are examples of built-in objects that support the
- buffer protocol.
- byteorder: unicode
- The byte order used to represent the integer. If byteorder is 'big',
- the most significant byte is at the beginning of the byte array. If
- byteorder is 'little', the most significant byte is at the end of the
- byte array. To request the native byte order of the host system, use
- `sys.byteorder' as the byte order value.
- *
- signed as is_signed: bool = False
- Indicates whether two's complement is used to represent the integer.
-
-Return the integer represented by the given array of bytes.
-[clinic start generated code]*/
-
-static PyObject *
-int_from_bytes_impl(PyTypeObject *type, PyObject *bytes_obj,
- PyObject *byteorder, int is_signed)
-/*[clinic end generated code: output=efc5d68e31f9314f input=cdf98332b6a821b0]*/
-{
- int little_endian;
- PyObject *long_obj, *bytes;
-
- if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_little))
- little_endian = 1;
- else if (_PyUnicode_EqualToASCIIId(byteorder, &PyId_big))
- little_endian = 0;
- else {
- PyErr_SetString(PyExc_ValueError,
- "byteorder must be either 'little' or 'big'");
- return NULL;
- }
-
- bytes = PyObject_Bytes(bytes_obj);
- if (bytes == NULL)
- return NULL;
-
- long_obj = _PyLong_FromByteArray(
- (unsigned char *)PyBytes_AS_STRING(bytes), Py_SIZE(bytes),
- little_endian, is_signed);
- Py_DECREF(bytes);
-
- if (long_obj != NULL && type != &PyLong_Type) {
- Py_SETREF(long_obj, _PyObject_CallOneArg((PyObject *)type, long_obj));
- }
-
- return long_obj;
-}
-
-static PyObject *
-long_long_meth(PyObject *self, PyObject *Py_UNUSED(ignored))
-{
- return long_long(self);
-}
-
static PyMethodDef long_methods[] = {
- {"conjugate", long_long_meth, METH_NOARGS,
- "Returns self, the complex conjugate of any int."},
- INT_BIT_LENGTH_METHODDEF
+ {"conjugate", (PyCFunction)long_long, METH_NOARGS,
+ "Returns self, the complex conjugate of any long."},
+ {"bit_length", (PyCFunction)long_bit_length, METH_NOARGS,
+ long_bit_length_doc},
#if 0
{"is_finite", (PyCFunction)long_is_finite, METH_NOARGS,
"Returns always True."},
#endif
- INT_TO_BYTES_METHODDEF
- INT_FROM_BYTES_METHODDEF
- INT_AS_INTEGER_RATIO_METHODDEF
- {"__trunc__", long_long_meth, METH_NOARGS,
+ {"__trunc__", (PyCFunction)long_long, METH_NOARGS,
"Truncating an Integral returns itself."},
- {"__floor__", long_long_meth, METH_NOARGS,
- "Flooring an Integral returns itself."},
- {"__ceil__", long_long_meth, METH_NOARGS,
- "Ceiling of an Integral returns itself."},
- {"__round__", (PyCFunction)long_round, METH_VARARGS,
- "Rounding an Integral returns itself.\n"
- "Rounding with an ndigits argument also returns an integer."},
- INT___GETNEWARGS___METHODDEF
- INT___FORMAT___METHODDEF
- INT___SIZEOF___METHODDEF
+ {"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
+ {"__format__", (PyCFunction)long__format__, METH_VARARGS},
+ {"__sizeof__", (PyCFunction)long_sizeof, METH_NOARGS,
+ "Returns size in memory, in bytes"},
{NULL, NULL} /* sentinel */
};
static PyGetSetDef long_getset[] = {
{"real",
- (getter)long_long_meth, (setter)NULL,
+ (getter)long_long, (setter)NULL,
"the real part of a complex number",
NULL},
{"imag",
- long_get0, (setter)NULL,
+ (getter)long_get0, (setter)NULL,
"the imaginary part of a complex number",
NULL},
{"numerator",
- (getter)long_long_meth, (setter)NULL,
+ (getter)long_long, (setter)NULL,
"the numerator of a rational number in lowest terms",
NULL},
{"denominator",
- long_get1, (setter)NULL,
+ (getter)long_get1, (setter)NULL,
"the denominator of a rational number in lowest terms",
NULL},
{NULL} /* Sentinel */
};
PyDoc_STRVAR(long_doc,
-"int([x]) -> integer\n\
-int(x, base=10) -> integer\n\
+"long(x=0) -> long\n\
+long(x, base=10) -> long\n\
\n\
-Convert a number or string to an integer, or return 0 if no arguments\n\
-are given. If x is a number, return x.__int__(). For floating point\n\
-numbers, this truncates towards zero.\n\
+Convert a number or string to a long integer, or return 0L if no arguments\n\
+are given. If x is floating point, the conversion truncates towards zero.\n\
\n\
-If x is not a number or if base is given, then x must be a string,\n\
-bytes, or bytearray instance representing an integer literal in the\n\
-given base. The literal can be preceded by '+' or '-' and be surrounded\n\
-by whitespace. The base defaults to 10. Valid bases are 0 and 2-36.\n\
-Base 0 means to interpret the base from the string as an integer literal.\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");
+4L");
static PyNumberMethods long_as_number = {
(binaryfunc)long_add, /*nb_add*/
(binaryfunc)long_sub, /*nb_subtract*/
(binaryfunc)long_mul, /*nb_multiply*/
+ long_classic_div, /*nb_divide*/
long_mod, /*nb_remainder*/
long_divmod, /*nb_divmod*/
long_pow, /*nb_power*/
(unaryfunc)long_neg, /*nb_negative*/
- long_long, /*tp_positive*/
+ (unaryfunc)long_long, /*tp_positive*/
(unaryfunc)long_abs, /*tp_absolute*/
- (inquiry)long_bool, /*tp_bool*/
+ (inquiry)long_nonzero, /*tp_nonzero*/
(unaryfunc)long_invert, /*nb_invert*/
long_lshift, /*nb_lshift*/
- long_rshift, /*nb_rshift*/
+ (binaryfunc)long_rshift, /*nb_rshift*/
long_and, /*nb_and*/
long_xor, /*nb_xor*/
long_or, /*nb_or*/
- long_long, /*nb_int*/
- 0, /*nb_reserved*/
+ long_coerce, /*nb_coerce*/
+ long_int, /*nb_int*/
+ long_long, /*nb_long*/
long_float, /*nb_float*/
+ long_oct, /*nb_oct*/
+ long_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 */
@@ -5700,30 +4315,30 @@ static PyNumberMethods long_as_number = {
PyTypeObject PyLong_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
- "int", /* tp_name */
+ "long", /* tp_name */
offsetof(PyLongObject, ob_digit), /* tp_basicsize */
sizeof(digit), /* tp_itemsize */
- 0, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
+ long_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
- 0, /* tp_as_async */
- long_to_decimal_string, /* tp_repr */
+ (cmpfunc)long_compare, /* tp_compare */
+ long_repr, /* tp_repr */
&long_as_number, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
(hashfunc)long_hash, /* tp_hash */
0, /* tp_call */
- 0, /* tp_str */
+ long_str, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
- Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
+ Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */
long_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
- long_richcompare, /* tp_richcompare */
+ 0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
@@ -5741,93 +4356,51 @@ PyTypeObject PyLong_Type = {
PyObject_Del, /* tp_free */
};
-static PyTypeObject Int_InfoType;
+static PyTypeObject Long_InfoType;
-PyDoc_STRVAR(int_info__doc__,
-"sys.int_info\n\
+PyDoc_STRVAR(long_info__doc__,
+"sys.long_info\n\
\n\
-A named tuple that holds information about Python's\n\
+A struct sequence that holds information about Python's\n\
internal representation of integers. The attributes are read only.");
-static PyStructSequence_Field int_info_fields[] = {
+static PyStructSequence_Field long_info_fields[] = {
{"bits_per_digit", "size of a digit in bits"},
{"sizeof_digit", "size in bytes of the C type used to represent a digit"},
{NULL, NULL}
};
-static PyStructSequence_Desc int_info_desc = {
- "sys.int_info", /* name */
- int_info__doc__, /* doc */
- int_info_fields, /* fields */
- 2 /* number of fields */
+static PyStructSequence_Desc long_info_desc = {
+ "sys.long_info", /* name */
+ long_info__doc__, /* doc */
+ long_info_fields, /* fields */
+ 2 /* number of fields */
};
PyObject *
PyLong_GetInfo(void)
{
- PyObject* int_info;
+ PyObject* long_info;
int field = 0;
- int_info = PyStructSequence_New(&Int_InfoType);
- if (int_info == NULL)
+ long_info = PyStructSequence_New(&Long_InfoType);
+ if (long_info == NULL)
return NULL;
- PyStructSequence_SET_ITEM(int_info, field++,
- PyLong_FromLong(PyLong_SHIFT));
- PyStructSequence_SET_ITEM(int_info, field++,
- PyLong_FromLong(sizeof(digit)));
+ PyStructSequence_SET_ITEM(long_info, field++,
+ PyInt_FromLong(PyLong_SHIFT));
+ PyStructSequence_SET_ITEM(long_info, field++,
+ PyInt_FromLong(sizeof(digit)));
if (PyErr_Occurred()) {
- Py_CLEAR(int_info);
+ Py_CLEAR(long_info);
return NULL;
}
- return int_info;
+ return long_info;
}
int
_PyLong_Init(void)
{
-#if NSMALLNEGINTS + NSMALLPOSINTS > 0
- for (Py_ssize_t i=0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) {
- sdigit ival = (sdigit)i - NSMALLNEGINTS;
- int size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1);
-
- PyLongObject *v = _PyLong_New(1);
- if (!v) {
- return -1;
- }
-
- Py_SIZE(v) = size;
- v->ob_digit[0] = (digit)abs(ival);
-
- small_ints[i] = v;
- }
-#endif
- _PyLong_Zero = PyLong_FromLong(0);
- if (_PyLong_Zero == NULL) {
- return 0;
- }
-
- _PyLong_One = PyLong_FromLong(1);
- if (_PyLong_One == NULL) {
- return 0;
- }
-
- /* initialize int_info */
- if (Int_InfoType.tp_name == NULL) {
- if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) {
- return 0;
- }
- }
-
+ /* initialize long_info */
+ if (Long_InfoType.tp_name == 0)
+ PyStructSequence_InitType(&Long_InfoType, &long_info_desc);
return 1;
}
-
-void
-_PyLong_Fini(void)
-{
- Py_CLEAR(_PyLong_One);
- Py_CLEAR(_PyLong_Zero);
-#if NSMALLNEGINTS + NSMALLPOSINTS > 0
- for (Py_ssize_t i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) {
- Py_CLEAR(small_ints[i]);
- }
-#endif
-}