#ifndef BDL_GC_H #define BDL_GC_H #include "objects.h" #include "environment.h" typedef struct FreeList { size_t *buf; size_t size; size_t cap; size_t position; } FreeList; typedef struct GC { Object **roots; Environment *envs; Object *objects; size_t obj_cap; FreeList free_objects; FreeList free_envs; Environment **active_envs; } GC; void init_gc(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