From b98af7bdded69038c986afadcc21a24fc160b56a Mon Sep 17 00:00:00 2001 From: "Javier B. Torres" Date: Fri, 23 Jan 2026 11:20:21 -0300 Subject: [PATCH] initialize standard pipes in vm init to keep them rooted --- src/file.c | 10 ++-------- src/vm.c | 13 +++++++++++-- src/vm.h | 3 +++ 3 files changed, 16 insertions(+), 10 deletions(-) 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 {