]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Python/bltinmodule.c: mods by Andrew Kuchling to implement
authorGuido van Rossum <guido@python.org>
Mon, 29 Aug 1994 12:52:37 +0000 (12:52 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 29 Aug 1994 12:52:37 +0000 (12:52 +0000)
        pow(x,y,z) == pow(x,y)%z, but without incurring overflow

Python/bltinmodule.c

index d8e0d2692324cc38cbf8c6fcbacb879985f53531..7e872ade63c279bf06d05d2c9769d63d47310d2b 100644 (file)
@@ -859,19 +859,32 @@ builtin_pow(self, args)
        object *self;
        object *args;
 {
-       object *v, *w, *x;
-       if (!getargs(args, "(OO)", &v, &w))
-               return NULL;
+       object *v, *w, *z, *x;
+       z = None;
+       if (!getargs(args, "(OO)", &v, &w)) {
+                err_clear();
+                if (!getargs(args, "(OOO)", &v, &w, &z)) {
+                       return NULL;
+               }
+       }
        if (v->ob_type->tp_as_number == NULL ||
-                               w->ob_type->tp_as_number == NULL) {
+           (z!=None && z->ob_type->tp_as_number == NULL) ||
+           w->ob_type->tp_as_number == NULL) {
                err_setstr(TypeError, "pow() requires numeric arguments");
                return NULL;
        }
        if (coerce(&v, &w) != 0)
                return NULL;
-       x = (*v->ob_type->tp_as_number->nb_power)(v, w);
+       if (z!=None) {
+               if (coerce(&w, &z) != 0)
+                       return NULL;
+               if (coerce(&v, &z) != 0)
+                       return NULL;
+       }
+       x = (*v->ob_type->tp_as_number->nb_power)(v, w, z);
        DECREF(v);
        DECREF(w);
+       if (z!=None) {DECREF(w); DECREF(v); DECREF(z); DECREF(z);}
        return x;
 }