wingo pushed a commit to branch wip-whippet
in repository guile.

commit db36c48efd8af953745081c42cd8bfa2531d3ef0
Author: Andy Wingo <wi...@igalia.com>
AuthorDate: Wed Aug 16 11:08:12 2023 +0200

    Update extern space API to allow for evacuation
---
 api/gc-embedder-api.h           |  5 +++--
 benchmarks/simple-gc-embedder.h |  5 +++--
 src/semi.c                      | 11 ++++++-----
 src/whippet.c                   |  2 +-
 4 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/api/gc-embedder-api.h b/api/gc-embedder-api.h
index 31793316f..ad33bc170 100644
--- a/api/gc-embedder-api.h
+++ b/api/gc-embedder-api.h
@@ -21,8 +21,9 @@ struct gc_extern_space;
 
 GC_EMBEDDER_API inline int gc_is_valid_conservative_ref_displacement(uintptr_t 
displacement);
 
-GC_EMBEDDER_API inline int gc_extern_space_mark(struct gc_extern_space *space,
-                                                struct gc_ref ref) 
GC_ALWAYS_INLINE;
+GC_EMBEDDER_API inline int gc_extern_space_visit(struct gc_extern_space *space,
+                                                 struct gc_edge edge,
+                                                 struct gc_ref ref) 
GC_ALWAYS_INLINE;
 GC_EMBEDDER_API inline void gc_extern_space_start_gc(struct gc_extern_space 
*space,
                                                      int is_minor_gc);
 GC_EMBEDDER_API inline void gc_extern_space_finish_gc(struct gc_extern_space 
*space,
diff --git a/benchmarks/simple-gc-embedder.h b/benchmarks/simple-gc-embedder.h
index d4276192f..2c599655b 100644
--- a/benchmarks/simple-gc-embedder.h
+++ b/benchmarks/simple-gc-embedder.h
@@ -19,8 +19,9 @@ gc_is_valid_conservative_ref_displacement(uintptr_t 
displacement) {
 }
 
 // No external objects in simple benchmarks.
-static inline int gc_extern_space_mark(struct gc_extern_space *space,
-                                       struct gc_ref ref) {
+static inline int gc_extern_space_visit(struct gc_extern_space *space,
+                                        struct gc_edge edge,
+                                        struct gc_ref ref) {
   GC_CRASH();
 }
 static inline void gc_extern_space_start_gc(struct gc_extern_space *space,
diff --git a/src/semi.c b/src/semi.c
index 151bafb83..182a68a3d 100644
--- a/src/semi.c
+++ b/src/semi.c
@@ -199,12 +199,13 @@ static int semi_space_contains(struct semi_space *space, 
struct gc_ref ref) {
 
 static void visit_external_object(struct gc_heap *heap,
                                   struct gc_extern_space *space,
-                                  struct gc_ref ref) {
-  if (gc_extern_space_mark(space, ref)) {
+                                  struct gc_edge edge,
+                                  struct gc_ref old_ref) {
+  if (gc_extern_space_visit(space, edge, old_ref)) {
     if (GC_UNLIKELY(heap->check_pending_ephemerons))
-      gc_resolve_pending_ephemerons(ref, heap);
+      gc_resolve_pending_ephemerons(old_ref, heap);
 
-    gc_trace_object(ref, trace, heap, NULL, NULL);
+    gc_trace_object(gc_edge_ref(edge), trace, heap, NULL, NULL);
   }
 }
 
@@ -217,7 +218,7 @@ static void visit(struct gc_edge edge, struct gc_heap 
*heap) {
   else if (large_object_space_contains(heap_large_object_space(heap), ref))
     visit_large_object_space(heap, heap_large_object_space(heap), ref);
   else
-    visit_external_object(heap, heap->extern_space, ref);
+    visit_external_object(heap, heap->extern_space, edge, ref);
 }
 
 struct gc_pending_ephemerons *
diff --git a/src/whippet.c b/src/whippet.c
index ae247482b..d32868aa7 100644
--- a/src/whippet.c
+++ b/src/whippet.c
@@ -671,7 +671,7 @@ static inline int do_trace(struct gc_heap *heap, struct 
gc_edge edge,
     return large_object_space_mark_object(heap_large_object_space(heap),
                                           ref);
   else
-    return gc_extern_space_mark(heap_extern_space(heap), ref);
+    return gc_extern_space_visit(heap_extern_space(heap), edge, ref);
 }
 
 static inline int trace_edge(struct gc_heap *heap, struct gc_edge edge) {

Reply via email to