From d032c97b137b370ebb5fa50fa1715e89daad4ab2 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 26 Nov 2021 00:01:37 +0200 Subject: [PATCH] =?UTF-8?q?cache=20monadic=20=E2=80=A2Import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/fns.c | 10 ++++++++++ src/builtins/sysfn.c | 33 ++++++++++++++++++++++++++++++--- src/load.c | 2 ++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/builtins/fns.c b/src/builtins/fns.c index afbd8641..b46264b5 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -309,9 +309,19 @@ B count_c2(B t, B w, B x) { return c2(rt_count, w, x); } +H_b2i* prevImports; +i32 prevImportIdx(B path, i32 pos) { + if (prevImports==NULL) prevImports = m_b2i(16); + return swap_b2i(&prevImports, path, pos, -1); +} +void fun_gcFn() { + if (prevImports!=NULL) mm_visitP(prevImports); +} + void fns_init() { + gc_addFn(fun_gcFn); TIi(t_funBI,print) = print_funBI; TIi(t_funBI,identity) = funBI_identity; TIi(t_funBI,fn_uc1) = funBI_uc1; diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index d91fcbcc..7307951c 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -629,8 +629,35 @@ B flines_c2(B d, B w, B x) { return p; } static NFnDesc* importDesc; -B import_c1(B d, B x) { return bqn_execFile(path_rel(nfn_objU(d), x), emptySVec()); } -B import_c2(B d, B w, B x) { return bqn_execFile(path_rel(nfn_objU(d), x), w); } + + + +B import_c2(B d, B w, B x) { + return bqn_execFile(path_rel(nfn_objU(d), x), w); +} + +i32 prevImportIdx(B path, i32 pos); // defined in fns.c +static B importKeyList; +static B importValList; +B import_c1(B d, B x) { + if (importKeyList.u==0) { + importKeyList = emptyHVec(); + importValList = emptyHVec(); + } + B path = path_abs(path_rel(nfn_objU(d), x)); + i32 prevIdx = prevImportIdx(path, a(importKeyList)->ia); + if (prevIdx!=-1) { dec(path); return IGet(importValList, prevIdx); } + B r = bqn_execFile(inc(path), emptySVec()); + importKeyList = vec_add(importKeyList, path); + importValList = vec_add(importValList, inc(r)); + return r; +} +static void sys_gcFn() { + mm_visit(importKeyList); + mm_visit(importValList); +} + + static NFnDesc* listDesc; B list_c1(B d, B x) { return file_list(path_rel(nfn_objU(d), x)); @@ -849,7 +876,7 @@ B sys_c1(B t, B x) { B cdPath; void sysfn_init() { - cdPath = m_str8(1, "."); gc_add(cdPath); + cdPath = m_str8(1, "."); gc_add(cdPath); gc_addFn(sys_gcFn); fCharsDesc = registerNFn(m_str8l("(file).Chars"), fchars_c1, fchars_c2); fileAtDesc = registerNFn(m_str8l("(file).At"), fileAt_c1, fileAt_c2); fLinesDesc = registerNFn(m_str8l("(file).Lines"), flines_c1, flines_c2); diff --git a/src/load.c b/src/load.c index de0b1c6b..0fa292f9 100644 --- a/src/load.c +++ b/src/load.c @@ -525,6 +525,8 @@ void base_init() { // very first init function TIi(t_funBI,freeO) = TIi(t_md1BI,freeO) = TIi(t_md2BI,freeO) = builtin_free; TIi(t_funBI,freeF) = TIi(t_md1BI,freeF) = TIi(t_md2BI,freeF) = builtin_free; TIi(t_funBI,visit) = funBI_visit; + TIi(t_hashmap,visit) = noop_visit; + assert((MD1_TAG>>1) == (MD2_TAG>>1)); // just to be sure it isn't changed incorrectly, `isMd` depends on this #define FA(N,X) bi_##N = m_bfn(N##_c1, N##_c2, pf_##N);