From: Guido van Rossum Date: Sun, 18 Nov 1990 17:30:23 +0000 (+0000) Subject: Fixed resizestring() to work if reference tracing is turned on. X-Git-Tag: v0.9.8~1112 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=921842f2c2a4f4124ff80f95e3f613c3f0dcc8d5;p=thirdparty%2FPython%2Fcpython.git 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... --- diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 7b02dc87b625..cceed7590fb1 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; }