diff -r 87dfadd61e0d Objects/longobject.c --- a/Objects/longobject.c Thu Feb 04 01:24:56 2016 -0500 +++ b/Objects/longobject.c Thu Feb 04 12:21:54 2016 +0200 @@ -3000,9 +3000,11 @@ x_sub(PyLongObject *a, PyLongObject *b) return long_normalize(z); } -static PyObject * -long_add(PyLongObject *a, PyLongObject *b) +PyObject * +_PyLong_Add(PyObject *left, PyObject *right) { + PyLongObject *a = (PyLongObject *)left; + PyLongObject *b = (PyLongObject *)right; PyLongObject *z; CHECK_BINOP(a, b); @@ -3030,9 +3032,11 @@ long_add(PyLongObject *a, PyLongObject * return (PyObject *)z; } -static PyObject * -long_sub(PyLongObject *a, PyLongObject *b) +PyObject * +_PyLong_Subtract(PyObject *left, PyObject *right) { + PyLongObject *a = (PyLongObject *)left; + PyLongObject *b = (PyLongObject *)right; PyLongObject *z; CHECK_BINOP(a, b); @@ -3462,9 +3466,11 @@ k_lopsided_mul(PyLongObject *a, PyLongOb return NULL; } -static PyObject * -long_mul(PyLongObject *a, PyLongObject *b) +PyObject * +_PyLong_Multiply(PyObject *left, PyObject *right) { + PyLongObject *a = (PyLongObject *)left; + PyLongObject *b = (PyLongObject *)right; PyLongObject *z; CHECK_BINOP(a, b); @@ -3526,18 +3532,18 @@ l_divmod(PyLongObject *v, PyLongObject * return -1; if ((Py_SIZE(mod) < 0 && Py_SIZE(w) > 0) || (Py_SIZE(mod) > 0 && Py_SIZE(w) < 0)) { - PyLongObject *temp; - PyLongObject *one; - temp = (PyLongObject *) long_add(mod, w); + PyObject *temp; + PyObject *one; + temp = _PyLong_Add((PyObject *)mod, (PyObject *)w); Py_DECREF(mod); - mod = temp; + mod = (PyLongObject *)temp; if (mod == NULL) { Py_DECREF(div); return -1; } - one = (PyLongObject *) PyLong_FromLong(1L); + one = PyLong_FromLong(1L); if (one == NULL || - (temp = (PyLongObject *) long_sub(div, one)) == NULL) { + (temp = _PyLong_Subtract((PyObject *)div, one)) == NULL) { Py_DECREF(mod); Py_DECREF(div); Py_XDECREF(one); @@ -3545,7 +3551,7 @@ l_divmod(PyLongObject *v, PyLongObject * } Py_DECREF(one); Py_DECREF(div); - div = temp; + div = (PyLongObject *)temp; } if (pdiv != NULL) *pdiv = div; @@ -3993,7 +3999,7 @@ long_pow(PyObject *v, PyObject *w, PyObj result = X*Y % c. If c is NULL, skip the mod. */ #define MULT(X, Y, result) \ do { \ - temp = (PyLongObject *)long_mul(X, Y); \ + temp = (PyLongObject *) _PyLong_Multiply((PyObject *)X, (PyObject *)Y); \ if (temp == NULL) \ goto Error; \ Py_XDECREF(result); \ @@ -4036,7 +4042,7 @@ long_pow(PyObject *v, PyObject *w, PyObj } if (negativeOutput && (Py_SIZE(z) != 0)) { - temp = (PyLongObject *)long_sub(z, c); + temp = (PyLongObject *)_PyLong_Subtract((PyObject *)z, (PyObject *)c); if (temp == NULL) goto Error; Py_DECREF(z); @@ -4065,14 +4071,14 @@ long_invert(PyLongObject *v) { /* Implement ~x as -(x+1) */ PyLongObject *x; - PyLongObject *w; + PyObject *one; if (Py_ABS(Py_SIZE(v)) <=1) return PyLong_FromLong(-(MEDIUM_VALUE(v)+1)); - w = (PyLongObject *)PyLong_FromLong(1L); - if (w == NULL) + one = PyLong_FromLong(1L); + if (one == NULL) return NULL; - x = (PyLongObject *) long_add(v, w); - Py_DECREF(w); + x = (PyLongObject *) _PyLong_Add((PyObject *)v, one); + Py_DECREF(one); if (x == NULL) return NULL; Py_SIZE(x) = -(Py_SIZE(x)); @@ -4792,18 +4798,18 @@ PyObject * if ((Py_SIZE(b) < 0 ? cmp < 0 : cmp > 0) || (cmp == 0 && quo_is_odd)) { /* fix up quotient */ if (quo_is_neg) - temp = long_sub(quo, (PyLongObject *)one); + temp = _PyLong_Subtract((PyObject *)quo, one); else - temp = long_add(quo, (PyLongObject *)one); + temp = _PyLong_Add((PyObject *)quo, one); Py_DECREF(quo); quo = (PyLongObject *)temp; if (quo == NULL) goto error; /* and remainder */ if (quo_is_neg) - temp = long_add(rem, (PyLongObject *)b); + temp = _PyLong_Add((PyObject *)rem, b); else - temp = long_sub(rem, (PyLongObject *)b); + temp = _PyLong_Subtract((PyObject *)rem, b); Py_DECREF(rem); rem = (PyLongObject *)temp; if (rem == NULL) @@ -4887,8 +4893,7 @@ long_round(PyObject *self, PyObject *arg if (result == NULL) return NULL; - temp = long_sub((PyLongObject *)self, - (PyLongObject *)PyTuple_GET_ITEM(result, 1)); + temp = _PyLong_Subtract(self, PyTuple_GET_ITEM(result, 1)); Py_DECREF(result); result = temp; @@ -4907,7 +4912,7 @@ long_sizeof(PyLongObject *v) static PyObject * long_bit_length(PyLongObject *v) { - PyLongObject *result, *x, *y; + PyObject *result, *x, *y; Py_ssize_t ndigits, msd_bits = 0; digit msd; @@ -4929,30 +4934,30 @@ long_bit_length(PyLongObject *v) return PyLong_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits); /* expression above may overflow; use Python integers instead */ - result = (PyLongObject *)PyLong_FromSsize_t(ndigits - 1); + result = PyLong_FromSsize_t(ndigits - 1); if (result == NULL) return NULL; - x = (PyLongObject *)PyLong_FromLong(PyLong_SHIFT); + x = PyLong_FromLong(PyLong_SHIFT); if (x == NULL) goto error; - y = (PyLongObject *)long_mul(result, x); + y = _PyLong_Multiply(result, x); Py_DECREF(x); if (y == NULL) goto error; Py_DECREF(result); result = y; - x = (PyLongObject *)PyLong_FromLong((long)msd_bits); + x = PyLong_FromLong((long)msd_bits); if (x == NULL) goto error; - y = (PyLongObject *)long_add(result, x); + y = _PyLong_Add(result, x); Py_DECREF(x); if (y == NULL) goto error; Py_DECREF(result); result = y; - return (PyObject *)result; + return result; error: Py_DECREF(result); @@ -5221,9 +5226,9 @@ Base 0 means to interpret the base from 4"); static PyNumberMethods long_as_number = { - (binaryfunc)long_add, /*nb_add*/ - (binaryfunc)long_sub, /*nb_subtract*/ - (binaryfunc)long_mul, /*nb_multiply*/ + _PyLong_Add, /*nb_add*/ + _PyLong_Subtract, /*nb_subtract*/ + _PyLong_Multiply, /*nb_multiply*/ long_mod, /*nb_remainder*/ long_divmod, /*nb_divmod*/ long_pow, /*nb_power*/ diff -r 87dfadd61e0d Python/ceval.c --- a/Python/ceval.c Thu Feb 04 01:24:56 2016 -0500 +++ b/Python/ceval.c Thu Feb 04 12:21:54 2016 +0200 @@ -147,6 +147,10 @@ static PyObject * unicode_concatenate(Py PyFrameObject *, unsigned char *); static PyObject * special_lookup(PyObject *, _Py_Identifier *); +PyObject * _PyLong_Add(PyObject *a, PyObject *b); +PyObject * _PyLong_Subtract(PyObject *a, PyObject *b); +PyObject * _PyLong_Multiply(PyObject *a, PyObject *b); + #define NAME_ERROR_MSG \ "name '%.200s' is not defined" #define UNBOUNDLOCAL_ERROR_MSG \ @@ -1497,7 +1501,13 @@ PyEval_EvalFrameEx(PyFrameObject *f, int TARGET(BINARY_MULTIPLY) { PyObject *right = POP(); PyObject *left = TOP(); - PyObject *res = PyNumber_Multiply(left, right); + PyObject *res; + if (PyLong_CheckExact(left) && PyLong_CheckExact(right)) { + res = _PyLong_Multiply(left, right); + } + else { + res = PyNumber_Multiply(left, right); + } Py_DECREF(left); Py_DECREF(right); SET_TOP(res); @@ -1560,7 +1570,16 @@ PyEval_EvalFrameEx(PyFrameObject *f, int PyObject *right = POP(); PyObject *left = TOP(); PyObject *sum; - if (PyUnicode_CheckExact(left) && + if (PyLong_CheckExact(left)) { + if (PyLong_CheckExact(right)) { + sum = _PyLong_Add(left, right); + } + else { + sum = PyNumber_Add(left, right); + } + Py_DECREF(left); + } + else if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) { sum = unicode_concatenate(left, right, f, next_instr); /* unicode_concatenate consumed the ref to v */ @@ -1579,7 +1598,13 @@ PyEval_EvalFrameEx(PyFrameObject *f, int TARGET(BINARY_SUBTRACT) { PyObject *right = POP(); PyObject *left = TOP(); - PyObject *diff = PyNumber_Subtract(left, right); + PyObject *diff; + if (PyLong_CheckExact(left) && PyLong_CheckExact(right)) { + diff = _PyLong_Subtract(left, right); + } + else { + diff = PyNumber_Subtract(left, right); + } Py_DECREF(right); Py_DECREF(left); SET_TOP(diff); @@ -1700,6 +1725,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int PyObject *right = POP(); PyObject *left = TOP(); PyObject *res = PyNumber_InPlaceMultiply(left, right); + if (PyLong_CheckExact(left) && PyLong_CheckExact(right)) { + res = _PyLong_Multiply(left, right); + } + else { + res = PyNumber_InPlaceMultiply(left, right); + } Py_DECREF(left); Py_DECREF(right); SET_TOP(res); @@ -1760,7 +1791,16 @@ PyEval_EvalFrameEx(PyFrameObject *f, int PyObject *right = POP(); PyObject *left = TOP(); PyObject *sum; - if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) { + if (PyLong_CheckExact(left)) { + if (PyLong_CheckExact(right)) { + sum = _PyLong_Add(left, right); + } + else { + sum = PyNumber_InPlaceAdd(left, right); + } + Py_DECREF(left); + } + else if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) { sum = unicode_concatenate(left, right, f, next_instr); /* unicode_concatenate consumed the ref to v */ } @@ -1778,7 +1818,13 @@ PyEval_EvalFrameEx(PyFrameObject *f, int TARGET(INPLACE_SUBTRACT) { PyObject *right = POP(); PyObject *left = TOP(); - PyObject *diff = PyNumber_InPlaceSubtract(left, right); + PyObject *diff; + if (PyLong_CheckExact(left) && PyLong_CheckExact(right)) { + diff = _PyLong_Subtract(left, right); + } + else { + diff = PyNumber_InPlaceSubtract(left, right); + } Py_DECREF(left); Py_DECREF(right); SET_TOP(diff);