1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-28 14:00:31 +02:00

Explicitly support immediate values

Because we have to deref edges ourselves, as part of generational
marking, we need to ignore edges that don't point to heap objects.
This commit is contained in:
Andy Wingo 2024-10-04 11:40:09 +02:00
parent 10017daa0c
commit b5c36b9fd8
10 changed files with 57 additions and 34 deletions

View file

@ -207,7 +207,7 @@ trace_worker_steal_from_any(struct gc_trace_worker *worker,
for (size_t i = 0; i < tracer->worker_count; i++) {
LOG("tracer #%zu: stealing from #%zu\n", worker->id, worker->steal_id);
struct gc_ref obj = tracer_steal_from_worker(tracer, worker->steal_id);
if (gc_ref_is_heap_object(obj)) {
if (!gc_ref_is_null(obj)) {
LOG("tracer #%zu: stealing got %p\n", worker->id,
gc_ref_heap_object(obj));
return obj;
@ -281,13 +281,13 @@ trace_worker_steal(struct gc_trace_worker *worker) {
{
LOG("tracer #%zu: trying to pop worker's own deque\n", worker->id);
struct gc_ref obj = shared_worklist_try_pop(&worker->shared);
if (gc_ref_is_heap_object(obj))
if (!gc_ref_is_null(obj))
return obj;
}
LOG("tracer #%zu: trying to steal\n", worker->id);
struct gc_ref obj = trace_worker_steal_from_any(worker, tracer);
if (gc_ref_is_heap_object(obj))
if (!gc_ref_is_null(obj))
return obj;
return gc_ref_null();
@ -337,7 +337,7 @@ trace_with_data(struct gc_tracer *tracer,
ref = local_worklist_pop(&worker->local);
} else {
ref = trace_worker_steal(worker);
if (!gc_ref_is_heap_object(ref))
if (gc_ref_is_null(ref))
break;
}
trace_one(ref, heap, worker);