fix >2 repeated imports & error on cyclical importing
This commit is contained in:
parent
d032c97b13
commit
4697b91b1e
@ -312,7 +312,11 @@ B count_c2(B t, B w, B x) {
|
|||||||
H_b2i* prevImports;
|
H_b2i* prevImports;
|
||||||
i32 prevImportIdx(B path, i32 pos) {
|
i32 prevImportIdx(B path, i32 pos) {
|
||||||
if (prevImports==NULL) prevImports = m_b2i(16);
|
if (prevImports==NULL) prevImports = m_b2i(16);
|
||||||
return swap_b2i(&prevImports, path, pos, -1);
|
bool had;
|
||||||
|
i32 prev = mk_b2i(&prevImports, path, &had);
|
||||||
|
if (had) return prevImports->a[prev].val;
|
||||||
|
prevImports->a[prev].val = pos;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
void fun_gcFn() {
|
void fun_gcFn() {
|
||||||
if (prevImports!=NULL) mm_visitP(prevImports);
|
if (prevImports!=NULL) mm_visitP(prevImports);
|
||||||
|
|||||||
@ -637,7 +637,7 @@ B import_c2(B d, B w, B x) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
i32 prevImportIdx(B path, i32 pos); // defined in fns.c
|
i32 prevImportIdx(B path, i32 pos); // defined in fns.c
|
||||||
static B importKeyList;
|
static B importKeyList; // exists for GC roots
|
||||||
static B importValList;
|
static B importValList;
|
||||||
B import_c1(B d, B x) {
|
B import_c1(B d, B x) {
|
||||||
if (importKeyList.u==0) {
|
if (importKeyList.u==0) {
|
||||||
@ -645,8 +645,14 @@ B import_c1(B d, B x) {
|
|||||||
importValList = emptyHVec();
|
importValList = emptyHVec();
|
||||||
}
|
}
|
||||||
B path = path_abs(path_rel(nfn_objU(d), x));
|
B path = path_abs(path_rel(nfn_objU(d), x));
|
||||||
i32 prevIdx = prevImportIdx(path, a(importKeyList)->ia);
|
i32 prevLen = a(importKeyList)->ia;
|
||||||
if (prevIdx!=-1) { dec(path); return IGet(importValList, prevIdx); }
|
i32 prevIdx = prevImportIdx(path, prevLen);
|
||||||
|
if (prevIdx!=-1) {
|
||||||
|
// print_fmt("cached: %R @ %i/%i\n", path, prevIdx, prevLen);
|
||||||
|
if (prevIdx>=prevLen) thrF("•Import: cyclic import of \"%R\"", path);
|
||||||
|
dec(path);
|
||||||
|
return IGet(importValList, prevIdx);
|
||||||
|
}
|
||||||
B r = bqn_execFile(inc(path), emptySVec());
|
B r = bqn_execFile(inc(path), emptySVec());
|
||||||
importKeyList = vec_add(importKeyList, path);
|
importKeyList = vec_add(importKeyList, path);
|
||||||
importValList = vec_add(importValList, inc(r));
|
importValList = vec_add(importValList, inc(r));
|
||||||
@ -881,9 +887,9 @@ void sysfn_init() {
|
|||||||
fileAtDesc = registerNFn(m_str8l("(file).At"), fileAt_c1, fileAt_c2);
|
fileAtDesc = registerNFn(m_str8l("(file).At"), fileAt_c1, fileAt_c2);
|
||||||
fLinesDesc = registerNFn(m_str8l("(file).Lines"), flines_c1, flines_c2);
|
fLinesDesc = registerNFn(m_str8l("(file).Lines"), flines_c1, flines_c2);
|
||||||
fBytesDesc = registerNFn(m_str8l("(file).Bytes"), fbytes_c1, fbytes_c2);
|
fBytesDesc = registerNFn(m_str8l("(file).Bytes"), fbytes_c1, fbytes_c2);
|
||||||
|
listDesc = registerNFn(m_str8l("(file).List"), list_c1, c2_bad);
|
||||||
importDesc = registerNFn(m_str32(U"•Import"), import_c1, import_c2);
|
importDesc = registerNFn(m_str32(U"•Import"), import_c1, import_c2);
|
||||||
reBQNDesc = registerNFn(m_str8l("(REPL)"), repl_c1, repl_c2);
|
reBQNDesc = registerNFn(m_str8l("(REPL)"), repl_c1, repl_c2);
|
||||||
listDesc = registerNFn(m_str32(U"•file.List"), list_c1, c2_bad);
|
|
||||||
}
|
}
|
||||||
void sysfnPost_init() {
|
void sysfnPost_init() {
|
||||||
file_nsGen = bqn_exec(m_str32(U"{⟨path,At,List,Bytes,Chars,Lines⟩⇐𝕩}"), emptyCVec(), emptySVec()); gc_add(file_nsGen);
|
file_nsGen = bqn_exec(m_str32(U"{⟨path,At,List,Bytes,Chars,Lines⟩⇐𝕩}"), emptyCVec(), emptySVec()); gc_add(file_nsGen);
|
||||||
|
|||||||
@ -317,6 +317,7 @@ NOINLINE void print_fmt(char* p, ...) {
|
|||||||
B r = do_fmt(emptyCVec(), p, a);
|
B r = do_fmt(emptyCVec(), p, a);
|
||||||
va_end(a);
|
va_end(a);
|
||||||
printRaw(r);
|
printRaw(r);
|
||||||
|
dec(r);
|
||||||
}
|
}
|
||||||
NOINLINE void thrF(char* p, ...) {
|
NOINLINE void thrF(char* p, ...) {
|
||||||
va_list a;
|
va_list a;
|
||||||
|
|||||||
@ -2,10 +2,10 @@
|
|||||||
u64 gc_depth = 1;
|
u64 gc_depth = 1;
|
||||||
|
|
||||||
|
|
||||||
vfn gc_roots[16];
|
vfn gc_roots[32];
|
||||||
u32 gc_rootSz;
|
u32 gc_rootSz;
|
||||||
void gc_addFn(vfn f) {
|
void gc_addFn(vfn f) {
|
||||||
if (gc_rootSz>=16) err("Too many GC roots");
|
if (gc_rootSz>=32) err("Too many GC root functions");
|
||||||
gc_roots[gc_rootSz++] = f;
|
gc_roots[gc_rootSz++] = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user