Kaydet (Commit) 472c04f1 authored tarafından Guido van Rossum's avatar Guido van Rossum

Fix newlongobject so it will work for 64-bit as well as 32-bit hardware

(although for 32-bit hardware it's a bit slower than it was).

Make gcc -Wall happy.
üst a0a69b8b
...@@ -90,17 +90,20 @@ object * ...@@ -90,17 +90,20 @@ object *
newlongobject(ival) newlongobject(ival)
long ival; long ival;
{ {
/* Assume a C long fits in at most 3 'digits' */ /* Assume a C long fits in at most 5 'digits' */
/* XXX On 64 bit machines this isn't true!!! */ /* Works on both 32- and 64-bit machines */
longobject *v = alloclongobject(3); longobject *v = alloclongobject(5);
if (v != NULL) { if (v != NULL) {
unsigned long t = ival;
int i;
if (ival < 0) { if (ival < 0) {
ival = -ival; t = -ival;
v->ob_size = -(v->ob_size); v->ob_size = -(v->ob_size);
}
for (i = 0; i < 5; i++) {
v->ob_digit[i] = t & MASK;
t >>= SHIFT;
} }
v->ob_digit[0] = ival & MASK;
v->ob_digit[1] = (ival >> SHIFT) & MASK;
v->ob_digit[2] = ((unsigned long)ival >> (2*SHIFT)) & MASK;
v = long_normalize(v); v = long_normalize(v);
} }
return (object *)v; return (object *)v;
...@@ -384,7 +387,7 @@ long_escan(str, pend, base) ...@@ -384,7 +387,7 @@ long_escan(str, pend, base)
int sign = 1; int sign = 1;
longobject *z; longobject *z;
if (base != 0 && base < 2 || base > 36) { if ((base != 0 && base < 2) || base > 36) {
err_setstr(ValueError, "invalid base for long literal"); err_setstr(ValueError, "invalid base for long literal");
return NULL; return NULL;
} }
...@@ -453,8 +456,8 @@ long_divrem(a, b, pdiv, prem) ...@@ -453,8 +456,8 @@ long_divrem(a, b, pdiv, prem)
return -1; return -1;
} }
if (size_a < size_b || if (size_a < size_b ||
size_a == size_b && (size_a == size_b &&
a->ob_digit[size_a-1] < b->ob_digit[size_b-1]) { a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
/* |a| < |b|. */ /* |a| < |b|. */
*pdiv = alloclongobject(0); *pdiv = alloclongobject(0);
INCREF(a); INCREF(a);
...@@ -889,8 +892,8 @@ l_divmod(v, w, pdiv, pmod) ...@@ -889,8 +892,8 @@ l_divmod(v, w, pdiv, pmod)
if (long_divrem(v, w, &div, &mod) < 0) if (long_divrem(v, w, &div, &mod) < 0)
return -1; return -1;
if (mod->ob_size < 0 && w->ob_size > 0 || if ((mod->ob_size < 0 && w->ob_size > 0) ||
mod->ob_size > 0 && w->ob_size < 0) { (mod->ob_size > 0 && w->ob_size < 0)) {
longobject *temp; longobject *temp;
longobject *one; longobject *one;
temp = (longobject *) long_add(mod, w); temp = (longobject *) long_add(mod, w);
......
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