summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorThomas Wouters <thomas@python.org>2001-05-28 13:11:02 (GMT)
committerThomas Wouters <thomas@python.org>2001-05-28 13:11:02 (GMT)
commit6a922372ad24a86306d70889e67edb03815d07c0 (patch)
treeb4a12e7d5a1e9be78e671c485d2fc0c30fbf3856 /Objects
parent15d4929ae4ad5206e2f7fa947d632bfba9b8bfd1 (diff)
downloadcpython-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.c13
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;