mirror of
https://github.com/python/cpython.git
synced 2025-10-17 04:08:28 +00:00
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...
This commit is contained in:
parent
da0c6bdfe3
commit
921842f2c2
1 changed files with 13 additions and 6 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue