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) {