Exemplo n.º 1
0
        private ActionBlock OnInvokeAction(InvokeActionBlock block)
        {
            MethodInvocationExpression invocation = block.Expression;

            if (!IsActivateInvocation(invocation))
            {
                CannotOptimize(invocation);
            }

            return(block.Next);
        }
Exemplo n.º 2
0
        private static bool IsNoSideEffectIndirectActivationInvocation(MethodInvocationExpression invocation)
        {
            MethodDefinition methodDefinition = MethodDefinitionFor(invocation);

            if (null == methodDefinition)
            {
                return(false);
            }
            ActionFlowGraph afg = FlowGraphFactory.CreateActionFlowGraph(FlowGraphFactory.CreateControlFlowGraph(methodDefinition));

            if (afg.Blocks.Count == 2 && afg.Blocks[0].ActionType == ActionType.Invoke)
            {
                InvokeActionBlock invocationBlock = (InvokeActionBlock)afg.Blocks[0];
                return(IsActivateInvocation(invocationBlock.Expression));
            }

            return(false);
        }
Exemplo n.º 3
0
        private static Expression GetQueryExpression(ActionFlowGraph afg)
        {
            IDictionary <int, Expression> variables = new Dictionary <int, Expression>();
            ActionBlock block = afg.Blocks[0];

            while (block != null)
            {
                switch (block.ActionType)
                {
                case ActionType.Invoke:
                    InvokeActionBlock          invokeBlock = (InvokeActionBlock)block;
                    MethodInvocationExpression invocation  = invokeBlock.Expression;
                    if (IsActivateInvocation(invocation) ||
                        IsNoSideEffectIndirectActivationInvocation(invocation))
                    {
                        block = invokeBlock.Next;
                        break;
                    }

                    UnsupportedExpression(invocation);
                    break;

                case ActionType.ConditionalBranch:
                    UnsupportedPredicate("Conditional blocks are not supported.");
                    break;

                case ActionType.Branch:
                    block = ((BranchActionBlock)block).Target;
                    break;

                case ActionType.Assign:
                {
                    AssignActionBlock           assignBlock = (AssignActionBlock)block;
                    AssignExpression            assign      = assignBlock.AssignExpression;
                    VariableReferenceExpression variable    = assign.Target as VariableReferenceExpression;
                    if (null == variable)
                    {
                        UnsupportedExpression(assign);
                    }
                    else
                    {
                        if (variables.ContainsKey(variable.Variable.Index))
                        {
                            UnsupportedExpression(assign.Expression);
                        }

                        variables.Add(variable.Variable.Index, assign.Expression);
                        block = assignBlock.Next;
                    }
                    break;
                }

                case ActionType.Return:
                {
                    Expression expression = ((ReturnActionBlock)block).Expression;
                    VariableReferenceExpression variable = expression as VariableReferenceExpression;
                    return(null == variable
                                                                ? expression
                                                                : variables[variable.Variable.Index]);
                }
                }
            }
            return(null);
        }
Exemplo n.º 4
0
 void WriteInvoke(InvokeActionBlock block)
 {
     WriteExpression(block.Expression);
 }