@@ -72,10 +72,24 @@ __mem_pool = iter; return iter->ptr; } + +- (void*)getMemForNItems: (size_t)nitems + withSize: (size_t)size +{ + size_t memsize; + + if (size > SIZE_MAX / nitems) { + [[OFOverflowException newWithObject: self] raise]; + return NULL; + } + + memsize = nitems * size; + return [self getMemWithSize: memsize]; +} - (void*)resizeMem: (void*)ptr toSize: (size_t)size { struct __ofobject_allocated_mem *iter; @@ -83,11 +97,11 @@ for (iter = __mem_pool; iter != NULL; iter = iter->prev) { if (iter->ptr == ptr) { if ((ptr = realloc(iter->ptr, size)) == NULL) { [[OFNoMemException newWithObject: self andSize: size] raise]; - return NULL; + return iter->ptr; } iter->ptr = ptr; return ptr; } @@ -95,10 +109,26 @@ [[OFMemNotPartOfObjException newWithObject: self andPointer: ptr] raise]; return NULL; } + +- (void*)resizeMem: (void*)ptr + toNItems: (size_t)nitems + ofSize: (size_t)size +{ + size_t memsize; + + if (size > SIZE_MAX / nitems) { + [[OFOverflowException newWithObject: self] raise]; + return ptr; + } + + memsize = nitems * size; + return [self resizeMem: ptr + toSize: memsize]; +} - freeMem: (void*)ptr; { struct __ofobject_allocated_mem *iter;