]> granicus.if.org Git - python/commitdiff
Merge 3.5.
authorStefan Krah <skrah@bytereef.org>
Sun, 17 Jul 2016 12:12:59 +0000 (14:12 +0200)
committerStefan Krah <skrah@bytereef.org>
Sun, 17 Jul 2016 12:12:59 +0000 (14:12 +0200)
1  2 
Lib/test/test_decimal.py
Modules/_decimal/_decimal.c

Simple merge
index dd33f973e46790f9cdb4c207d3debab3e034a0b1,e15941aec8e175798538bbad948b422ae66067a0..3ba8e35ce953b2b4913c650dff044eb996b857b4
@@@ -3385,106 -3394,6 +3393,105 @@@ dec_as_long(PyObject *dec, PyObject *co
      return (PyObject *) pylong;
  }
  
-     PyNumberMethods *long_methods = PyLong_Type.tp_as_number;
 +/* Convert a Decimal to its exact integer ratio representation. */
 +static PyObject *
 +dec_as_integer_ratio(PyObject *self, PyObject *args UNUSED)
 +{
 +    PyObject *numerator = NULL;
 +    PyObject *denominator = NULL;
 +    PyObject *exponent = NULL;
 +    PyObject *result = NULL;
 +    PyObject *tmp;
 +    mpd_ssize_t exp;
 +    PyObject *context;
 +    uint32_t status = 0;
-     Py_SETREF(exponent, long_methods->nb_power(tmp, exponent, Py_None));
 +
 +    if (mpd_isspecial(MPD(self))) {
 +        if (mpd_isnan(MPD(self))) {
 +            PyErr_SetString(PyExc_ValueError,
 +                "cannot convert NaN to integer ratio");
 +        }
 +        else {
 +            PyErr_SetString(PyExc_OverflowError,
 +                "cannot convert Infinity to integer ratio");
 +        }
 +        return NULL;
 +    }
 +
 +    CURRENT_CONTEXT(context);
 +
 +    tmp = dec_alloc();
 +    if (tmp == NULL) {
 +        return NULL;
 +    }
 +
 +    if (!mpd_qcopy(MPD(tmp), MPD(self), &status)) {
 +        Py_DECREF(tmp);
 +        PyErr_NoMemory();
 +        return NULL;
 +    }
 +
 +    exp = mpd_iszero(MPD(tmp)) ? 0 : MPD(tmp)->exp;
 +    MPD(tmp)->exp = 0;
 +
 +    /* context and rounding are unused here: the conversion is exact */
 +    numerator = dec_as_long(tmp, context, MPD_ROUND_FLOOR);
 +    Py_DECREF(tmp);
 +    if (numerator == NULL) {
 +        goto error;
 +    }
 +
 +    exponent = PyLong_FromSsize_t(exp < 0 ? -exp : exp);
 +    if (exponent == NULL) {
 +        goto error;
 +    }
 +
 +    tmp = PyLong_FromLong(10);
 +    if (tmp == NULL) {
 +        goto error;
 +    }
 +
-         Py_SETREF(numerator, long_methods->nb_multiply(numerator, exponent));
++    Py_SETREF(exponent, _py_long_power(tmp, exponent, Py_None));
 +    Py_DECREF(tmp);
 +    if (exponent == NULL) {
 +        goto error;
 +    }
 +
 +    if (exp >= 0) {
-         Py_SETREF(numerator, long_methods->nb_floor_divide(numerator, tmp));
-         Py_SETREF(denominator, long_methods->nb_floor_divide(denominator, tmp));
++        Py_SETREF(numerator, _py_long_multiply(numerator, exponent));
 +        if (numerator == NULL) {
 +            goto error;
 +        }
 +        denominator = PyLong_FromLong(1);
 +        if (denominator == NULL) {
 +            goto error;
 +        }
 +    }
 +    else {
 +        denominator = exponent;
 +        exponent = NULL;
 +        tmp = _PyLong_GCD(numerator, denominator);
 +        if (tmp == NULL) {
 +            goto error;
 +        }
++        Py_SETREF(numerator, _py_long_floor_divide(numerator, tmp));
++        Py_SETREF(denominator, _py_long_floor_divide(denominator, tmp));
 +        Py_DECREF(tmp);
 +        if (numerator == NULL || denominator == NULL) {
 +            goto error;
 +        }
 +    }
 +
 +    result = PyTuple_Pack(2, numerator, denominator);
 +
 +
 +error:
 +    Py_XDECREF(exponent);
 +    Py_XDECREF(denominator);
 +    Py_XDECREF(numerator);
 +    return result;
 +}
 +
  static PyObject *
  PyDec_ToIntegralValue(PyObject *dec, PyObject *args, PyObject *kwds)
  {