diff options
author | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2011-04-06 00:07:38 (GMT) |
---|---|---|
committer | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2011-04-06 00:07:38 (GMT) |
commit | b6f5ec737008f5c739ba3c667e1ae01b8625488b (patch) | |
tree | c42061761133138a6e7b2a0d00d5eb50a3ab52c3 /Modules | |
parent | 04026cf56c32e89e4af4da6ac6068c6e5dd3c098 (diff) | |
download | cpython-b6f5ec737008f5c739ba3c667e1ae01b8625488b.zip cpython-b6f5ec737008f5c739ba3c667e1ae01b8625488b.tar.gz cpython-b6f5ec737008f5c739ba3c667e1ae01b8625488b.tar.bz2 |
Issue #11576: Fixed timedelta subtraction glitch on big timedelta values
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_datetimemodule.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 6195940..6ee5317 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -1801,13 +1801,14 @@ delta_subtract(PyObject *left, PyObject *right) if (PyDelta_Check(left) && PyDelta_Check(right)) { /* delta - delta */ - PyObject *minus_right = PyNumber_Negative(right); - if (minus_right) { - result = delta_add(left, minus_right); - Py_DECREF(minus_right); - } - else - result = NULL; + /* The C-level additions can't overflow because of the + * invariant bounds. + */ + int days = GET_TD_DAYS(left) - GET_TD_DAYS(right); + int seconds = GET_TD_SECONDS(left) - GET_TD_SECONDS(right); + int microseconds = GET_TD_MICROSECONDS(left) - + GET_TD_MICROSECONDS(right); + result = new_delta(days, seconds, microseconds, 1); } if (result == Py_NotImplemented) |