Commit bc4c8c3a authored by Guido van Rossum's avatar Guido van Rossum

Different shift implementation.

parent 4ba19274
......@@ -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 *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment