Beispiel #1
0
Datei: p.c Projekt: 0branch/kona
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); } } } }
Beispiel #2
0
Datei: ko.c Projekt: elrzn/kona
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));
        )