Make use of PyLong_AsLongAndOverflow in math_ldexp.

This commit is contained in:
Mark Dickinson 2010-01-03 12:03:03 +00:00
parent 722a8a95b7
commit f132c16199
1 changed files with 7 additions and 20 deletions

View File

@ -1175,31 +1175,18 @@ math_ldexp(PyObject *self, PyObject *args)
double x, r;
PyObject *oexp;
long exp;
int overflow;
if (! PyArg_ParseTuple(args, "dO:ldexp", &x, &oexp))
return NULL;
if (PyLong_Check(oexp)) {
if (PyLong_Check(oexp) || PyInt_Check(oexp)) {
/* on overflow, replace exponent with either LONG_MAX
or LONG_MIN, depending on the sign. */
exp = PyLong_AsLong(oexp);
if (exp == -1 && PyErr_Occurred()) {
if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
if (Py_SIZE(oexp) < 0) {
exp = LONG_MIN;
}
else {
exp = LONG_MAX;
}
PyErr_Clear();
}
else {
/* propagate any unexpected exception */
exp = PyLong_AsLongAndOverflow(oexp, &overflow);
if (exp == -1 && PyErr_Occurred())
return NULL;
}
}
}
else if (PyInt_Check(oexp)) {
exp = PyInt_AS_LONG(oexp);
if (overflow)
exp = overflow < 0 ? LONG_MIN : LONG_MAX;
}
else {
PyErr_SetString(PyExc_TypeError,