Different shift implementation.

This commit is contained in:
Guido van Rossum 1992-01-14 18:33:22 +00:00
parent a38c0ff7cd
commit f3b351f140
1 changed files with 34 additions and 2 deletions

View File

@ -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 *