]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fixed resizestring() to work if reference tracing is turned on.
authorGuido van Rossum <guido@python.org>
Sun, 18 Nov 1990 17:30:23 +0000 (17:30 +0000)
committerGuido van Rossum <guido@python.org>
Sun, 18 Nov 1990 17:30:23 +0000 (17:30 +0000)
The realloc() call would move the list head without fixing the
pointers to in the the chain of allocated objects...

Objects/stringobject.c

index 7b02dc87b625130af9811160d51fb93f6e62f640..cceed7590fb1014665156f456023e37cb7ecf702 100644 (file)
@@ -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;
 }