Esempio n. 1
0
            internal MemberAssignmentRewriter(MemberAssignment binding, StackSpiller spiller, Stack stack) :
                base(binding, spiller)
            {
                Result result = spiller.RewriteExpression(binding.Expression, stack);

                _action = result.Action;
                _rhs    = result.Node;
            }
Esempio n. 2
0
        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;
                }
            }
Esempio n. 4
0
 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();
 }
Esempio n. 6
0
        // 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));
        }
Esempio n. 7
0
            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;
                }
            }
Esempio n. 8
0
            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();
            }
Esempio n. 9
0
 internal override LambdaExpression Accept(StackSpiller spiller)
 {
     return(spiller.Rewrite(this));
 }
Esempio n. 10
0
 internal abstract LambdaExpression Accept(StackSpiller spiller);
Esempio n. 11
0
 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));
 }
Esempio n. 13
0
        public static Expression Spill(Expression expression)
        {
            var spilled = StackSpiller.AnalyzeLambda(Expression.Lambda(expression)).Body;

            return(spilled);
        }
Esempio n. 14
0
 internal ChildRewriter(StackSpiller self, Stack stack, int count) {
     _self = self;
     _stack = stack;
     _expressions = new Expression[count];
 }
 internal BindingRewriter(MemberBinding binding, StackSpiller spiller) {
     _binding = binding;
     _spiller = spiller;
 }
            internal MemberAssignmentRewriter(MemberAssignment binding, StackSpiller spiller, Stack stack) :
                base(binding, spiller) {

                Result result = spiller.RewriteExpression(binding.Expression, stack);
                _action = result.Action;
                _rhs = result.Node;
            }
            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;
                }
            }
 public SpillVisitor(StackSpiller spiller)
 {
     _spiller = spiller;
 }
 internal ChildRewriter(StackSpiller self, Stack stack, int count)
 {
     _self        = self;
     _stack       = stack;
     _expressions = new Expression[count];
 }
 internal override LambdaExpression Accept(StackSpiller spiller)
 {
     return(spiller.Rewrite <TDelegate>((Expression <TDelegate>) this));
 }