summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2009-03-20 23:16:14 (GMT)
committerMark Dickinson <dickinsm@gmail.com>2009-03-20 23:16:14 (GMT)
commitf35f8044e4c2679d4d701fb464be7541a9f33e6d (patch)
tree710c4b82aa21a753bc5a91c8ddcf0b11fd33c0f5 /Include
parent2cef1a540984985913d5b6d7ffbe760db4889737 (diff)
downloadcpython-f35f8044e4c2679d4d701fb464be7541a9f33e6d.zip
cpython-f35f8044e4c2679d4d701fb464be7541a9f33e6d.tar.gz
cpython-f35f8044e4c2679d4d701fb464be7541a9f33e6d.tar.bz2
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.
Diffstat (limited to 'Include')
-rw-r--r--Include/pyport.h18
1 files changed, 11 insertions, 7 deletions
diff --git a/Include/pyport.h b/Include/pyport.h
index 53352f1..f44c43e 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -378,19 +378,23 @@ extern "C" {
* 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