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