private ActionBlock OnInvokeAction(InvokeActionBlock block) { MethodInvocationExpression invocation = block.Expression; if (!IsActivateInvocation(invocation)) { CannotOptimize(invocation); } return(block.Next); }
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); }
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); }
void WriteInvoke(InvokeActionBlock block) { WriteExpression(block.Expression); }