From 28746aba9bf636d03eb1c1c5f4550c6f2dbf5300 Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Sun, 9 Jul 2006 22:14:42 +0000 Subject: [PATCH] On 64 bit systems, int literals that use less than 64 bits are now ints rather than longs. This also fixes the test for eval(-sys.maxint - 1). --- Lib/test/test_compile.py | 15 +++++++++++++++ Misc/NEWS | 3 +++ Python/mystrtoul.c | 11 +++++++++++ 3 files changed, 29 insertions(+) diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index bacec35766c..688a02dd56c 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -216,6 +216,21 @@ if 1: self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 1)), int)) self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 2)), long)) + if sys.maxint == 9223372036854775807: + def test_32_63_bit_values(self): + a = +4294967296 # 1 << 32 + b = -4294967296 # 1 << 32 + c = +281474976710656 # 1 << 48 + d = -281474976710656 # 1 << 48 + e = +4611686018427387904 # 1 << 62 + f = -4611686018427387904 # 1 << 62 + g = +9223372036854775807 # 1 << 63 - 1 + h = -9223372036854775807 # 1 << 63 - 1 + + for variable in self.test_32_63_bit_values.func_code.co_consts: + if variable is not None: + self.assertTrue(isinstance(variable, int)) + def test_sequence_unpacking_error(self): # Verify sequence packing/unpacking with "or". SF bug #757818 i,j = (1, -1) or (-1, 1) diff --git a/Misc/NEWS b/Misc/NEWS index bc34360ab7a..ff336c62aca 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -30,6 +30,9 @@ Core and builtins - Bug #1519018: 'as' is now validated properly in import statements. +- On 64 bit systems, int literals that use less than 64 bits are + now ints rather than longs. + Library ------- diff --git a/Python/mystrtoul.c b/Python/mystrtoul.c index 1fc360be95a..51553fbe1f3 100644 --- a/Python/mystrtoul.c +++ b/Python/mystrtoul.c @@ -69,11 +69,22 @@ static unsigned long smallmax[] = { * calculated by [int(math.floor(math.log(2**32, i))) for i in range(2, 37)]. * Note that this is pessimistic if sizeof(long) > 4. */ +#if SIZEOF_LONG == 4 static int digitlimit[] = { 0, 0, 32, 20, 16, 13, 12, 11, 10, 10, /* 0 - 9 */ 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, /* 10 - 19 */ 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, /* 20 - 29 */ 6, 6, 6, 6, 6, 6, 6}; /* 30 - 36 */ +#elif SIZEOF_LONG == 8 +/* [int(math.floor(math.log(2**64, i))) for i in range(2, 37)] */ +static int digitlimit[] = { + 0, 0, 64, 40, 32, 27, 24, 22, 21, 20, /* 0 - 9 */ + 19, 18, 17, 17, 16, 16, 16, 15, 15, 15, /* 10 - 19 */ + 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, /* 20 - 29 */ + 13, 12, 12, 12, 12, 12, 12}; /* 30 - 36 */ +#else +#error "Need table for SIZEOF_LONG" +#endif /* ** strtoul