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