Merged the int/long unification branch, by very crude means (sorry Thomas!).

I banged on the code (beyond what's in that branch) to make fewer tests fail;
the only tests that fail now are:
  test_descr -- can't pickle ints?!
  test_pickletools -- ???
  test_socket -- See python.org/sf/1619659
  test_sqlite -- ???
I'll deal with those later.
This commit is contained in:
Guido van Rossum 2007-01-14 03:31:43 +00:00
parent 5b787e8bc2
commit ddefaf31b3
46 changed files with 798 additions and 404 deletions

4
BROKEN_TESTS Normal file
View File

@ -0,0 +1,4 @@
test_descr -- can't pickle int objects?!?!
test_pickletools -- ???
test_socket -- OverflowError: can't convert negative value to unsigned int
test_sqlite -- ???

50
INTBENCH Normal file
View File

@ -0,0 +1,50 @@
Measurements of _testcapi.profile_int, on an 800MHz G3, OSX 10.4.7
best of three runs
r51476 (original p3yk)
Test 1: 1.601978s
Test 2: 1.696623s
Test 3: 1.900683s
Test 4: 5.307155s
Test 5: 2.546707s
Test 6: 1.670252s
Test 7: 1.910734s
r51506 (int type dropped)
Test 1: 4.134757s
Test 2: 4.398235s
Test 3: 4.611636s
Test 4: 10.665429s
r51509 (small int cache)
Test 1: 3.457184s
Test 2: 4.514800s
Test 3: 4.999010s
Test 4: 10.818277s
r51452 (special-casing medium int allocation)
Test 1: 3.258219s
Test 2: 4.255007s
Test 3: 4.547923s
Test 4: 10.615123s
Test 5: 5.255545s
Test 6: 3.775941s
Test 7: 4.001805s
r51562 (special-case one-digit operations)
Test 1: 3.527860s
Test 2: 3.975953s
Test 3: 4.226751s
Test 4: 10.605721s
Test 5: 5.233576s
Test 6: 2.161525s
Test 7: 3.421624s
r51573 (speed up PyLong_FromLong)
Test 1: 3.149116s
Test 2: 3.948204s
Test 3: 4.012080s
Test 4: 8.589921s
Test 5: 4.481723s
Test 6: 2.259849s
Test 7: 3.453212s

View File

@ -716,7 +716,7 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
is cleared and the value is clipped. is cleared and the value is clipped.
*/ */
PyAPI_FUNC(PyObject *) PyNumber_Int(PyObject *o); #define PyNumber_Int PyNumber_Long
/* /*
Returns the o converted to an integer object on success, or Returns the o converted to an integer object on success, or

View File

@ -7,8 +7,6 @@ extern "C" {
#endif #endif
typedef PyIntObject PyBoolObject;
PyAPI_DATA(PyTypeObject) PyBool_Type; PyAPI_DATA(PyTypeObject) PyBool_Type;
#define PyBool_Check(x) ((x)->ob_type == &PyBool_Type) #define PyBool_Check(x) ((x)->ob_type == &PyBool_Type)
@ -17,10 +15,10 @@ PyAPI_DATA(PyTypeObject) PyBool_Type;
Don't forget to apply Py_INCREF() when returning either!!! */ Don't forget to apply Py_INCREF() when returning either!!! */
/* Don't use these directly */ /* Don't use these directly */
PyAPI_DATA(PyIntObject) _Py_ZeroStruct, _Py_TrueStruct; PyAPI_DATA(struct _longobject) _Py_FalseStruct, _Py_TrueStruct;
/* Use these macros */ /* Use these macros */
#define Py_False ((PyObject *) &_Py_ZeroStruct) #define Py_False ((PyObject *) &_Py_FalseStruct)
#define Py_True ((PyObject *) &_Py_TrueStruct) #define Py_True ((PyObject *) &_Py_TrueStruct)
/* Macros for returning Py_True or Py_False, respectively */ /* Macros for returning Py_True or Py_False, respectively */

View File

@ -20,34 +20,31 @@ _Py_TrueStruct and _Py_ZeroStruct in boolobject.h; don't use this.
extern "C" { extern "C" {
#endif #endif
/*
typedef struct { typedef struct {
PyObject_HEAD PyObject_HEAD
long ob_ival; long ob_ival;
} PyIntObject; } PyIntObject;
PyAPI_DATA(PyTypeObject) PyInt_Type; PyAPI_DATA(PyTypeObject) PyInt_Type;
*/
#define PyInt_Check(op) PyObject_TypeCheck(op, &PyInt_Type) #define PyInt_Check(op) PyLong_Check(op)
#define PyInt_CheckExact(op) ((op)->ob_type == &PyInt_Type) #define PyInt_CheckExact(op) (PyLong_CheckExact(op) && _PyLong_FitsInLong(op))
PyAPI_FUNC(PyObject *) PyInt_FromString(char*, char**, int); #define PyInt_FromString PyLong_FromString
#ifdef Py_USING_UNICODE #define PyInt_FromUnicode PyLong_FromUnicode
PyAPI_FUNC(PyObject *) PyInt_FromUnicode(Py_UNICODE*, Py_ssize_t, int); #define PyInt_FromLong PyLong_FromLong
#endif #define PyInt_FromSize_t PyLong_FromSize_t
PyAPI_FUNC(PyObject *) PyInt_FromLong(long); #define PyInt_FromSsize_t PyLong_FromSsize_t
PyAPI_FUNC(PyObject *) PyInt_FromSize_t(size_t); #define PyInt_AsLong PyLong_AsLong
PyAPI_FUNC(PyObject *) PyInt_FromSsize_t(Py_ssize_t); #define PyInt_AsSsize_t PyLong_AsSsize_t
PyAPI_FUNC(long) PyInt_AsLong(PyObject *); #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask
PyAPI_FUNC(Py_ssize_t) PyInt_AsSsize_t(PyObject *); #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
PyAPI_FUNC(unsigned long) PyInt_AsUnsignedLongMask(PyObject *);
#ifdef HAVE_LONG_LONG
PyAPI_FUNC(unsigned PY_LONG_LONG) PyInt_AsUnsignedLongLongMask(PyObject *);
#endif
PyAPI_FUNC(long) PyInt_GetMax(void); PyAPI_FUNC(long) PyInt_GetMax(void);
/* Macro, trading safety for speed */ #define PyInt_AS_LONG(op) PyLong_AsLong(op)
#define PyInt_AS_LONG(op) (((PyIntObject *)(op))->ob_ival)
/* These aren't really part of the Int object, but they're handy; the protos /* These aren't really part of the Int object, but they're handy; the protos
* are necessary for systems that need the magic of PyAPI_FUNC and that want * are necessary for systems that need the magic of PyAPI_FUNC and that want

View File

@ -16,15 +16,16 @@ PyAPI_DATA(PyTypeObject) PyLong_Type;
PyAPI_FUNC(PyObject *) PyLong_FromLong(long); PyAPI_FUNC(PyObject *) PyLong_FromLong(long);
PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long); PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long);
PyAPI_FUNC(PyObject *) PyLong_FromSize_t(size_t);
PyAPI_FUNC(PyObject *) PyLong_FromSsize_t(Py_ssize_t);
PyAPI_FUNC(PyObject *) PyLong_FromDouble(double); PyAPI_FUNC(PyObject *) PyLong_FromDouble(double);
PyAPI_FUNC(long) PyLong_AsLong(PyObject *); PyAPI_FUNC(long) PyLong_AsLong(PyObject *);
PyAPI_FUNC(ssize_t) PyLong_AsSsize_t(PyObject *);
PyAPI_FUNC(size_t) PyLong_AsSize_t(PyObject *);
PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLong(PyObject *); PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLong(PyObject *);
PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *); PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *);
/* For use by intobject.c only */ /* For use by intobject.c only */
PyAPI_FUNC(Py_ssize_t) _PyLong_AsSsize_t(PyObject *);
PyAPI_FUNC(PyObject *) _PyLong_FromSize_t(size_t);
PyAPI_FUNC(PyObject *) _PyLong_FromSsize_t(Py_ssize_t);
PyAPI_DATA(int) _PyLong_DigitValue[256]; PyAPI_DATA(int) _PyLong_DigitValue[256];
/* _PyLong_AsScaledDouble returns a double x and an exponent e such that /* _PyLong_AsScaledDouble returns a double x and an exponent e such that
@ -34,6 +35,7 @@ PyAPI_DATA(int) _PyLong_DigitValue[256];
be multiplied by SHIFT! There may not be enough room in an int to store be multiplied by SHIFT! There may not be enough room in an int to store
e*SHIFT directly. */ e*SHIFT directly. */
PyAPI_FUNC(double) _PyLong_AsScaledDouble(PyObject *vv, int *e); PyAPI_FUNC(double) _PyLong_AsScaledDouble(PyObject *vv, int *e);
PyAPI_FUNC(int) _PyLong_FitsInLong(PyObject* vv);
PyAPI_FUNC(double) PyLong_AsDouble(PyObject *); PyAPI_FUNC(double) PyLong_AsDouble(PyObject *);
PyAPI_FUNC(PyObject *) PyLong_FromVoidPtr(void *); PyAPI_FUNC(PyObject *) PyLong_FromVoidPtr(void *);

View File

@ -456,9 +456,29 @@ class Pickler:
return return
# Text pickle, or int too big to fit in signed 4-byte format. # Text pickle, or int too big to fit in signed 4-byte format.
self.write(INT + repr(obj) + '\n') self.write(INT + repr(obj) + '\n')
dispatch[IntType] = save_int # XXX save_int is merged into save_long
# dispatch[IntType] = save_int
def save_long(self, obj, pack=struct.pack): def save_long(self, obj, pack=struct.pack):
if self.bin:
# If the int is small enough to fit in a signed 4-byte 2's-comp
# format, we can store it more efficiently than the general
# case.
# First one- and two-byte unsigned ints:
if obj >= 0:
if obj <= 0xff:
self.write(BININT1 + chr(obj))
return
if obj <= 0xffff:
self.write("%c%c%c" % (BININT2, obj&0xff, obj>>8))
return
# Next check for 4-byte signed ints:
high_bits = obj >> 31 # note that Python shift sign-extends
if high_bits == 0 or high_bits == -1:
# All high bits are copies of bit 2**31, so the value
# fits in a 4-byte signed int.
self.write(BININT + pack("<i", obj))
return
if self.proto >= 2: if self.proto >= 2:
bytes = encode_long(obj) bytes = encode_long(obj)
n = len(bytes) n = len(bytes)

View File

@ -44,7 +44,7 @@ __neg__: ()
__pos__: () __pos__: ()
__abs__: () __abs__: ()
__int__: () __int__: ()
__long__: () __int__: ()
__float__: () __float__: ()
__oct__: () __oct__: ()
__hex__: () __hex__: ()

View File

@ -1081,10 +1081,12 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(long(Foo0()), 42L) self.assertEqual(long(Foo0()), 42L)
self.assertEqual(long(Foo1()), 42L) self.assertEqual(long(Foo1()), 42L)
self.assertEqual(long(Foo2()), 42L) # XXX invokes __int__ now
# self.assertEqual(long(Foo2()), 42L)
self.assertEqual(long(Foo3()), 0) self.assertEqual(long(Foo3()), 0)
self.assertEqual(long(Foo4()), 42) # XXX likewise
self.assertRaises(TypeError, long, Foo5()) # self.assertEqual(long(Foo4()), 42)
# self.assertRaises(TypeError, long, Foo5())
def test_map(self): def test_map(self):
self.assertEqual( self.assertEqual(

View File

@ -430,13 +430,6 @@ def ints():
pass pass
else: else:
raise TestFailed, "NotImplemented should have caused TypeError" raise TestFailed, "NotImplemented should have caused TypeError"
import sys
try:
C(sys.maxint+1)
except OverflowError:
pass
else:
raise TestFailed, "should have raised OverflowError"
def longs(): def longs():
if verbose: print "Testing long operations..." if verbose: print "Testing long operations..."

View File

@ -204,7 +204,7 @@ class BugsTestCase(unittest.TestCase):
def test_patch_873224(self): def test_patch_873224(self):
self.assertRaises(Exception, marshal.loads, '0') self.assertRaises(Exception, marshal.loads, '0')
self.assertRaises(Exception, marshal.loads, 'f') self.assertRaises(Exception, marshal.loads, 'f')
self.assertRaises(Exception, marshal.loads, marshal.dumps(5L)[:-1]) self.assertRaises(Exception, marshal.loads, marshal.dumps(2**65L)[:-1])
def test_version_argument(self): def test_version_argument(self):
# Python 2.4.0 crashes for any call to marshal.dumps(x, y) # Python 2.4.0 crashes for any call to marshal.dumps(x, y)

View File

@ -1600,7 +1600,7 @@ class TestParseNumber(BaseTest):
self.assertRaises( self.assertRaises(
_parse_num, ("0xOoops", long), {}, _parse_num, ("0xOoops", long), {},
ValueError, ValueError,
re.compile(r"invalid literal for long().*: '?0xOoops'?")) re.compile(r"invalid literal for int().*: '?0xOoops'?"))
def test_parse_num_ok(self): def test_parse_num_ok(self):
self.assertEqual(_parse_num("0", int), 0) self.assertEqual(_parse_num("0", int), 0)
@ -1618,9 +1618,9 @@ class TestParseNumber(BaseTest):
self.assertParseFail(["-n008"], self.assertParseFail(["-n008"],
"option -n: invalid integer value: '008'") "option -n: invalid integer value: '008'")
self.assertParseFail(["-l0b0123"], self.assertParseFail(["-l0b0123"],
"option -l: invalid long integer value: '0b0123'") "option -l: invalid integer value: '0b0123'")
self.assertParseFail(["-l", "0x12x"], self.assertParseFail(["-l", "0x12x"],
"option -l: invalid long integer value: '0x12x'") "option -l: invalid integer value: '0x12x'")
def _testclasses(): def _testclasses():

View File

@ -219,7 +219,7 @@ _set_int(const char *name, int *target, PyObject *src, int dflt)
if (src == NULL) if (src == NULL)
*target = dflt; *target = dflt;
else { else {
if (!PyInt_Check(src)) { if (!PyInt_CheckExact(src)) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"\"%s\" must be an integer", name); "\"%s\" must be an integer", name);
return -1; return -1;
@ -1410,7 +1410,7 @@ csv_field_size_limit(PyObject *module, PyObject *args)
if (!PyArg_UnpackTuple(args, "field_size_limit", 0, 1, &new_limit)) if (!PyArg_UnpackTuple(args, "field_size_limit", 0, 1, &new_limit))
return NULL; return NULL;
if (new_limit != NULL) { if (new_limit != NULL) {
if (!PyInt_Check(new_limit)) { if (!PyInt_CheckExact(new_limit)) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"limit must be an integer"); "limit must be an integer");
return NULL; return NULL;

View File

@ -991,7 +991,7 @@ ArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL; return NULL;
proto = PyDict_GetItemString(typedict, "_length_"); /* Borrowed ref */ proto = PyDict_GetItemString(typedict, "_length_"); /* Borrowed ref */
if (!proto || !PyInt_Check(proto)) { if (!proto || !PyInt_CheckExact(proto)) {
PyErr_SetString(PyExc_AttributeError, PyErr_SetString(PyExc_AttributeError,
"class must define a '_length_' attribute, " "class must define a '_length_' attribute, "
"which must be a positive integer"); "which must be a positive integer");

View File

@ -496,12 +496,6 @@ static int ConvParam(PyObject *obj, int index, struct argument *pa)
return 0; return 0;
} }
if (PyInt_Check(obj)) {
pa->ffi_type = &ffi_type_sint;
pa->value.i = PyInt_AS_LONG(obj);
return 0;
}
if (PyLong_Check(obj)) { if (PyLong_Check(obj)) {
pa->ffi_type = &ffi_type_sint; pa->ffi_type = &ffi_type_sint;
pa->value.i = (long)PyLong_AsUnsignedLong(obj); pa->value.i = (long)PyLong_AsUnsignedLong(obj);

View File

@ -193,7 +193,7 @@ PyCursesCheckERR(int code, char *fname)
static int static int
PyCurses_ConvertToChtype(PyObject *obj, chtype *ch) PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
{ {
if (PyInt_Check(obj)) { if (PyInt_CheckExact(obj)) {
*ch = (chtype) PyInt_AsLong(obj); *ch = (chtype) PyInt_AsLong(obj);
} else if(PyString_Check(obj) } else if(PyString_Check(obj)
&& (PyString_Size(obj) == 1)) { && (PyString_Size(obj) == 1)) {
@ -2364,7 +2364,7 @@ PyCurses_UnCtrl(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL; if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
if (PyInt_Check(temp)) if (PyInt_CheckExact(temp))
ch = (chtype) PyInt_AsLong(temp); ch = (chtype) PyInt_AsLong(temp);
else if (PyString_Check(temp)) else if (PyString_Check(temp))
ch = (chtype) *PyString_AsString(temp); ch = (chtype) *PyString_AsString(temp);
@ -2386,7 +2386,7 @@ PyCurses_UngetCh(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL; if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
if (PyInt_Check(temp)) if (PyInt_CheckExact(temp))
ch = (int) PyInt_AsLong(temp); ch = (int) PyInt_AsLong(temp);
else if (PyString_Check(temp)) else if (PyString_Check(temp))
ch = (int) *PyString_AsString(temp); ch = (int) *PyString_AsString(temp);

View File

@ -2688,8 +2688,7 @@ _compile(PyObject* self_, PyObject* args)
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
PyObject *o = PyList_GET_ITEM(code, i); PyObject *o = PyList_GET_ITEM(code, i);
unsigned long value = PyInt_Check(o) ? (unsigned long)PyInt_AsLong(o) unsigned long value = PyLong_AsUnsignedLong(o);
: PyLong_AsUnsignedLong(o);
self->code[i] = (SRE_CODE) value; self->code[i] = (SRE_CODE) value;
if ((unsigned long) self->code[i] != value) { if ((unsigned long) self->code[i] != value) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
@ -2763,6 +2762,10 @@ match_getindex(MatchObject* self, PyObject* index)
{ {
Py_ssize_t i; Py_ssize_t i;
if (index == NULL)
/* Default value */
return 0;
if (PyInt_Check(index)) if (PyInt_Check(index))
return PyInt_AsSsize_t(index); return PyInt_AsSsize_t(index);
@ -2913,7 +2916,7 @@ match_start(MatchObject* self, PyObject* args)
{ {
Py_ssize_t index; Py_ssize_t index;
PyObject* index_ = Py_False; /* zero */ PyObject* index_ = NULL;
if (!PyArg_UnpackTuple(args, "start", 0, 1, &index_)) if (!PyArg_UnpackTuple(args, "start", 0, 1, &index_))
return NULL; return NULL;
@ -2936,7 +2939,7 @@ match_end(MatchObject* self, PyObject* args)
{ {
Py_ssize_t index; Py_ssize_t index;
PyObject* index_ = Py_False; /* zero */ PyObject* index_ = NULL;
if (!PyArg_UnpackTuple(args, "end", 0, 1, &index_)) if (!PyArg_UnpackTuple(args, "end", 0, 1, &index_))
return NULL; return NULL;
@ -2986,7 +2989,7 @@ match_span(MatchObject* self, PyObject* args)
{ {
Py_ssize_t index; Py_ssize_t index;
PyObject* index_ = Py_False; /* zero */ PyObject* index_ = NULL;
if (!PyArg_UnpackTuple(args, "span", 0, 1, &index_)) if (!PyArg_UnpackTuple(args, "span", 0, 1, &index_))
return NULL; return NULL;

View File

@ -118,8 +118,6 @@ get_pylong(PyObject *v)
PyNumberMethods *m; PyNumberMethods *m;
assert(v != NULL); assert(v != NULL);
if (PyInt_Check(v))
return PyLong_FromLong(PyInt_AS_LONG(v));
if (PyLong_Check(v)) { if (PyLong_Check(v)) {
Py_INCREF(v); Py_INCREF(v);
return v; return v;

View File

@ -718,6 +718,119 @@ test_with_docstring(PyObject *self)
Py_RETURN_NONE; Py_RETURN_NONE;
} }
#ifdef HAVE_GETTIMEOFDAY
/* Profiling of integer performance */
void print_delta(int test, struct timeval *s, struct timeval *e)
{
e->tv_sec -= s->tv_sec;
e->tv_usec -= s->tv_usec;
if (e->tv_usec < 0) {
e->tv_sec -=1;
e->tv_usec += 1000000;
}
printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, e->tv_usec);
}
static PyObject *
profile_int(PyObject *self, PyObject* args)
{
int i, k;
struct timeval start, stop;
PyObject *single, **multiple, *op1, *result;
/* Test 1: Allocate and immediately deallocate
many small integers */
gettimeofday(&start, NULL);
for(k=0; k < 20000; k++)
for(i=0; i < 1000; i++) {
single = PyInt_FromLong(i);
Py_DECREF(single);
}
gettimeofday(&stop, NULL);
print_delta(1, &start, &stop);
/* Test 2: Allocate and immediately deallocate
many large integers */
gettimeofday(&start, NULL);
for(k=0; k < 20000; k++)
for(i=0; i < 1000; i++) {
single = PyInt_FromLong(i+1000000);
Py_DECREF(single);
}
gettimeofday(&stop, NULL);
print_delta(2, &start, &stop);
/* Test 3: Allocate a few integers, then release
them all simultaneously. */
multiple = malloc(sizeof(PyObject*) * 1000);
gettimeofday(&start, NULL);
for(k=0; k < 20000; k++) {
for(i=0; i < 1000; i++) {
multiple[i] = PyInt_FromLong(i+1000000);
}
for(i=0; i < 1000; i++) {
Py_DECREF(multiple[i]);
}
}
gettimeofday(&stop, NULL);
print_delta(3, &start, &stop);
/* Test 4: Allocate many integers, then release
them all simultaneously. */
multiple = malloc(sizeof(PyObject*) * 1000000);
gettimeofday(&start, NULL);
for(k=0; k < 20; k++) {
for(i=0; i < 1000000; i++) {
multiple[i] = PyInt_FromLong(i+1000000);
}
for(i=0; i < 1000000; i++) {
Py_DECREF(multiple[i]);
}
}
gettimeofday(&stop, NULL);
print_delta(4, &start, &stop);
/* Test 5: Allocate many integers < 32000 */
multiple = malloc(sizeof(PyObject*) * 1000000);
gettimeofday(&start, NULL);
for(k=0; k < 10; k++) {
for(i=0; i < 1000000; i++) {
multiple[i] = PyInt_FromLong(i+1000);
}
for(i=0; i < 1000000; i++) {
Py_DECREF(multiple[i]);
}
}
gettimeofday(&stop, NULL);
print_delta(5, &start, &stop);
/* Test 6: Perform small int addition */
op1 = PyInt_FromLong(1);
gettimeofday(&start, NULL);
for(i=0; i < 10000000; i++) {
result = PyNumber_Add(op1, op1);
Py_DECREF(result);
}
gettimeofday(&stop, NULL);
Py_DECREF(op1);
print_delta(6, &start, &stop);
/* Test 7: Perform medium int addition */
op1 = PyInt_FromLong(1000);
gettimeofday(&start, NULL);
for(i=0; i < 10000000; i++) {
result = PyNumber_Add(op1, op1);
Py_DECREF(result);
}
gettimeofday(&stop, NULL);
Py_DECREF(op1);
print_delta(7, &start, &stop);
Py_INCREF(Py_None);
return Py_None;
}
#endif
static PyMethodDef TestMethods[] = { static PyMethodDef TestMethods[] = {
{"raise_exception", raise_exception, METH_VARARGS}, {"raise_exception", raise_exception, METH_VARARGS},
{"test_config", (PyCFunction)test_config, METH_NOARGS}, {"test_config", (PyCFunction)test_config, METH_NOARGS},
@ -755,6 +868,9 @@ static PyMethodDef TestMethods[] = {
#endif #endif
#ifdef WITH_THREAD #ifdef WITH_THREAD
{"_test_thread_state", test_thread_state, METH_VARARGS}, {"_test_thread_state", test_thread_state, METH_VARARGS},
#endif
#ifdef HAVE_GETTIMEOFDAY
{"profile_int", profile_int, METH_NOARGS},
#endif #endif
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };

View File

@ -913,7 +913,7 @@ AsObj(PyObject *value)
PyString_GET_SIZE(value)); PyString_GET_SIZE(value));
else if (PyBool_Check(value)) else if (PyBool_Check(value))
return Tcl_NewBooleanObj(PyObject_IsTrue(value)); return Tcl_NewBooleanObj(PyObject_IsTrue(value));
else if (PyInt_Check(value)) else if (PyInt_CheckExact(value))
return Tcl_NewLongObj(PyInt_AS_LONG(value)); return Tcl_NewLongObj(PyInt_AS_LONG(value));
else if (PyFloat_Check(value)) else if (PyFloat_Check(value))
return Tcl_NewDoubleObj(PyFloat_AS_DOUBLE(value)); return Tcl_NewDoubleObj(PyFloat_AS_DOUBLE(value));

View File

@ -711,7 +711,9 @@ get(Picklerobject *self, PyObject *id)
PyErr_SetString(PicklingError, "no int where int expected in memo"); PyErr_SetString(PicklingError, "no int where int expected in memo");
return -1; return -1;
} }
c_value = PyInt_AS_LONG((PyIntObject*)value); c_value = PyInt_AsLong(value);
if (c_value == -1 && PyErr_Occurred())
return -1;
if (!self->bin) { if (!self->bin) {
s[0] = GET; s[0] = GET;
@ -958,7 +960,7 @@ save_bool(Picklerobject *self, PyObject *args)
{ {
static const char *buf[2] = {FALSE, TRUE}; static const char *buf[2] = {FALSE, TRUE};
static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1}; static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
long l = PyInt_AS_LONG((PyIntObject *)args); long l = args == Py_True;
if (self->proto >= 2) { if (self->proto >= 2) {
char opcode = l ? NEWTRUE : NEWFALSE; char opcode = l ? NEWTRUE : NEWFALSE;
@ -971,10 +973,9 @@ save_bool(Picklerobject *self, PyObject *args)
} }
static int static int
save_int(Picklerobject *self, PyObject *args) save_int(Picklerobject *self, long l)
{ {
char c_str[32]; char c_str[32];
long l = PyInt_AS_LONG((PyIntObject *)args);
int len = 0; int len = 0;
if (!self->bin if (!self->bin
@ -1027,9 +1028,16 @@ save_long(Picklerobject *self, PyObject *args)
Py_ssize_t size; Py_ssize_t size;
int res = -1; int res = -1;
PyObject *repr = NULL; PyObject *repr = NULL;
int val = PyInt_AsLong(args);
static char l = LONG; static char l = LONG;
if (val == -1 && PyErr_Occurred()) {
/* out of range for int pickling */
PyErr_Clear();
}
else
return save_int(self, val);
if (self->proto >= 2) { if (self->proto >= 2) {
/* Linear-time pickling. */ /* Linear-time pickling. */
size_t nbits; size_t nbits;
@ -2183,13 +2191,6 @@ save(Picklerobject *self, PyObject *args, int pers_save)
goto finally; goto finally;
} }
break; break;
case 'i':
if (type == &PyInt_Type) {
res = save_int(self, args);
goto finally;
}
break;
case 'l': case 'l':
if (type == &PyLong_Type) { if (type == &PyLong_Type) {
res = save_long(self, args); res = save_long(self, args);
@ -2486,7 +2487,9 @@ Pickle_getvalue(Picklerobject *self, PyObject *args)
rsize += PyString_GET_SIZE(k); rsize += PyString_GET_SIZE(k);
else if (PyInt_Check(k)) { /* put */ else if (PyInt_Check(k)) { /* put */
ik = PyInt_AS_LONG((PyIntObject*)k); ik = PyInt_AsLong(k);
if (ik == -1 && PyErr_Occurred())
goto err;
if (ik >= lm || ik == 0) { if (ik >= lm || ik == 0) {
PyErr_SetString(PicklingError, PyErr_SetString(PicklingError,
"Invalid get data"); "Invalid get data");
@ -2506,7 +2509,9 @@ Pickle_getvalue(Picklerobject *self, PyObject *args)
} }
else { /* put */ else { /* put */
ik = PyInt_AS_LONG((PyIntObject *)k); ik = PyInt_AsLong(k);
if (ik == -1 && PyErr_Occurred())
goto err;
if (ik >= lm || ik == 0) { if (ik >= lm || ik == 0) {
PyErr_SetString(PicklingError, PyErr_SetString(PicklingError,
"Invalid get data"); "Invalid get data");
@ -2535,8 +2540,9 @@ Pickle_getvalue(Picklerobject *self, PyObject *args)
} }
else if (PyTuple_Check(k)) { /* get */ else if (PyTuple_Check(k)) { /* get */
ik = PyInt_AS_LONG((PyIntObject *) ik = PyLong_AsLong(PyTuple_GET_ITEM(k, 0));
PyTuple_GET_ITEM(k, 0)); if (ik == -1 && PyErr_Occurred())
goto err;
if (ik < 256) { if (ik < 256) {
*s++ = BINGET; *s++ = BINGET;
*s++ = (int)(ik & 0xff); *s++ = (int)(ik & 0xff);
@ -2551,7 +2557,9 @@ Pickle_getvalue(Picklerobject *self, PyObject *args)
} }
else { /* put */ else { /* put */
ik = PyInt_AS_LONG((PyIntObject*)k); ik = PyLong_AsLong(k);
if (ik == -1 && PyErr_Occurred())
goto err;
if (have_get[ik]) { /* with matching get */ if (have_get[ik]) { /* with matching get */
if (ik < 256) { if (ik < 256) {

View File

@ -1314,6 +1314,9 @@ mbstreamreader_read(MultibyteStreamReaderObject *self, PyObject *args)
return NULL; return NULL;
} }
if (size == -1 && PyErr_Occurred())
return NULL;
return mbstreamreader_iread(self, "read", size); return mbstreamreader_iread(self, "read", size);
} }
@ -1335,6 +1338,9 @@ mbstreamreader_readline(MultibyteStreamReaderObject *self, PyObject *args)
return NULL; return NULL;
} }
if (size == -1 && PyErr_Occurred())
return NULL;
return mbstreamreader_iread(self, "readline", size); return mbstreamreader_iread(self, "readline", size);
} }
@ -1356,6 +1362,9 @@ mbstreamreader_readlines(MultibyteStreamReaderObject *self, PyObject *args)
return NULL; return NULL;
} }
if (sizehint == -1 && PyErr_Occurred())
return NULL;
r = mbstreamreader_iread(self, "read", sizehint); r = mbstreamreader_iread(self, "read", sizehint);
if (r == NULL) if (r == NULL)
return NULL; return NULL;

View File

@ -1844,10 +1844,7 @@ accum(const char* tag, PyObject *sofar, PyObject *num, PyObject *factor,
* lose a little info. * lose a little info.
*/ */
assert(PyInt_Check(factor) || PyLong_Check(factor)); assert(PyInt_Check(factor) || PyLong_Check(factor));
if (PyInt_Check(factor)) dnum = PyLong_AsDouble(factor);
dnum = (double)PyInt_AsLong(factor);
else
dnum = PyLong_AsDouble(factor);
dnum *= fracpart; dnum *= fracpart;
fracpart = modf(dnum, &intpart); fracpart = modf(dnum, &intpart);
@ -3800,7 +3797,7 @@ datetime_strptime(PyObject *cls, PyObject *args)
Py_DECREF(obj); Py_DECREF(obj);
return NULL; return NULL;
} }
if (PyInt_Check(p)) if (PyInt_CheckExact(p))
ia[i] = PyInt_AsLong(p); ia[i] = PyInt_AsLong(p);
else else
good_timetuple = 0; good_timetuple = 0;

View File

@ -107,9 +107,11 @@ dl_call(dlobject *xp, PyObject *args)
} }
for (i = 1; i < n; i++) { for (i = 1; i < n; i++) {
PyObject *v = PyTuple_GetItem(args, i); PyObject *v = PyTuple_GetItem(args, i);
if (PyInt_Check(v)) if (PyInt_Check(v)) {
alist[i-1] = PyInt_AsLong(v); alist[i-1] = PyInt_AsLong(v);
else if (PyString_Check(v)) if (alist[i-1] == -1 && PyErr_Occurred())
return NULL;
} else if (PyString_Check(v))
alist[i-1] = (long)PyString_AsString(v); alist[i-1] = (long)PyString_AsString(v);
else if (v == Py_None) else if (v == Py_None)
alist[i-1] = (long) ((char *)NULL); alist[i-1] = (long) ((char *)NULL);

View File

@ -5437,32 +5437,21 @@ posix_setgroups(PyObject *self, PyObject *groups)
elem = PySequence_GetItem(groups, i); elem = PySequence_GetItem(groups, i);
if (!elem) if (!elem)
return NULL; return NULL;
if (!PyInt_Check(elem)) { if (!PyLong_Check(elem)) {
if (!PyLong_Check(elem)) { PyErr_SetString(PyExc_TypeError,
PyErr_SetString(PyExc_TypeError, "groups must be integers");
"groups must be integers"); Py_DECREF(elem);
return NULL;
} else {
unsigned long x = PyLong_AsUnsignedLong(elem);
if (PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError,
"group id too big");
Py_DECREF(elem); Py_DECREF(elem);
return NULL; return NULL;
} else {
unsigned long x = PyLong_AsUnsignedLong(elem);
if (PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError,
"group id too big");
Py_DECREF(elem);
return NULL;
}
grouplist[i] = x;
/* read back the value to see if it fitted in gid_t */
if (grouplist[i] != x) {
PyErr_SetString(PyExc_TypeError,
"group id too big");
Py_DECREF(elem);
return NULL;
}
} }
} else {
long x = PyInt_AsLong(elem);
grouplist[i] = x; grouplist[i] = x;
/* read back the value to see if it fitted in gid_t */
if (grouplist[i] != x) { if (grouplist[i] != x) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"group id too big"); "group id too big");

View File

@ -3483,12 +3483,7 @@ socket_ntohl(PyObject *self, PyObject *arg)
{ {
unsigned long x; unsigned long x;
if (PyInt_Check(arg)) { if (PyLong_Check(arg)) {
x = PyInt_AS_LONG(arg);
if (x == (unsigned long) -1 && PyErr_Occurred())
return NULL;
}
else if (PyLong_Check(arg)) {
x = PyLong_AsUnsignedLong(arg); x = PyLong_AsUnsignedLong(arg);
if (x == (unsigned long) -1 && PyErr_Occurred()) if (x == (unsigned long) -1 && PyErr_Occurred())
return NULL; return NULL;
@ -3542,12 +3537,7 @@ socket_htonl(PyObject *self, PyObject *arg)
{ {
unsigned long x; unsigned long x;
if (PyInt_Check(arg)) { if (PyLong_Check(arg)) {
x = PyInt_AS_LONG(arg);
if (x == (unsigned long) -1 && PyErr_Occurred())
return NULL;
}
else if (PyLong_Check(arg)) {
x = PyLong_AsUnsignedLong(arg); x = PyLong_AsUnsignedLong(arg);
if (x == (unsigned long) -1 && PyErr_Occurred()) if (x == (unsigned long) -1 && PyErr_Occurred())
return NULL; return NULL;
@ -3827,7 +3817,7 @@ socket_getaddrinfo(PyObject *self, PyObject *args)
"getaddrinfo() argument 1 must be string or None"); "getaddrinfo() argument 1 must be string or None");
return NULL; return NULL;
} }
if (PyInt_Check(pobj)) { if (PyInt_CheckExact(pobj)) {
PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj)); PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
pptr = pbuf; pptr = pbuf;
} else if (PyString_Check(pobj)) { } else if (PyString_Check(pobj)) {

View File

@ -357,7 +357,7 @@ gettmarg(PyObject *args, struct tm *p)
if (y < 1900) { if (y < 1900) {
PyObject *accept = PyDict_GetItemString(moddict, PyObject *accept = PyDict_GetItemString(moddict,
"accept2dyear"); "accept2dyear");
if (accept == NULL || !PyInt_Check(accept) || if (accept == NULL || !PyInt_CheckExact(accept) ||
PyInt_AsLong(accept) == 0) { PyInt_AsLong(accept) == 0) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"year >= 1900 required"); "year >= 1900 required");

View File

@ -790,25 +790,6 @@ PyNumber_Absolute(PyObject *o)
return type_error("bad operand type for abs(): '%.200s'", o); return type_error("bad operand type for abs(): '%.200s'", o);
} }
/* Add a check for embedded NULL-bytes in the argument. */
static PyObject *
int_from_string(const char *s, Py_ssize_t len)
{
char *end;
PyObject *x;
x = PyInt_FromString((char*)s, &end, 10);
if (x == NULL)
return NULL;
if (end != s + len) {
PyErr_SetString(PyExc_ValueError,
"null byte in argument for int()");
Py_DECREF(x);
return NULL;
}
return x;
}
/* Return a Python Int or Long from the object item /* Return a Python Int or Long from the object item
Raise TypeError if the result is not an int-or-long Raise TypeError if the result is not an int-or-long
or if the object cannot be interpreted as an index. or if the object cannot be interpreted as an index.
@ -828,7 +809,7 @@ PyNumber_Index(PyObject *item)
if (result && if (result &&
!PyInt_Check(result) && !PyLong_Check(result)) { !PyInt_Check(result) && !PyLong_Check(result)) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"__index__ returned non-(int,long) " \ "__index__ returned non-int " \
"(type %.200s)", "(type %.200s)",
result->ob_type->tp_name); result->ob_type->tp_name);
Py_DECREF(result); Py_DECREF(result);
@ -890,51 +871,6 @@ PyNumber_AsSsize_t(PyObject *item, PyObject *err)
} }
PyObject *
PyNumber_Int(PyObject *o)
{
PyNumberMethods *m;
const char *buffer;
Py_ssize_t buffer_len;
if (o == NULL)
return null_error();
if (PyInt_CheckExact(o)) {
Py_INCREF(o);
return o;
}
m = o->ob_type->tp_as_number;
if (m && m->nb_int) { /* This should include subclasses of int */
PyObject *res = m->nb_int(o);
if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
PyErr_Format(PyExc_TypeError,
"__int__ returned non-int (type %.200s)",
res->ob_type->tp_name);
Py_DECREF(res);
return NULL;
}
return res;
}
if (PyInt_Check(o)) { /* A int subclass without nb_int */
PyIntObject *io = (PyIntObject*)o;
return PyInt_FromLong(io->ob_ival);
}
if (PyString_Check(o))
return int_from_string(PyString_AS_STRING(o),
PyString_GET_SIZE(o));
#ifdef Py_USING_UNICODE
if (PyUnicode_Check(o))
return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
PyUnicode_GET_SIZE(o),
10);
#endif
if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
return int_from_string((char*)buffer, buffer_len);
return type_error("int() argument must be a string or a "
"number, not '%.200s'", o);
}
/* Add a check for embedded NULL-bytes in the argument. */ /* Add a check for embedded NULL-bytes in the argument. */
static PyObject * static PyObject *
long_from_string(const char *s, Py_ssize_t len) long_from_string(const char *s, Py_ssize_t len)
@ -947,7 +883,7 @@ long_from_string(const char *s, Py_ssize_t len)
return NULL; return NULL;
if (end != s + len) { if (end != s + len) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"null byte in argument for long()"); "null byte in argument for int()");
Py_DECREF(x); Py_DECREF(x);
return NULL; return NULL;
} }
@ -963,7 +899,22 @@ PyNumber_Long(PyObject *o)
if (o == NULL) if (o == NULL)
return null_error(); return null_error();
if (PyLong_CheckExact(o)) {
Py_INCREF(o);
return o;
}
m = o->ob_type->tp_as_number; m = o->ob_type->tp_as_number;
if (m && m->nb_int) { /* This should include subclasses of int */
PyObject *res = m->nb_int(o);
if (res && !PyLong_Check(res)) {
PyErr_Format(PyExc_TypeError,
"__int__ returned non-int (type %.200s)",
res->ob_type->tp_name);
Py_DECREF(res);
return NULL;
}
return res;
}
if (m && m->nb_long) { /* This should include subclasses of long */ if (m && m->nb_long) { /* This should include subclasses of long */
PyObject *res = m->nb_long(o); PyObject *res = m->nb_long(o);
if (res && (!PyInt_Check(res) && !PyLong_Check(res))) { if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
@ -994,7 +945,7 @@ PyNumber_Long(PyObject *o)
if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len)) if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
return long_from_string(buffer, buffer_len); return long_from_string(buffer, buffer_len);
return type_error("long() argument must be a string or a " return type_error("int() argument must be a string or a "
"number, not '%.200s'", o); "number, not '%.200s'", o);
} }

View File

@ -1,13 +1,14 @@
/* Boolean type, a subtype of int */ /* Boolean type, a subtype of int */
#include "Python.h" #include "Python.h"
#include "longintrepr.h"
/* We need to define bool_print to override int_print */ /* We need to define bool_print to override int_print */
static int static int
bool_print(PyBoolObject *self, FILE *fp, int flags) bool_print(PyObject *self, FILE *fp, int flags)
{ {
fputs(self->ob_ival == 0 ? "False" : "True", fp); fputs(self == Py_False ? "False" : "True", fp);
return 0; return 0;
} }
@ -17,11 +18,11 @@ static PyObject *false_str = NULL;
static PyObject *true_str = NULL; static PyObject *true_str = NULL;
static PyObject * static PyObject *
bool_repr(PyBoolObject *self) bool_repr(PyObject *self)
{ {
PyObject *s; PyObject *s;
if (self->ob_ival) if (self == Py_True)
s = true_str ? true_str : s = true_str ? true_str :
(true_str = PyString_InternFromString("True")); (true_str = PyString_InternFromString("True"));
else else
@ -68,27 +69,24 @@ static PyObject *
bool_and(PyObject *a, PyObject *b) bool_and(PyObject *a, PyObject *b)
{ {
if (!PyBool_Check(a) || !PyBool_Check(b)) if (!PyBool_Check(a) || !PyBool_Check(b))
return PyInt_Type.tp_as_number->nb_and(a, b); return PyLong_Type.tp_as_number->nb_and(a, b);
return PyBool_FromLong( return PyBool_FromLong((a == Py_True) & (b == Py_True));
((PyBoolObject *)a)->ob_ival & ((PyBoolObject *)b)->ob_ival);
} }
static PyObject * static PyObject *
bool_or(PyObject *a, PyObject *b) bool_or(PyObject *a, PyObject *b)
{ {
if (!PyBool_Check(a) || !PyBool_Check(b)) if (!PyBool_Check(a) || !PyBool_Check(b))
return PyInt_Type.tp_as_number->nb_or(a, b); return PyLong_Type.tp_as_number->nb_or(a, b);
return PyBool_FromLong( return PyBool_FromLong((a == Py_True) | (b == Py_True));
((PyBoolObject *)a)->ob_ival | ((PyBoolObject *)b)->ob_ival);
} }
static PyObject * static PyObject *
bool_xor(PyObject *a, PyObject *b) bool_xor(PyObject *a, PyObject *b)
{ {
if (!PyBool_Check(a) || !PyBool_Check(b)) if (!PyBool_Check(a) || !PyBool_Check(b))
return PyInt_Type.tp_as_number->nb_xor(a, b); return PyLong_Type.tp_as_number->nb_xor(a, b);
return PyBool_FromLong( return PyBool_FromLong((a == Py_True) ^ (b == Py_True));
((PyBoolObject *)a)->ob_ival ^ ((PyBoolObject *)b)->ob_ival);
} }
/* Doc string */ /* Doc string */
@ -139,6 +137,7 @@ static PyNumberMethods bool_as_number = {
0, /* nb_true_divide */ 0, /* nb_true_divide */
0, /* nb_inplace_floor_divide */ 0, /* nb_inplace_floor_divide */
0, /* nb_inplace_true_divide */ 0, /* nb_inplace_true_divide */
0, /* nb_index */
}; };
/* The type object for bool. Note that this cannot be subclassed! */ /* The type object for bool. Note that this cannot be subclassed! */
@ -147,20 +146,20 @@ PyTypeObject PyBool_Type = {
PyObject_HEAD_INIT(&PyType_Type) PyObject_HEAD_INIT(&PyType_Type)
0, 0,
"bool", "bool",
sizeof(PyIntObject), sizeof(struct _longobject),
0, 0,
0, /* tp_dealloc */ 0, /* tp_dealloc */
(printfunc)bool_print, /* tp_print */ bool_print, /* tp_print */
0, /* tp_getattr */ 0, /* tp_getattr */
0, /* tp_setattr */ 0, /* tp_setattr */
0, /* tp_compare */ 0, /* tp_compare */
(reprfunc)bool_repr, /* tp_repr */ bool_repr, /* tp_repr */
&bool_as_number, /* tp_as_number */ &bool_as_number, /* tp_as_number */
0, /* tp_as_sequence */ 0, /* tp_as_sequence */
0, /* tp_as_mapping */ 0, /* tp_as_mapping */
0, /* tp_hash */ 0, /* tp_hash */
0, /* tp_call */ 0, /* tp_call */
(reprfunc)bool_repr, /* tp_str */ bool_repr, /* tp_str */
0, /* tp_getattro */ 0, /* tp_getattro */
0, /* tp_setattro */ 0, /* tp_setattro */
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
@ -175,7 +174,7 @@ PyTypeObject PyBool_Type = {
0, /* tp_methods */ 0, /* tp_methods */
0, /* tp_members */ 0, /* tp_members */
0, /* tp_getset */ 0, /* tp_getset */
&PyInt_Type, /* tp_base */ &PyLong_Type, /* tp_base */
0, /* tp_dict */ 0, /* tp_dict */
0, /* tp_descr_get */ 0, /* tp_descr_get */
0, /* tp_descr_set */ 0, /* tp_descr_set */
@ -188,12 +187,12 @@ PyTypeObject PyBool_Type = {
/* The objects representing bool values False and True */ /* The objects representing bool values False and True */
/* Named Zero for link-level compatibility */ /* Named Zero for link-level compatibility */
PyIntObject _Py_ZeroStruct = { struct _longobject _Py_FalseStruct = {
PyObject_HEAD_INIT(&PyBool_Type) PyObject_HEAD_INIT(&PyBool_Type)
0 0, { 0 }
}; };
PyIntObject _Py_TrueStruct = { struct _longobject _Py_TrueStruct = {
PyObject_HEAD_INIT(&PyBool_Type) PyObject_HEAD_INIT(&PyBool_Type)
1 1, { 1 }
}; };

View File

@ -349,10 +349,6 @@ to_complex(PyObject **pobj, Py_complex *pc)
PyObject *obj = *pobj; PyObject *obj = *pobj;
pc->real = pc->imag = 0.0; pc->real = pc->imag = 0.0;
if (PyInt_Check(obj)) {
pc->real = PyInt_AS_LONG(obj);
return 0;
}
if (PyLong_Check(obj)) { if (PyLong_Check(obj)) {
pc->real = PyLong_AsDouble(obj); pc->real = PyLong_AsDouble(obj);
if (pc->real == -1.0 && PyErr_Occurred()) { if (pc->real == -1.0 && PyErr_Occurred()) {

View File

@ -1089,7 +1089,7 @@ SyntaxError_str(PySyntaxErrorObject *self)
have_filename = (self->filename != NULL) && have_filename = (self->filename != NULL) &&
PyString_Check(self->filename); PyString_Check(self->filename);
have_lineno = (self->lineno != NULL) && PyInt_Check(self->lineno); have_lineno = (self->lineno != NULL) && PyInt_CheckExact(self->lineno);
if (!have_filename && !have_lineno) if (!have_filename && !have_lineno)
return str; return str;
@ -1225,10 +1225,8 @@ get_int(PyObject *attr, Py_ssize_t *value, const char *name)
return -1; return -1;
} }
if (PyInt_Check(attr)) { if (PyLong_Check(attr)) {
*value = PyInt_AS_LONG(attr); *value = PyLong_AsSsize_t(attr);
} else if (PyLong_Check(attr)) {
*value = _PyLong_AsSsize_t(attr);
if (*value == -1 && PyErr_Occurred()) if (*value == -1 && PyErr_Occurred())
return -1; return -1;
} else { } else {
@ -1515,8 +1513,8 @@ UnicodeError_init(PyUnicodeErrorObject *self, PyObject *args, PyObject *kwds,
if (!PyArg_ParseTuple(args, "O!O!O!O!O!", if (!PyArg_ParseTuple(args, "O!O!O!O!O!",
&PyString_Type, &self->encoding, &PyString_Type, &self->encoding,
objecttype, &self->object, objecttype, &self->object,
&PyInt_Type, &self->start, &PyLong_Type, &self->start,
&PyInt_Type, &self->end, &PyLong_Type, &self->end,
&PyString_Type, &self->reason)) { &PyString_Type, &self->reason)) {
self->encoding = self->object = self->start = self->end = self->encoding = self->object = self->start = self->end =
self->reason = NULL; self->reason = NULL;
@ -1748,8 +1746,8 @@ UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
if (!PyArg_ParseTuple(args, "O!O!O!O!", if (!PyArg_ParseTuple(args, "O!O!O!O!",
&PyUnicode_Type, &self->object, &PyUnicode_Type, &self->object,
&PyInt_Type, &self->start, &PyLong_Type, &self->start,
&PyInt_Type, &self->end, &PyLong_Type, &self->end,
&PyString_Type, &self->reason)) { &PyString_Type, &self->reason)) {
self->object = self->start = self->end = self->reason = NULL; self->object = self->start = self->end = self->reason = NULL;
return -1; return -1;

View File

@ -2136,7 +2136,7 @@ PyFile_SoftSpace(PyObject *f, int newflag)
if (v == NULL) if (v == NULL)
PyErr_Clear(); PyErr_Clear();
else { else {
if (PyInt_Check(v)) if (PyInt_CheckExact(v))
oldflag = PyInt_AsLong(v); oldflag = PyInt_AsLong(v);
assert(oldflag < INT_MAX); assert(oldflag < INT_MAX);
Py_DECREF(v); Py_DECREF(v);
@ -2301,6 +2301,8 @@ int PyObject_AsFileDescriptor(PyObject *o)
return -1; return -1;
} }
if (fd == -1 && PyErr_Occurred())
return -1;
if (fd < 0) { if (fd < 0) {
PyErr_Format(PyExc_ValueError, PyErr_Format(PyExc_ValueError,
"file descriptor cannot be a negative integer (%i)", "file descriptor cannot be a negative integer (%i)",

View File

@ -273,10 +273,7 @@ convert_to_double(PyObject **v, double *dbl)
{ {
register PyObject *obj = *v; register PyObject *obj = *v;
if (PyInt_Check(obj)) { if (PyLong_Check(obj)) {
*dbl = (double)PyInt_AS_LONG(obj);
}
else if (PyLong_Check(obj)) {
*dbl = PyLong_AsDouble(obj); *dbl = PyLong_AsDouble(obj);
if (*dbl == -1.0 && PyErr_Occurred()) { if (*dbl == -1.0 && PyErr_Occurred()) {
*v = NULL; *v = NULL;
@ -376,32 +373,6 @@ float_richcompare(PyObject *v, PyObject *w, int op)
goto Unimplemented; goto Unimplemented;
} }
else if (PyInt_Check(w)) {
long jj = PyInt_AS_LONG(w);
/* In the worst realistic case I can imagine, C double is a
* Cray single with 48 bits of precision, and long has 64
* bits.
*/
#if SIZEOF_LONG > 6
unsigned long abs = (unsigned long)(jj < 0 ? -jj : jj);
if (abs >> 48) {
/* Needs more than 48 bits. Make it take the
* PyLong path.
*/
PyObject *result;
PyObject *ww = PyLong_FromLong(jj);
if (ww == NULL)
return NULL;
result = float_richcompare(v, ww, op);
Py_DECREF(ww);
return result;
}
#endif
j = (double)jj;
assert((long)j == jj);
}
else if (PyLong_Check(w)) { else if (PyLong_Check(w)) {
int vsign = i == 0.0 ? 0 : i < 0.0 ? -1 : 1; int vsign = i == 0.0 ? 0 : i < 0.0 ? -1 : 1;
int wsign = _PyLong_Sign(w); int wsign = _PyLong_Sign(w);

View File

@ -88,7 +88,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
int setup_op = 0; /* (ditto) */ int setup_op = 0; /* (ditto) */
/* f_lineno must be an integer. */ /* f_lineno must be an integer. */
if (!PyInt_Check(p_new_lineno)) { if (!PyInt_CheckExact(p_new_lineno)) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"lineno must be an integer"); "lineno must be an integer");
return -1; return -1;

View File

@ -10,6 +10,7 @@ PyInt_GetMax(void)
return LONG_MAX; /* To initialize sys.maxint */ return LONG_MAX; /* To initialize sys.maxint */
} }
#if 0
/* Integers are quite normal objects, to make object handling uniform. /* Integers are quite normal objects, to make object handling uniform.
(Using odd pointers to represent integers would save much space (Using odd pointers to represent integers would save much space
but require extra checks for this special case throughout the code.) but require extra checks for this special case throughout the code.)
@ -1254,3 +1255,4 @@ PyInt_Fini(void)
} }
} }
} }
#endif /* if 0 */

View File

@ -945,7 +945,7 @@ islt(PyObject *x, PyObject *y, PyObject *compare)
Py_DECREF(args); Py_DECREF(args);
if (res == NULL) if (res == NULL)
return -1; return -1;
if (!PyInt_Check(res)) { if (!PyInt_CheckExact(res)) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"comparison function must return int, not %.200s", "comparison function must return int, not %.200s",
res->ob_type->tp_name); res->ob_type->tp_name);

View File

@ -7,6 +7,53 @@
#include <ctype.h> #include <ctype.h>
#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS 257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS 5
#endif
#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];
#ifdef COUNT_ALLOCS
int quick_int_allocs, quick_neg_int_allocs;
#endif
static inline PyObject *
get_small_int(int ival)
{
PyObject *v = (PyObject*)(small_ints + ival + NSMALLNEGINTS);
Py_INCREF(v);
#ifdef COUNT_ALLOCS
if (ival >= 0)
quick_int_allocs++;
else
quick_neg_int_allocs++;
#endif
return v;
}
#define CHECK_SMALL_INT(ival) \
do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \
return get_small_int(ival); \
} while(0)
#else
#define CHECK_SMALL_INT(ival)
#endif
#define MEDIUM_VALUE(x) ((x)->ob_size < 0 ? -(x)->ob_digit[0] : ((x)->ob_size == 0 ? 0 : (x)->ob_digit[0]))
/* If a freshly-allocated long is already shared, it must
be a small integer, so negating it must go to PyLong_FromLong */
#define NEGATE(x) \
do if ((x)->ob_refcnt == 1) (x)->ob_size = -(x)->ob_size; \
else { PyObject* tmp=PyInt_FromLong(-MEDIUM_VALUE(x)); \
Py_DECREF(x); (x) = (PyLongObject*)tmp; } \
while(0)
/* For long 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 * both operands contain more than KARATSUBA_CUTOFF digits (this
* being an internal Python long digit, in base BASE). * being an internal Python long digit, in base BASE).
@ -64,11 +111,21 @@ long_normalize(register PyLongObject *v)
PyLongObject * PyLongObject *
_PyLong_New(Py_ssize_t size) _PyLong_New(Py_ssize_t size)
{ {
if (size > PY_SSIZE_T_MAX) { PyLongObject *result;
/* Can't use sizeof(PyLongObject) here, since the
compiler takes padding at the end into account.
As the consequence, this would waste 2 bytes on
a 32-bit system, and 6 bytes on a 64-bit system.
This computation would be incorrect on systems
which have padding before the digits; with 16-bit
digits this should not happen. */
result = PyObject_MALLOC(sizeof(PyVarObject) +
size*sizeof(digit));
if (!result) {
PyErr_NoMemory(); PyErr_NoMemory();
return NULL; return NULL;
} }
return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size); return (PyLongObject*)PyObject_INIT_VAR(result, &PyLong_Type, size);
} }
PyObject * PyObject *
@ -81,6 +138,12 @@ _PyLong_Copy(PyLongObject *src)
i = src->ob_size; i = src->ob_size;
if (i < 0) if (i < 0)
i = -(i); i = -(i);
if (i < 2) {
int ival = src->ob_digit[0];
if (src->ob_size < 0)
ival = -ival;
CHECK_SMALL_INT(ival);
}
result = _PyLong_New(i); result = _PyLong_New(i);
if (result != NULL) { if (result != NULL) {
result->ob_size = src->ob_size; result->ob_size = src->ob_size;
@ -98,17 +161,37 @@ PyLong_FromLong(long ival)
PyLongObject *v; PyLongObject *v;
unsigned long t; /* unsigned so >> doesn't propagate sign bit */ unsigned long t; /* unsigned so >> doesn't propagate sign bit */
int ndigits = 0; int ndigits = 0;
int negative = 0; int sign = 1;
CHECK_SMALL_INT(ival);
if (ival < 0) { if (ival < 0) {
ival = -ival; ival = -ival;
negative = 1; sign = -1;
} }
/* Count the number of Python digits. /* Fast path for single-digits ints */
We used to pick 5 ("big enough for anything"), but that's a if (!(ival>>SHIFT)) {
waste of time and space given that 5*15 = 75 bits are rarely v = _PyLong_New(1);
needed. */ if (v) {
v->ob_size = sign;
v->ob_digit[0] = ival;
}
return (PyObject*)v;
}
/* 2 digits */
if (!(ival >> 2*SHIFT)) {
v = _PyLong_New(2);
if (v) {
v->ob_size = 2*sign;
v->ob_digit[0] = (digit)ival & MASK;
v->ob_digit[1] = ival >> SHIFT;
}
return (PyObject*)v;
}
/* Larger numbers: loop to determine number of digits */
t = (unsigned long)ival; t = (unsigned long)ival;
while (t) { while (t) {
++ndigits; ++ndigits;
@ -117,7 +200,7 @@ PyLong_FromLong(long ival)
v = _PyLong_New(ndigits); v = _PyLong_New(ndigits);
if (v != NULL) { if (v != NULL) {
digit *p = v->ob_digit; digit *p = v->ob_digit;
v->ob_size = negative ? -ndigits : ndigits; v->ob_size = ndigits*sign;
t = (unsigned long)ival; t = (unsigned long)ival;
while (t) { while (t) {
*p++ = (digit)(t & MASK); *p++ = (digit)(t & MASK);
@ -136,6 +219,8 @@ PyLong_FromUnsignedLong(unsigned long ival)
unsigned long t; unsigned long t;
int ndigits = 0; int ndigits = 0;
if (ival < BASE)
return PyLong_FromLong(ival);
/* Count the number of Python digits. */ /* Count the number of Python digits. */
t = (unsigned long)ival; t = (unsigned long)ival;
while (t) { while (t) {
@ -165,9 +250,10 @@ PyLong_FromDouble(double dval)
neg = 0; neg = 0;
if (Py_IS_INFINITY(dval)) { if (Py_IS_INFINITY(dval)) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"cannot convert float infinity to long"); "cannot convert float infinity to int");
return NULL; return NULL;
} }
CHECK_SMALL_INT((int)dval);
if (dval < 0.0) { if (dval < 0.0) {
neg = 1; neg = 1;
dval = -dval; dval = -dval;
@ -214,15 +300,39 @@ PyLong_AsLong(PyObject *vv)
unsigned long x, prev; unsigned long x, prev;
Py_ssize_t i; Py_ssize_t i;
int sign; int sign;
int do_decref = 0; /* if nb_int was called */
if (vv == NULL || !PyLong_Check(vv)) { if (vv == NULL) {
if (vv != NULL && PyInt_Check(vv))
return PyInt_AsLong(vv);
PyErr_BadInternalCall(); PyErr_BadInternalCall();
return -1; return -1;
} }
if (!PyLong_Check(vv)) {
PyNumberMethods *nb;
if ((nb = vv->ob_type->tp_as_number) == 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 (!PyLong_Check(vv)) {
Py_DECREF(vv);
PyErr_SetString(PyExc_TypeError,
"nb_int should return int object");
return -1;
}
}
v = (PyLongObject *)vv; v = (PyLongObject *)vv;
i = v->ob_size; i = v->ob_size;
switch (i) {
case -1: return -v->ob_digit[0];
case 0: return 0;
case 1: return v->ob_digit[0];
}
sign = 1; sign = 1;
x = 0; x = 0;
if (i < 0) { if (i < 0) {
@ -235,6 +345,9 @@ PyLong_AsLong(PyObject *vv)
if ((x >> SHIFT) != prev) if ((x >> SHIFT) != prev)
goto overflow; goto overflow;
} }
if (do_decref) {
Py_DECREF(vv);
}
/* Haven't lost any bits, but casting to long requires extra care /* Haven't lost any bits, but casting to long requires extra care
* (see comment above). * (see comment above).
*/ */
@ -247,16 +360,32 @@ PyLong_AsLong(PyObject *vv)
/* else overflow */ /* else overflow */
overflow: overflow:
if (do_decref) {
Py_DECREF(vv);
}
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"long int too large to convert to int"); "int too large to convert to int");
return -1; return -1;
} }
int
_PyLong_FitsInLong(PyObject *vv)
{
int size;
if (!PyLong_CheckExact(vv)) {
PyErr_BadInternalCall();
return 0;
}
/* conservative estimate */
size = ((PyLongObject*)vv)->ob_size;
return -2 <= size && size <= 2;
}
/* Get a Py_ssize_t from a long int object. /* Get a Py_ssize_t from a long int object.
Returns -1 and sets an error condition if overflow occurs. */ Returns -1 and sets an error condition if overflow occurs. */
Py_ssize_t Py_ssize_t
_PyLong_AsSsize_t(PyObject *vv) { PyLong_AsSsize_t(PyObject *vv) {
register PyLongObject *v; register PyLongObject *v;
size_t x, prev; size_t x, prev;
Py_ssize_t i; Py_ssize_t i;
@ -268,6 +397,11 @@ _PyLong_AsSsize_t(PyObject *vv) {
} }
v = (PyLongObject *)vv; v = (PyLongObject *)vv;
i = v->ob_size; i = v->ob_size;
switch (i) {
case -1: return -v->ob_digit[0];
case 0: return 0;
case 1: return v->ob_digit[0];
}
sign = 1; sign = 1;
x = 0; x = 0;
if (i < 0) { if (i < 0) {
@ -293,7 +427,7 @@ _PyLong_AsSsize_t(PyObject *vv) {
overflow: overflow:
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"long int too large to convert to int"); "int too large to convert to ");
return -1; return -1;
} }
@ -308,15 +442,6 @@ PyLong_AsUnsignedLong(PyObject *vv)
Py_ssize_t i; Py_ssize_t i;
if (vv == NULL || !PyLong_Check(vv)) { 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(); PyErr_BadInternalCall();
return (unsigned long) -1; return (unsigned long) -1;
} }
@ -325,15 +450,57 @@ PyLong_AsUnsignedLong(PyObject *vv)
x = 0; x = 0;
if (i < 0) { if (i < 0) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"can't convert negative value to unsigned long"); "can't convert negative value to unsigned int");
return (unsigned long) -1; return (unsigned long) -1;
} }
switch (i) {
case 0: return 0;
case 1: return v->ob_digit[0];
}
while (--i >= 0) { while (--i >= 0) {
prev = x; prev = x;
x = (x << SHIFT) + v->ob_digit[i]; x = (x << SHIFT) + v->ob_digit[i];
if ((x >> SHIFT) != prev) { if ((x >> SHIFT) != prev) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"long int too large to convert"); "int too large to convert");
return (unsigned long) -1;
}
}
return x;
}
/* Get a C unsigned long int from a long int object.
Returns -1 and sets an error condition if overflow occurs. */
size_t
PyLong_AsSize_t(PyObject *vv)
{
register PyLongObject *v;
size_t x, prev;
Py_ssize_t i;
if (vv == NULL || !PyLong_Check(vv)) {
PyErr_BadInternalCall();
return (unsigned long) -1;
}
v = (PyLongObject *)vv;
i = v->ob_size;
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 << SHIFT) + v->ob_digit[i];
if ((x >> SHIFT) != prev) {
PyErr_SetString(PyExc_OverflowError,
"int too large to convert");
return (unsigned long) -1; return (unsigned long) -1;
} }
} }
@ -343,8 +510,8 @@ PyLong_AsUnsignedLong(PyObject *vv)
/* Get a C unsigned long int from a long 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. */ Returns -1 and sets an error condition if an error occurs. */
unsigned long static unsigned long
PyLong_AsUnsignedLongMask(PyObject *vv) _PyLong_AsUnsignedLongMask(PyObject *vv)
{ {
register PyLongObject *v; register PyLongObject *v;
unsigned long x; unsigned long x;
@ -352,13 +519,15 @@ PyLong_AsUnsignedLongMask(PyObject *vv)
int sign; int sign;
if (vv == NULL || !PyLong_Check(vv)) { if (vv == NULL || !PyLong_Check(vv)) {
if (vv != NULL && PyInt_Check(vv))
return PyInt_AsUnsignedLongMask(vv);
PyErr_BadInternalCall(); PyErr_BadInternalCall();
return (unsigned long) -1; return (unsigned long) -1;
} }
v = (PyLongObject *)vv; v = (PyLongObject *)vv;
i = v->ob_size; i = v->ob_size;
switch (i) {
case 0: return 0;
case 1: return v->ob_digit[0];
}
sign = 1; sign = 1;
x = 0; x = 0;
if (i < 0) { if (i < 0) {
@ -371,6 +540,41 @@ PyLong_AsUnsignedLongMask(PyObject *vv)
return x * sign; return x * sign;
} }
unsigned long
PyLong_AsUnsignedLongMask(register PyObject *op)
{
PyNumberMethods *nb;
PyLongObject *lo;
unsigned long val;
if (op && PyLong_Check(op))
return _PyLong_AsUnsignedLongMask(op);
if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
nb->nb_int == NULL) {
PyErr_SetString(PyExc_TypeError, "an integer is required");
return (unsigned long)-1;
}
lo = (PyLongObject*) (*nb->nb_int) (op);
if (lo == NULL)
return (unsigned long)-1;
if (PyLong_Check(lo)) {
val = _PyLong_AsUnsignedLongMask((PyObject *)lo);
Py_DECREF(lo);
if (PyErr_Occurred())
return (unsigned long)-1;
return val;
}
else
{
Py_DECREF(lo);
PyErr_SetString(PyExc_TypeError,
"nb_int should return int object");
return (unsigned long)-1;
}
}
int int
_PyLong_Sign(PyObject *vv) _PyLong_Sign(PyObject *vv)
{ {
@ -409,7 +613,7 @@ _PyLong_NumBits(PyObject *vv)
return result; return result;
Overflow: Overflow:
PyErr_SetString(PyExc_OverflowError, "long has too many bits " PyErr_SetString(PyExc_OverflowError, "int has too many bits "
"to express in a platform size_t"); "to express in a platform size_t");
return (size_t)-1; return (size_t)-1;
} }
@ -542,7 +746,7 @@ _PyLong_AsByteArray(PyLongObject* v,
ndigits = -(v->ob_size); ndigits = -(v->ob_size);
if (!is_signed) { if (!is_signed) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"can't convert negative long to unsigned"); "can't convert negative int to unsigned");
return -1; return -1;
} }
do_twos_comp = 1; do_twos_comp = 1;
@ -653,7 +857,7 @@ _PyLong_AsByteArray(PyLongObject* v,
return 0; return 0;
Overflow: Overflow:
PyErr_SetString(PyExc_OverflowError, "long too big to convert"); PyErr_SetString(PyExc_OverflowError, "int too big to convert");
return -1; return -1;
} }
@ -739,7 +943,7 @@ PyLong_AsDouble(PyObject *vv)
overflow: overflow:
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"long int too large to convert to float"); "int too large to convert to float");
return -1.0; return -1.0;
} }
@ -748,24 +952,17 @@ overflow:
PyObject * PyObject *
PyLong_FromVoidPtr(void *p) PyLong_FromVoidPtr(void *p)
{ {
#if SIZEOF_VOID_P <= SIZEOF_LONG
if ((long)p < 0)
return PyLong_FromUnsignedLong((unsigned long)p);
return PyInt_FromLong((long)p);
#else
#ifndef HAVE_LONG_LONG #ifndef HAVE_LONG_LONG
# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long" # error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
#endif #endif
#if SIZEOF_LONG_LONG < SIZEOF_VOID_P #if SIZEOF_LONG_LONG < SIZEOF_VOID_P
# error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)" # error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
#endif #endif
/* optimize null pointers */ /* special-case null pointer */
if (p == NULL) if (!p)
return PyInt_FromLong(0); return PyInt_FromLong(0);
return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)p); return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)(Py_uintptr_t)p);
#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
} }
/* Get a C pointer from a long object (or an int object in some cases) */ /* Get a C pointer from a long object (or an int object in some cases) */
@ -780,9 +977,7 @@ PyLong_AsVoidPtr(PyObject *vv)
#if SIZEOF_VOID_P <= SIZEOF_LONG #if SIZEOF_VOID_P <= SIZEOF_LONG
long x; long x;
if (PyInt_Check(vv)) if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
x = PyInt_AS_LONG(vv);
else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
x = PyLong_AsLong(vv); x = PyLong_AsLong(vv);
else else
x = PyLong_AsUnsignedLong(vv); x = PyLong_AsUnsignedLong(vv);
@ -796,9 +991,7 @@ PyLong_AsVoidPtr(PyObject *vv)
#endif #endif
PY_LONG_LONG x; PY_LONG_LONG x;
if (PyInt_Check(vv)) if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
x = PyInt_AS_LONG(vv);
else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
x = PyLong_AsLongLong(vv); x = PyLong_AsLongLong(vv);
else else
x = PyLong_AsUnsignedLongLong(vv); x = PyLong_AsUnsignedLongLong(vv);
@ -828,6 +1021,7 @@ PyLong_FromLongLong(PY_LONG_LONG ival)
int ndigits = 0; int ndigits = 0;
int negative = 0; int negative = 0;
CHECK_SMALL_INT(ival);
if (ival < 0) { if (ival < 0) {
ival = -ival; ival = -ival;
negative = 1; negative = 1;
@ -864,6 +1058,8 @@ PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG ival)
unsigned PY_LONG_LONG t; unsigned PY_LONG_LONG t;
int ndigits = 0; int ndigits = 0;
if (ival < BASE)
return PyLong_FromLong(ival);
/* Count the number of Python digits. */ /* Count the number of Python digits. */
t = (unsigned PY_LONG_LONG)ival; t = (unsigned PY_LONG_LONG)ival;
while (t) { while (t) {
@ -885,22 +1081,26 @@ PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG ival)
/* Create a new long int object from a C Py_ssize_t. */ /* Create a new long int object from a C Py_ssize_t. */
PyObject * PyObject *
_PyLong_FromSsize_t(Py_ssize_t ival) PyLong_FromSsize_t(Py_ssize_t ival)
{ {
Py_ssize_t bytes = ival; Py_ssize_t bytes = ival;
int one = 1; int one = 1;
if (ival < BASE)
return PyLong_FromLong(ival);
return _PyLong_FromByteArray( return _PyLong_FromByteArray(
(unsigned char *)&bytes, (unsigned char *)&bytes,
SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0); SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 1);
} }
/* Create a new long int object from a C size_t. */ /* Create a new long int object from a C size_t. */
PyObject * PyObject *
_PyLong_FromSize_t(size_t ival) PyLong_FromSize_t(size_t ival)
{ {
size_t bytes = ival; size_t bytes = ival;
int one = 1; int one = 1;
if (ival < BASE)
return PyLong_FromLong(ival);
return _PyLong_FromByteArray( return _PyLong_FromByteArray(
(unsigned char *)&bytes, (unsigned char *)&bytes,
SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0); SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0);
@ -912,6 +1112,7 @@ _PyLong_FromSize_t(size_t ival)
PY_LONG_LONG PY_LONG_LONG
PyLong_AsLongLong(PyObject *vv) PyLong_AsLongLong(PyObject *vv)
{ {
PyLongObject *v;
PY_LONG_LONG bytes; PY_LONG_LONG bytes;
int one = 1; int one = 1;
int res; int res;
@ -923,8 +1124,6 @@ PyLong_AsLongLong(PyObject *vv)
if (!PyLong_Check(vv)) { if (!PyLong_Check(vv)) {
PyNumberMethods *nb; PyNumberMethods *nb;
PyObject *io; PyObject *io;
if (PyInt_Check(vv))
return (PY_LONG_LONG)PyInt_AsLong(vv);
if ((nb = vv->ob_type->tp_as_number) == NULL || if ((nb = vv->ob_type->tp_as_number) == NULL ||
nb->nb_int == NULL) { nb->nb_int == NULL) {
PyErr_SetString(PyExc_TypeError, "an integer is required"); PyErr_SetString(PyExc_TypeError, "an integer is required");
@ -933,11 +1132,6 @@ PyLong_AsLongLong(PyObject *vv)
io = (*nb->nb_int) (vv); io = (*nb->nb_int) (vv);
if (io == NULL) if (io == NULL)
return -1; return -1;
if (PyInt_Check(io)) {
bytes = PyInt_AsLong(io);
Py_DECREF(io);
return bytes;
}
if (PyLong_Check(io)) { if (PyLong_Check(io)) {
bytes = PyLong_AsLongLong(io); bytes = PyLong_AsLongLong(io);
Py_DECREF(io); Py_DECREF(io);
@ -948,6 +1142,12 @@ PyLong_AsLongLong(PyObject *vv)
return -1; return -1;
} }
v = (PyLongObject*)vv;
switch(v->ob_size) {
case -1: return -v->ob_digit[0];
case 0: return 0;
case 1: return v->ob_digit[0];
}
res = _PyLong_AsByteArray( res = _PyLong_AsByteArray(
(PyLongObject *)vv, (unsigned char *)&bytes, (PyLongObject *)vv, (unsigned char *)&bytes,
SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1); SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
@ -965,6 +1165,7 @@ PyLong_AsLongLong(PyObject *vv)
unsigned PY_LONG_LONG unsigned PY_LONG_LONG
PyLong_AsUnsignedLongLong(PyObject *vv) PyLong_AsUnsignedLongLong(PyObject *vv)
{ {
PyLongObject *v;
unsigned PY_LONG_LONG bytes; unsigned PY_LONG_LONG bytes;
int one = 1; int one = 1;
int res; int res;
@ -974,6 +1175,12 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
return (unsigned PY_LONG_LONG)-1; return (unsigned PY_LONG_LONG)-1;
} }
v = (PyLongObject*)vv;
switch(v->ob_size) {
case 0: return 0;
case 1: return v->ob_digit[0];
}
res = _PyLong_AsByteArray( res = _PyLong_AsByteArray(
(PyLongObject *)vv, (unsigned char *)&bytes, (PyLongObject *)vv, (unsigned char *)&bytes,
SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0); SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
@ -988,8 +1195,8 @@ PyLong_AsUnsignedLongLong(PyObject *vv)
/* Get a C unsigned long int from a long 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. */ Returns -1 and sets an error condition if an error occurs. */
unsigned PY_LONG_LONG static unsigned PY_LONG_LONG
PyLong_AsUnsignedLongLongMask(PyObject *vv) _PyLong_AsUnsignedLongLongMask(PyObject *vv)
{ {
register PyLongObject *v; register PyLongObject *v;
unsigned PY_LONG_LONG x; unsigned PY_LONG_LONG x;
@ -1001,6 +1208,10 @@ PyLong_AsUnsignedLongLongMask(PyObject *vv)
return (unsigned long) -1; return (unsigned long) -1;
} }
v = (PyLongObject *)vv; v = (PyLongObject *)vv;
switch(v->ob_size) {
case 0: return 0;
case 1: return v->ob_digit[0];
}
i = v->ob_size; i = v->ob_size;
sign = 1; sign = 1;
x = 0; x = 0;
@ -1013,6 +1224,41 @@ PyLong_AsUnsignedLongLongMask(PyObject *vv)
} }
return x * sign; return x * sign;
} }
unsigned PY_LONG_LONG
PyLong_AsUnsignedLongLongMask(register PyObject *op)
{
PyNumberMethods *nb;
PyLongObject *lo;
unsigned PY_LONG_LONG val;
if (op && PyLong_Check(op))
return _PyLong_AsUnsignedLongLongMask(op);
if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
nb->nb_int == NULL) {
PyErr_SetString(PyExc_TypeError, "an integer is required");
return (unsigned PY_LONG_LONG)-1;
}
lo = (PyLongObject*) (*nb->nb_int) (op);
if (lo == NULL)
return (unsigned PY_LONG_LONG)-1;
if (PyLong_Check(lo)) {
val = _PyLong_AsUnsignedLongLongMask((PyObject *)lo);
Py_DECREF(lo);
if (PyErr_Occurred())
return (unsigned PY_LONG_LONG)-1;
return val;
}
else
{
Py_DECREF(lo);
PyErr_SetString(PyExc_TypeError,
"nb_int should return int object");
return (unsigned PY_LONG_LONG)-1;
}
}
#undef IS_LITTLE_ENDIAN #undef IS_LITTLE_ENDIAN
#endif /* HAVE_LONG_LONG */ #endif /* HAVE_LONG_LONG */
@ -1024,9 +1270,6 @@ convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
*a = (PyLongObject *) v; *a = (PyLongObject *) v;
Py_INCREF(v); Py_INCREF(v);
} }
else if (PyInt_Check(v)) {
*a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
}
else { else {
return 0; return 0;
} }
@ -1034,9 +1277,6 @@ convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
*b = (PyLongObject *) w; *b = (PyLongObject *) w;
Py_INCREF(w); Py_INCREF(w);
} }
else if (PyInt_Check(w)) {
*b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
}
else { else {
Py_DECREF(*a); Py_DECREF(*a);
return 0; return 0;
@ -1206,7 +1446,7 @@ long_format(PyObject *aa, int base)
sz = i + j / bits; sz = i + j / bits;
if (j / SHIFT < size_a || sz < i) { if (j / SHIFT < size_a || sz < i) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"long is too large to format"); "int is too large to format");
return NULL; return NULL;
} }
str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz); str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz);
@ -1386,7 +1626,7 @@ long_from_binary_base(char **str, int base)
n = (p - start) * bits_per_char + SHIFT - 1; n = (p - start) * bits_per_char + SHIFT - 1;
if (n / bits_per_char < p - start) { if (n / bits_per_char < p - start) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"long string too large to convert"); "int string too large to convert");
return NULL; return NULL;
} }
n = n / SHIFT; n = n / SHIFT;
@ -1433,7 +1673,7 @@ PyLong_FromString(char *str, char **pend, int base)
if ((base != 0 && base < 2) || base > 36) { if ((base != 0 && base < 2) || base > 36) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"long() arg 2 must be >= 2 and <= 36"); "int() arg 2 must be >= 2 and <= 36");
return NULL; return NULL;
} }
while (*str != '\0' && isspace(Py_CHARMASK(*str))) while (*str != '\0' && isspace(Py_CHARMASK(*str)))
@ -1683,7 +1923,7 @@ digit beyond the first.
if (strrepr == NULL) if (strrepr == NULL)
return NULL; return NULL;
PyErr_Format(PyExc_ValueError, PyErr_Format(PyExc_ValueError,
"invalid literal for long() with base %d: %s", "invalid literal for int() with base %d: %s",
base, PyString_AS_STRING(strrepr)); base, PyString_AS_STRING(strrepr));
Py_DECREF(strrepr); Py_DECREF(strrepr);
return NULL; return NULL;
@ -1727,14 +1967,14 @@ long_divrem(PyLongObject *a, PyLongObject *b,
if (size_b == 0) { if (size_b == 0) {
PyErr_SetString(PyExc_ZeroDivisionError, PyErr_SetString(PyExc_ZeroDivisionError,
"long division or modulo by zero"); "integer division or modulo by zero");
return -1; return -1;
} }
if (size_a < size_b || if (size_a < size_b ||
(size_a == size_b && (size_a == size_b &&
a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) { a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
/* |a| < |b|. */ /* |a| < |b|. */
*pdiv = _PyLong_New(0); *pdiv = (PyLongObject*)PyLong_FromLong(0);
Py_INCREF(a); Py_INCREF(a);
*prem = (PyLongObject *) a; *prem = (PyLongObject *) a;
return 0; return 0;
@ -1756,9 +1996,9 @@ long_divrem(PyLongObject *a, PyLongObject *b,
the remainder r has the sign of a, the remainder r has the sign of a,
so a = b*z + r. */ so a = b*z + r. */
if ((a->ob_size < 0) != (b->ob_size < 0)) if ((a->ob_size < 0) != (b->ob_size < 0))
z->ob_size = -(z->ob_size); NEGATE(z);
if (a->ob_size < 0 && (*prem)->ob_size != 0) if (a->ob_size < 0 && (*prem)->ob_size != 0)
(*prem)->ob_size = -((*prem)->ob_size); NEGATE(*prem);
*pdiv = z; *pdiv = z;
return 0; return 0;
} }
@ -1922,6 +2162,11 @@ long_hash(PyLongObject *v)
same value hash to the same value, otherwise comparisons same value hash to the same value, otherwise comparisons
of mapping keys will turn out weird */ of mapping keys will turn out weird */
i = v->ob_size; i = v->ob_size;
switch(i) {
case -1: return v->ob_digit[0]==1 ? -2 : -v->ob_digit[0];
case 0: return 0;
case 1: return v->ob_digit[0];
}
sign = 1; sign = 1;
x = 0; x = 0;
if (i < 0) { if (i < 0) {
@ -2027,7 +2272,7 @@ x_sub(PyLongObject *a, PyLongObject *b)
} }
assert(borrow == 0); assert(borrow == 0);
if (sign < 0) if (sign < 0)
z->ob_size = -(z->ob_size); NEGATE(z);
return long_normalize(z); return long_normalize(z);
} }
@ -2038,6 +2283,9 @@ long_add(PyLongObject *v, PyLongObject *w)
CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b); CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
if (ABS(a->ob_size) <= 1 && ABS(b->ob_size) <= 1)
return PyInt_FromLong(MEDIUM_VALUE(a) +
MEDIUM_VALUE(b));
if (a->ob_size < 0) { if (a->ob_size < 0) {
if (b->ob_size < 0) { if (b->ob_size < 0) {
z = x_add(a, b); z = x_add(a, b);
@ -2065,6 +2313,8 @@ long_sub(PyLongObject *v, PyLongObject *w)
CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b); CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
if (ABS(a->ob_size) <= 1 && ABS(b->ob_size) <= 1)
return PyLong_FromLong(MEDIUM_VALUE(a)-MEDIUM_VALUE(b));
if (a->ob_size < 0) { if (a->ob_size < 0) {
if (b->ob_size < 0) if (b->ob_size < 0)
z = x_sub(a, b); z = x_sub(a, b);
@ -2494,10 +2744,13 @@ long_mul(PyLongObject *v, PyLongObject *w)
return Py_NotImplemented; return Py_NotImplemented;
} }
if (ABS(v->ob_size) <= 1 && ABS(w->ob_size) <= 1)
return PyLong_FromLong(MEDIUM_VALUE(v)*MEDIUM_VALUE(w));
z = k_mul(a, b); z = k_mul(a, b);
/* Negate if exactly one of the inputs is negative. */ /* Negate if exactly one of the inputs is negative. */
if (((a->ob_size ^ b->ob_size) < 0) && z) if (((a->ob_size ^ b->ob_size) < 0) && z)
z->ob_size = -(z->ob_size); NEGATE(z);
Py_DECREF(a); Py_DECREF(a);
Py_DECREF(b); Py_DECREF(b);
return (PyObject *)z; return (PyObject *)z;
@ -2603,7 +2856,7 @@ long_true_divide(PyObject *v, PyObject *w)
if (bd == 0.0) { if (bd == 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError, PyErr_SetString(PyExc_ZeroDivisionError,
"long division or modulo by zero"); "int division or modulo by zero");
return NULL; return NULL;
} }
@ -2622,7 +2875,7 @@ long_true_divide(PyObject *v, PyObject *w)
overflow: overflow:
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"long/long too large for a float"); "int/int too large for a float");
return NULL; return NULL;
} }
@ -2691,11 +2944,6 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
c = (PyLongObject *)x; c = (PyLongObject *)x;
Py_INCREF(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) else if (x == Py_None)
c = NULL; c = NULL;
else { else {
@ -2741,7 +2989,7 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
Py_DECREF(c); Py_DECREF(c);
c = temp; c = temp;
temp = NULL; temp = NULL;
c->ob_size = - c->ob_size; NEGATE(c);
} }
/* if modulus == 1: /* if modulus == 1:
@ -2862,6 +3110,8 @@ long_invert(PyLongObject *v)
/* Implement ~x as -(x+1) */ /* Implement ~x as -(x+1) */
PyLongObject *x; PyLongObject *x;
PyLongObject *w; PyLongObject *w;
if (ABS(v->ob_size) <=1)
return PyLong_FromLong(-(MEDIUM_VALUE(v)+1));
w = (PyLongObject *)PyLong_FromLong(1L); w = (PyLongObject *)PyLong_FromLong(1L);
if (w == NULL) if (w == NULL)
return NULL; return NULL;
@ -2888,11 +3138,8 @@ static PyObject *
long_neg(PyLongObject *v) long_neg(PyLongObject *v)
{ {
PyLongObject *z; PyLongObject *z;
if (v->ob_size == 0 && PyLong_CheckExact(v)) { if (ABS(v->ob_size) <= 1)
/* -0 == 0 */ return PyLong_FromLong(-MEDIUM_VALUE(v));
Py_INCREF(v);
return (PyObject *) v;
}
z = (PyLongObject *)_PyLong_Copy(v); z = (PyLongObject *)_PyLong_Copy(v);
if (z != NULL) if (z != NULL)
z->ob_size = -(v->ob_size); z->ob_size = -(v->ob_size);
@ -3016,7 +3263,7 @@ long_lshift(PyObject *v, PyObject *w)
if (z == NULL) if (z == NULL)
goto lshift_error; goto lshift_error;
if (a->ob_size < 0) if (a->ob_size < 0)
z->ob_size = -(z->ob_size); NEGATE(z);
for (i = 0; i < wordshift; i++) for (i = 0; i < wordshift; i++)
z->ob_digit[i] = 0; z->ob_digit[i] = 0;
accum = 0; accum = 0;
@ -3194,22 +3441,7 @@ long_long(PyObject *v)
static PyObject * static PyObject *
long_int(PyObject *v) long_int(PyObject *v)
{ {
long x; return long_long(v);
x = PyLong_AsLong(v);
if (PyErr_Occurred()) {
if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
PyErr_Clear();
if (PyLong_CheckExact(v)) {
Py_INCREF(v);
return v;
}
else
return _PyLong_Copy((PyLongObject *)v);
}
else
return NULL;
}
return PyInt_FromLong(x);
} }
static PyObject * static PyObject *
@ -3246,15 +3478,25 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (type != &PyLong_Type) if (type != &PyLong_Type)
return long_subtype_new(type, args, kwds); /* Wimp out */ return long_subtype_new(type, args, kwds); /* Wimp out */
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist, if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
&x, &base)) &x, &base))
return NULL; return NULL;
if (x == NULL) if (x == NULL)
return PyLong_FromLong(0L); return PyLong_FromLong(0L);
if (base == -909) if (base == -909)
return PyNumber_Long(x); return PyNumber_Long(x);
else if (PyString_Check(x)) else if (PyString_Check(x)) {
return PyLong_FromString(PyString_AS_STRING(x), NULL, base); char *s = PyString_AS_STRING(x);
char *end;
PyObject *r = PyLong_FromString(s, &end, base);
if (r != NULL && end != s + PyString_GET_SIZE(x)) {
PyErr_SetString(PyExc_ValueError,
"null byte in argument for int()");
Py_DECREF(r);
r = NULL;
}
return r;
}
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE
else if (PyUnicode_Check(x)) else if (PyUnicode_Check(x))
return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x), return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
@ -3263,7 +3505,7 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
#endif #endif
else { else {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"long() can't convert non-string with explicit base"); "int() can't convert non-string with explicit base");
return NULL; return NULL;
} }
} }
@ -3312,9 +3554,9 @@ static PyMethodDef long_methods[] = {
}; };
PyDoc_STRVAR(long_doc, PyDoc_STRVAR(long_doc,
"long(x[, base]) -> integer\n\ "int(x[, base]) -> integer\n\
\n\ \n\
Convert a string or number to a long integer, if possible. A floating\n\ Convert a string or number to an integer, if possible. A floating\n\
point argument will be truncated towards zero (this does not include a\n\ point argument will be truncated towards zero (this does not include a\n\
string representation of a floating point number!) When converting a\n\ string representation of a floating point number!) When converting a\n\
string, use the optional base. It is an error to supply a base when\n\ string, use the optional base. It is an error to supply a base when\n\
@ -3363,8 +3605,10 @@ static PyNumberMethods long_as_number = {
PyTypeObject PyLong_Type = { PyTypeObject PyLong_Type = {
PyObject_HEAD_INIT(&PyType_Type) PyObject_HEAD_INIT(&PyType_Type)
0, /* ob_size */ 0, /* ob_size */
"long", /* tp_name */ "int", /* tp_name */
sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */ /* See _PyLong_New for why this isn't
sizeof(PyLongObject) - sizeof(digit) */
sizeof(PyVarObject), /* tp_basicsize */
sizeof(digit), /* tp_itemsize */ sizeof(digit), /* tp_itemsize */
long_dealloc, /* tp_dealloc */ long_dealloc, /* tp_dealloc */
0, /* tp_print */ 0, /* tp_print */
@ -3377,7 +3621,7 @@ PyTypeObject PyLong_Type = {
0, /* tp_as_mapping */ 0, /* tp_as_mapping */
(hashfunc)long_hash, /* tp_hash */ (hashfunc)long_hash, /* tp_hash */
0, /* tp_call */ 0, /* tp_call */
0, /* tp_str */ long_repr, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */ PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */ 0, /* tp_setattro */
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
@ -3402,3 +3646,43 @@ PyTypeObject PyLong_Type = {
long_new, /* tp_new */ long_new, /* tp_new */
PyObject_Del, /* tp_free */ PyObject_Del, /* tp_free */
}; };
int
_PyLong_Init(void)
{
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
int ival;
PyLongObject *v = small_ints;
for (ival = -NSMALLNEGINTS; ival < 0; ival++, v++) {
PyObject_INIT(v, &PyLong_Type);
v->ob_size = -1;
v->ob_digit[0] = -ival;
}
for (; ival < NSMALLPOSINTS; ival++, v++) {
PyObject_INIT(v, &PyLong_Type);
v->ob_size = ival ? 1 : 0;
v->ob_digit[0] = ival;
}
#endif
return 1;
}
void
PyLong_Fini(void)
{
#if 0
int i;
/* This is currently not needed; the small integers
are statically allocated */
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
PyIntObject **q;
i = NSMALLNEGINTS + NSMALLPOSINTS;
q = small_ints;
while (--i >= 0) {
Py_XDECREF(*q);
*q++ = NULL;
}
#endif
#endif
}

View File

@ -4221,6 +4221,14 @@ _PyString_FormatLong(PyObject *val, int flags, int prec, int type,
int numdigits; /* len == numnondigits + numdigits */ int numdigits; /* len == numnondigits + numdigits */
int numnondigits = 0; int numnondigits = 0;
/* Avoid exceeding SSIZE_T_MAX */
if (prec > PY_SSIZE_T_MAX-3) {
PyErr_SetString(PyExc_OverflowError,
"precision too large");
return NULL;
}
switch (type) { switch (type) {
case 'd': case 'd':
case 'u': case 'u':
@ -4565,6 +4573,8 @@ PyString_Format(PyObject *format, PyObject *args)
goto error; goto error;
} }
width = PyInt_AsLong(v); width = PyInt_AsLong(v);
if (width == -1 && PyErr_Occurred())
goto error;
if (width < 0) { if (width < 0) {
flags |= F_LJUST; flags |= F_LJUST;
width = -width; width = -width;
@ -4602,6 +4612,8 @@ PyString_Format(PyObject *format, PyObject *args)
goto error; goto error;
} }
prec = PyInt_AsLong(v); prec = PyInt_AsLong(v);
if (prec == -1 && PyErr_Occurred())
goto error;
if (prec < 0) if (prec < 0)
prec = 0; prec = 0;
if (--fmtcnt >= 0) if (--fmtcnt >= 0)

View File

@ -7585,6 +7585,8 @@ PyObject *PyUnicode_Format(PyObject *format,
goto onError; goto onError;
} }
width = PyInt_AsLong(v); width = PyInt_AsLong(v);
if (width == -1 && PyErr_Occurred())
goto onError;
if (width < 0) { if (width < 0) {
flags |= F_LJUST; flags |= F_LJUST;
width = -width; width = -width;
@ -7620,6 +7622,8 @@ PyObject *PyUnicode_Format(PyObject *format,
goto onError; goto onError;
} }
prec = PyInt_AsLong(v); prec = PyInt_AsLong(v);
if (prec == -1 && PyErr_Occurred())
goto onError;
if (prec < 0) if (prec < 0)
prec = 0; prec = 0;
if (--fmtcnt >= 0) if (--fmtcnt >= 0)

View File

@ -543,7 +543,7 @@ summary_setproperty(msiobj* si, PyObject *args)
if (PyString_Check(data)) { if (PyString_Check(data)) {
status = MsiSummaryInfoSetProperty(si->h, field, VT_LPSTR, status = MsiSummaryInfoSetProperty(si->h, field, VT_LPSTR,
0, NULL, PyString_AsString(data)); 0, NULL, PyString_AsString(data));
} else if (PyInt_Check(data)) { } else if (PyInt_CheckExact(data)) {
status = MsiSummaryInfoSetProperty(si->h, field, VT_I4, status = MsiSummaryInfoSetProperty(si->h, field, VT_I4,
PyInt_AsLong(data), NULL, NULL); PyInt_AsLong(data), NULL, NULL);
} else { } else {

View File

@ -2124,7 +2124,7 @@ _PyBuiltin_Init(void)
SETBUILTIN("float", &PyFloat_Type); SETBUILTIN("float", &PyFloat_Type);
SETBUILTIN("frozenset", &PyFrozenSet_Type); SETBUILTIN("frozenset", &PyFrozenSet_Type);
SETBUILTIN("property", &PyProperty_Type); SETBUILTIN("property", &PyProperty_Type);
SETBUILTIN("int", &PyInt_Type); SETBUILTIN("int", &PyLong_Type);
SETBUILTIN("list", &PyList_Type); SETBUILTIN("list", &PyList_Type);
SETBUILTIN("long", &PyLong_Type); SETBUILTIN("long", &PyLong_Type);
SETBUILTIN("object", &PyBaseObject_Type); SETBUILTIN("object", &PyBaseObject_Type);

View File

@ -3900,7 +3900,7 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
{ {
if (v != NULL) { if (v != NULL) {
Py_ssize_t x; Py_ssize_t x;
if (PyInt_Check(v)) { if (PyInt_CheckExact(v)) {
/* XXX(nnorwitz): I think PyInt_AS_LONG is correct, /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
however, it looks like it should be AsSsize_t. however, it looks like it should be AsSsize_t.
There should be a comment here explaining why. There should be a comment here explaining why.

View File

@ -720,9 +720,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
case 'K': { /* long long sized bitfield */ case 'K': { /* long long sized bitfield */
unsigned PY_LONG_LONG *p = va_arg(*p_va, unsigned PY_LONG_LONG *); unsigned PY_LONG_LONG *p = va_arg(*p_va, unsigned PY_LONG_LONG *);
unsigned PY_LONG_LONG ival; unsigned PY_LONG_LONG ival;
if (PyInt_Check(arg)) if (PyLong_Check(arg))
ival = PyInt_AsUnsignedLongMask(arg);
else if (PyLong_Check(arg))
ival = PyLong_AsUnsignedLongLongMask(arg); ival = PyLong_AsUnsignedLongLongMask(arg);
else else
return converterr("integer<K>", arg, msgbuf, bufsize); return converterr("integer<K>", arg, msgbuf, bufsize);

View File

@ -144,31 +144,34 @@ w_object(PyObject *v, WFILE *p)
else if (v == Py_True) { else if (v == Py_True) {
w_byte(TYPE_TRUE, p); w_byte(TYPE_TRUE, p);
} }
else if (PyInt_Check(v)) { else if (PyLong_Check(v)) {
long x = PyInt_AS_LONG((PyIntObject *)v); long x = PyLong_AsLong(v);
if ((x == -1) && PyErr_Occurred()) {
PyLongObject *ob = (PyLongObject *)v;
PyErr_Clear();
w_byte(TYPE_LONG, p);
n = ob->ob_size;
w_long((long)n, p);
if (n < 0)
n = -n;
for (i = 0; i < n; i++)
w_short(ob->ob_digit[i], p);
}
else {
#if SIZEOF_LONG > 4 #if SIZEOF_LONG > 4
long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31); long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
if (y && y != -1) { if (y && y != -1) {
w_byte(TYPE_INT64, p); w_byte(TYPE_INT64, p);
w_long64(x, p); w_long64(x, p);
} }
else else
#endif #endif
{ {
w_byte(TYPE_INT, p); w_byte(TYPE_INT, p);
w_long(x, p); w_long(x, p);
}
} }
} }
else if (PyLong_Check(v)) {
PyLongObject *ob = (PyLongObject *)v;
w_byte(TYPE_LONG, p);
n = ob->ob_size;
w_long((long)n, p);
if (n < 0)
n = -n;
for (i = 0; i < n; i++)
w_short(ob->ob_digit[i], p);
}
else if (PyFloat_Check(v)) { else if (PyFloat_Check(v)) {
if (p->version > 1) { if (p->version > 1) {
unsigned char buf[8]; unsigned char buf[8];

View File

@ -60,6 +60,8 @@ static void call_sys_exitfunc(void);
static void call_ll_exitfuncs(void); static void call_ll_exitfuncs(void);
extern void _PyUnicode_Init(void); extern void _PyUnicode_Init(void);
extern void _PyUnicode_Fini(void); extern void _PyUnicode_Fini(void);
extern int _PyLong_Init(void);
extern void PyLong_Fini(void);
#ifdef WITH_THREAD #ifdef WITH_THREAD
extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
@ -181,8 +183,8 @@ Py_InitializeEx(int install_sigs)
if (!_PyFrame_Init()) if (!_PyFrame_Init())
Py_FatalError("Py_Initialize: can't init frames"); Py_FatalError("Py_Initialize: can't init frames");
if (!_PyInt_Init()) if (!_PyLong_Init())
Py_FatalError("Py_Initialize: can't init ints"); Py_FatalError("Py_Initialize: can't init longs");
_PyFloat_Init(); _PyFloat_Init();
@ -453,7 +455,7 @@ Py_Finalize(void)
PyList_Fini(); PyList_Fini();
PySet_Fini(); PySet_Fini();
PyString_Fini(); PyString_Fini();
PyInt_Fini(); PyLong_Fini();
PyFloat_Fini(); PyFloat_Fini();
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE

View File

@ -250,7 +250,7 @@ PyTraceBack_Print(PyObject *v, PyObject *f)
return -1; return -1;
} }
limitv = PySys_GetObject("tracebacklimit"); limitv = PySys_GetObject("tracebacklimit");
if (limitv && PyInt_Check(limitv)) { if (limitv && PyInt_CheckExact(limitv)) {
limit = PyInt_AsLong(limitv); limit = PyInt_AsLong(limitv);
if (limit <= 0) if (limit <= 0)
return 0; return 0;