public StateControllerRemover(MethodSpecificContext methodContext, FieldDefinition stateField = null)
 {
     this.methodContext = methodContext;
     this.theCFG = methodContext.ControlFlowGraph;
     this.stateField = stateField;
     this.stateToStartBlock = new InstructionBlock[this.theCFG.Blocks.Length];
 }
		public LogicalFlowBuilderContext(ControlFlowGraph cfg)
        {
            CFGBlockToLogicalConstructMap = new Dictionary<InstructionBlock, CFGBlockLogicalConstruct[]>();
			CFG = cfg;
			InstructionToCFGBlockMapping = cfg.InstructionToBlockMapping;
            LogicalConstructToDominatorTreeMap = new Dictionary<ILogicalConstruct, DominatorTree>();
        }
		internal ControlFlowGraphAnalyser(ControlFlowGraph TheGraph)
		{
			cfg = TheGraph;
			verticesThatPartitionGraph = new List<InstructionBlock>();
			mostDistantInstructionBlockIndexReached = 0;
			MarkPartitioningVertices(0);
		}
 public Ast.Statements.BlockStatement Process(DecompilationContext context, Ast.Statements.BlockStatement body)
 {
     this.decompilationContext = context;
     this.theCFG = context.MethodContext.ControlFlowGraph;
     ProcessTheControlFlowGraph();
     return body;
 }
        public Ast.Statements.BlockStatement Process(DecompilationContext context, Ast.Statements.BlockStatement body)
        {
            this.moveNextMethodContext = context.MethodContext;
            this.theCFG = this.moveNextMethodContext.ControlFlowGraph;
            moveNextMethodContext.IsMethodBodyChanged = true;

            StateMachineUtilities.FixInstructionConnections(theCFG.Blocks);

            if (!ProcessCFG())
            {
                ((BaseLanguage)Language).StopPipeline();
            }
            return body;
        }
        public AsyncMoveNextMethodAnalyzer(MethodSpecificContext moveNextMethodContext, FieldDefinition stateField)
        {
            this.theCFG = moveNextMethodContext.ControlFlowGraph;
            this.methodVariables = moveNextMethodContext.Variables;
            this.stateField = stateField;

            if (GetDoFinallyVariable())
            {
                this.StateMachineVersion = AsyncStateMachineVersion.V1;
            }
            else
            {
                GetStateVariable();
                this.StateMachineVersion = AsyncStateMachineVersion.V2;
            }
        }
        /// <summary>
        /// The entry point for the class.
        /// </summary>
        /// <param name="context">The decompilation context.</param>
        /// <param name="body">The body of the method.</param>
        /// <returns>Returns the updated body of the method.</returns>
        public BlockStatement Process(DecompilationContext context, BlockStatement body)
        {
            this.methodContext = context.MethodContext;
            this.controlFlowGraph = this.methodContext.ControlFlowGraph;
            this.exceptionHandlers = controlFlowGraph.RawExceptionHandlers;
            this.blockToInitialStackMap = new int[controlFlowGraph.Blocks.Length][];
            this.blockToExitStackMap = new int[controlFlowGraph.Blocks.Length][];

            /// Perform the analysis.
            AnalyzeStackUsage();

            GenerateStackVariables();

            GenerateStackData();

            return body;
        }
 internal MethodSpecificContext(DecompilationAnalysisResults analysisResults, YieldData yieldData, AsyncData asyncData,
     bool isMethodBodyChanged, Dictionary<string, Statement> gotoLabels, List<GotoStatement> gotoStatements,
     StackUsageData stackData, bool isBaseConstructorInvokingConstructor, bool enableEventAnalysis,
     MethodBody body, Collection<VariableDefinition> variables, ControlFlowGraph controlFlowGraph,
     ExpressionDecompilerData expressions, BlockLogicalConstruct logicalConstructsTree, LogicalFlowBuilderContext logicalConstructsContext,
     MethodInvocationExpression ctorInvokeExpression, Dictionary<Statement, ILogicalConstruct> statementToLogicalConstruct,
     Dictionary<ILogicalConstruct, List<Statement>> logicalConstructToStatements, Dictionary<VariableDefinition, string> variableDefinitionToNameMap,
     HashSet<string> variableNamesCollection, Dictionary<ParameterDefinition, string> parameterDefinitionToNameMap,
     HashSet<VariableDefinition> variablesToRename, Dictionary<FieldDefinition, Expression> fieldToExpression,
     int lambdaVariablesCount, Dictionary<VariableDefinition, AssignmentType> variableAssignmentData, List<ParameterDefinition> outParametersToAssign,
     bool isDestructor, BlockStatement destructorStatements, HashSet<VariableDefinition> undeclaredLinqVariables,
     Dictionary<VariableReference, Dictionary<FieldDefinition, Expression>> closureVariableToFieldValue,
     HashSet<VariableDefinition> variablesToNotDeclare)
 {
     this.AnalysisResults = analysisResults;
     this.YieldData = yieldData;
     this.AsyncData = asyncData;
     this.IsMethodBodyChanged = isMethodBodyChanged;
     this.GotoLabels = gotoLabels;
     this.GotoStatements = gotoStatements;
     this.StackData = stackData;
     this.IsBaseConstructorInvokingConstructor = isBaseConstructorInvokingConstructor;
     this.EnableEventAnalysis = enableEventAnalysis;
     this.Body = body;
     this.Variables = variables;
     this.ControlFlowGraph = controlFlowGraph;
     this.Expressions = expressions;
     this.LogicalConstructsTree = logicalConstructsTree;
     this.LogicalConstructsContext = logicalConstructsContext;
     this.CtorInvokeExpression = ctorInvokeExpression;
     this.StatementToLogicalConstruct = statementToLogicalConstruct;
     this.LogicalConstructToStatements = logicalConstructToStatements;
     this.VariableDefinitionToNameMap = variableDefinitionToNameMap;
     this.VariableNamesCollection = variableNamesCollection;
     this.ParameterDefinitionToNameMap = parameterDefinitionToNameMap;
     this.VariablesToRename = variablesToRename;
     this.FieldToExpression = fieldToExpression;
     this.LambdaVariablesCount = lambdaVariablesCount;
     this.VariableAssignmentData = variableAssignmentData;
     this.OutParametersToAssign = outParametersToAssign;
     this.IsDestructor = isDestructor;
     this.DestructorStatements = destructorStatements;
     this.UndeclaredLinqVariables = undeclaredLinqVariables;
     this.ClosureVariableToFieldValue = closureVariableToFieldValue;
     this.VariablesToNotDeclare = variablesToNotDeclare;
 }
 public StateMachineCFGCleaner(ControlFlowGraph theCFG, SwitchData controllerSwitchData, InstructionBlock newEntryBlock)
 {
     this.theCFG = theCFG;
     this.controllerSwitchData = controllerSwitchData;
     this.newEntryBlock = newEntryBlock;
 }
