From eeff5e273f22aa28e81ab080e9ffdce85ac394b8 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 22 Oct 2021 09:59:31 +0200 Subject: Prepare skeleton for bytecode interpreter --- src/treewalk/gc.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/treewalk/gc.h (limited to 'src/treewalk/gc.h') diff --git a/src/treewalk/gc.h b/src/treewalk/gc.h new file mode 100644 index 0000000..9ad1615 --- /dev/null +++ b/src/treewalk/gc.h @@ -0,0 +1,46 @@ +#ifndef BDL_GC_H +#define BDL_GC_H + +#include "objects.h" +#include "environment.h" + +typedef struct FreeList { + size_t *offsets; + size_t position; +} FreeList; + +typedef struct GC { + Object **roots; + Environment *envs; + Object *objects; + FreeList free_objects; + FreeList free_envs; + Environment **active_envs; +} GC; + +void gc_init(void); + +// Allocation functions for objects and environments. +Object * alloc_object(ObjectType type); +Environment * alloc_env(void); + +// Root and environment protector functions. +void push_root(Object *obj); +Object * pop_root(void); +void push_active_env(Environment *env); +Environment * pop_active_env(void); + +// Mark and sweep algorithm functions. +void mark_environment(Environment *env); +void mark_obj(Object *obj); +void mark_and_sweep(void); + +// Debugging function to print out the contentes of some GC fields. +void dump_gc(void); + +#define GC_OBJS_CAP 1024 * 1024 +#define GC_ROOTS_CAP 1024 +#define GC_ACTIVE_ENVS_CAP 2 +#define GC_ENVS_CAP 1024 * 4 + +#endif // BDL_GC_H -- cgit v1.2.1