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

pow(x,y,z) == pow(x,y)%z, but without incurring overflow
This commit is contained in:
Guido van Rossum 1994-08-29 12:52:37 +00:00
parent 2d9518585c
commit df05ac6dfb
1 changed files with 18 additions and 5 deletions

View File

@ -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;
} }