protected override Expression VisitParameter(ParameterExpression node)
        {
            Expression closureItem = this.GetClosureItem(node, true);

            if (closureItem == null)
            {
                return(node);
            }
            return(Utils.Convert(closureItem, node.Type));
        }
Exemple #2
0
 public DynamicMetaObject GetMetaObject(Expression parameter, int index)
 {
     return(DynamicMetaObject.Create(
                GetArgument(index),
                Expression.Call(
                    s_getArgMethod,
                    AstUtils.Convert(parameter, typeof(ArgumentArray)),
                    AstUtils.Constant(index)
                    )
                ));
 }
Exemple #3
0
        internal Func <object[], StrongBox <object>[], InterpretedFrame, int> CreateDelegate()
        {
            Expression body = this.Visit(this._loop);
            ReadOnlyCollectionBuilder <Expression> expressions = new ReadOnlyCollectionBuilder <Expression>();
            ReadOnlyCollectionBuilder <Expression> builder2    = new ReadOnlyCollectionBuilder <Expression>();

            foreach (KeyValuePair <ParameterExpression, LoopVariable> pair in this._loopVariables)
            {
                LocalVariable variable;
                if (!this._outerVariables.TryGetValue(pair.Key, out variable))
                {
                    variable = this._closureVariables[pair.Key];
                }
                Expression right = variable.LoadFromArray(this._frameDataVar, this._frameClosureVar);
                if (variable.InClosureOrBoxed)
                {
                    ParameterExpression boxStorage = pair.Value.BoxStorage;
                    expressions.Add(Expression.Assign(boxStorage, right));
                    this.AddTemp(boxStorage);
                }
                else
                {
                    expressions.Add(Expression.Assign(pair.Key, Utils.Convert(right, pair.Key.Type)));
                    if ((pair.Value.Access & ExpressionAccess.Write) != ExpressionAccess.None)
                    {
                        builder2.Add(Expression.Assign(right, Utils.Box(pair.Key)));
                    }
                    this.AddTemp(pair.Key);
                }
            }
            if (builder2.Count > 0)
            {
                expressions.Add(Expression.TryFinally(body, Expression.Block(builder2)));
            }
            else
            {
                expressions.Add(body);
            }
            expressions.Add(Expression.Label(this._returnLabel, Expression.Constant(this._loopEndInstructionIndex - this._loopStartInstructionIndex)));
            return(Expression.Lambda <Func <object[], StrongBox <object>[], InterpretedFrame, int> >((this._temps != null) ? Expression.Block((IEnumerable <ParameterExpression>) this._temps.ToReadOnlyCollection(), (IEnumerable <Expression>)expressions) : Expression.Block(expressions), new ParameterExpression[] { this._frameDataVar, this._frameClosureVar, this._frameVar }).Compile());
        }
 protected override Expression VisitBinary(BinaryExpression node)
 {
     if ((node.NodeType == ExpressionType.Assign) && (node.Left.NodeType == ExpressionType.Parameter))
     {
         ParameterExpression left        = (ParameterExpression)node.Left;
         Expression          closureItem = this.GetClosureItem(left, true);
         if (closureItem != null)
         {
             return(Expression.Block(new ParameterExpression[] { left }, new Expression[] { Expression.Assign(left, this.Visit(node.Right)), Expression.Assign(closureItem, Utils.Convert(left, typeof(object))), left }));
         }
     }
     return(base.VisitBinary(node));
 }