mirror of
https://github.com/python/cpython.git
synced 2025-10-18 04:38:07 +00:00
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.
This commit is contained in:
parent
a0a69b8b42
commit
472c04f18f
1 changed files with 15 additions and 12 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
v->ob_digit[0] = ival & MASK;
|
for (i = 0; i < 5; i++) {
|
||||||
v->ob_digit[1] = (ival >> SHIFT) & MASK;
|
v->ob_digit[i] = t & MASK;
|
||||||
v->ob_digit[2] = ((unsigned long)ival >> (2*SHIFT)) & MASK;
|
t >>= SHIFT;
|
||||||
|
}
|
||||||
v = long_normalize(v);
|
v = long_normalize(v);
|
||||||
}
|
}
|
||||||
return (object *)v;
|
return (object *)v;
|
||||||
|
@ -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)
|
||||||
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)
|
||||||
|
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue