# HG changeset patch # Parent c964820dfbc09a15f7cfebfd8a44b497d547f5ab diff -r c964820dfbc0 -r d6f791d63bcb Objects/longobject.c --- a/Objects/longobject.c Fri Sep 26 12:43:40 2014 +0200 +++ b/Objects/longobject.c Fri Sep 26 13:35:11 2014 +0200 @@ -2941,10 +2941,21 @@ long_add(PyLongObject *a, PyLongObject *b) { PyLongObject *z; + Py_ssize_t a_size, b_size; CHECK_BINOP(a, b); - if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) { + a_size = Py_ABS(Py_SIZE(a)); + b_size = Py_ABS(Py_SIZE(b)); + + if (a_size == 0) { + return long_long((PyObject*)b); + } + if (b_size == 0) { + return long_long((PyObject*)a); + } + + if (a_size == 1 && b_size == 1) { PyObject *result = PyLong_FromLong(MEDIUM_VALUE(a) + MEDIUM_VALUE(b)); return result; @@ -2971,10 +2982,21 @@ long_sub(PyLongObject *a, PyLongObject *b) { PyLongObject *z; + Py_ssize_t a_size, b_size; CHECK_BINOP(a, b); - if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) { + a_size = Py_ABS(Py_SIZE(a)); + b_size = Py_ABS(Py_SIZE(b)); + + if (b_size == 0) { + return long_long((PyObject*)a); + } + if (a_size == 0) { + return long_neg(b); + } + + if (a_size == 1 && b_size == 1) { PyObject* r; r = PyLong_FromLong(MEDIUM_VALUE(a)-MEDIUM_VALUE(b)); return r;