summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1990-11-18 17:30:23 (GMT)
committerGuido van Rossum <guido@python.org>1990-11-18 17:30:23 (GMT)
commit921842f2c2a4f4124ff80f95e3f613c3f0dcc8d5 (patch)
tree744cb42248c39e56137ca7fbf44fc0abb104f84f
parentda0c6bdfe36a58e9f6ba3408e843d1afb3733056 (diff)
downloadcpython-921842f2c2a4f4124ff80f95e3f613c3f0dcc8d5.zip
cpython-921842f2c2a4f4124ff80f95e3f613c3f0dcc8d5.tar.gz
cpython-921842f2c2a4f4124ff80f95e3f613c3f0dcc8d5.tar.bz2
Fixed resizestring() to work if reference tracing is turned on.
The realloc() call would move the list head without fixing the pointers to in the the chain of allocated objects...
-rw-r--r--Objects/stringobject.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 7b02dc8..cceed75 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -296,24 +296,31 @@ resizestring(pv, newsize)
object **pv;
int newsize;
{
- register stringobject *v;
- v = (stringobject *) *pv;
+ register object *v;
+ register stringobject *sv;
+ v = *pv;
if (!is_stringobject(v) || v->ob_refcnt != 1) {
*pv = 0;
DECREF(v);
err_badcall();
return -1;
}
+ /* XXX UNREF/NEWREF interface should be more symmetrical */
+#ifdef TRACE_REFS
+ --ref_total;
+#endif
+ UNREF(v);
*pv = (object *)
realloc((char *)v,
sizeof(stringobject) + newsize * sizeof(char));
if (*pv == NULL) {
- DECREF(v);
+ DEL(v);
err_nomem();
return -1;
}
- v = (stringobject *) *pv;
- v->ob_size = newsize;
- v->ob_sval[newsize] = '\0';
+ NEWREF(*pv);
+ sv = (stringobject *) *pv;
+ sv->ob_size = newsize;
+ sv->ob_sval[newsize] = '\0';
return 0;
}