Merge 5fbb1b1ebd into 6739742fb6
This commit is contained in:
commit
df54e304dc
2 changed files with 1263 additions and 1087 deletions
|
|
@ -118,18 +118,41 @@ void *realloc(void *ptr, size_t new_size) {
|
|||
return malloc(new_size);
|
||||
}
|
||||
|
||||
// Per the C standard, realloc(ptr, 0) acts like free(ptr) and returns NULL.
|
||||
if (new_size == 0) {
|
||||
free(ptr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Region *region = region_for_ptr(ptr);
|
||||
Region *region_end = region_after(region, region->size);
|
||||
|
||||
// When reallocating the last allocated region, return
|
||||
// the same pointer, and skip copying the data.
|
||||
if (region_end == next) {
|
||||
next = region;
|
||||
return malloc(new_size);
|
||||
// grow the heap and update last region's size so we do not need to copy data
|
||||
Region *new_region_end = region_after(region, new_size);
|
||||
if (new_region_end > heap_end) {
|
||||
if ((char *)new_region_end - (char *)heap_start > MAX_HEAP_SIZE) {
|
||||
return NULL;
|
||||
}
|
||||
if (!grow_heap(new_size)) return NULL;
|
||||
heap_end = get_heap_end();
|
||||
}
|
||||
|
||||
region->size = new_size;
|
||||
next = new_region_end;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void *result = malloc(new_size);
|
||||
memcpy(result, ®ion->data, region->size);
|
||||
if (result == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size_t copy_size = (region->size < new_size) ? region->size : new_size;
|
||||
memcpy(result, ®ion->data, copy_size);
|
||||
free(ptr);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue