Commit 7b07a41e authored by Tim Peters's avatar Tim Peters

The endless 460020 bug.

Disable t[:], t*0, t*1 optimizations when t is of a tuple subclass type.
parent f0b0f680
...@@ -1417,9 +1417,18 @@ def inherits(): ...@@ -1417,9 +1417,18 @@ def inherits():
a = madtuple((1,2,3,4,5)) a = madtuple((1,2,3,4,5))
verify(tuple(a) == (1,2,3,4,5)) verify(tuple(a) == (1,2,3,4,5))
verify(tuple(a).__class__ is tuple) verify(tuple(a).__class__ is tuple)
verify(a[:].__class__ is tuple)
verify((a * 1).__class__ is tuple)
verify((a * 0).__class__ is tuple)
verify((a + ()).__class__ is tuple)
a = madtuple(()) a = madtuple(())
verify(tuple(a) == ()) verify(tuple(a) == ())
verify(tuple(a).__class__ is tuple) verify(tuple(a).__class__ is tuple)
verify((a + a).__class__ is tuple)
verify((a * 0).__class__ is tuple)
verify((a * 1).__class__ is tuple)
verify((a * 2).__class__ is tuple)
verify(a[:].__class__ is tuple)
class madstring(str): class madstring(str):
_rev = None _rev = None
......
...@@ -298,8 +298,7 @@ tupleslice(register PyTupleObject *a, register int ilow, register int ihigh) ...@@ -298,8 +298,7 @@ tupleslice(register PyTupleObject *a, register int ilow, register int ihigh)
ihigh = a->ob_size; ihigh = a->ob_size;
if (ihigh < ilow) if (ihigh < ilow)
ihigh = ilow; ihigh = ilow;
if (ilow == 0 && ihigh == a->ob_size) { if (ilow == 0 && ihigh == a->ob_size && PyTuple_CheckExact(a)) {
/* XXX can only do this if tuples are immutable! */
Py_INCREF(a); Py_INCREF(a);
return (PyObject *)a; return (PyObject *)a;
} }
...@@ -366,10 +365,14 @@ tuplerepeat(PyTupleObject *a, int n) ...@@ -366,10 +365,14 @@ tuplerepeat(PyTupleObject *a, int n)
if (n < 0) if (n < 0)
n = 0; n = 0;
if (a->ob_size == 0 || n == 1) { if (a->ob_size == 0 || n == 1) {
/* Since tuples are immutable, we can return a shared if (PyTuple_CheckExact(a)) {
copy in this case */ /* Since tuples are immutable, we can return a shared
Py_INCREF(a); copy in this case */
return (PyObject *)a; Py_INCREF(a);
return (PyObject *)a;
}
if (a->ob_size == 0)
return PyTuple_New(0);
} }
size = a->ob_size * n; size = a->ob_size * n;
if (size/a->ob_size != n) if (size/a->ob_size != n)
......
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