initialize standard pipes in vm init to keep them rooted
This commit is contained in:
parent
45e2c0d406
commit
b98af7bdde
3 changed files with 16 additions and 10 deletions
10
src/file.c
10
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;
|
||||
}
|
||||
|
||||
|
|
|
|||
13
src/vm.c
13
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) {
|
||||
|
|
|
|||
3
src/vm.h
3
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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue