[Python-checkins] r70489 - python/trunk/Include/pyport.h

mark.dickinson python-checkins at python.org
Sat Mar 21 00:16:15 CET 2009


Author: mark.dickinson
Date: Sat Mar 21 00:16:14 2009
New Revision: 70489

Log:
Rewrite Py_ARITHMETIC_RIGHT_SHIFT so that it's valid for all signed
integer types T, not just those for which "unsigned T" is legal.



Modified:
   python/trunk/Include/pyport.h

Modified: python/trunk/Include/pyport.h
==============================================================================
--- python/trunk/Include/pyport.h	(original)
+++ python/trunk/Include/pyport.h	Sat Mar 21 00:16:14 2009
@@ -378,19 +378,23 @@
  * C doesn't define whether a right-shift of a signed integer sign-extends
  * or zero-fills.  Here a macro to force sign extension:
  * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J)
- *    Return I >> J, forcing sign extension.
+ *    Return I >> J, forcing sign extension.  Arithmetically, return the
+ *    floor of I/2**J.
  * Requirements:
- *    I is of basic signed type TYPE (char, short, int, long, or long long).
- *    TYPE is one of char, short, int, long, or long long, although long long
- *    must not be used except on platforms that support it.
- *    J is an integer >= 0 and strictly less than the number of bits in TYPE
- *    (because C doesn't define what happens for J outside that range either).
+ *    I should have signed integer type.  In the terminology of C99, this can
+ *    be either one of the five standard signed integer types (signed char,
+ *    short, int, long, long long) or an extended signed integer type.
+ *    J is an integer >= 0 and strictly less than the number of bits in the
+ *    type of I (because C doesn't define what happens for J outside that
+ *    range either).
+ *    TYPE used to specify the type of I, but is now ignored.  It's been left
+ *    in for backwards compatibility with versions <= 2.6 or 3.0.
  * Caution:
  *    I may be evaluated more than once.
  */
 #ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS
 #define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \
-	((I) < 0 ? ~((~(unsigned TYPE)(I)) >> (J)) : (I) >> (J))
+	((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J))
 #else
 #define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J))
 #endif


More information about the Python-checkins mailing list