@@ -345,6 +345,19 @@ STATIC void gc_sweep(void) {
345
345
}
346
346
}
347
347
348
+ // Mark can handle NULL pointers because it verifies the pointer is within the heap bounds.
349
+ STATIC void gc_mark (void * ptr ) {
350
+ if (VERIFY_PTR (ptr )) {
351
+ size_t block = BLOCK_FROM_PTR (ptr );
352
+ if (ATB_GET_KIND (block ) == AT_HEAD ) {
353
+ // An unmarked head: mark it, and mark all its children
354
+ TRACE_MARK (block , ptr );
355
+ ATB_HEAD_TO_MARK (block );
356
+ gc_mark_subtree (block );
357
+ }
358
+ }
359
+ }
360
+
348
361
void gc_collect_start (void ) {
349
362
GC_ENTER ();
350
363
MP_STATE_MEM (gc_lock_depth )++ ;
@@ -361,9 +374,7 @@ void gc_collect_start(void) {
361
374
size_t root_end = offsetof(mp_state_ctx_t , vm .qstr_last_chunk );
362
375
gc_collect_root (ptrs + root_start / sizeof (void * ), (root_end - root_start ) / sizeof (void * ));
363
376
364
- if (MP_STATE_MEM (permanent_pointers ) != NULL ) {
365
- gc_collect_root (MP_STATE_MEM (permanent_pointers ), BYTES_PER_BLOCK / sizeof (void * ));
366
- }
377
+ gc_mark (MP_STATE_MEM (permanent_pointers ));
367
378
368
379
#if MICROPY_ENABLE_PYSTACK
369
380
// Trace root pointers from the Python stack.
@@ -375,15 +386,7 @@ void gc_collect_start(void) {
375
386
void gc_collect_root (void * * ptrs , size_t len ) {
376
387
for (size_t i = 0 ; i < len ; i ++ ) {
377
388
void * ptr = ptrs [i ];
378
- if (VERIFY_PTR (ptr )) {
379
- size_t block = BLOCK_FROM_PTR (ptr );
380
- if (ATB_GET_KIND (block ) == AT_HEAD ) {
381
- // An unmarked head: mark it, and mark all its children
382
- TRACE_MARK (block , ptr );
383
- ATB_HEAD_TO_MARK (block );
384
- gc_mark_subtree (block );
385
- }
386
- }
389
+ gc_mark (ptr );
387
390
}
388
391
}
389
392
0 commit comments