// 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)); }