]> granicus.if.org Git - python/commitdiff
The endless 460020 bug.
authorTim Peters <tim.peters@gmail.com>
Tue, 11 Sep 2001 19:48:03 +0000 (19:48 +0000)
committerTim Peters <tim.peters@gmail.com>
Tue, 11 Sep 2001 19:48:03 +0000 (19:48 +0000)
Disable t[:], t*0, t*1 optimizations when t is of a tuple subclass type.

Lib/test/test_descr.py
Objects/tupleobject.c

index 7095f0b5d49cd9932284a0a5b44687fbeb27a368..5c4db303359f5dbab8d476b9d1cb3882c7449431 100644 (file)
@@ -1417,9 +1417,18 @@ def inherits():
     a = madtuple((1,2,3,4,5))
     verify(tuple(a) == (1,2,3,4,5))
     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(())
     verify(tuple(a) == ())
     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):
         _rev = None
index b07eb747ba94a93f3d670de8d1d90fc22f26397f..f371e1ee3c8a50a108a0196674bfecd0aa4b9605 100644 (file)
@@ -298,8 +298,7 @@ tupleslice(register PyTupleObject *a, register int ilow, register int ihigh)
                ihigh = a->ob_size;
        if (ihigh < ilow)
                ihigh = ilow;
-       if (ilow == 0 && ihigh == a->ob_size) {
-               /* XXX can only do this if tuples are immutable! */
+       if (ilow == 0 && ihigh == a->ob_size && PyTuple_CheckExact(a)) {
                Py_INCREF(a);
                return (PyObject *)a;
        }
@@ -366,10 +365,14 @@ tuplerepeat(PyTupleObject *a, int n)
        if (n < 0)
                n = 0;
        if (a->ob_size == 0 || n == 1) {
-               /* Since tuples are immutable, we can return a shared
-                  copy in this case */
-               Py_INCREF(a);
-               return (PyObject *)a;
+               if (PyTuple_CheckExact(a)) {
+                       /* Since tuples are immutable, we can return a shared
+                          copy in this case */
+                       Py_INCREF(a);
+                       return (PyObject *)a;
+               }
+               if (a->ob_size == 0)
+                       return PyTuple_New(0);
        }
        size = a->ob_size * n;
        if (size/a->ob_size != n)