diff --git a/lang/main.c b/lang/main.c index ead53a2..f77ccb9 100644 --- a/lang/main.c +++ b/lang/main.c @@ -30,12 +30,9 @@ } int lang_main(void) { - printf("Hello world!\n"); - struct object *stack[16] = {0}; - struct vm_state state; - state.stack_next = (struct object **)&stack; - state.stack_base = state.stack_next; - test_number(&state); - test_func(&state); + struct vm_state *state = vm_create(); + test_number(state); + test_func(state); + vm_destroy(&state); return 0; } diff --git a/lang/vm.c b/lang/vm.c index 5f01af3..aeb5e96 100644 --- a/lang/vm.c +++ b/lang/vm.c @@ -4,6 +4,28 @@ #include "vm.h" #include "object.h" #include +#include + +struct vm_state { + struct object **stack; + struct object **stack_base; + struct object **stack_next; +}; + +struct vm_state *vm_create(void) { + struct vm_state *state = malloc(sizeof(struct vm_state)); + struct object **stack = malloc(sizeof(struct object *) * 16); + state->stack = stack; + state->stack_base = stack; + state->stack_next = stack; + return state; +} + +void vm_destroy(struct vm_state **state) { + free((*state)->stack); + free(*state); + *state = NULL; +} void vm_stack_set(struct vm_state *state, int index, struct object *obj) { struct object **stack_pos = &state->stack_base[index]; diff --git a/lang/vm.h b/lang/vm.h index dfc77e3..1c56503 100644 --- a/lang/vm.h +++ b/lang/vm.h @@ -5,11 +5,10 @@ #define VM_H struct object; +struct vm_state; -struct vm_state { - struct object **stack_base; - struct object **stack_next; -}; +struct vm_state *vm_create(void); +void vm_destroy(struct vm_state **state); void vm_stack_set(struct vm_state *state, int index, struct object *obj); struct object *vm_stack_get(struct vm_state *state, int index);