diff --git a/src/file.c b/src/file.c index eed569f..8807182 100644 --- a/src/file.c +++ b/src/file.c @@ -14,18 +14,12 @@ Ut userdata_file = { // clang-format on I prim_file_stdout(Vm *vm) { - static O stdout_object = NIL; - if (stdout_object == NIL) - stdout_object = userdata_make(vm, (void *)stdout, &userdata_file); - vm_push(vm, stdout_object); + vm_push(vm, vm->stdout); return 0; } I prim_file_stderr(Vm *vm) { - static O stderr_object = NIL; - if (stderr_object == NIL) - stderr_object = userdata_make(vm, (void *)stderr, &userdata_file); - vm_push(vm, stderr_object); + vm_push(vm, vm->stderr); return 0; } diff --git a/src/vm.c b/src/vm.c index 0c6f02e..ae56946 100644 --- a/src/vm.c +++ b/src/vm.c @@ -7,8 +7,9 @@ #include "dictionary.h" #include "gc.h" #include "object.h" -#include "print.h" -#include "src/primitive.h" +#include "primitive.h" +#include "userdata.h" +#include "file.h" #include "string.h" #include "vm.h" @@ -47,6 +48,14 @@ V vm_init(Vm *vm) { gc_addroot(&vm->gc, &vm->stack[i]); gc_addroot(&vm->gc, &vm->tstack[i]); } + + vm->stdin = userdata_make(vm, (void *)stdin, &userdata_file); + vm->stdout = userdata_make(vm, (void *)stdout, &userdata_file); + vm->stderr = userdata_make(vm, (void *)stderr, &userdata_file); + + gc_addroot(&vm->gc, &vm->stdin); + gc_addroot(&vm->gc, &vm->stdout); + gc_addroot(&vm->gc, &vm->stderr); } V vm_deinit(Vm *vm) { diff --git a/src/vm.h b/src/vm.h index 0905463..8fb4b55 100644 --- a/src/vm.h +++ b/src/vm.h @@ -68,6 +68,9 @@ typedef struct Vm { Dt *dictionary; Ar arena; jmp_buf error; + + // These objects need to stay as roots! + O stdin, stdout, stderr; } Vm; enum {