]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
_PyTuple_Resize: take into account the empty tuple. There can be only one.
authorThomas Wouters <thomas@python.org>
Mon, 28 May 2001 13:04:33 +0000 (13:04 +0000)
committerThomas Wouters <thomas@python.org>
Mon, 28 May 2001 13:04:33 +0000 (13:04 +0000)
Instead of raising a SystemError, just create a new tuple of the desired
size.

This fixes (at least) SF bug #420343.

Objects/tupleobject.c

index d40f9474eed265c60f4e5e7073f2be303f07d813..461b3255da7ab6a3072472a8e14082b18207c8da 100644 (file)
@@ -499,8 +499,8 @@ _PyTuple_Resize(PyObject **pv, int newsize, int last_is_sticky)
        int sizediff;
 
        v = (PyTupleObject *) *pv;
-       if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1 ||
-             last_is_sticky) {
+       if (v == NULL || !PyTuple_Check(v) || last_is_sticky ||
+           (v->ob_size != 0 && v->ob_refcnt != 1)) {
                *pv = 0;
                Py_XDECREF(v);
                PyErr_BadInternalCall();
@@ -510,6 +510,15 @@ _PyTuple_Resize(PyObject **pv, int newsize, int last_is_sticky)
        if (sizediff == 0)
                return 0;
 
+       if (v->ob_size == 0) {
+               /* Empty tuples are often shared, so we should never 
+                  resize them in-place even if we do own the only
+                  (current) reference */
+               Py_DECREF(v);
+               *pv = PyTuple_New(newsize);
+               return 0;
+       }
+
        /* XXX UNREF/NEWREF interface should be more symmetrical */
 #ifdef Py_REF_DEBUG
        --_Py_RefTotal;