summaryrefslogtreecommitdiff
path: root/Objects/stringobject.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1990-11-18 17:30:23 +0000
committerGuido van Rossum <guido@python.org>1990-11-18 17:30:23 +0000
commit921842f2c2a4f4124ff80f95e3f613c3f0dcc8d5 (patch)
tree744cb42248c39e56137ca7fbf44fc0abb104f84f /Objects/stringobject.c
parentda0c6bdfe36a58e9f6ba3408e843d1afb3733056 (diff)
downloadcpython-git-921842f2c2a4f4124ff80f95e3f613c3f0dcc8d5.tar.gz
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...
Diffstat (limited to 'Objects/stringobject.c')
-rw-r--r--Objects/stringobject.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 7b02dc87b6..cceed7590f 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;
}