@include @define mknsraw(ons, typetab, symtab, name) { @local type, sym, addr, undef; @local lt, ls, et, es, la, ns; @local ltresolve; printf("all right.\n"); @defloc resetltr() { ltresolve = mkresolve(type, undef, @lambda(tn){ @local td; tn = typename(tn); /* ? */ td = typetab[tn]; if(td) return td; /* FIXME: or looktype? */ return ons.looktype(tn); }); } type = [:]; sym = [:]; addr = [:]; undef = [:]; resetltr(); @define lt(this, tn) { @local t; t = ltresolve(tn); if(isundeftype(t)) return nil; return t; } @define et(this) { @local resolve, ts; // FIXME: maybe only muxenumtype if we haven't before /* reset cache */ type = [:]; undef = [:]; resetltr(); ts = ons.enumtype(); resolve = mkresolve(type, undef, @lambda(tn){ @local td; tn = typename(tn); td = typetab[ns]; if(td) return td; return ts[typename(tn)]; }); foreach(@lambda(k, v){ resolve(k); }, typetab); foreach(@lambda(k, v){ resolve(k); }, ts); if(length(undef) > 0){ printf("%d unresolved\n", length(undef)); foreach(@lambda(k, v){ printf("\t%t\n", k); }, undef); } return type; } @defloc fixsym(sym) { @local t, s; t = ltresolve(typename(symtype(sym))); s = mksym(t, symid(sym), symattr(sym)); return s; } @define ls(this, name) { @local s; s = sym[name]; if(s != nil) return s; s = symtab[name]; if(s == nil) s = ons.looksym(s); if(s != nil){ s = fixsym(s); sym[name] = s; addr[symoff(s)] = s; } return s; } @define es(this) { @defloc add(id, s) { if(s){ s = fixsym(s); sym[symid(s)] = s; addr[symoff(s)] = s; } } /* reset cache */ sym = [:]; /* why does the code this came from iterate over non-tables? */ foreach(add, ons.enumsym()); foreach(add, symtab); return sym; } @define la(this, a) { error("lookaddr is unimplemented"); } ns = mkns([ "looktype" : lt, "enumtype" : et, "looksym" : ls, "enumsym" : es, "lookaddr" : la ]); return ns; }