From db12ef7e8ac6a8a6f8b4830701558b9abfd108fc Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 4 Oct 2017 20:30:09 +0300 Subject: [PATCH] Refactor multiplication and division of timedelta and float. (#3656) Implementations of these operations are virtually identical. --- Modules/_datetimemodule.c | 51 ++++++++------------------------------- 1 file changed, 10 insertions(+), 41 deletions(-) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 3dd7f827509..fc2cdba70c5 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -1677,8 +1677,9 @@ get_float_as_integer_ratio(PyObject *floatobj) return ratio; } +/* op is 0 for multiplication, 1 for division */ static PyObject * -multiply_float_timedelta(PyObject *floatobj, PyDateTime_Delta *delta) +multiply_truedivide_timedelta_float(PyDateTime_Delta *delta, PyObject *floatobj, int op) { PyObject *result = NULL; PyObject *pyus_in = NULL, *temp, *pyus_out; @@ -1691,12 +1692,12 @@ multiply_float_timedelta(PyObject *floatobj, PyDateTime_Delta *delta) if (ratio == NULL) { goto error; } - temp = PyNumber_Multiply(pyus_in, PyTuple_GET_ITEM(ratio, 0)); + temp = PyNumber_Multiply(pyus_in, PyTuple_GET_ITEM(ratio, op)); Py_DECREF(pyus_in); pyus_in = NULL; if (temp == NULL) goto error; - pyus_out = divide_nearest(temp, PyTuple_GET_ITEM(ratio, 1)); + pyus_out = divide_nearest(temp, PyTuple_GET_ITEM(ratio, !op)); Py_DECREF(temp); if (pyus_out == NULL) goto error; @@ -1776,38 +1777,6 @@ truedivide_timedelta_timedelta(PyDateTime_Delta *left, PyDateTime_Delta *right) return result; } -static PyObject * -truedivide_timedelta_float(PyDateTime_Delta *delta, PyObject *f) -{ - PyObject *result = NULL; - PyObject *pyus_in = NULL, *temp, *pyus_out; - PyObject *ratio = NULL; - - pyus_in = delta_to_microseconds(delta); - if (pyus_in == NULL) - return NULL; - ratio = get_float_as_integer_ratio(f); - if (ratio == NULL) { - goto error; - } - temp = PyNumber_Multiply(pyus_in, PyTuple_GET_ITEM(ratio, 1)); - Py_DECREF(pyus_in); - pyus_in = NULL; - if (temp == NULL) - goto error; - pyus_out = divide_nearest(temp, PyTuple_GET_ITEM(ratio, 0)); - Py_DECREF(temp); - if (pyus_out == NULL) - goto error; - result = microseconds_to_delta(pyus_out); - Py_DECREF(pyus_out); - error: - Py_XDECREF(pyus_in); - Py_XDECREF(ratio); - - return result; -} - static PyObject * truedivide_timedelta_int(PyDateTime_Delta *delta, PyObject *i) { @@ -1958,15 +1927,15 @@ delta_multiply(PyObject *left, PyObject *right) result = multiply_int_timedelta(right, (PyDateTime_Delta *) left); else if (PyFloat_Check(right)) - result = multiply_float_timedelta(right, - (PyDateTime_Delta *) left); + result = multiply_truedivide_timedelta_float( + (PyDateTime_Delta *) left, right, 0); } else if (PyLong_Check(left)) result = multiply_int_timedelta(left, (PyDateTime_Delta *) right); else if (PyFloat_Check(left)) - result = multiply_float_timedelta(left, - (PyDateTime_Delta *) right); + result = multiply_truedivide_timedelta_float( + (PyDateTime_Delta *) right, left, 0); if (result == Py_NotImplemented) Py_INCREF(result); @@ -2006,8 +1975,8 @@ delta_truedivide(PyObject *left, PyObject *right) (PyDateTime_Delta *)left, (PyDateTime_Delta *)right); else if (PyFloat_Check(right)) - result = truedivide_timedelta_float( - (PyDateTime_Delta *)left, right); + result = multiply_truedivide_timedelta_float( + (PyDateTime_Delta *)left, right, 1); else if (PyLong_Check(right)) result = truedivide_timedelta_int( (PyDateTime_Delta *)left, right);