Пример #10
0
 internal MethodSpecificContext(DecompilationAnalysisResults analysisResults, Telerik.JustDecompiler.Decompiler.YieldData yieldData, Telerik.JustDecompiler.Decompiler.AsyncData asyncData, bool isMethodBodyChanged, Dictionary <string, Statement> gotoLabels, List <GotoStatement> gotoStatements, StackUsageData stackData, bool isBaseConstructorInvokingConstructor, bool enableEventAnalysis, MethodBody body, Collection <VariableDefinition> variables, Telerik.JustDecompiler.Cil.ControlFlowGraph controlFlowGraph, ExpressionDecompilerData expressions, BlockLogicalConstruct logicalConstructsTree, LogicalFlowBuilderContext logicalConstructsContext, MethodInvocationExpression ctorInvokeExpression, Dictionary <Statement, ILogicalConstruct> statementToLogicalConstruct, Dictionary <ILogicalConstruct, List <Statement> > logicalConstructToStatements, Dictionary <VariableDefinition, string> variableDefinitionToNameMap, HashSet <string> variableNamesCollection, Dictionary <ParameterDefinition, string> parameterDefinitionToNameMap, HashSet <VariableDefinition> variablesToRename, Dictionary <FieldDefinition, Expression> fieldToExpression, int lambdaVariablesCount, Dictionary <VariableDefinition, AssignmentType> variableAssignmentData, List <ParameterDefinition> outParametersToAssign, bool isDestructor, BlockStatement destructorStatements, HashSet <VariableDefinition> undeclaredLinqVariables, Dictionary <VariableReference, Dictionary <FieldDefinition, Expression> > closureVariableToFieldValue, HashSet <VariableDefinition> variablesToNotDeclare, CompilerOptimizedSwitchByStringData switchByStringData)
 {
     base();
     this.set_AnalysisResults(analysisResults);
     this.set_YieldData(yieldData);
     this.set_AsyncData(asyncData);
     this.set_IsMethodBodyChanged(isMethodBodyChanged);
     this.set_GotoLabels(gotoLabels);
     this.set_GotoStatements(gotoStatements);
     this.set_StackData(stackData);
     this.set_IsBaseConstructorInvokingConstructor(isBaseConstructorInvokingConstructor);
     this.set_EnableEventAnalysis(enableEventAnalysis);
     this.set_Body(body);
     this.set_Variables(variables);
     this.set_ControlFlowGraph(controlFlowGraph);
     this.set_Expressions(expressions);
     this.set_LogicalConstructsTree(logicalConstructsTree);
     this.set_LogicalConstructsContext(logicalConstructsContext);
     this.set_CtorInvokeExpression(ctorInvokeExpression);
     this.set_StatementToLogicalConstruct(statementToLogicalConstruct);
     this.set_LogicalConstructToStatements(logicalConstructToStatements);
     this.set_VariableDefinitionToNameMap(variableDefinitionToNameMap);
     this.set_VariableNamesCollection(variableNamesCollection);
     this.set_ParameterDefinitionToNameMap(parameterDefinitionToNameMap);
     this.set_VariablesToRename(variablesToRename);
     this.set_FieldToExpression(fieldToExpression);
     this.set_LambdaVariablesCount(lambdaVariablesCount);
     this.set_VariableAssignmentData(variableAssignmentData);
     this.set_OutParametersToAssign(outParametersToAssign);
     this.set_IsDestructor(isDestructor);
     this.set_DestructorStatements(destructorStatements);
     this.set_UndeclaredLinqVariables(undeclaredLinqVariables);
     this.set_ClosureVariableToFieldValue(closureVariableToFieldValue);
     this.set_VariablesToNotDeclare(variablesToNotDeclare);
     this.set_SwitchByStringData(switchByStringData);
     return;
 }
        /// <summary>
        /// Gets the control flow graph of the Dispose method.
        /// </summary>
        private bool GetDisposeMethodCFG()
        {
            string disposeMethodFullMemberName = "System.Void System.IDisposable.Dispose()";
            TypeDefinition currentTypeDefinition = moveNextMethodDefinition.DeclaringType;
            MethodDefinition disposeMethodDefinition = null;
            foreach (MethodDefinition methodDefinition in currentTypeDefinition.Methods)
            {
                if (methodDefinition.GetFullMemberName(null) == disposeMethodFullMemberName)
                {
                    disposeMethodDefinition = methodDefinition;
                    break;
                }
            }

            if (disposeMethodDefinition == null)
            {
                return false;
            }

            theDisposeCFG = new ControlFlowGraphBuilder(disposeMethodDefinition).CreateGraph();
            return true;
        }
 public StateMachineFinallyCheckRemoverBase(MethodSpecificContext methodContext)
 {
     this.methodVariables = methodContext.Body.Variables;
     this.theCFG = methodContext.ControlFlowGraph;
 }