protected override Expression VisitParameter(ParameterExpression node) { Expression closureItem = this.GetClosureItem(node, true); if (closureItem == null) { return(node); } return(Utils.Convert(closureItem, node.Type)); }
public DynamicMetaObject GetMetaObject(Expression parameter, int index) { return(DynamicMetaObject.Create( GetArgument(index), Expression.Call( s_getArgMethod, AstUtils.Convert(parameter, typeof(ArgumentArray)), AstUtils.Constant(index) ) )); }
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)); }