Kaydet (Commit) 69c2de3a authored tarafından Tim Peters's avatar Tim Peters

More bug 460020. Disable a number of long optimizations for long subclasses.

üst 0280cf79
...@@ -1389,6 +1389,30 @@ def inherits(): ...@@ -1389,6 +1389,30 @@ def inherits():
a = octlong(12345) a = octlong(12345)
verify(long(a) == 12345L) verify(long(a) == 12345L)
verify(long(a).__class__ is long) verify(long(a).__class__ is long)
verify((+a).__class__ is long)
verify((-a).__class__ is long)
verify((-octlong(0)).__class__ is long)
verify((a >> 0).__class__ is long)
verify((a << 0).__class__ is long)
verify((a - 0).__class__ is long)
verify((a * 1).__class__ is long)
verify((a ** 1).__class__ is long)
verify((a // 1).__class__ is long)
verify((1 * a).__class__ is long)
verify((a | 0).__class__ is long)
verify((a ^ 0).__class__ is long)
verify((a & -1L).__class__ is long)
verify((octlong(0) << 12).__class__ is long)
verify((octlong(0) >> 12).__class__ is long)
verify(abs(octlong(0)).__class__ is long)
# Because octlong overrides __add__, we can't check the absence of +0
# optimizations using octlong.
class longclone(long):
pass
a = longclone(1)
verify((a + 0).__class__ is long)
verify((0 + a).__class__ is long)
class precfloat(float): class precfloat(float):
__slots__ = ['prec'] __slots__ = ['prec']
......
...@@ -1297,7 +1297,7 @@ x_add(PyLongObject *a, PyLongObject *b) ...@@ -1297,7 +1297,7 @@ x_add(PyLongObject *a, PyLongObject *b)
PyLongObject *z; PyLongObject *z;
int i; int i;
digit carry = 0; digit carry = 0;
/* Ensure a is the larger of the two: */ /* Ensure a is the larger of the two: */
if (size_a < size_b) { if (size_a < size_b) {
{ PyLongObject *temp = a; a = b; b = temp; } { PyLongObject *temp = a; a = b; b = temp; }
...@@ -1332,7 +1332,7 @@ x_sub(PyLongObject *a, PyLongObject *b) ...@@ -1332,7 +1332,7 @@ x_sub(PyLongObject *a, PyLongObject *b)
int i; int i;
int sign = 1; int sign = 1;
digit borrow = 0; digit borrow = 0;
/* Ensure a is the larger of the two: */ /* Ensure a is the larger of the two: */
if (size_a < size_b) { if (size_a < size_b) {
sign = -1; sign = -1;
...@@ -1381,7 +1381,7 @@ static PyObject * ...@@ -1381,7 +1381,7 @@ static PyObject *
long_add(PyLongObject *v, PyLongObject *w) long_add(PyLongObject *v, PyLongObject *w)
{ {
PyLongObject *a, *b, *z; PyLongObject *a, *b, *z;
CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b); CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
if (a->ob_size < 0) { if (a->ob_size < 0) {
...@@ -1820,27 +1820,26 @@ long_invert(PyLongObject *v) ...@@ -1820,27 +1820,26 @@ long_invert(PyLongObject *v)
static PyObject * static PyObject *
long_pos(PyLongObject *v) long_pos(PyLongObject *v)
{ {
Py_INCREF(v); if (PyLong_CheckExact(v)) {
return (PyObject *)v; Py_INCREF(v);
return (PyObject *)v;
}
else
return _PyLong_Copy(v);
} }
static PyObject * static PyObject *
long_neg(PyLongObject *v) long_neg(PyLongObject *v)
{ {
PyLongObject *z; PyLongObject *z;
int i, n; if (v->ob_size == 0 && PyLong_CheckExact(v)) {
n = ABS(v->ob_size);
if (n == 0) {
/* -0 == 0 */ /* -0 == 0 */
Py_INCREF(v); Py_INCREF(v);
return (PyObject *) v; return (PyObject *) v;
} }
z = _PyLong_New(ABS(n)); z = (PyLongObject *)_PyLong_Copy(v);
if (z == NULL) if (z != NULL)
return NULL; z->ob_size = -(v->ob_size);
for (i = 0; i < n; i++)
z->ob_digit[i] = v->ob_digit[i];
z->ob_size = -(v->ob_size);
return (PyObject *)z; return (PyObject *)z;
} }
...@@ -1849,10 +1848,8 @@ long_abs(PyLongObject *v) ...@@ -1849,10 +1848,8 @@ long_abs(PyLongObject *v)
{ {
if (v->ob_size < 0) if (v->ob_size < 0)
return long_neg(v); return long_neg(v);
else { else
Py_INCREF(v); return long_pos(v);
return (PyObject *)v;
}
} }
static int static int
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment