]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix off-by-one error in long_repr.
authorGuido van Rossum <guido@python.org>
Tue, 28 May 1991 21:58:16 +0000 (21:58 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 28 May 1991 21:58:16 +0000 (21:58 +0000)
Implement long_pow.

Objects/longobject.c

index a2fccc51067202b231178c1c04fb56dad5a66d16..badc3df0713c5349001e1844fef0663f1bd677f3 100644 (file)
@@ -278,6 +278,7 @@ long_format(a, base)
                assert(p > q);
                do {
                } while ((*q++ = *p++) != '\0');
+               q--;
                resizestring((object **)&str, (int) (q - GETSTRINGVALUE(str)));
        }
        return str;
@@ -844,16 +845,60 @@ long_divmod(v, w)
 }
 
 static object *
-long_pow(v, w)
-       longobject *v;
-       register object *w;
+long_pow(a, w)
+       longobject *a;
+       object *w;
 {
+       register longobject *b;
+       longobject *z;
+       int size_b, i;
+       
        if (!is_longobject(w)) {
                err_badarg();
                return NULL;
        }
-       err_setstr(SystemError, "long power not implemented");
-       return NULL;
+       
+       b = (longobject *)w;
+       size_b = b->ob_size;
+       if (size_b < 0) {
+               err_setstr(RuntimeError, "long integer to the negative power");
+               return NULL;
+       }
+
+       z = (longobject *)newlongobject(1L);
+       
+       INCREF(a);
+       for (i = 0; i < size_b; ++i) {
+               digit bi = b->ob_digit[i];
+               int j;
+               
+               for (j = 0; j < SHIFT; ++j) {
+                       longobject *temp;
+                       
+                       if (bi & 1) {
+                               temp = (longobject *)long_mul(z, (object *)a);
+                               DECREF(z);
+                               z = temp;
+                               if (z == NULL)
+                                       break;
+                       }
+                       bi >>= 1;
+                       if (bi == 0 && i+1 == size_b)
+                               break;
+                       temp = (longobject *)long_mul(a, (object *)a);
+                       DECREF(a);
+                       a = temp;
+                       if (a == NULL) {
+                               DECREF(z);
+                               z = NULL;
+                               break;
+                       }
+               }
+               if (a == NULL)
+                       break;
+       }
+       XDECREF(a);
+       return (object *)z;
 }
 
 static object *