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);
   }
 }
 

Reply via email to