internal MemberAssignmentRewriter(MemberAssignment binding, StackSpiller spiller, Stack stack) : base(binding, spiller) { Result result = spiller.RewriteExpression(binding.Expression, stack); _action = result.Action; _rhs = result.Node; }
private static AnalyzedTree AnalyzeLambda(ref LambdaExpression lambda) { // Spill the stack for any exception handling blocks or other // constructs which require entering with an empty stack lambda = StackSpiller.AnalyzeLambda(lambda); // Bind any variable references in this lambda return(VariableBinder.Bind(lambda)); }
internal MemberMemberBindingRewriter(MemberMemberBinding binding, StackSpiller spiller, Stack stack) : base(binding, spiller) { _bindings = binding.Bindings; _bindingRewriters = new BindingRewriter[_bindings.Count]; for (int i = 0; i < _bindings.Count; i++) { BindingRewriter br = BindingRewriter.Create(_bindings[i], spiller, stack); _action |= br.Action; _bindingRewriters[i] = br; } }
internal static BindingRewriter Create(MemberBinding binding, StackSpiller spiller, Stack stack) { switch (binding.BindingType) { case MemberBindingType.Assignment: MemberAssignment assign = (MemberAssignment)binding; return new MemberAssignmentRewriter(assign, spiller, stack); case MemberBindingType.ListBinding: MemberListBinding list = (MemberListBinding)binding; return new ListBindingRewriter(list, spiller, stack); case MemberBindingType.MemberBinding: MemberMemberBinding member = (MemberMemberBinding)binding; return new MemberMemberBindingRewriter(member, spiller, stack); } throw Error.UnhandledBinding(); }
// InvocationExpression private Result RewriteInvocationExpression(Expression expr, Stack stack) { InvocationExpression node = (InvocationExpression)expr; ChildRewriter cr; // See if the lambda will be inlined LambdaExpression lambda = node.LambdaOperand; if (lambda != null) { // Arguments execute on current stack cr = new ChildRewriter(this, stack, node.Arguments.Count); cr.Add(node.Arguments); if (cr.Action == RewriteAction.SpillStack) { RequireNoRefArgs(Expression.GetInvokeMethod(node.Expression)); } // Lambda body also executes on current stack var spiller = new StackSpiller(stack); lambda = lambda.Accept(spiller); if (cr.Rewrite || spiller._lambdaRewrite != RewriteAction.None) { node = new InvocationExpression(lambda, cr[0, -1], node.Type); } Result result = cr.Finish(node); return(new Result(result.Action | spiller._lambdaRewrite, result.Node)); } cr = new ChildRewriter(this, stack, node.Arguments.Count + 1); // first argument starts on stack as provided cr.Add(node.Expression); // rest of arguments have non-empty stack (delegate instance on the stack) cr.Add(node.Arguments); if (cr.Action == RewriteAction.SpillStack) { RequireNoRefArgs(Expression.GetInvokeMethod(node.Expression)); } return(cr.Finish(cr.Rewrite ? new InvocationExpression(cr[0], cr[1, -1], node.Type) : expr)); }
internal ListBindingRewriter(MemberListBinding binding, StackSpiller spiller, Stack stack) : base(binding, spiller) { _inits = binding.Initializers; _childRewriters = new ChildRewriter[_inits.Count]; for (int i = 0; i < _inits.Count; i++) { ElementInit init = _inits[i]; ChildRewriter cr = new ChildRewriter(spiller, stack, init.Arguments.Count); cr.Add(init.Arguments); _action |= cr.Action; _childRewriters[i] = cr; } }
internal static BindingRewriter Create(MemberBinding binding, StackSpiller spiller, Stack stack) { switch (binding.BindingType) { case MemberBindingType.Assignment: MemberAssignment assign = (MemberAssignment)binding; return(new MemberAssignmentRewriter(assign, spiller, stack)); case MemberBindingType.ListBinding: MemberListBinding list = (MemberListBinding)binding; return(new ListBindingRewriter(list, spiller, stack)); case MemberBindingType.MemberBinding: MemberMemberBinding member = (MemberMemberBinding)binding; return(new MemberMemberBindingRewriter(member, spiller, stack)); } throw Error.UnhandledBinding(); }
internal override LambdaExpression Accept(StackSpiller spiller) { return(spiller.Rewrite(this)); }
internal abstract LambdaExpression Accept(StackSpiller spiller);
internal BindingRewriter(MemberBinding binding, StackSpiller spiller) { _binding = binding; _spiller = spiller; }
public static LambdaExpression Accept(this LambdaExpression expression, StackSpiller spiller) { return((LambdaExpression) new SpillVisitor(spiller).Visit(expression)); }
public static Expression Spill(Expression expression) { var spilled = StackSpiller.AnalyzeLambda(Expression.Lambda(expression)).Body; return(spilled); }
internal ChildRewriter(StackSpiller self, Stack stack, int count) { _self = self; _stack = stack; _expressions = new Expression[count]; }
public SpillVisitor(StackSpiller spiller) { _spiller = spiller; }
internal override LambdaExpression Accept(StackSpiller spiller) { return(spiller.Rewrite <TDelegate>((Expression <TDelegate>) this)); }