From f3b351f140e9365edd32fbde866219dbd98f97cc Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 14 Jan 1992 18:33:22 +0000 Subject: [PATCH] Different shift implementation. --- Objects/intobject.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/Objects/intobject.c b/Objects/intobject.c index 181cb4f4211..edffacefe48 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -375,7 +375,19 @@ int_lshift(v, w) } a = v->ob_ival; b = ((intobject *)w) -> ob_ival; - return newintobject((unsigned long)a << b); + if (b < 0) { + err_setstr(ValueError, "negative shift count"); + return NULL; + } + if (a == 0 || b == 0) { + INCREF(v); + return (object *) v; + } + if (b >= 32) { + return newintobject(0L); + } + a = (unsigned long)a << b; + return newintobject(a); } static object * @@ -390,7 +402,27 @@ int_rshift(v, w) } a = v->ob_ival; b = ((intobject *)w) -> ob_ival; - return newintobject((unsigned long)a >> b); + if (b < 0) { + err_setstr(ValueError, "negative shift count"); + return NULL; + } + if (a == 0 || b == 0) { + INCREF(v); + return (object *) v; + } + if (b >= 32) { + if (a < 0) + a = -1; + else + a = 0; + } + else { + if (a < 0) + a = ~( ~(unsigned long)a >> b ); + else + a = (unsigned long)a >> b; + } + return newintobject(a); } static object *