mirror of
https://github.com/python/cpython
synced 2026-09-29 10:35:30 +03:00
New restriction on pow(x, y, z): If z is not None, x and y must be of
integer types, and y must be >= 0. See discussion at http://sf.net/tracker/index.php?func=detail&aid=457066&group_id=5470&atid=105470
This commit is contained in:
parent
5d2b77cf31
commit
32f453eaa4
9 changed files with 79 additions and 49 deletions
|
|
@ -492,11 +492,13 @@ static PyObject *
|
|||
float_pow(PyObject *v, PyObject *w, PyObject *z)
|
||||
{
|
||||
double iv, iw, ix;
|
||||
/* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
|
||||
* The z parameter is really only going to be useful for integers and
|
||||
* long integers. Maybe something clever with logarithms could be done.
|
||||
* [AMK]
|
||||
*/
|
||||
|
||||
if ((PyObject *)z != Py_None) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"3rd argument to floating pow() must be None");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CONVERT_TO_DOUBLE(v, iv);
|
||||
CONVERT_TO_DOUBLE(w, iw);
|
||||
|
||||
|
|
@ -538,16 +540,6 @@ float_pow(PyObject *v, PyObject *w, PyObject *z)
|
|||
PyErr_SetFromErrno(PyExc_OverflowError);
|
||||
return NULL;
|
||||
}
|
||||
if ((PyObject *)z != Py_None) {
|
||||
double iz;
|
||||
CONVERT_TO_DOUBLE(z, iz);
|
||||
PyFPE_START_PROTECT("pow", return 0)
|
||||
ix = fmod(ix, iz); /* XXX To Be Rewritten */
|
||||
if (ix != 0 && ((iv < 0 && iz > 0) || (iv > 0 && iz < 0) )) {
|
||||
ix += iz;
|
||||
}
|
||||
PyFPE_END_PROTECT(ix)
|
||||
}
|
||||
return PyFloat_FromDouble(ix);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -575,6 +575,11 @@ int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
|
|||
CONVERT_TO_LONG(v, iv);
|
||||
CONVERT_TO_LONG(w, iw);
|
||||
if (iw < 0) {
|
||||
if ((PyObject *)z != Py_None) {
|
||||
PyErr_SetString(PyExc_TypeError, "integer pow() arg "
|
||||
"3 must not be specified when arg 2 is < 0");
|
||||
return NULL;
|
||||
}
|
||||
/* Return a float. This works because we know that
|
||||
this calls float_pow() which converts its
|
||||
arguments to double. */
|
||||
|
|
|
|||
|
|
@ -1598,12 +1598,17 @@ long_pow(PyObject *v, PyObject *w, PyObject *x)
|
|||
|
||||
size_b = b->ob_size;
|
||||
if (size_b < 0) {
|
||||
/* Return a float. This works because we know that
|
||||
this calls float_pow() which converts its
|
||||
arguments to double. */
|
||||
Py_DECREF(a);
|
||||
Py_DECREF(b);
|
||||
Py_DECREF(c);
|
||||
if (x != Py_None) {
|
||||
PyErr_SetString(PyExc_TypeError, "integer pow() arg "
|
||||
"3 must not be specified when arg 2 is < 0");
|
||||
return NULL;
|
||||
}
|
||||
/* Return a float. This works because we know that
|
||||
this calls float_pow() which converts its
|
||||
arguments to double. */
|
||||
return PyFloat_Type.tp_as_number->nb_power(v, w, x);
|
||||
}
|
||||
z = (PyLongObject *)PyLong_FromLong(1L);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue