diff options
author | Thomas Wouters <thomas@python.org> | 2001-05-28 13:11:02 (GMT) |
---|---|---|
committer | Thomas Wouters <thomas@python.org> | 2001-05-28 13:11:02 (GMT) |
commit | 6a922372ad24a86306d70889e67edb03815d07c0 (patch) | |
tree | b4a12e7d5a1e9be78e671c485d2fc0c30fbf3856 /Objects | |
parent | 15d4929ae4ad5206e2f7fa947d632bfba9b8bfd1 (diff) | |
download | cpython-6a922372ad24a86306d70889e67edb03815d07c0.zip cpython-6a922372ad24a86306d70889e67edb03815d07c0.tar.gz cpython-6a922372ad24a86306d70889e67edb03815d07c0.tar.bz2 |
_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.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/tupleobject.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 6cd74eb..16e0b12 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -500,8 +500,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(); @@ -511,6 +511,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; |