Example #1
0
static void ultrfrm( int parcnt, genpar *pars, void *d0, void *d1, mapevalenviron* mapenv, evalcontext* ecntxt )
{
  maptyp mp, mp0;
  int mtyp;
  solidtyp sol;
  implinst coercf;

  mp0 = mp = *(maptyp*)pars[1].parp;
  sol = *(solidtyp*)pars[0].parp;
  mtyp = mp->type;
  if ( mtyp != ULtrf3 )
    if ( coercf = coercible( ULtrf3, mtyp, -1 ) )
      mp0 = newmap( ULtrf3, 1, pars+1, 0, coercf, ecntxt, 0 );
    else
      ecntxt->cycles->errormsg( 149 );
  if ( ecntxt->cycles->error )
  {
    soldel( &sol );
    delitem( ULmap, &mp );
    return;
  }
  mp = mp0;
  if ( !sol->ttyp )
  {
    sol->ttyp = ULmap;
    sol->trf.trfi = mp;
  }
  else
  {
    *(maptyp*)pars[1].parp = mp;
    if ( sol->ttyp == ULmap )
    {
      *(maptyp*)pars[0].parp = sol->trf.trfi;
      pars[0].type = ULmap;
    }
    else
    {
      *(trf3typ*)pars[0].parp = sol->trf.trfe;
      pars[0].type = ULtrf3;
    }
    sol->ttyp = ULmap;
    sol->trf.trfi = newmap( ULtrf3, 2, pars, 0, (implinst)ult3prd, ecntxt, 0 );
    if ( mp->idep & DEP3c )
      sol->trf.trfi->mpar[1].ppeval = true;
  }
  if ( ecntxt->cycles->error )
  {
    soldel( &sol );
    delitem( ULmap, &mp );
  }
  ecntxt->stacks->pushand( ULsol, &sol );
}
Example #2
0
File: utils.c Project: UPPMAX/irods
int coercible(ExprType *a, ExprType *b) {
            return (getNodeType(a)!=T_CONS && getNodeType(a) == getNodeType(b)) ||
                   (getNodeType(b) == T_DOUBLE && getNodeType(a) == T_INT) ||
                   (getNodeType(b) == T_DOUBLE && getNodeType(a) == T_STRING) ||
                   (getNodeType(b) == T_INT && getNodeType(a) == T_DOUBLE) ||
                   (getNodeType(b) == T_INT && getNodeType(a) == T_STRING) ||
                   (getNodeType(b) == T_STRING && getNodeType(a) == T_INT) ||
                   (getNodeType(b) == T_STRING && getNodeType(a) == T_DOUBLE) ||
                   (getNodeType(b) == T_STRING && getNodeType(a) == T_BOOL) ||
                   (getNodeType(b) == T_BOOL && getNodeType(a) == T_STRING) ||
                   (getNodeType(b) == T_DATETIME && getNodeType(a) == T_INT) ||
                   (getNodeType(b) == T_DATETIME && getNodeType(a) == T_DOUBLE) ||
                   (getNodeType(b) == T_DYNAMIC) ||
                   (getNodeType(a) == T_DYNAMIC) ||
                   (getNodeType(a)==T_CONS && getNodeType(b)==T_CONS && coercible(T_CONS_TYPE_ARG(a, 0), T_CONS_TYPE_ARG(b, 0)));
}
Example #3
0
void ilparser::comAssign( symptyp sympnt, bool def )
{
    datpnt *symdatp = mContext->hasher->tabdatadr( &sympnt );
    int valstack = sympnt.local ? IDVAL : GLBVAL;
    int idt = symdatp->tp;
    int vlt = newval.tp;
    if ( idt )
    {
        if ( def )
        {
            mContext->stacks->chkdel( OPAND, &newval );
            mContext->cycles->errormsg( 294 );
            return;
        }
        if ( idt != vlt )
        {
            implinst coercf;
            if ( idt == ULmap && ilstatic( vlt ) )
            {
                genpar par;
                par.parp = mContext->stacks->stackadr( OPAND, newval.sp );
                par.type = vlt;
                mContext->stacks->chkdel( valstack, symdatp );
                cmap( 1, &par, (maptyp*)mContext->stacks->stackadr( valstack, symdatp->sp ), NULL, NULL, mContext );
            }
            else if ( coercf = coercible( idt, vlt, -1 ) )
            {
                genpar par;
                par.parp = mContext->stacks->stackadr( OPAND, newval.sp );
                par.type = vlt;
                (*coercf)( 1, &par, mContext->stacks->stackadr( valstack, symdatp->sp ), NULL, NULL, mContext );
            }
            else
            {
                mContext->stacks->chkdel( OPAND, &newval );
                mContext->cycles->errormsg( 140 );
            }
        }
        else
        {
            mContext->stacks->chkdel( valstack, symdatp );
            memcpy( mContext->stacks->stackadr( valstack, symdatp->sp ),
                    mContext->stacks->stackadr( OPAND, newval.sp ),
                    typesize( vlt ) );
        }
    }
    else
    {
        symdatp->sp = mContext->stacks->push( valstack,
                                              mContext->stacks->stackadr( OPAND, newval.sp ),
                                              typesize( newval.tp ) );
        if ( mContext->cycles->error )
        {
            mContext->stacks->chkdel( OPAND, &newval );
            return;
        }
        symdatp->tp = vlt;
        if ( def )
            mContext->hasher->pprotect( &sympnt );
    }
    if ( mContext->cycles->error )
        return;
    mContext->stacks->setspnt( OPAND, idadr.sp - 1 );
    mContext->stacks->chkref( OPAND, &newval );
    mContext->stacks->pushand( vlt, mContext->stacks->stackadr( OPAND, newval.sp ) );
}