]> granicus.if.org Git - python/commitdiff
Issue #10325: Fix two issues in the fallback definitions of PY_LLONG_MAX and
authorMark Dickinson <dickinsm@gmail.com>
Sat, 20 Nov 2010 10:43:10 +0000 (10:43 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Sat, 20 Nov 2010 10:43:10 +0000 (10:43 +0000)
PY_ULLONG_MAX in pyport.h.  Thanks Hallvard B Furuseth for the patch.

Include/pyport.h
Misc/NEWS

index 568199b85dd570bbddf60771857c67a3ffd94d96..62aa53ae21618aeb8f50e8a8923e45636ef09503 100644 (file)
@@ -62,15 +62,20 @@ Used in:  PY_LONG_LONG
 #define PY_LLONG_MAX LLONG_MAX
 #define PY_ULLONG_MAX ULLONG_MAX
 #elif defined(__LONG_LONG_MAX__)
-/* Otherwise, if GCC has a builtin define, use that. */
+/* Otherwise, if GCC has a builtin define, use that.  (Definition of
+ * PY_LLONG_MIN assumes two's complement with no trap representation.) */
 #define PY_LLONG_MAX __LONG_LONG_MAX__
-#define PY_LLONG_MIN (-PY_LLONG_MAX-1)
-#define PY_ULLONG_MAX (__LONG_LONG_MAX__*2ULL + 1ULL)
-#else
-/* Otherwise, rely on two's complement. */
-#define PY_ULLONG_MAX (~0ULL)
-#define PY_LLONG_MAX  ((long long)(PY_ULLONG_MAX>>1))
-#define PY_LLONG_MIN (-PY_LLONG_MAX-1)
+#define PY_LLONG_MIN (-PY_LLONG_MAX - 1)
+#define PY_ULLONG_MAX (PY_LLONG_MAX * Py_ULL(2) + 1)
+#elif defined(SIZEOF_LONG_LONG)
+/* Otherwise compute from SIZEOF_LONG_LONG, assuming two's complement, no
+   padding bits, and no trap representation.  Note: PY_ULLONG_MAX was
+   previously #defined as (~0ULL) here; but that'll give the wrong value in a
+   preprocessor expression on systems where long long != intmax_t. */
+#define PY_LLONG_MAX                                                    \
+    (1 + 2 * ((Py_LL(1) << (CHAR_BIT * SIZEOF_LONG_LONG - 2)) - 1))
+#define PY_LLONG_MIN (-PY_LLONG_MAX - 1)
+#define PY_ULLONG_MAX (PY_LLONG_MAX * Py_ULL(2) + 1)
 #endif /* LLONG_MAX */
 #endif
 #endif /* HAVE_LONG_LONG */
index d5a002b125855a405696241b805de312f34c79cf..917b7cd3b094169f40dccb8aee01763b5ec3f24f 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -45,6 +45,12 @@ Tests
 - Issue #8886: Use context managers throughout test_zipfile. Patch by
   Eric Carstensen.
 
+Build
+-----
+
+- Issue #10325: Fix two issues in the fallback definitions for PY_ULLONG_MAX and
+  PY_LLONG_MAX that made them unsuitable for use in preprocessor conditionals.
+
 
 What's New in Python 3.2 Alpha 4?
 =================================