void gc_collect_root(void **ptrs, machine_uint_t len) { for (machine_uint_t i = 0; i < len; i++) { machine_uint_t ptr = (machine_uint_t)ptrs[i]; VERIFY_MARK_AND_PUSH(ptr); gc_drain_stack(); } }
void gc_collect_root(void **ptrs, size_t len) { for (size_t i = 0; i < len; i++) { void *ptr = ptrs[i]; VERIFY_MARK_AND_PUSH(ptr); gc_drain_stack(); } }
STATIC void gc_drain_stack(void) { while (gc_sp > gc_stack) { // pop the next block off the stack machine_uint_t block = *--gc_sp; // work out number of consecutive blocks in the chain starting with this one machine_uint_t n_blocks = 0; do { n_blocks += 1; } while (ATB_GET_KIND(block + n_blocks) == AT_TAIL); // check this block's children machine_uint_t *scan = (machine_uint_t*)PTR_FROM_BLOCK(block); for (machine_uint_t i = n_blocks * WORDS_PER_BLOCK; i > 0; i--, scan++) { machine_uint_t ptr2 = *scan; VERIFY_MARK_AND_PUSH(ptr2); } } }
STATIC void gc_drain_stack(void) { while (MP_STATE_MEM(gc_sp) > MP_STATE_MEM(gc_stack)) { // pop the next block off the stack size_t block = *--MP_STATE_MEM(gc_sp); // work out number of consecutive blocks in the chain starting with this one size_t n_blocks = 0; do { n_blocks += 1; } while (ATB_GET_KIND(block + n_blocks) == AT_TAIL); // check this block's children void **ptrs = (void**)PTR_FROM_BLOCK(block); for (size_t i = n_blocks * BYTES_PER_BLOCK / sizeof(void*); i > 0; i--, ptrs++) { void *ptr = *ptrs; VERIFY_MARK_AND_PUSH(ptr); } } }