mirror of
https://github.com/licsber/micropython.git
synced 2024-09-20 09:00:23 +08:00
py/gc: Rename gc_drain_stack to gc_mark_subtree and pass it first block.
This saves a bit in code size: minimal CROSS=1: -44 unix: -96
This commit is contained in:
parent
ea7cf2b738
commit
5c9e5618e0
26
py/gc.c
26
py/gc.c
@ -203,11 +203,13 @@ bool gc_is_locked(void) {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
STATIC void gc_drain_stack(void) {
|
// Take the given block as the topmost block on the stack. Check all it's
|
||||||
while (MP_STATE_MEM(gc_sp) > MP_STATE_MEM(gc_stack)) {
|
// children: mark the unmarked child blocks and put those newly marked
|
||||||
// pop the next block off the stack
|
// blocks on the stack. When all children have been checked, pop off the
|
||||||
size_t block = *--MP_STATE_MEM(gc_sp);
|
// topmost block on the stack and repeat with that one.
|
||||||
|
STATIC void gc_mark_subtree(size_t block) {
|
||||||
|
// Start with the block passed in the argument.
|
||||||
|
for (;;) {
|
||||||
// work out number of consecutive blocks in the chain starting with this one
|
// work out number of consecutive blocks in the chain starting with this one
|
||||||
size_t n_blocks = 0;
|
size_t n_blocks = 0;
|
||||||
do {
|
do {
|
||||||
@ -233,6 +235,14 @@ STATIC void gc_drain_stack(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Are there any blocks on the stack?
|
||||||
|
if (MP_STATE_MEM(gc_sp) <= MP_STATE_MEM(gc_stack)) {
|
||||||
|
break; // No, stack is empty, we're done.
|
||||||
|
}
|
||||||
|
|
||||||
|
// pop the next block off the stack
|
||||||
|
block = *--MP_STATE_MEM(gc_sp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,8 +255,7 @@ STATIC void gc_deal_with_stack_overflow(void) {
|
|||||||
for (size_t block = 0; block < MP_STATE_MEM(gc_alloc_table_byte_len) * BLOCKS_PER_ATB; block++) {
|
for (size_t block = 0; block < MP_STATE_MEM(gc_alloc_table_byte_len) * BLOCKS_PER_ATB; block++) {
|
||||||
// trace (again) if mark bit set
|
// trace (again) if mark bit set
|
||||||
if (ATB_GET_KIND(block) == AT_MARK) {
|
if (ATB_GET_KIND(block) == AT_MARK) {
|
||||||
*MP_STATE_MEM(gc_sp)++ = block;
|
gc_mark_subtree(block);
|
||||||
gc_drain_stack();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -339,8 +348,7 @@ void gc_collect_root(void **ptrs, size_t len) {
|
|||||||
// an unmarked head, mark it, and push it on gc stack
|
// an unmarked head, mark it, and push it on gc stack
|
||||||
TRACE_MARK(block, ptr);
|
TRACE_MARK(block, ptr);
|
||||||
ATB_HEAD_TO_MARK(block);
|
ATB_HEAD_TO_MARK(block);
|
||||||
*MP_STATE_MEM(gc_sp)++ = block;
|
gc_mark_subtree(block);
|
||||||
gc_drain_stack();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user