From: Thomas Wouters Date: Mon, 28 May 2001 13:04:33 +0000 (+0000) Subject: _PyTuple_Resize: take into account the empty tuple. There can be only one. X-Git-Tag: v2.1.1c1~99 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fbed5be9e13144f80a30b90dbd670131fdaba51e;p=thirdparty%2FPython%2Fcpython.git _PyTuple_Resize: take into account the empty tuple. There can be only one. Instead of raising a SystemError, just create a new tuple of the desired size. This fixes (at least) SF bug #420343. --- diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index d40f9474eed2..461b3255da7a 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -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;