Changeset 188de86 in git for Singular/newstruct.cc


Ignore:
Timestamp:
Aug 2, 2012, 4:09:13 PM (11 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'c987db42cd2ec943b97ac5746c99892ceddf909c')
Children:
4f9652847609cefd5ff3b91d14f34611592ab699
Parents:
0419aba8292e7109329604d8ad03b70f8ef6542344a1c2199e33375a631289eaab7a81954c8383e2
Message:
Merge pull request #158 from alexanderdreyer/spielwiese

Transfering newstruct and pyobject fixes to Spielwiese
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/newstruct.cc

    r0419ab r188de86  
    3939};
    4040
     41int newstruct_desc_size()
     42{
     43  return sizeof(newstruct_desc_s);
     44}
    4145
    4246char * newstruct_String(blackbox *b, void *d)
     
    4650  {
    4751    newstruct_desc ad=(newstruct_desc)(b->data);
     52
     53    newstruct_proc p=ad->procs;
     54    while((p!=NULL)&&(p->t!=STRING_CMD))
     55      p=p->next;
     56
     57    if (p!=NULL)
     58    {
     59      leftv sl;
     60      sleftv tmp;
     61      memset(&tmp,0,sizeof(tmp));
     62      tmp.rtyp=ad->id;
     63      void * newstruct_Copy(blackbox*, void *); //forward declaration
     64      tmp.data=(void*)newstruct_Copy(b,d);
     65      idrec hh;
     66      memset(&hh,0,sizeof(hh));
     67      hh.id=Tok2Cmdname(p->t);
     68      hh.typ=PROC_CMD;
     69      hh.data.pinf=p->p;
     70      sl=iiMake_proc(&hh,NULL,&tmp);
     71
     72      if (sl->Typ() == STRING_CMD)
     73      {
     74        char *res = omStrDup((char*)sl->Data());
     75        sl->CleanUp();
     76        return res;
     77      }
     78      else
     79        sl->CleanUp();     
     80    }
     81
    4882    lists l=(lists)d;
    4983    newstruct_member a=ad->member;
     
    130164}
    131165
     166// Used by newstruct_Assign for overloaded '='
     167BOOLEAN newstruct_equal(int op, leftv l, leftv r)
     168{
     169  blackbox *ll=getBlackboxStuff(op);
     170  assume(ll->data != NULL);
     171  newstruct_desc nt=(newstruct_desc)ll->data;
     172  newstruct_proc p=nt->procs;
     173 
     174  while( (p!=NULL) && ((p->t!='=')||(p->args!=1)) ) p=p->next;
     175
     176  if (p!=NULL)
     177  {
     178    idrec hh;
     179    memset(&hh,0,sizeof(hh));
     180    hh.id=Tok2Cmdname(p->t);
     181    hh.typ=PROC_CMD;
     182    hh.data.pinf=p->p;
     183    sleftv tmp;
     184    memset(&tmp,0,sizeof(sleftv));
     185    tmp.Copy(r);
     186    leftv sl = iiMake_proc(&hh, NULL, &tmp);
     187    if (sl != NULL)
     188    {
     189      if (sl->Typ() == op) { l->Copy(sl); return FALSE;}
     190      else sl->CleanUp();
     191    }
     192  }
     193  return TRUE;
     194}
     195
    132196BOOLEAN newstruct_Assign(leftv l, leftv r)
    133197{
     
    138202    {
    139203      newstruct_desc rrn=(newstruct_desc)rr->data;
     204
     205      if (!rrn)
     206      {
     207        Werror("custom type %s(%d) cannot be assigned to newstruct %s(%d)",
     208               Tok2Cmdname(r->Typ()), r->Typ(), Tok2Cmdname(l->Typ()), l->Typ());
     209        return TRUE;
     210      }
     211
    140212      newstruct_desc rrp=rrn->parent;
    141213      while ((rrp!=NULL)&&(rrp->id!=l->Typ())) rrp=rrp->parent;
     
    151223        }
    152224      }
     225      else                      // unrelated types - look for custom conversion
     226      {
     227        sleftv tmp;
     228        BOOLEAN newstruct_Op1(int, leftv, leftv);  // forward declaration
     229        if (! newstruct_Op1(l->Typ(), &tmp, r))  return newstruct_Assign(l, &tmp);
     230      }
    153231    }
    154232    if (l->Typ()==r->Typ())
     
    172250    }
    173251  }
     252
     253  else if(l->Typ() > MAX_TOK)
     254  {
     255    assume(l->Typ() > MAX_TOK);
     256    sleftv tmp;
     257    if(!newstruct_equal(l->Typ(), &tmp, r)) return newstruct_Assign(l, &tmp);
     258  }
    174259  Werror("assign %s(%d) = %s(%d)",
    175260        Tok2Cmdname(l->Typ()),l->Typ(),Tok2Cmdname(r->Typ()),r->Typ());
    176261  return TRUE;
    177262}
     263
     264BOOLEAN newstruct_Op1(int op, leftv res, leftv arg)
     265{
     266  // interpreter: arg is newstruct
     267  blackbox *a=getBlackboxStuff(arg->Typ());
     268  newstruct_desc nt=(newstruct_desc)a->data;
     269  newstruct_proc p=nt->procs;
     270
     271  while((p!=NULL) &&( (p->t!=op) || (p->args!=1) )) p=p->next;
     272
     273  if (p!=NULL)
     274  {
     275    leftv sl;
     276    sleftv tmp;
     277    memset(&tmp,0,sizeof(sleftv));
     278    tmp.Copy(arg);
     279    idrec hh;
     280    memset(&hh,0,sizeof(hh));
     281    hh.id=Tok2Cmdname(p->t);
     282    hh.typ=PROC_CMD;
     283    hh.data.pinf=p->p;
     284    sl=iiMake_proc(&hh,NULL,&tmp);
     285    if (sl==NULL) return TRUE;
     286    else
     287    {
     288      res->Copy(sl);
     289      return FALSE;
     290    }
     291  }
     292  return blackboxDefaultOp1(op,res,arg);
     293}
     294
     295
    178296
    179297BOOLEAN newstruct_Op2(int op, leftv res, leftv a1, leftv a2)
     
    280398  }
    281399  newstruct_proc p=nt->procs;
    282   while((p!=NULL) &&(p->t=op)&&(p->args!=2)) p=p->next;
     400  while((p!=NULL) && ( (p->t!=op) || (p->args!=2) )) p=p->next;
    283401  if (p!=NULL)
    284402  {
     
    323441  }
    324442  newstruct_proc p=nt->procs;
    325   while((p!=NULL) &&(p->t=op)&&(p->args!=4)) p=p->next;
     443 
     444  while((p!=NULL) &&( (p->t!=op) || (p->args!=4) )) p=p->next;
     445
    326446  if (p!=NULL)
    327447  {
     
    474594  b->blackbox_Copy=newstruct_Copy;
    475595  b->blackbox_Assign=newstruct_Assign;
    476   //b->blackbox_Op1=blackboxDefaultOp1;
     596  b->blackbox_Op1=newstruct_Op1;
    477597  b->blackbox_Op2=newstruct_Op2;
    478598  //b->blackbox_Op3=blackbox_default_Op3;
     
    617737  newstruct_proc p=(newstruct_proc)omAlloc(sizeof(*p));
    618738  p->next=desc->procs; desc->procs=p;
     739
     740  idhdl save_ring=currRingHdl;
     741  currRingHdl=(idhdl)1; // fake ring detection
     742
    619743  if(!IsCmd(func,p->t))
    620744  {
     
    628752    {
    629753      Werror(">>%s<< is not a kernel command",func);
     754      currRingHdl = save_ring;
    630755      return TRUE;
    631756    }
     
    633758  p->args=args;
    634759  p->p=pr; pr->ref++;
     760  currRingHdl = save_ring;
    635761  return FALSE;
    636762}
Note: See TracChangeset for help on using the changeset viewer.