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; }
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 ); }
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 ); }
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 ); }
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 ); } }
//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); }