Tweaks resulting from Fred's valgrind sesssions.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/branches/stable@26997 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 2008-10-31 11:07:54 +00:00
parent 042f7a621d
commit 18912f117c
3 changed files with 24 additions and 5 deletions

View file

@ -1,3 +1,10 @@
2008-10-31 Richard Frith-Macdonald <rfm@gnu.org>
* Headers/Additions/GNUstepBase/GSIArray.h:
Minor fixes for memory leak on exception etc.
* Source/NSKeyedUnarchiver.m:
Make sure array of objects is initialised with correct capacity.
2008-10-29 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSException.m: Fix stacktrace to be available when built

View file

@ -185,6 +185,7 @@ GSIArrayGrow(GSIArray array)
if (array->old < 1)
{
array->old = 1;
array->cap = 1;
}
next = array->cap + array->old;
size = next*sizeof(GSIArrayItem);
@ -220,7 +221,18 @@ GSIArrayGrowTo(GSIArray array, unsigned next)
format: @"attempt to shrink below count"];
}
size = next*sizeof(GSIArrayItem);
tmp = NSZoneRealloc(array->zone, array->ptr, size);
if (array->old == 0)
{
/*
* Statically initialised buffer ... copy into new heap buffer.
*/
tmp = NSZoneMalloc(array->zone, size);
memcpy(tmp, array->ptr, array->count * sizeof(GSIArrayItem));
}
else
{
tmp = NSZoneRealloc(array->zone, array->ptr, size);
}
if (tmp == 0)
{
@ -228,7 +240,7 @@ GSIArrayGrowTo(GSIArray array, unsigned next)
format: @"failed to grow GSIArray"];
}
array->ptr = tmp;
array->old = array->cap;
array->old = (array->cap > 0 ? array->cap : 1);
array->cap = next;
}
@ -237,8 +249,8 @@ GSIArrayInsertItem(GSIArray array, GSIArrayItem item, unsigned index)
{
unsigned int i;
GSI_ARRAY_RETAIN(array, item);
GSI_ARRAY_CHECK;
GSI_ARRAY_RETAIN(array, item);
if (array->count == array->cap)
{
GSIArrayGrow(array);
@ -272,8 +284,8 @@ GSIArrayInsertItemNoRetain(GSIArray array, GSIArrayItem item, unsigned index)
static INLINE void
GSIArrayAddItem(GSIArray array, GSIArrayItem item)
{
GSI_ARRAY_RETAIN(array, item);
GSI_ARRAY_CHECK;
GSI_ARRAY_RETAIN(array, item);
if (array->count == array->cap)
{
GSIArrayGrow(array);

View file

@ -798,7 +798,7 @@ static NSMapTable globalClassMap = 0;
NSNonOwnedPointerMapValueCallBacks, 0);
_objMap = NSZoneMalloc(_zone, sizeof(GSIArray_t));
count = [_objects count];
GSIArrayInitWithZoneAndCapacity(_objMap, _zone, count);
GSIArrayInitWithZoneAndCapacity(_objMap, _zone, count+1);
// Add marker for nil object
GSIArrayAddItem(_objMap, (GSIArrayItem)((id)[NilMarker class]));
// Add markers for unencoded objects.