#include #include "gc.h" #include "vm.h" void mark(struct garbageObject *obj) { if (obj->mark) return; ++obj->mark; if (obj->type == GARBAGE_PAIR) { mark(obj->head); mark(obj->tail); } } void markAll(struct virtualMachine *vm) { for (int i = 0; i < vm->stackSize; ++i) { mark(vm->stack[i]); } } void sweep(struct virtualMachine *vm) { struct garbageObject **obj = &vm->head; while (*obj) { if (!(*obj)->mark) { struct garbageObject *unreachable = *obj; *obj = unreachable->next; free(unreachable); vm->refCount--; } else { (*obj)->mark = 0; obj = &(*obj)->next; } } } void collect(struct virtualMachine *vm) { markAll(vm); sweep(vm); vm->refMax = vm->refCount * 2 <= STACK_MAX ? vm->refCount * 2 : STACK_MAX; }