protected override bool ProcessCFG() { StateMachineDisposeAnalyzer disposeAnalyzer = new StateMachineDisposeAnalyzer(moveNextMethodContext.Method); StateControllerRemover controllerRemover; YieldStateMachineVersion machineVersion = disposeAnalyzer.ProcessDisposeMethod(); if (machineVersion == YieldStateMachineVersion.V1) { controllerRemover = new StateControllerRemover(moveNextMethodContext); } else if (machineVersion == YieldStateMachineVersion.V2) { controllerRemover = new DisposingStateControllerRemover(moveNextMethodContext, disposeAnalyzer.StateField, disposeAnalyzer.DisposingField); StateMachineDoFinallyCheckRemover doFinallyCheckRemover = new StateMachineDoFinallyCheckRemover(moveNextMethodContext); if (!doFinallyCheckRemover.MarkFinallyConditionsForRemoval()) { return(false); } toBeRemoved.UnionWith(doFinallyCheckRemover.BlocksMarkedForRemoval); } else { return(false); } if (!controllerRemover.RemoveStateMachineController()) { return(false); } toBeRemoved.UnionWith(controllerRemover.BlocksMarkedForRemoval); SwitchData switchData = controllerRemover.SwitchData; YieldStateMachineControlFlowRebuilder controlFlowRebuilder = new YieldStateMachineControlFlowRebuilder(moveNextMethodContext, switchData, controllerRemover.StateField); if (!controlFlowRebuilder.ProcessEndBlocks()) { return(false); } toBeRemoved.UnionWith(controlFlowRebuilder.BlocksMarkedForRemoval); StateMachineCFGCleaner cfgCleaner = new StateMachineCFGCleaner(theCFG, switchData, switchData.OrderedCasesArray[0]); if (!cfgCleaner.CleanUpTheCFG(toBeRemoved)) { return(false); } YieldFieldsInformation fieldsInfo = new YieldFieldsInformation(controllerRemover.StateField, controlFlowRebuilder.CurrentItemField, controlFlowRebuilder.ReturnFlagVariable); this.moveNextMethodContext.YieldData = new YieldData(machineVersion, controlFlowRebuilder.YieldReturnBlocks, controlFlowRebuilder.YieldBreakBlocks, fieldsInfo, disposeAnalyzer.YieldsExceptionData); return(true); }
protected override bool ProcessCFG() { if (!GetStateField() || !RemoveStateSavingBlocks()) { return(false); } AsyncMoveNextMethodAnalyzer analyzer = new AsyncMoveNextMethodAnalyzer(this.moveNextMethodContext, this.stateField); StateMachineFinallyCheckRemoverBase finallyCheckRemover; if (analyzer.StateMachineVersion == AsyncStateMachineVersion.V1) { finallyCheckRemover = new StateMachineDoFinallyCheckRemover(this.moveNextMethodContext); finallyCheckRemover.MarkFinallyConditionsForRemoval(analyzer.DoFinallyVariable); } else { finallyCheckRemover = new StateMachineFinallyStateCheckRemover(this.moveNextMethodContext); finallyCheckRemover.MarkFinallyConditionsForRemoval(analyzer.StateVariable); } toBeRemoved.UnionWith(finallyCheckRemover.BlocksMarkedForRemoval); AsyncStateControllerRemover asyncControllerRemover = new AsyncStateControllerRemover(this.moveNextMethodContext, this.stateField, analyzer.DoFinallyVariable, analyzer.StateMachineVersion); if (!asyncControllerRemover.RemoveStateMachineController() && asyncControllerRemover.FoundControllerBlocks) { return(false); } toBeRemoved.UnionWith(asyncControllerRemover.BlocksMarkedForRemoval); SwitchData controllerSwitchData; if (asyncControllerRemover.SwitchData != null) { controllerSwitchData = asyncControllerRemover.SwitchData; } else if (!CreateFakeSwitchData(out controllerSwitchData)) { return(false); } StateMachineCFGCleaner cfgCleaner = new StateMachineCFGCleaner(this.theCFG, controllerSwitchData, controllerSwitchData.DefaultCase); if (!cfgCleaner.CleanUpTheCFG(toBeRemoved)) { return(false); } this.moveNextMethodContext.AsyncData = new Decompiler.AsyncData(stateField, awaiterVariables, analyzer.variableToFieldMap); return(true); }