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:
parent
2d9518585c
commit
df05ac6dfb
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue