Exemplo n.º 1
0
        // MethodCallExpression
        // TODO: ref parameters!!!
        private Expression Rewrite(MethodCallExpression node)
        {
            Expression instance = RewriteExpression(node.Instance);
            ReadOnlyCollection <Expression> args = node.Arguments;

            Expression[] clone = null;
            Expression[] comma = null;
            int          ci    = 0; // comma array fill index

            if (args != null)
            {
                for (int i = 0; i < args.Count; i++)
                {
                    Expression arg  = args[i];
                    Expression rarg = RewriteExpression(arg);

                    if ((object)arg != (object)rarg)
                    {
                        if (clone == null)
                        {
                            clone = new Expression[args.Count];
                            if (instance != null)
                            {
                                comma    = new Expression[args.Count + 2]; // + instance + the call
                                instance = ToTemp(instance, out comma[ci++]);
                            }
                            else
                            {
                                comma = new Expression[args.Count + 1];
                            }

                            for (int j = 0; j < i; j++)
                            {
                                clone[j] = ToTemp(args[j], out comma[ci++]);
                            }
                        }
                    }

                    if (clone != null)
                    {
                        clone[i] = ToTemp(rarg, out comma[ci++]);
                    }
                }
            }

            if (clone != null)
            {
                comma[ci] = Ast.Call(instance, node.Method, clone);
                return(Ast.Comma(comma));
            }
            else if ((object)instance != (object)node.Instance)
            {
                return(Ast.Call(
                           instance,
                           node.Method,
                           node.Arguments
                           ));
            }
            else
            {
                return(node);
            }
        }
Exemplo n.º 2
0
        // CommaExpression
        private Expression Rewrite(CommaExpression node)
        {
            ReadOnlyCollection <Expression> expressions = node.Expressions;
            int index = node.ValueIndex;

            Expression[] clone  = null;
            Expression   result = null;

            for (int i = 0; i < expressions.Count; i++)
            {
                Expression expression = expressions[i];
                Expression rewritten  = RewriteExpression(expression);

                if ((object)expression != (object)rewritten)
                {
                    if (clone == null)
                    {
                        int size = expressions.Count;
                        // If the result is not at the end of the comma,
                        // we need an extra element for the result temp.
                        if (index < expressions.Count - 1)
                        {
                            size++;
                        }
                        clone = new Expression[size];
                        for (int j = 0; j < i; j++)
                        {
                            Expression expr = expressions[j];
                            if (j == index)
                            {
                                // This expression is not the last (j < i < expressions.Count)
                                Debug.Assert(j < expressions.Count - 1);
                                result = ToTemp(expr, out expr);
                            }
                            clone[j] = expr;
                        }
                    }
                }

                if (clone != null)
                {
                    if (i == index && index < expressions.Count - 1)
                    {
                        result = ToTemp(rewritten, out rewritten);
                    }
                    clone[i] = rewritten;
                }
            }

            if (clone != null)
            {
                if (result != null)
                {
                    Debug.Assert(index < expressions.Count - 1);
                    Debug.Assert(clone[clone.Length - 1] == null);
                    clone[clone.Length - 1] = result;
                }
                return(Ast.Comma(clone));
            }
            else
            {
                return(node);
            }
        }