diff -r c964820dfbc0 Objects/longobject.c --- a/Objects/longobject.c Fri Sep 26 12:43:40 2014 +0200 +++ b/Objects/longobject.c Fri Sep 26 12:53:31 2014 +0200 @@ -2941,10 +2941,23 @@ 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) { + Py_INCREF(b); + return (PyObject*)b; + } + if (b_size == 0) { + Py_INCREF(a); + return (PyObject*)a; + } + + if (a_size == 1 && b_size == 1) { PyObject *result = PyLong_FromLong(MEDIUM_VALUE(a) + MEDIUM_VALUE(b)); return result; @@ -2971,10 +2984,22 @@ 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) { + Py_INCREF(a); + return (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;