mirror of
https://codeberg.org/andyscott/marCsweep.git
synced 2024-11-13 15:50:50 -05:00
54 lines
1.2 KiB
C
54 lines
1.2 KiB
C
|
#ifndef VM_H
|
||
|
#define VM_H
|
||
|
|
||
|
#define STACK_MAX 1024
|
||
|
|
||
|
// 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;
|
||
|
|
||
|
union {
|
||
|
int value;
|
||
|
|
||
|
struct {
|
||
|
struct garbageObject *head;
|
||
|
struct garbageObject *tail;
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Virtual machine hold the stack to trace references
|
||
|
struct virtualMachine {
|
||
|
int stackSize;
|
||
|
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();
|
||
|
|
||
|
// 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 */
|