diff options
Diffstat (limited to 'libguile/whippet/benchmarks/ephemerons-embedder.h')
-rw-r--r-- | libguile/whippet/benchmarks/ephemerons-embedder.h | 54 |
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 |