From 4af5f3d4a6db8bf3fecb39f3c8f128cffc7da306 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 28 Nov 2021 21:56:01 +0200 Subject: [PATCH] store Value* as gc roots --- src/builtins/sysfn.c | 2 +- src/opt/gc.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index ad32cb9a..93647bb5 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -638,7 +638,7 @@ B import_c2(B d, B w, B x) { // defined in fns.c i32 getPrevImport(B path); -i32 setPrevImport(B path, i32 pos); +void setPrevImport(B path, i32 pos); static B importKeyList; // exists for GC roots as the hashmap doesn't static B importValList; diff --git a/src/opt/gc.c b/src/opt/gc.c index 0250d4af..b073f3f9 100644 --- a/src/opt/gc.c +++ b/src/opt/gc.c @@ -9,11 +9,12 @@ void gc_addFn(vfn f) { gc_roots[gc_rootSz++] = f; } -B gc_rootObjs[256]; +Value* gc_rootObjs[256]; u32 gc_rootObjSz; void gc_add(B x) { + assert(isVal(x)); if (gc_rootObjSz>=256) err("Too many GC root objects"); - gc_rootObjs[gc_rootObjSz++] = x; + gc_rootObjs[gc_rootObjSz++] = v(x); } @@ -53,7 +54,7 @@ static void gc_resetTag(Value* x) { void gc_visitRoots() { for (u32 i = 0; i < gc_rootSz; i++) gc_roots[i](); - for (u32 i = 0; i < gc_rootObjSz; i++) mm_visit(gc_rootObjs[i]); + for (u32 i = 0; i < gc_rootObjSz; i++) mm_visitP(gc_rootObjs[i]); } u64 gc_lastAlloc; void gc_forceGC() {