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

Python/bltinmodule.c: mods by Andrew Kuchling to implement

        pow(x,y,z) == pow(x,y)%z, but without incurring overflow
parent 2d951858
...@@ -859,19 +859,32 @@ builtin_pow(self, args) ...@@ -859,19 +859,32 @@ builtin_pow(self, args)
object *self; object *self;
object *args; object *args;
{ {
object *v, *w, *x; object *v, *w, *z, *x;
if (!getargs(args, "(OO)", &v, &w)) z = None;
return NULL; 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 || 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"); err_setstr(TypeError, "pow() requires numeric arguments");
return NULL; return NULL;
} }
if (coerce(&v, &w) != 0) if (coerce(&v, &w) != 0)
return NULL; 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(v);
DECREF(w); DECREF(w);
if (z!=None) {DECREF(w); DECREF(v); DECREF(z); DECREF(z);}
return x; return x;
} }
......
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