Skip to content

Commit 6a27408

Browse files
author
theraven
committed
Fix malloc() / free() imbalance.
1 parent 9083746 commit 6a27408

File tree

4 files changed

+17
-2
lines changed

4 files changed

+17
-2
lines changed

gc_boehm.c

+2
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ static id allocate_class(Class cls, size_t extra)
429429
return obj;
430430
}
431431

432+
static void free_object(id obj) {}
432433
id objc_allocate_object(Class cls, int extra)
433434
{
434435
return class_createInstance(cls, extra);
@@ -714,6 +715,7 @@ static void debug_free(void *ptr)
714715
PRIVATE struct gc_ops gc_ops_boehm =
715716
{
716717
.allocate_class = allocate_class,
718+
.free_object = free_object,
717719
.malloc = debug_malloc,
718720
.free = debug_free,
719721
};

gc_none.c

+6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ static id allocate_class(Class cls, size_t extraBytes)
1111
return (id)(addr + 1);
1212
}
1313

14+
static void free_object(id obj)
15+
{
16+
free((void*)(((intptr_t)obj) - 1));
17+
}
18+
1419
static void *alloc(size_t size)
1520
{
1621
return calloc(size, 1);
@@ -19,6 +24,7 @@ static void *alloc(size_t size)
1924
PRIVATE struct gc_ops gc_ops_none =
2025
{
2126
.allocate_class = allocate_class,
27+
.free_object = free_object,
2228
.malloc = alloc,
2329
.free = free
2430
};

gc_ops.h

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ struct gc_ops
1212
* Allocates enough space for a class, followed by some extra bytes.
1313
*/
1414
id (*allocate_class)(Class, size_t);
15+
/**
16+
* Frees an object.
17+
*/
18+
void (*free_object)(id);
1519
/**
1620
* Allocates some memory that can be used to store pointers. This must be
1721
* used instead of malloc() for internal data structures that will store

runtime.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,11 @@ id object_copy(id obj, size_t size)
358358

359359
id object_dispose(id obj)
360360
{
361-
call_cxx_destruct(obj);
362-
gc->free(obj);
361+
if (isGCEnabled)
362+
{
363+
call_cxx_destruct(obj);
364+
gc->free_object(obj);
365+
}
363366
return nil;
364367
}
365368

0 commit comments

Comments
 (0)