fix import A →import B; import A

This commit is contained in:
dzaima 2021-11-26 12:23:46 +02:00
parent 4697b91b1e
commit 94e38e7162
2 changed files with 22 additions and 11 deletions

View File

@ -310,14 +310,18 @@ B count_c2(B t, B w, B x) {
} }
H_b2i* prevImports; H_b2i* prevImports;
i32 prevImportIdx(B path, i32 pos) { i32 getPrevImport(B path) { // -1 for unset, -2 for unfinished
if (prevImports==NULL) prevImports = m_b2i(16); if (prevImports==NULL) prevImports = m_b2i(16);
bool had;
i32 prev = mk_b2i(&prevImports, path, &had); bool had; i32 prev = mk_b2i(&prevImports, path, &had);
if (had) return prevImports->a[prev].val; if (had) return prevImports->a[prev].val;
prevImports->a[prev].val = pos; prevImports->a[prev].val = -2;
return -1; return -1;
} }
void setPrevImport(B path, i32 pos) {
bool had; i32 prev = mk_b2i(&prevImports, path, &had);
prevImports->a[prev].val = pos;
}
void fun_gcFn() { void fun_gcFn() {
if (prevImports!=NULL) mm_visitP(prevImports); if (prevImports!=NULL) mm_visitP(prevImports);
} }

View File

@ -636,8 +636,11 @@ B import_c2(B d, B w, B x) {
return bqn_execFile(path_rel(nfn_objU(d), x), w); return bqn_execFile(path_rel(nfn_objU(d), x), w);
} }
i32 prevImportIdx(B path, i32 pos); // defined in fns.c // defined in fns.c
static B importKeyList; // exists for GC roots i32 getPrevImport(B path);
i32 setPrevImport(B path, i32 pos);
static B importKeyList; // exists for GC roots as the hashmap doesn't
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,15 +648,19 @@ 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 prevLen = a(importKeyList)->ia;
i32 prevIdx = prevImportIdx(path, prevLen); i32 prevIdx = getPrevImport(path);
if (prevIdx!=-1) { if (prevIdx>=0) {
// print_fmt("cached: %R @ %i/%i\n", path, prevIdx, prevLen); // print_fmt("cached: %R @ %i/%i\n", path, prevIdx, a(importKeyList)->ia);
if (prevIdx>=prevLen) thrF("•Import: cyclic import of \"%R\"", path);
dec(path); dec(path);
return IGet(importValList, prevIdx); return IGet(importValList, prevIdx);
} }
if (prevIdx==-2) thrF("•Import: cyclic import of \"%R\"", path);
B r = bqn_execFile(inc(path), emptySVec()); B r = bqn_execFile(inc(path), emptySVec());
i32 prevLen = a(importKeyList)->ia;
// print_fmt("caching: %R @ %i\n", path, prevLen);
setPrevImport(path, prevLen);
importKeyList = vec_add(importKeyList, path); importKeyList = vec_add(importKeyList, path);
importValList = vec_add(importValList, inc(r)); importValList = vec_add(importValList, inc(r));
return r; return r;