Example #1
0
static solidtyp solcp( solidtyp sol, int deep, int pass, evalcontext* ecntxt )
{
  int i;
  solidtyp nsol;
  void *pp;

  if ( !sol )
    return NULL;
  nsol = newsol( ecntxt );
  if ( ecntxt->cycles->error )
    return NULL;
  *nsol = *sol;
  nsol->refcnt = 1;
  if ( sol->ttyp == ULmap )
    if ( deep )
    {
//      nsol->trf.trfi = *(maptyp*)cpyitem( ULmap, &sol->trf.trfi, 1, pass );
      cpyitem( ULmap, &pp, &sol->trf.trfi, 1, pass, ecntxt );
      nsol->trf.trfi = *(maptyp*)pp;
    }
    else
      refitem( ULmap, &sol->trf.trfi );
  if ( deep )
    for ( i = 0; i < nrnatr; i++ )
    {
//      nsol->natrb[i] = *(listtyp*)cpyitem( ULlist, &sol->natrb[i], 1, 0 );
      cpyitem( ULlist, &pp, &sol->natrb[i], 1, pass, ecntxt );
      nsol->natrb[i] = *(listtyp*)pp;
    }
  else
    for ( i = 0; i < nrnatr; i++ )
      refitem( ULlist, &sol->natrb[i] );
  if ( sol->isleaf )
  {
  /*
    if ( sol->tpart.leaf.isop )
      nsol->tpart.leaf.isop = copy_iso_data( sol->tpart.leaf.isop );
  */
    if ( deep )
      for ( i = 0; i < nrlatr; i++ )
      {
//        nsol->tpart.leaf.latrb[i] = *(listtyp*)cpyitem( ULlist, &sol->tpart.leaf.latrb[i], 1, 0 );
        cpyitem( ULlist, &pp, &sol->tpart.leaf.latrb[i], 1, pass, ecntxt );
        nsol->tpart.leaf.latrb[i] = *(listtyp*)pp;
      }
    else
      for ( i = 0; i < nrlatr; i++ )
	refitem( ULlist, &sol->tpart.leaf.latrb[i] );
  }
  else
  {
    nsol->tpart.node.lnode = solcp( sol->tpart.node.lnode, deep, pass, ecntxt );
    nsol->tpart.node.rnode = solcp( sol->tpart.node.rnode, deep, pass, ecntxt );
  }
  return nsol;
}
Example #2
0
static void ulgetlatr( int parcnt, genpar *pars, void *d0, void *d1, mapevalenviron* mapenv, evalcontext* ecntxt )
{
  inttyp ai;
  solidtyp sol;
  listtyp l;

  sol = *(solidtyp*)pars[0].parp;
  ai = *(inttyp*)pars[1].parp;
  if ( ai < 0 || ai >= nrlatr )
  {
    soldel( &sol );
    ecntxt->cycles->errormsg( 178 );
    return;
  }
  if ( !sol->isleaf )
  {
    soldel( &sol );
    ecntxt->cycles->errormsg( 179 );
    return;
  }
  l = sol->tpart.leaf.latrb[ai];
  refitem( ULlist, &l );
  soldel( &sol );
  ecntxt->stacks->pushand( ULlist, &l );
}
Example #3
0
static void ulthreadend( int parcnt, genpar *pars, void *d0, void *d1, mapevalenviron* mapenv, evalcontext* ecntxt )
{
  int ti = *(inttyp*)pars[0].parp;
  int tend = 0;
  ILThread* ilt = ILThread::getthread( ti );
  int ttp;
  if ( ilt && ( ttp = ilt->getThreadArgType() ) >= 0 )
  {
    void* ppp = ilt->getThreadArg();
    refitem( ttp, ppp );
    ecntxt->stacks->pushand( ttp, ppp );
    ilt->stop();
  }
  else
    ecntxt->stacks->pushand( ULint, &tend );
}
Example #4
0
static void ulsel( int parcnt, genpar *pars, void *d0, void *d1, mapevalenviron* mapenv, evalcontext* ecntxt )
{
  solidtyp sol, rsol;
  booltyp b;

  sol = *(solidtyp*)pars[0].parp;
  b = *(booltyp*)pars[1].parp;
  if ( sol->isleaf )
    rsol = sol;
  else
  {
    if ( !( b && ( rsol = sol->tpart.node.rnode ) ) )
      rsol = sol->tpart.node.lnode;
  }
  refitem( ULsol, &rsol );
  soldel( &sol );
  ecntxt->stacks->pushand( ULsol, &rsol );
}
Example #5
0
static void ultrfof( int parcnt, genpar *pars, void *d0, void *d1, mapevalenviron* mapenv, evalcontext* ecntxt )
{
  solidtyp sol;
  trf3typ t;
  maptyp m;

  sol = *(solidtyp*)pars[0].parp;
  if ( !sol->ttyp || sol->ttyp == ULtrf3 )
  {
    t = sol->trf.trfe;
    soldel( &sol );
    ecntxt->stacks->pushand( ULtrf3, &t );
  }
  else
  {
    m = sol->trf.trfi;
    refitem( ULmap, &m );
    soldel( &sol );
    ecntxt->stacks->pushand( ULmap, &m );
  }
}
Example #6
0
//don't register objs twice; boy that could go poorly
void
gc_register(void *obj, TYPE type) {
  ref *n = refitem(obj, type);
  append_unmarked(n); 
}