Esempio n. 1
0
        public Expression SetValue(Compiler compiler, Expression rhs)
        {
            ParameterExpression left = Expression.Variable(rhs.Type);
            int count = this.ArrayLiteral.Elements.Count;
            List <Expression> expressions = new List <Expression> {
                Expression.Assign(left, rhs)
            };

            for (int i = 0; i < count; i++)
            {
                Expression      expression2    = Expression.Call(left, CachedReflectionInfo.IList_get_Item, new Expression[] { ExpressionCache.Constant(i) });
                ExpressionAst   ast            = this.ArrayLiteral.Elements[i];
                ArrayLiteralAst pureExpression = ast as ArrayLiteralAst;
                if (ast is ParenExpressionAst)
                {
                    pureExpression = ((ParenExpressionAst)ast).Pipeline.GetPureExpression() as ArrayLiteralAst;
                }
                if (pureExpression != null)
                {
                    expression2 = Expression.Dynamic(PSArrayAssignmentRHSBinder.Get(pureExpression.Elements.Count), typeof(IList), expression2);
                }
                expressions.Add(compiler.ReduceAssignment((ISupportsAssignment)ast, TokenKind.Equals, expression2));
            }
            expressions.Add(left);
            return(Expression.Block(new ParameterExpression[] { left }, expressions));
        }
        internal static PSArrayAssignmentRHSBinder Get(int i)
        {
            PSArrayAssignmentRHSBinder pSArrayAssignmentRHSBinder;

            lock (PSArrayAssignmentRHSBinder._binders)
            {
                while (PSArrayAssignmentRHSBinder._binders.Count <= i)
                {
                    PSArrayAssignmentRHSBinder._binders.Add(null);
                }
                PSArrayAssignmentRHSBinder item = PSArrayAssignmentRHSBinder._binders[i];
                PSArrayAssignmentRHSBinder pSArrayAssignmentRHSBinder1 = item;
                if (item == null)
                {
                    PSArrayAssignmentRHSBinder pSArrayAssignmentRHSBinder2 = new PSArrayAssignmentRHSBinder(i);
                    PSArrayAssignmentRHSBinder pSArrayAssignmentRHSBinder3 = pSArrayAssignmentRHSBinder2;
                    PSArrayAssignmentRHSBinder._binders[i] = pSArrayAssignmentRHSBinder2;
                    pSArrayAssignmentRHSBinder1            = pSArrayAssignmentRHSBinder3;
                }
                pSArrayAssignmentRHSBinder = pSArrayAssignmentRHSBinder1;
            }
            return(pSArrayAssignmentRHSBinder);
        }
 internal static PSArrayAssignmentRHSBinder Get(int i)
 {
     PSArrayAssignmentRHSBinder pSArrayAssignmentRHSBinder;
     lock (PSArrayAssignmentRHSBinder._binders)
     {
         while (PSArrayAssignmentRHSBinder._binders.Count <= i)
         {
             PSArrayAssignmentRHSBinder._binders.Add(null);
         }
         PSArrayAssignmentRHSBinder item = PSArrayAssignmentRHSBinder._binders[i];
         PSArrayAssignmentRHSBinder pSArrayAssignmentRHSBinder1 = item;
         if (item == null)
         {
             PSArrayAssignmentRHSBinder pSArrayAssignmentRHSBinder2 = new PSArrayAssignmentRHSBinder(i);
             PSArrayAssignmentRHSBinder pSArrayAssignmentRHSBinder3 = pSArrayAssignmentRHSBinder2;
             PSArrayAssignmentRHSBinder._binders[i] = pSArrayAssignmentRHSBinder2;
             pSArrayAssignmentRHSBinder1 = pSArrayAssignmentRHSBinder3;
         }
         pSArrayAssignmentRHSBinder = pSArrayAssignmentRHSBinder1;
     }
     return pSArrayAssignmentRHSBinder;
 }