#ifndef VM_H #define VM_H #define STACK_MAX 1024 #define GC_THRESHOLD 256 // Primitive types for garbage collection enum garbageData { GARBAGE_INT, GARBAGE_PAIR, }; // Holds type and value data for the virtual machine struct garbageObject { enum garbageData type; struct garbageObject *next; unsigned char mark; union { int value; struct { struct garbageObject *head; struct garbageObject *tail; }; }; }; // Virtual machine hold the stack to trace references struct virtualMachine { int stackSize; unsigned refCount; unsigned refMax; struct garbageObject *head; struct garbageObject *stack[STACK_MAX]; }; // Create a new garbageObject struct garbageObject *initGarbage(struct virtualMachine *vm, enum garbageData type); // Create a new VM struct virtualMachine *initVM(void); void deinitVM(struct virtualMachine *vm); // Generic function to push data onto the VM stack void push(struct virtualMachine *vm, struct garbageObject *value); // Pop data from the VM stack struct garbageObject *pop(struct virtualMachine *vm); // Push a GARBAGE_INT onto the VM stack void pushInt(struct virtualMachine *vm, int value); // Push a GARBAGE_PAIR onto the VM stack struct garbageObject *pushPair(struct virtualMachine *vm); #endif /* VM_H */