Z void dum7(K*_v,I a){ K v=*_v; int n=0;I vt=v->t,vn=v->n,f=1; S typ7[]={"wd","wordfn","cfn","charfn",":[]","if[]","while[]","do[]"}; V e=0;V*kw=kW(v); if(!a)O("\n"); if(7==vt){ A(a);O("[%lld,%lld,%lld,%s]\n",vt,vn,rc(v),typ7[vn]); SW(vn){ CS(2, A(a);O(" val: %p %p %p\n",kw[0],kw[1],kw[2])) CD: { K par=(K)kV(v)[PARAMS],loc=(K)kV(v)[PARAMS],conj=(K)kV(v)[CONJ]; if(par->n){A(a);O("params: ");dum7(&par,a+2);} if(loc->n){A(a);O("locals: ");dum7(&loc,a+2);} if(conj){A(a);O(" conj: ");dum7(&conj,a+2);} if(3==vn){ K cw=(K)kV(v)[CACHE_WD];K ct=(K)kV(v)[CACHE_TREE]; if(cw){A(a);O(" cachewd: ");dum7(&cw,a+2);} if(ct){A(a);O("cachetree: ");dum7(&ct,a+2);} A(a);showx(v); } else while((e=*kw++)){ if(f){A(a);O("entries-->\n");f=0;} A(a);O("%d entry",n++); if((L)e<DT_SIZE){O(" dt: %s (%p)\n",DT[(L)e].text,e);} else dum7((K*)e,a+2); } } } }
K kclone(K a)//Deep copy -- eliminate where possible { if(!a) R 0; I t=a->t,n=a->n; K z= 7==t?Kv():newK(t,n); if (4==ABS(t)) DO(n, kS(z)[i]=kS(a)[i]) //memcpy everywhere is better else if(3==ABS(t)) DO(n, kC(z)[i]=kC(a)[i]) else if(2==ABS(t)) DO(n, kF(z)[i]=kF(a)[i]) else if(1==ABS(t)) DO(n, kI(z)[i]=kI(a)[i]) else if(0== t ) DO(n, kK(z)[i]=kclone(kK(a)[i])) else if(5== t ) DO(n, kK(z)[i]=kclone(kK(a)[i])) else if(7== t ) { I k=0; z->t=a->t; I vt=z->n = a->n; K kv; V*v; SW(vt) { CS(1, k=((K)kV(a)[CODE])->n-1; M(z,kv=newK(-4,k+1)) v=(V*)kK(kv); //v[k]=0;//superfluous reminder DO(k, V w=kW(a)[i]; if(VA(w))v[i]=w; //TODO: is this ok for NAMES? see similar code in capture() else { K r=kclone(*(K*)w); //oom V q=newE(LS,r); //oom kap((K*) kV(z)+LOCALS,&q);//oom cd(q);//kap does ci q=EVP(q); //oom free z etc. kap needs checking v[i]=q; } ) ) CS(2, M(z,kv=newK(-4,3)) v=(V*)kK(kv); memcpy(v,kW(a),3*sizeof(V)); )