mirror of
https://github.com/python/cpython.git
synced 2025-10-16 03:40:58 +00:00
More bug 460020. Disable a number of long optimizations for long subclasses.
This commit is contained in:
parent
0280cf79a7
commit
69c2de3ad6
2 changed files with 39 additions and 18 deletions
|
@ -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']
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue