summaryrefslogtreecommitdiff
path: root/libguile/whippet/benchmarks/ephemerons-embedder.h
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/whippet/benchmarks/ephemerons-embedder.h')
-rw-r--r--libguile/whippet/benchmarks/ephemerons-embedder.h54
1 files changed, 54 insertions, 0 deletions
diff --git a/libguile/whippet/benchmarks/ephemerons-embedder.h b/libguile/whippet/benchmarks/ephemerons-embedder.h
new file mode 100644
index 000000000..5b17178cd
--- /dev/null
+++ b/libguile/whippet/benchmarks/ephemerons-embedder.h
@@ -0,0 +1,54 @@
+#ifndef EPHEMERONS_EMBEDDER_H
+#define EPHEMERONS_EMBEDDER_H
+
+#include <stddef.h>
+
+#include "ephemerons-types.h"
+#include "gc-ephemeron.h"
+
+struct gc_heap;
+
+#define DEFINE_METHODS(name, Name, NAME) \
+ static inline size_t name##_size(Name *obj) GC_ALWAYS_INLINE; \
+ static inline void visit_##name##_fields(Name *obj,\
+ void (*visit)(struct gc_edge edge, \
+ struct gc_heap *heap, \
+ void *visit_data), \
+ struct gc_heap *heap, \
+ void *visit_data) GC_ALWAYS_INLINE;
+FOR_EACH_HEAP_OBJECT_KIND(DEFINE_METHODS)
+#undef DEFINE_METHODS
+
+static inline size_t small_object_size(SmallObject *obj) { return sizeof(*obj); }
+static inline size_t ephemeron_size(Ephemeron *obj) { return gc_ephemeron_size(); }
+static inline size_t box_size(Box *obj) { return sizeof(*obj); }
+
+static inline void
+visit_small_object_fields(SmallObject *obj,
+ void (*visit)(struct gc_edge edge, struct gc_heap *heap,
+ void *visit_data),
+ struct gc_heap *heap,
+ void *visit_data) {}
+
+static inline void
+visit_ephemeron_fields(Ephemeron *ephemeron,
+ void (*visit)(struct gc_edge edge, struct gc_heap *heap,
+ void *visit_data),
+
+ struct gc_heap *heap,
+ void *visit_data) {
+ gc_trace_ephemeron((struct gc_ephemeron*)ephemeron, visit, heap, visit_data);
+}
+
+static inline void
+visit_box_fields(Box *box,
+ void (*visit)(struct gc_edge edge, struct gc_heap *heap,
+ void *visit_data),
+ struct gc_heap *heap,
+ void *visit_data) {
+ visit(gc_edge(&box->obj), heap, visit_data);
+}
+
+#include "simple-gc-embedder.h"
+
+#endif // EPHEMERONS_EMBEDDER_H