mirror of
https://github.com/python/cpython.git
synced 2025-09-25 17:59:57 +00:00
The endless 460020 bug.
Disable t[:], t*0, t*1 optimizations when t is of a tuple subclass type.
This commit is contained in:
parent
f0b0f680fe
commit
7b07a41e9f
2 changed files with 18 additions and 6 deletions
|
@ -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)
|
||||||
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,11 +365,15 @@ 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) {
|
||||||
|
if (PyTuple_CheckExact(a)) {
|
||||||
/* Since tuples are immutable, we can return a shared
|
/* Since tuples are immutable, we can return a shared
|
||||||
copy in this case */
|
copy in this case */
|
||||||
Py_INCREF(a);
|
Py_INCREF(a);
|
||||||
return (PyObject *)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)
|
||||||
return PyErr_NoMemory();
|
return PyErr_NoMemory();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue