Skip to content

Commit

Permalink
py/gc: Refactor assertions in gc_free function.
Browse files Browse the repository at this point in the history
gc_free() expects either NULL or a valid pointer into the heap, so the
checks for a valid pointer can be turned into assertions.
  • Loading branch information
dpgeorge committed Jul 12, 2017
1 parent 1e6fd9f commit 12d4fa9
Showing 1 changed file with 23 additions and 26 deletions.
49 changes: 23 additions & 26 deletions py/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -536,37 +536,34 @@ void gc_free(void *ptr) {

DEBUG_printf("gc_free(%p)\n", ptr);

if (VERIFY_PTR(ptr)) {
if (ptr == NULL) {
GC_EXIT();
} else {
// get the GC block number corresponding to this pointer
assert(VERIFY_PTR(ptr));
size_t block = BLOCK_FROM_PTR(ptr);
if (ATB_GET_KIND(block) == AT_HEAD) {
#if MICROPY_ENABLE_FINALISER
FTB_CLEAR(block);
#endif
// set the last_free pointer to this block if it's earlier in the heap
if (block / BLOCKS_PER_ATB < MP_STATE_MEM(gc_last_free_atb_index)) {
MP_STATE_MEM(gc_last_free_atb_index) = block / BLOCKS_PER_ATB;
}
assert(ATB_GET_KIND(block) == AT_HEAD);

// free head and all of its tail blocks
do {
ATB_ANY_TO_FREE(block);
block += 1;
} while (ATB_GET_KIND(block) == AT_TAIL);

GC_EXIT();
#if MICROPY_ENABLE_FINALISER
FTB_CLEAR(block);
#endif

#if EXTENSIVE_HEAP_PROFILING
gc_dump_alloc_table();
#endif
} else {
GC_EXIT();
assert(!"bad free");
// set the last_free pointer to this block if it's earlier in the heap
if (block / BLOCKS_PER_ATB < MP_STATE_MEM(gc_last_free_atb_index)) {
MP_STATE_MEM(gc_last_free_atb_index) = block / BLOCKS_PER_ATB;
}
} else if (ptr != NULL) {
GC_EXIT();
assert(!"bad free");
} else {

// free head and all of its tail blocks
do {
ATB_ANY_TO_FREE(block);
block += 1;
} while (ATB_GET_KIND(block) == AT_TAIL);

GC_EXIT();

#if EXTENSIVE_HEAP_PROFILING
gc_dump_alloc_table();
#endif
}
}

Expand Down

0 comments on commit 12d4fa9

Please sign in to comment.