wingo pushed a commit to branch wip-whippet in repository guile. commit 87907a042b6aeca81d43008619f0cb95b5fdb9b6 Author: Andy Wingo <wi...@igalia.com> AuthorDate: Thu Aug 7 22:31:27 2025 +0200
Change gc_trace_object to return object size --- api/gc-embedder-api.h | 13 ++++++------- benchmarks/simple-gc-embedder.h | 17 +++++++---------- src/copy-space.h | 3 +-- src/mmc.c | 2 +- src/nofl-space.h | 6 ++---- src/pcc.c | 2 +- src/semi.c | 10 ++++------ 7 files changed, 22 insertions(+), 31 deletions(-) diff --git a/api/gc-embedder-api.h b/api/gc-embedder-api.h index 012ec5bd6..d8f960ece 100644 --- a/api/gc-embedder-api.h +++ b/api/gc-embedder-api.h @@ -28,13 +28,12 @@ GC_EMBEDDER_API inline void gc_extern_space_start_gc(struct gc_extern_space *spa GC_EMBEDDER_API inline void gc_extern_space_finish_gc(struct gc_extern_space *space, int is_minor_gc); -GC_EMBEDDER_API inline void gc_trace_object(struct gc_ref ref, - void (*visit)(struct gc_edge edge, - struct gc_heap *heap, - void *visit_data), - struct gc_heap *heap, - void *trace_data, - size_t *size) GC_ALWAYS_INLINE; +GC_EMBEDDER_API inline size_t gc_trace_object(struct gc_ref ref, + void (*visit)(struct gc_edge edge, + struct gc_heap *heap, + void *visit_data), + struct gc_heap *heap, + void *trace_data) GC_ALWAYS_INLINE; GC_EMBEDDER_API inline void gc_trace_mutator_roots(struct gc_mutator_roots *roots, void (*trace_edge)(struct gc_edge edge, diff --git a/benchmarks/simple-gc-embedder.h b/benchmarks/simple-gc-embedder.h index 26fcef444..c91aad0ff 100644 --- a/benchmarks/simple-gc-embedder.h +++ b/benchmarks/simple-gc-embedder.h @@ -32,22 +32,19 @@ static inline void gc_extern_space_finish_gc(struct gc_extern_space *space, int is_minor_gc) { } -static inline void gc_trace_object(struct gc_ref ref, - void (*trace_edge)(struct gc_edge edge, - struct gc_heap *heap, - void *trace_data), - struct gc_heap *heap, - void *trace_data, - size_t *size) { +static inline size_t gc_trace_object(struct gc_ref ref, + void (*trace_edge)(struct gc_edge edge, + struct gc_heap *heap, + void *trace_data), + struct gc_heap *heap, + void *trace_data) { switch (tag_live_alloc_kind(*tag_word(ref))) { #define SCAN_OBJECT(name, Name, NAME) \ case ALLOC_KIND_##NAME: \ if (trace_edge) \ visit_##name##_fields(gc_ref_heap_object(ref), trace_edge, \ heap, trace_data); \ - if (size) \ - *size = name##_size(gc_ref_heap_object(ref)); \ - break; + return name##_size(gc_ref_heap_object(ref)); FOR_EACH_HEAP_OBJECT_KIND(SCAN_OBJECT) #undef SCAN_OBJECT default: diff --git a/src/copy-space.h b/src/copy-space.h index 952c2e22d..962884e0d 100644 --- a/src/copy-space.h +++ b/src/copy-space.h @@ -693,8 +693,7 @@ copy_space_forward_nonatomic(struct copy_space *space, struct gc_edge edge, gc_edge_update(edge, gc_ref(forwarded)); return COPY_SPACE_FORWARD_UPDATED; } else { - size_t size; - gc_trace_object(old_ref, NULL, NULL, NULL, &size); + size_t size = gc_trace_object(old_ref, NULL, NULL, NULL); struct gc_ref new_ref = copy_space_allocate(alloc, space, size); if (gc_ref_is_null(new_ref)) return COPY_SPACE_FORWARD_FAILED; diff --git a/src/mmc.c b/src/mmc.c index a2cde87b9..a842ac6a3 100644 --- a/src/mmc.c +++ b/src/mmc.c @@ -425,7 +425,7 @@ trace_one(struct gc_ref ref, struct gc_heap *heap, struct gc_trace_plan plan = trace_plan(heap, ref); switch (plan.kind) { case GC_TRACE_PRECISELY: - gc_trace_object(ref, tracer_visit, heap, worker, NULL); + gc_trace_object(ref, tracer_visit, heap, worker); break; case GC_TRACE_NONE: break; diff --git a/src/nofl-space.h b/src/nofl-space.h index f22d721c2..97f2c3e84 100644 --- a/src/nofl-space.h +++ b/src/nofl-space.h @@ -1487,8 +1487,7 @@ nofl_space_verify_sweepable_blocks(struct nofl_space *space, GC_ASSERT(meta[granules - 1] & NOFL_METADATA_BYTE_END); if (nofl_metadata_byte_trace_kind(space, byte) == GC_TRACE_PRECISELY) { - size_t trace_bytes; - gc_trace_object(obj, NULL, NULL, NULL, &trace_bytes); + size_t trace_bytes = gc_trace_object(obj, NULL, NULL, NULL); size_t trace_granules = nofl_size_to_granules(trace_bytes); GC_ASSERT_EQ(granules, trace_granules); @@ -1540,8 +1539,7 @@ nofl_space_verify_swept_blocks(struct nofl_space *space, GC_ASSERT(meta[granules - 1] & NOFL_METADATA_BYTE_END); if (nofl_metadata_byte_trace_kind(space, byte) == GC_TRACE_PRECISELY) { - size_t trace_bytes; - gc_trace_object(obj, NULL, NULL, NULL, &trace_bytes); + size_t trace_bytes = gc_trace_object(obj, NULL, NULL, NULL); size_t trace_granules = nofl_size_to_granules(trace_bytes); GC_ASSERT_EQ(granules, trace_granules); diff --git a/src/pcc.c b/src/pcc.c index b78cb50f7..002715975 100644 --- a/src/pcc.c +++ b/src/pcc.c @@ -596,7 +596,7 @@ static inline void trace_one(struct gc_ref ref, struct gc_heap *heap, } #endif - gc_trace_object(ref, tracer_visit, heap, worker, NULL); + gc_trace_object(ref, tracer_visit, heap, worker); } static inline void trace_root(struct gc_root root, struct gc_heap *heap, diff --git a/src/semi.c b/src/semi.c index 53fceae37..d841a9d39 100644 --- a/src/semi.c +++ b/src/semi.c @@ -181,8 +181,7 @@ static void flip(struct semi_space *space) { static struct gc_ref copy(struct gc_heap *heap, struct semi_space *space, struct gc_ref ref) { - size_t size; - gc_trace_object(ref, NULL, NULL, NULL, &size); + size_t size = gc_trace_object(ref, NULL, NULL, NULL); struct gc_ref new_ref = gc_ref(space->hp); memcpy(gc_ref_heap_object(new_ref), gc_ref_heap_object(ref), size); gc_object_forward_nonatomic(ref, new_ref); @@ -195,8 +194,7 @@ static struct gc_ref copy(struct gc_heap *heap, struct semi_space *space, } static uintptr_t scan(struct gc_heap *heap, struct gc_ref grey) { - size_t size; - gc_trace_object(grey, trace, heap, NULL, &size); + size_t size = gc_trace_object(grey, trace, heap, NULL); return gc_ref_value(grey) + align_up(size, GC_ALIGNMENT); } @@ -218,7 +216,7 @@ static void visit_large_object_space(struct gc_heap *heap, if (GC_UNLIKELY(heap->check_pending_ephemerons)) gc_resolve_pending_ephemerons(ref, heap); - gc_trace_object(ref, trace, heap, NULL, NULL); + gc_trace_object(ref, trace, heap, NULL); } } @@ -241,7 +239,7 @@ static void visit_external_object(struct gc_heap *heap, if (GC_UNLIKELY(heap->check_pending_ephemerons)) gc_resolve_pending_ephemerons(ref, heap); - gc_trace_object(ref, trace, heap, NULL, NULL); + gc_trace_object(ref, trace, heap, NULL); } }