Exemple #1
0
        // Block
        private Result RewriteBlockExpression(Expression expr, Stack stack)
        {
            BlockExpression node = (BlockExpression)expr;

            int           count  = node.ExpressionCount();
            RewriteAction action = RewriteAction.None;

            Expression[] clone = null;
            for (int i = 0; i < count; i++)
            {
                Expression expression = node.GetExpression(i);
                // All statements within the block execute at the
                // same stack state.
                Result rewritten = RewriteExpression(expression, stack);
                action |= rewritten.Action;

                if (clone == null && rewritten.Action != RewriteAction.None)
                {
                    clone = Clone(node.Expressions, i);
                }

                if (clone != null)
                {
                    clone[i] = rewritten.Node;
                }
            }

            if (action != RewriteAction.None)
            {
                // okay to wrap since we know no one can mutate the clone array
                expr = node.Rewrite(null, clone);
            }
            return(new Result(action, expr));
        }